leerness 1.9.231 β†’ 1.9.233

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,75 @@
1
1
  # Changelog
2
2
 
3
+ ## 1.9.233 β€” 2026-05-23
4
+
5
+ **πŸ“š leerness commands μƒˆ λͺ…λ Ή (9 μΉ΄ν…Œκ³ λ¦¬ 51 CLI) + MCP 65번째 도ꡬ.**
6
+
7
+ ### 1. `leerness commands` μƒˆ λͺ…λ Ή β€” μΉ΄ν…Œκ³ λ¦¬ν™”λœ 전체 CLI λͺ©λ‘
8
+ - **9 μΉ΄ν…Œκ³ λ¦¬ Β· 51 λͺ…λ Ή** ν•œ λˆˆμ—:
9
+ - status (8) β€” handoff/health/pulse/round-history/milestones/session-resume/which/memory status
10
+ - task (5) β€” add/update/drop/export + next-action
11
+ - memory (4) β€” decision/rule/plan/lesson CRUD
12
+ - audit (10) β€” audit/drift/scan secrets/encoding/lazy/verify-claim/optimism/requests/pre-wake/idempotency
13
+ - workflow (7) β€” session close/resume/route/agents/review-request/review/brainstorm
14
+ - release (3) β€” sync-main/pack/publish
15
+ - skill (2) β€” list/info/learn/use/optimize/match/suggest + install/install-top/publish/search/discover
16
+ - bridge (3) β€” web/pc/lsp
17
+ - config (9) β€” init/migrate/update/wakeup-interval/workspace-dir/intent/constraints/provider/commands
18
+ - `--json` μ˜΅μ…˜ (μ™ΈλΆ€ μžλ™ν™”)
19
+
20
+ ### 2. MCP 65번째 도ꡬ β€” `leerness_commands`
21
+ - μ™ΈλΆ€ AI κ°€ 전체 CLI λͺ©λ‘μ„ 직접 회수 β†’ 맀뉴얼/도움말 동적 생성
22
+ - MCP 64 β†’ 65 (+1)
23
+
24
+ ### 3. μ‹€ μΈ‘μ • β€” leerness 전체 ν‘œλ©΄ κ°€μ‹œν™”
25
+ - 9 μΉ΄ν…Œκ³ λ¦¬ Γ— 평균 5.7 λͺ…λ Ή = **51 CLI λͺ…λ Ή**
26
+ - handoff/health/pulse λ“± 핡심 status λͺ…령은 status μΉ΄ν…Œκ³ λ¦¬μ— κ·Έλ£Ήν™”
27
+
28
+ ### 4. λˆ„μ  νšŒκ·€ (1.9.207~232) β€” λͺ¨λ‘ μœ μ§€
29
+
30
+ ### 5. stress-v178 β€” 16/16 PASS
31
+ - 1.9.233 (6): VERSION + CLI + --json μΉ΄ν…Œκ³ λ¦¬ 검증 + human 좜λ ₯ + MCP 65 + μ‹€ 호좜
32
+ - μ„±λŠ₯ (2): cold_start avg 413ms / commands 390ms (정적 데이터, 빠름)
33
+ - λˆ„μ  νšŒκ·€ (8): 1.9.207~232
34
+
35
+ ### 6. μžλ™ release (95 λΌμš΄λ“œ main-push streak Β· 56 λΌμš΄λ“œ npm publish streak)
36
+
37
+ πŸ“š **전체 ν‘œλ©΄ κ°€μ‹œν™”** β€” 9 μΉ΄ν…Œκ³ λ¦¬ Γ— 51 CLI Γ— 65 MCP 도ꡬ ν•œλˆˆμ—
38
+
39
+ ---
40
+
41
+ ## 1.9.232 β€” 2026-05-23
42
+
43
+ **πŸ› pulse memorySurface BUG fix + handoff --pulse μ˜΅μ…˜ + session close μžλ™ pulse.**
44
+
45
+ ### 1. pulse memorySurface BUG fix (1.9.231 β†’ 1.9.232)
46
+ - 1.9.231 pulse 의 T/D/R/P/L μΉ΄μš΄νŠΈκ°€ 잘λͺ»λœ μ •κ·œμ‹μœΌλ‘œ 늘 0 좜λ ₯
47
+ - 1.9.232: `memoryStatusCmd` 와 λ™μΌν•œ νŒ¨ν„΄ μ‚¬μš© (`readProgressRows`, `_extractDecisionBlocks`, `readRules`, `### M-` regex, `### YYYY-MM-DD` regex)
48
+ - 검증: leerness-pkg β†’ κΈ°μ‘΄ `T0/D0/R0/P0/L0` β†’ 정상 `T0/D0/R1/P1/L0` (active rule + milestone 반영)
49
+
50
+ ### 2. `leerness handoff --pulse` μ˜΅μ…˜ μ‹ μ„€
51
+ - handoff λŒ€μ‹  pulse 1 line ν˜•μ‹ 좜λ ₯
52
+ - AI κ°€ λΉ λ₯Έ μƒνƒœ 확인 μ‹œ μ‚¬μš© (`handoff` 전체 호좜 λŒ€μ‹ )
53
+ - λ‚΄λΆ€: `pulseCmd` 직접 호좜
54
+
55
+ ### 3. session close μžλ™ pulse ν•œ 쀄 λ…ΈμΆœ
56
+ - 마감 μ‹œ 1.9.217 톡합 보고 끝에 pulse ν•œ 쀄 μžλ™ μΆ”κ°€
57
+ - λ‹€μŒ λΌμš΄λ“œ μ§„μž… μ‹œ μ¦‰μ‹œ μƒνƒœ 인지: `πŸ“ v1.9.232 Β· πŸ”„ R188 Β· 🧠 T0/D0/R1/P1/L0 Β· 🎯 R200 (1d)`
58
+ - AI κ°€ ν•œ μ€„λ‘œ μ»¨ν…μŠ€νŠΈ 확보
59
+
60
+ ### 4. λˆ„μ  νšŒκ·€ (1.9.207~231) β€” λͺ¨λ‘ μœ μ§€
61
+
62
+ ### 5. stress-v177 β€” 13/13 PASS
63
+ - 1.9.232 (4): VERSION + pulse BUG fix + handoff --pulse + session close μžλ™ pulse
64
+ - μ„±λŠ₯ (2): cold_start avg 389ms / pulse 1009ms
65
+ - λˆ„μ  νšŒκ·€ (7): 1.9.207~231
66
+
67
+ ### 6. μžλ™ release (94 λΌμš΄λ“œ main-push streak Β· 55 λΌμš΄λ“œ npm publish streak)
68
+
69
+ πŸ› **1 λΌμš΄λ“œ BUG fix + 2 UX κ°œμ„ ** β€” pulse μ‹œμŠ€ν…œ μ•ˆμ •μ„± κ°•ν™”
70
+
71
+ ---
72
+
3
73
  ## 1.9.231 β€” 2026-05-23
4
74
 
5
75
  **πŸ“ leerness pulse μƒˆ λͺ…λ Ή (ν•œ 쀄 μ’…ν•© μš”μ•½) + MCP 64번째 도ꡬ.**
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.231-green)]() [![tests](https://img.shields.io/badge/e2e-217%2F217-success)]() [![stress](https://img.shields.io/badge/stress--v176-16%2F16-success)]() [![mcp](https://img.shields.io/badge/MCP--tools-64-brightgreen)]() [![rounds](https://img.shields.io/badge/autonomous--rounds-187-blueviolet)]() [![main-push](https://img.shields.io/badge/release--main--push-93_rounds-success)]() [![goal-matrix](https://img.shields.io/badge/λͺ©μ _맀트릭슀-100%2F100_(5μΆ•)-brightgreen)]() [![pulse](https://img.shields.io/badge/πŸ“_pulse-ν•œ_쀄_μ’…ν•©_μš”μ•½-blueviolet)]() [![perf](https://img.shields.io/badge/cold_start-394ms-success)]() [![install](https://img.shields.io/badge/npm_i_leerness-μ¦‰μ‹œ_μ‚¬μš©_κ°€λŠ₯-success)]() [![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.233-green)]() [![tests](https://img.shields.io/badge/e2e-217%2F217-success)]() [![stress](https://img.shields.io/badge/stress--v178-16%2F16-success)]() [![mcp](https://img.shields.io/badge/MCP--tools-65-brightgreen)]() [![cli](https://img.shields.io/badge/CLI_commands-51-brightgreen)]() [![rounds](https://img.shields.io/badge/autonomous--rounds-189-blueviolet)]() [![main-push](https://img.shields.io/badge/release--main--push-95_rounds-success)]() [![goal-matrix](https://img.shields.io/badge/λͺ©μ _맀트릭슀-100%2F100_(5μΆ•)-brightgreen)]() [![commands](https://img.shields.io/badge/πŸ“š_commands-9_μΉ΄ν…Œκ³ λ¦¬_51_λͺ…λ Ή-blueviolet)]() [![perf](https://img.shields.io/badge/cold_start-413ms-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.231 AI Agent Reliability Harness + Sandbox β•‘
15
+ β•‘ v1.9.233 AI Agent Reliability Harness + Sandbox β•‘
16
16
  β•‘ verify Β· remember Β· orchestrate Β· audit Β· sandbox Β· drift β•‘
17
- β•‘ πŸ“ leerness pulse β€” ν•œ 쀄 μ’…ν•© μš”μ•½ + MCP 64 도ꡬ β•‘
17
+ β•‘ πŸ“š leerness commands Β· 9 μΉ΄ν…Œκ³ λ¦¬ Β· 51 CLI Β· MCP 65 β•‘
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.231';
10
+ const VERSION = '1.9.233';
11
11
 
12
12
  // 1.9.184: DEP0190 (child_process shell: true) deprecation warning μ–΅μ œ (μ‚¬μš©μž λͺ…μ‹œ).
13
13
  // leerness λŠ” cross-platform PATH resolution 을 μœ„ν•΄ shell: true λ₯Ό μ˜λ„μ μœΌλ‘œ μ‚¬μš© (claude.cmd / ollama.cmd λ“± Windows .cmd 처리).
@@ -2227,14 +2227,22 @@ function pulseCmd(root) {
2227
2227
  const matches = src.match(/name: 'leerness_[a-z_]+'/g) || [];
2228
2228
  data.mcpTools = matches.length;
2229
2229
  } catch {}
2230
- // Memory Surface (T/D/R/P/L)
2230
+ // Memory Surface (T/D/R/P/L) β€” 1.9.232 BUG fix: memoryStatusCmd 와 λ™μΌν•œ νŒ¨ν„΄ μ‚¬μš©
2231
2231
  try {
2232
- const tasks = (read(progressTrackerPath(root)).split('\n').filter(l => /\|\s*in-progress\s*\|/.test(l)) || []).length;
2233
- const decisions = ((read(path.join(root, '.harness', 'decisions.md')) || '').match(/^##\s/gm) || []).length;
2234
- const rules = readRules(root).filter(r => r.status === 'active').length;
2235
- const milestonesCnt = ((read(path.join(root, '.harness', 'plan.md')) || '').match(/^- M-\d+/gm) || []).length;
2236
- const lessons = ((read(path.join(root, '.harness', 'lessons.md')) || '').match(/^###\s/gm) || []).length;
2237
- data.memorySurface = `T${tasks}/D${decisions}/R${rules}/P${milestonesCnt}/L${lessons}`;
2232
+ const rows = readProgressRows(root);
2233
+ const tasksInProgress = rows.filter(r => r.status === 'in-progress').length;
2234
+ const dm = exists(decisionsPath(root)) ? read(decisionsPath(root)) : '';
2235
+ const decisionBlocks = _extractDecisionBlocks(dm);
2236
+ const decisionCount = decisionBlocks.map(b => {
2237
+ const m = b.match(/^### (.+)$/m);
2238
+ return m ? '### ' + m[1].trim() : null;
2239
+ }).filter(Boolean).length;
2240
+ const rulesActive = readRules(root).filter(r => r.status === 'active').length;
2241
+ const planText = exists(planPath(root)) ? read(planPath(root)) : '';
2242
+ const milestonesCnt = (planText.match(/^### M-\d{4}\./gm) || []).length;
2243
+ const lm = exists(lessonsPath(root)) ? read(lessonsPath(root)) : '';
2244
+ const lessonsCount = (lm.match(/^### \d{4}-\d{2}-\d{2}[^\n]*/gm) || []).length;
2245
+ data.memorySurface = `T${tasksInProgress}/D${decisionCount}/R${rulesActive}/P${milestonesCnt}/L${lessonsCount}`;
2238
2246
  } catch {}
2239
2247
  // λ§ˆμΌμŠ€ν†€ + ETA
2240
2248
  try {
@@ -2263,13 +2271,121 @@ function pulseCmd(root) {
2263
2271
  if (data.abnormalShutdown !== 'none') {
2264
2272
  line += ` Β· πŸ”Œ abnormal:${data.abnormalShutdown}`;
2265
2273
  }
2266
- log(cy(`# leerness pulse (1.9.231) β€” ν•œ 쀄 μ’…ν•© μš”μ•½`));
2274
+ log(cy(`# leerness pulse (1.9.231/1.9.232) β€” ν•œ 쀄 μ’…ν•© μš”μ•½`));
2267
2275
  log('');
2268
2276
  log(` ${line}`);
2269
2277
  log('');
2270
2278
  log(dm(` β†’ 상세: leerness handoff . | health . | round-history | milestones`));
2271
2279
  }
2272
2280
 
2281
+ // 1.9.233: leerness commands β€” μΉ΄ν…Œκ³ λ¦¬ν™”λœ 전체 CLI λͺ…λ Ή λͺ©λ‘
2282
+ // λŒ€ν™”/AI/MCP/CI κ°€ λΉ λ₯΄κ²Œ 전체 κΈ°λŠ₯을 νŒŒμ•…ν•  수 μžˆλ„λ‘.
2283
+ // μΉ΄ν…Œκ³ λ¦¬: status (handoff/health/pulse/round-history/milestones/session-resume/which/memory status)
2284
+ // task (task add/update/drop/export/sync)
2285
+ // memory (decision/rule/plan/lesson add/list/drop)
2286
+ // workflow (route/agents/orchestrate/review/persona)
2287
+ // release (release pack/bump/note/publish/sync-main)
2288
+ // audit (audit/scan secrets/encoding check/drift check/optimism-check/verify-claim/lazy detect)
2289
+ // skill (skill list/info/learn/use/optimize/match/suggest/install/publish/discover)
2290
+ // bridge (web/pc/lsp β€” opt-in)
2291
+ // config (init/migrate/update/auto-update/setup-agents/install/workspace-dir/wakeup-interval)
2292
+ // advanced (intent/requests/constraints/pre-wake-audit/idempotency/round-history/milestones/pulse)
2293
+ function commandsCmd(root) {
2294
+ const isTty = process.stdout && process.stdout.isTTY;
2295
+ const cy = s => isTty ? `\x1b[36m${s}\x1b[0m` : s;
2296
+ const gr = s => isTty ? `\x1b[32m${s}\x1b[0m` : s;
2297
+ const yl = s => isTty ? `\x1b[33m${s}\x1b[0m` : s;
2298
+ const dm = s => isTty ? `\x1b[2m${s}\x1b[0m` : s;
2299
+ const cats = {
2300
+ status: [
2301
+ { cmd: 'handoff [path] [--json] [--pulse] [--compact] [--quiet]', desc: 'μ„Έμ…˜ μ‹œμž‘ μ»¨ν…μŠ€νŠΈ + 7 톡합 ν•„λ“œ' },
2302
+ { cmd: 'health [path] [--json] [--strict]', desc: 'μ’…ν•© ν—¬μŠ€ + drift/security/skill/memory/featureGraph/roundHistory/milestones' },
2303
+ { cmd: 'pulse [path] [--json]', desc: 'ν•œ 쀄 μ’…ν•© μš”μ•½ (1.9.231)' },
2304
+ { cmd: 'round-history [path] [--json]', desc: 'git tag 기반 자율 λΌμš΄λ“œ 톡계 (1.9.226)' },
2305
+ { cmd: 'milestones [path] [--json]', desc: '도달 λ§ˆμΌμŠ€ν†€ + λ‹€μŒ ETA (1.9.229)' },
2306
+ { cmd: 'session-resume [path] [--auto-fix] [--json]', desc: '비정상 μ’…λ£Œ 감지 + 자율 재개 (1.9.220/222)' },
2307
+ { cmd: 'which', desc: 'ν™œμ„± provider + 경둜 진단' },
2308
+ { cmd: 'memory status [path] [--json]', desc: 'T/D/R/P/L Memory Surface (1.9.114)' }
2309
+ ],
2310
+ task: [
2311
+ { cmd: 'task add "<request>"', desc: 'task μΆ”κ°€ (μžλ™ dedup 1.9.212, review trigger 1.9.177)' },
2312
+ { cmd: 'task update <id> --status <S>', desc: 'task μƒνƒœ κ°±μ‹ ' },
2313
+ { cmd: 'task drop <id>', desc: 'task λ“œλ‘­' },
2314
+ { cmd: 'task export --to <path>', desc: 'TodoWrite JSON ν˜•μ‹ export (1.9.60)' },
2315
+ { cmd: 'next-action take|list [--json]', desc: 'next-action queue (1.9.201)' }
2316
+ ],
2317
+ memory: [
2318
+ { cmd: 'decision add|list|drop <id>', desc: 'decisions.md CRUD (1.9.108/118/125)' },
2319
+ { cmd: 'rule add|list|pause|resume|remove', desc: 'rules.md CRUD (1.9.8/109)' },
2320
+ { cmd: 'plan add|list <M-id>', desc: 'plan.md milestone CRUD (1.9.110/119)' },
2321
+ { cmd: 'lesson save|list|drop', desc: 'lessons.md CRUD (1.9.112/117/124)' }
2322
+ ],
2323
+ audit: [
2324
+ { cmd: 'audit [path] [--fix] [--strict] [--json]', desc: '메타 + λ³΄μ•ˆ + npm CVE 톡합 감사' },
2325
+ { cmd: 'drift check [path] [--auto-fix] [--json]', desc: 'drift μ‹ ν˜Έ + μžλ™ 회볡 (1.9.37/82/225)' },
2326
+ { cmd: 'scan secrets [path]', desc: 'μ‹œν¬λ¦Ώ 탐지' },
2327
+ { cmd: 'encoding check [path]', desc: '인코딩 검증' },
2328
+ { cmd: 'lazy detect [path] [--json]', desc: '게으λ₯Έ μž‘μ—… 감지 (1.9.101)' },
2329
+ { cmd: 'verify-claim <T-ID> [--run-tests] [--strict-claims]', desc: 'μ£Όμž₯ 검증 (1.9.18~26)' },
2330
+ { cmd: 'optimism-check <T-ID>', desc: '낙관적 API 감지 (1.9.26)' },
2331
+ { cmd: 'requests audit|list|complete|drop|auto-complete', desc: 'μ‚¬μš©μž μš”μ²­ 좔적 (1.9.207/223)' },
2332
+ { cmd: 'pre-wake-audit [path] [--last]', desc: 'sleep μ „ 점검 (1.9.209)' },
2333
+ { cmd: 'idempotency audit', desc: 'λ©±λ“±μ„± μœ„λ°˜ 탐지 (1.9.212)' }
2334
+ ],
2335
+ workflow: [
2336
+ { cmd: 'session close [path] [--json] [--auto-apply-delivered]', desc: 'μ„Έμ…˜ 마감 + 9 μΉ΄ν…Œκ³ λ¦¬ + μžλ™ 톡합' },
2337
+ { cmd: 'resume [path]', desc: 'auto-resume-plan 적용 (1.9.203)' },
2338
+ { cmd: 'route <task-type>', desc: 'μž‘μ—… μœ ν˜• λΆ„λ₯˜ (11μ’…)' },
2339
+ { cmd: 'agents list|check|quota|dispatch|multi', desc: 'μ™ΈλΆ€ AI CLI μ˜€μΌ€μŠ€νŠΈλ ˆμ΄μ…˜' },
2340
+ { cmd: 'review-request "<request>"', desc: 'μ‚¬μš©μž μš”μ²­ 사전 κ²€ν†  (1.9.176)' },
2341
+ { cmd: 'review <file> --persona <ids>', desc: '페λ₯΄μ†Œλ‚˜ 리뷰 (1.9.29)' },
2342
+ { cmd: 'brainstorm "<topic>" [--include-code]', desc: 'μ›Œν¬μŠ€νŽ˜μ΄μŠ€ 회수 + μ½”λ“œ grep' }
2343
+ ],
2344
+ release: [
2345
+ { cmd: 'release sync-main [path]', desc: 'main merge + push + μžλ™ npm publish (1.9.140/178)' },
2346
+ { cmd: 'release pack', desc: 'tarball 생성' },
2347
+ { cmd: 'release publish', desc: 'GitHub release λ°œν–‰' }
2348
+ ],
2349
+ skill: [
2350
+ { cmd: 'skill list|info|learn|use|optimize|match|suggest', desc: 'skill μΉ΄νƒˆλ‘œκ·Έ CRUD' },
2351
+ { cmd: 'skill install|install-top|publish|search|discover', desc: 'skill 배포 + 검색' }
2352
+ ],
2353
+ bridge: [
2354
+ { cmd: 'web check|screenshot|extract <url>', desc: 'playwright bridge (opt-in, 1.9.165)' },
2355
+ { cmd: 'pc check|click|type|screenshot', desc: 'robotjs/nut-tree bridge (opt-in, 1.9.166)' },
2356
+ { cmd: 'lsp check|symbols|references', desc: 'LSP μ–΄λŒ‘ν„° (1.9.167)' }
2357
+ ],
2358
+ config: [
2359
+ { cmd: 'init [path]', desc: 'μ›Œν¬μŠ€νŽ˜μ΄μŠ€ μ΄ˆκΈ°ν™”' },
2360
+ { cmd: 'migrate [path] [--dry-run]', desc: 'μ—…λ°μ΄νŠΈ λ§ˆμ΄κ·Έλ ˆμ΄μ…˜' },
2361
+ { cmd: 'update [--check|--yes|--force]', desc: 'μžκ°€ μ—…λ°μ΄νŠΈ' },
2362
+ { cmd: 'wakeup-interval get|set|auto|history|record', desc: 'adaptive wakeup (1.9.210)' },
2363
+ { cmd: 'workspace-dir get|guide', desc: 'μ›Œν¬μŠ€νŽ˜μ΄μŠ€ 디렉토리 (1.9.211)' },
2364
+ { cmd: 'intent classify|expand|domains "<request>"', desc: 'μ˜λ„ νŒŒμ•… + scope (1.9.213)' },
2365
+ { cmd: 'constraints list|check|add', desc: 'ν”Œλž«νΌ/API μ œμ•½ (1.9.208)' },
2366
+ { cmd: 'provider list|add|remove|sync', desc: 'Provider Registry (1.9.157~160)' },
2367
+ { cmd: 'commands [--json]', desc: '전체 λͺ…λ Ή μΉ΄ν…Œκ³ λ¦¬ λͺ©λ‘ (1.9.233)' }
2368
+ ]
2369
+ };
2370
+ if (has('--json')) {
2371
+ log(JSON.stringify({ version: VERSION, totalCommands: Object.values(cats).reduce((s, a) => s + a.length, 0), categories: cats }, null, 2));
2372
+ return;
2373
+ }
2374
+ log(cy(`# leerness commands (1.9.233) β€” 전체 CLI λͺ…λ Ή μΉ΄ν…Œκ³ λ¦¬ λͺ©λ‘`));
2375
+ log('');
2376
+ for (const [catName, list] of Object.entries(cats)) {
2377
+ log(gr(`## ${catName} (${list.length}개)`));
2378
+ list.forEach(c => {
2379
+ log(` β€’ ${c.cmd}`);
2380
+ log(dm(` ${c.desc}`));
2381
+ });
2382
+ log('');
2383
+ }
2384
+ log(dm(` β†’ 총 ${Object.values(cats).reduce((s, a) => s + a.length, 0)} λͺ…λ Ή (9 μΉ΄ν…Œκ³ λ¦¬)`));
2385
+ log(dm(` β†’ MCP 도ꡬ: 65 (μ™ΈλΆ€ AI λ…ΈμΆœ)`));
2386
+ log(dm(` β†’ λΉ λ₯Έ μ‹œμž‘: leerness pulse | handoff | health`));
2387
+ }
2388
+
2273
2389
  function roundHistoryCmd(root) {
2274
2390
  root = absRoot(root);
2275
2391
  const isTty = process.stdout && process.stdout.isTTY;
@@ -7265,6 +7381,10 @@ function _handoffWorkspace(rootBase) {
7265
7381
  }
7266
7382
 
7267
7383
  function handoffCmd(root) {
7384
+ // 1.9.232: --pulse μ˜΅μ…˜ β€” pulse 1 line ν˜•μ‹μœΌλ‘œ 좜λ ₯ (handoff 전체 λŒ€μ‹ )
7385
+ if (has('--pulse')) {
7386
+ return pulseCmd(absRoot(root));
7387
+ }
7268
7388
  // 1.9.17: --all-apps / --include 톡합 λͺ¨λ“œ
7269
7389
  if (has('--all-apps') || arg('--include', null)) {
7270
7390
  return _handoffWorkspace(absRoot(root));
@@ -10349,6 +10469,28 @@ function sessionClose(root, opts = {}) {
10349
10469
  log(grn(` βœ“ λ©±λ“±μ„± 검사 톡과 β€” verified ${idemp.summary.verifiedAreas} μ˜μ—­`));
10350
10470
  }
10351
10471
  } catch {}
10472
+ // 1.9.232: 마감 μ‹œ pulse ν•œ 쀄 μžλ™ λ…ΈμΆœ β€” λ‹€μŒ λΌμš΄λ“œ μ§„μž… μ‹œ μ¦‰μ‹œ μƒνƒœ 인지
10473
+ try {
10474
+ const rh = _computeRoundHistory(root);
10475
+ const ms = _computeMilestones(root);
10476
+ const rows = readProgressRows(root);
10477
+ const tIn = rows.filter(r => r.status === 'in-progress').length;
10478
+ const dm = exists(decisionsPath(root)) ? read(decisionsPath(root)) : '';
10479
+ const dCnt = _extractDecisionBlocks(dm).length;
10480
+ const rActive = readRules(root).filter(r => r.status === 'active').length;
10481
+ const planText = exists(planPath(root)) ? read(planPath(root)) : '';
10482
+ const pCnt = (planText.match(/^### M-\d{4}\./gm) || []).length;
10483
+ const lm = exists(lessonsPath(root)) ? read(lessonsPath(root)) : '';
10484
+ const lCnt = (lm.match(/^### \d{4}-\d{2}-\d{2}[^\n]*/gm) || []).length;
10485
+ const mem = `T${tIn}/D${dCnt}/R${rActive}/P${pCnt}/L${lCnt}`;
10486
+ let pulseLine = `πŸ“ v${VERSION} Β· πŸ”„ R${rh.roundCount} Β· 🧠 ${mem}`;
10487
+ if (ms.next) {
10488
+ const eta = ms.next.etaDays != null ? ` (${ms.next.etaDays}d)` : '';
10489
+ pulseLine += ` · 🎯 R${ms.next.milestone}${eta}`;
10490
+ }
10491
+ log('');
10492
+ log(` ${pulseLine} ${dim('β€” leerness pulse (1.9.232)')}`);
10493
+ } catch {}
10352
10494
  } catch {}
10353
10495
  }
10354
10496
  }
@@ -14198,7 +14340,8 @@ function mcpServeCmd(root) {
14198
14340
  { name: 'leerness_requests_auto_complete', description: '1.9.224 (1.9.223 μžλ™ 회수) β€” delivered νŒ¨ν„΄ μžλ™ 감지 + μžλ™ μ™„λ£Œ. "Round X.Y.Z β€” κ΅¬ν˜„ μ™„λ£Œ" / "implemented" / "delivered" νŒ¨ν„΄μ΄ μžˆλŠ” open μš”μ²­ 쀑 ν˜„μž¬ 버전 μ΄ν•˜μΈ 것을 ν›„λ³΄λ‘œ λΆ„λ₯˜. 응닡: { total, candidates: [{id, text, claimedVersion, currentVersion, deliveredKeyword, recordedAt}], currentVersion, applied (apply=true μ‹œ), completedIds[] }. μ™ΈλΆ€ AIκ°€ "운영 λˆ„μ λœ κ°€μ§œ λ―Έλ‹΅ μ‹ ν˜Έ 정리 κ°€λŠ₯ν•œκ°€?"λ₯Ό 회수. κΈ°λ³Έ dry-run, apply: true λͺ…μ‹œ μ‹œμ—λ§Œ μ‹€ 적용. 인자: { path?, apply? (default false) }', inputSchema: { type: 'object', properties: { path: { type: 'string' }, apply: { type: 'boolean' } } } },
14199
14341
  { name: 'leerness_round_history', description: '1.9.226 β€” 자율 λΌμš΄λ“œ 톡계. git tag v1.9.X 기반 λˆ„μ  λΌμš΄λ“œ 카운트 + λ‹€μŒ λ§ˆμΌμŠ€ν†€ (50/75/100/125/150/175/200/250/300/400/500) + 평균 rounds/day. 응닡: { currentVersion, roundCount, baselineVersion, latestTags[], nextMilestone, roundsToNextMilestone, firstTagAt, latestTagAt, daysActive, avgRoundsPerDay }. μ™ΈλΆ€ AIκ°€ "이 ν”„λ‘œμ νŠΈλŠ” μ–Όλ§ˆλ‚˜ 진행됐고 λ‹€μŒ λ§ˆμΌμŠ€ν†€κΉŒμ§€ λͺ‡ λΌμš΄λ“œ λ‚¨μ•˜λ‚˜?"λ₯Ό 회수. 인자: { path? }', inputSchema: { type: 'object', properties: { path: { type: 'string' } } } },
14200
14342
  { name: 'leerness_milestones', description: '1.9.229 (1.9.226 ν™•μž₯) β€” 도달 λ§ˆμΌμŠ€ν†€ + λ‹€μŒ ETA. git tag 순차 λΆ„μ„μœΌλ‘œ 25/50/75/100/125/150/175/200/250/300/400/500 λ§ˆμΌμŠ€ν†€ 도달 일자 + λ‹€μŒ λ§ˆμΌμŠ€ν†€ ETA (ν˜„μž¬ 속도 κΈ°μ€€) 계산. 응닡: { totalRounds, reached: [{milestone, version, reachedAt, daysFromBaseline}], next: {milestone, roundsRemaining, etaDays, etaDate}, baselineAt, avgRoundsPerDay }. μ™ΈλΆ€ AIκ°€ "μ§€κΈˆκΉŒμ§€ μ–΄λ–€ λ§ˆμΌμŠ€ν†€μ„ μ–Έμ œ λ‹¬μ„±ν–ˆκ³  λ‹€μŒ λ§ˆμΌμŠ€ν†€ μ˜ˆμƒ 도달일은?"을 회수. 인자: { path? }', inputSchema: { type: 'object', properties: { path: { type: 'string' } } } },
14201
- { name: 'leerness_pulse', description: '1.9.231 β€” ν•œ 쀄 μ’…ν•© μš”μ•½ (10 핡심 μ§€ν‘œ). 응닡: { version, roundCount, mcpTools, memorySurface, security, health, driftScore, nextMilestone, etaDays, abnormalShutdown }. μ™ΈλΆ€ AIκ°€ "leerness μƒνƒœ ν•œ λˆˆμ— 보기"λ₯Ό κ°€λ²Όμš΄ 단일 호좜둜 회수. handoff 보닀 5λ°° 빠름 (drift/health 계산 skip). 인자: { path? }', inputSchema: { type: 'object', properties: { path: { type: 'string' } } } }
14343
+ { name: 'leerness_pulse', description: '1.9.231 β€” ν•œ 쀄 μ’…ν•© μš”μ•½ (10 핡심 μ§€ν‘œ). 응닡: { version, roundCount, mcpTools, memorySurface, security, health, driftScore, nextMilestone, etaDays, abnormalShutdown }. μ™ΈλΆ€ AIκ°€ "leerness μƒνƒœ ν•œ λˆˆμ— 보기"λ₯Ό κ°€λ²Όμš΄ 단일 호좜둜 회수. handoff 보닀 5λ°° 빠름 (drift/health 계산 skip). 인자: { path? }', inputSchema: { type: 'object', properties: { path: { type: 'string' } } } },
14344
+ { name: 'leerness_commands', description: '1.9.233 β€” μΉ΄ν…Œκ³ λ¦¬ν™”λœ 전체 CLI λͺ…λ Ή λͺ©λ‘ (9 μΉ΄ν…Œκ³ λ¦¬). 응닡: { version, totalCommands, categories: { status, task, memory, audit, workflow, release, skill, bridge, config } }. μ™ΈλΆ€ AIκ°€ "leerness κ°€ μ œκ³΅ν•˜λŠ” λͺ…령이 뭐가 μžˆλ‚˜"λ₯Ό 직접 회수. 맀뉴얼/도움말 동적 생성. 인자: { path? }', inputSchema: { type: 'object', properties: { path: { type: 'string' } } } }
14202
14345
  ];
14203
14346
 
14204
14347
  function send(obj) {
@@ -14371,6 +14514,10 @@ function mcpServeCmd(root) {
14371
14514
  // 1.9.231: ν•œ 쀄 μ’…ν•© μš”μ•½ (10 핡심 μ§€ν‘œ)
14372
14515
  cliArgs = ['pulse', '--path', targetPath, '--json'];
14373
14516
  break;
14517
+ case 'leerness_commands':
14518
+ // 1.9.233: μΉ΄ν…Œκ³ λ¦¬ν™”λœ 전체 CLI λͺ…λ Ή λͺ©λ‘
14519
+ cliArgs = ['commands', '--json'];
14520
+ break;
14374
14521
  default:
14375
14522
  return send({ jsonrpc: '2.0', id, error: { code: -32601, message: `Unknown tool: ${name}` } });
14376
14523
  }
@@ -18030,6 +18177,8 @@ async function main() {
18030
18177
  if (cmd === 'milestones') return milestonesCmd(arg('--path', process.cwd()));
18031
18178
  // 1.9.231: leerness pulse β€” ν•œ 쀄 μ’…ν•© μš”μ•½ (10 핡심 μ§€ν‘œ)
18032
18179
  if (cmd === 'pulse') return pulseCmd(arg('--path', process.cwd()));
18180
+ // 1.9.233: leerness commands β€” μΉ΄ν…Œκ³ λ¦¬ν™”λœ 전체 CLI λͺ…λ Ή λͺ©λ‘
18181
+ if (cmd === 'commands') return commandsCmd(arg('--path', process.cwd()));
18033
18182
  // 1.9.208: leerness constraints <list|check|add> β€” ν”Œλž«νΌ/API μ œμ•½ 사전 체크 (μ‚¬μš©μž λͺ…μ‹œ)
18034
18183
  if (cmd === 'constraints') return constraintsCmd(arg('--path', process.cwd()), args[1], ...args.slice(2));
18035
18184
  // 1.9.209: leerness pre-wake-audit β€” sleep μ „ sub-agent audit (μ‚¬μš©μž λͺ…μ‹œ)
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "leerness",
3
- "version": "1.9.231",
3
+ "version": "1.9.233",
4
4
  "description": "Leerness: λΉ„νŒŒκ΄΄ λ§ˆμ΄κ·Έλ ˆμ΄μ…˜, μžλ™ 버전 κ°μ§€Β·μ—…λ°μ΄νŠΈ, κ³„νš/μ§„ν–‰/ν•Έλ“œμ˜€ν”„ μžλ™ν™”, κ²ŒμœΌλ¦„Β·μ‹œν¬λ¦ΏΒ·μΈμ½”λ”© μžλ™ κ°€λ“œ, Claude Code μŠ¬λž˜μ‹œ 톡합을 κ°–μΆ˜ ν•œκ΅­μ–΄ μš°μ„  AI 개발 ν•˜λ„€μŠ€.",
5
5
  "keywords": [
6
6
  "leerness",