leerness 1.9.170 β 1.9.172
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 +111 -0
- package/README.md +3 -3
- package/bin/harness.js +73 -5
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,116 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 1.9.172 β 2026-05-21
|
|
4
|
+
|
|
5
|
+
**π¨ μ€νΈλ¦¬λ° UX κ°ν β spinner + Claude tool_use κ°μν + diff ν¨ν΄ μλ μκΉ (μ¬μ©μ λͺ
μ κ°ν).**
|
|
6
|
+
|
|
7
|
+
μμ¨ λͺ¨λ 102 λΌμ΄λ. 1.9.170 μ¬μ©μ λͺ
μ ("ν°λ―Έλ νλ©΄ κ³μ κ°±μ , μΆλ‘ μ€/diff/μκ°νλ κ³Όμ μ€μκ° νμ") μ μ§μ§ μλ 보κ°.
|
|
8
|
+
|
|
9
|
+
### 1. μΆλ‘ μ€ Spinner β Visual Feedback
|
|
10
|
+
- `_cliChatStream` μμ `setInterval(120ms)` spinner β stdout idle 800ms+ μ κΉλΉ‘μ
|
|
11
|
+
- `β β β Ήβ Έβ Όβ ΄β ¦β §β β ` 10 frames + κ²½κ³Ό μκ° νμ ("β μΆλ‘ μ€... (3s)")
|
|
12
|
+
- `\r\x1b[K` ANSI escape β νμ¬ λΌμΈ ν΄λ¦¬μ΄ + spinner κ°±μ
|
|
13
|
+
- `stopSpinner()` β stdout/stderr data λμ°© μ μ¦μ spinner λΌμΈ ν΄λ¦¬μ΄
|
|
14
|
+
- μ΅μ
: `opts.noSpinner: true` λλ λΉ-TTY νκ²½μμ μλ λΉνμ±
|
|
15
|
+
|
|
16
|
+
### 2. Claude tool_use κ°μν
|
|
17
|
+
- Claude `--output-format=stream-json` μ `content_block_start` μ΄λ²€νΈμμ `type='tool_use'` κ°μ§
|
|
18
|
+
- νμ: `π§ Tool: Read νΈμΆ μ€...` (cyan μ)
|
|
19
|
+
- AIκ° νμΌ μ½κΈ°/μ°κΈ°/Bash νΈμΆ μ μ¬μ©μκ° μ¦μ μΈμ§
|
|
20
|
+
|
|
21
|
+
### 3. diff ν¨ν΄ μλ μκΉ (writeColored)
|
|
22
|
+
```diff
|
|
23
|
+
diff --git a/file.js b/file.js # yellow (ν€λ)
|
|
24
|
+
--- a/file.js # yellow
|
|
25
|
+
+++ b/file.js # yellow
|
|
26
|
+
@@ -10,3 +10,3 @@ # cyan (hunk)
|
|
27
|
+
- old line # red
|
|
28
|
+
+ new line # green
|
|
29
|
+
context # κΈ°λ³Έ μ
|
|
30
|
+
```
|
|
31
|
+
- λΌμΈ λ¨μ μ²λ¦¬ (`lineBuf` λ²νΌλ§)
|
|
32
|
+
- μ κ·μ λ§€μΉ: `/^\+(?!\+\+)/` β green, `/^-(?!--)/` β red, `/^@@.*@@/` β cyan
|
|
33
|
+
- `flushLineBuf()` β μ’
λ£ μ μμ¬ λΌμΈ μΆλ ₯
|
|
34
|
+
|
|
35
|
+
### ν΅ν© νλ¦
|
|
36
|
+
```
|
|
37
|
+
user> μ΄ ν¨μ 리ν©ν λ§ + diff 보μ¬μ€
|
|
38
|
+
β claude CLI stream νΈμΆ μ€... (Ctrl+C λ‘ μ€λ¨)
|
|
39
|
+
ββ claude stream ββ
|
|
40
|
+
β Ή μΆλ‘ μ€... (2s) # μλ΅ μμ μ spinner
|
|
41
|
+
[claude-opus-4-7]
|
|
42
|
+
π§ Tool: Read νΈμΆ μ€... # tool_use κ°μ§
|
|
43
|
+
|
|
44
|
+
λΆμ κ²°κ³Ό:
|
|
45
|
+
|
|
46
|
+
diff --git a/utils.js b/utils.js # yellow
|
|
47
|
+
@@ -5,3 +5,3 @@ # cyan
|
|
48
|
+
- function bad() { return null; } # red
|
|
49
|
+
+ function good() { return {}; } # green
|
|
50
|
+
ββ /stream (4521ms) ββ
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
### Verified
|
|
54
|
+
- e2e 217/217 baseline μ μ§
|
|
55
|
+
- stress-v117: **20/20** (spinner 4 + tool_use 2 + diff 4 + ANSI helpers 2 + ν΅ν© 2 + λμ νκ· 6)
|
|
56
|
+
- VERSION = 1.9.172 / autonomous-rounds = 102 / main μλ push 33 λΌμ΄λ μ°μ
|
|
57
|
+
|
|
58
|
+
---
|
|
59
|
+
|
|
60
|
+
## 1.9.171 β 2026-05-21
|
|
61
|
+
|
|
62
|
+
**AGENTS.md / CLAUDE.md / session-workflow.md 1.9.88~170 λμ κ°±μ (drift μ°¨λ¨).**
|
|
63
|
+
|
|
64
|
+
μμ¨ λͺ¨λ 101 λΌμ΄λ. 1.9.87 λ§μ§λ§ metadata κ°±μ ν 84 λΌμ΄λ κ°κ²© β λ€μ μΈμ
μμ μ κΈ°λ₯ (REPL/Bridge/Tab cycle/53 MCP/6 λ₯λ ₯) μΈμ§ λͺ» ν μν μ°¨λ¨.
|
|
65
|
+
|
|
66
|
+
### Updated
|
|
67
|
+
- **session-workflow.md**: 1.9.140~170 31 λΌμ΄λ λμ λ³κ²½μ¬ν μΆκ°
|
|
68
|
+
- release sync-main μλ (31 λΌμ΄λ μ°μ main μλ push)
|
|
69
|
+
- Feature Causality Graph (1.9.141~143)
|
|
70
|
+
- env detect (1.9.145)
|
|
71
|
+
- CLI μμ΄μ νΈ λͺ¨λ + 3-tier κΆν μμ€ν
(1.9.146)
|
|
72
|
+
- REPL agent + Sandboxing runCommandSafe (1.9.149~150)
|
|
73
|
+
- REPL UX κ°ν (1.9.151~155)
|
|
74
|
+
- agents multi --execute + consensus (1.9.156)
|
|
75
|
+
- Provider Registry CRUD CLI + MCP **50 λꡬ λ§μΌμ€ν€** (1.9.157~159)
|
|
76
|
+
- 90 λΌμ΄λ λ§μΌμ€ν€ (1.9.160)
|
|
77
|
+
- REPL slash 4μ’
(1.9.161~162)
|
|
78
|
+
- 5λ₯λ ₯ λ§€νΈλ¦μ€ health ν΅ν© (1.9.163)
|
|
79
|
+
- leerness which μ§λ¨ (1.9.164)
|
|
80
|
+
- web/pc/lsp bridge 3μ’
(1.9.165~167)
|
|
81
|
+
- MCP **53 λꡬ λ§μΌμ€ν€** + Bridge μΈλΆ λ
ΈμΆ (1.9.168)
|
|
82
|
+
- --include explicit-only hotfix (1.9.169)
|
|
83
|
+
- **100 λΌμ΄λ + Tab cycle + μ€μκ° μ€νΈλ¦¬λ°** (1.9.170)
|
|
84
|
+
|
|
85
|
+
- **AGENTS.md**:
|
|
86
|
+
- "REPL Agent + Bridge λͺ
λ Ή (1.9.149~170)" μΉμ
μ μ€ (μμ°μ΄ λ§€ν 11μ’
)
|
|
87
|
+
- "6 λ₯λ ₯ λ§€νΈλ¦μ€ (1.9.167+)" μΉμ
β overallScore + production-ready/beta-ready/mvp λΌλ²¨
|
|
88
|
+
|
|
89
|
+
- **CLAUDE.md**:
|
|
90
|
+
- REPL Agent 100 λΌμ΄λ μμ¨ λ§μΌμ€ν€ μΉμ
(Tab/Shift+Tab/μ€νΈλ¦¬λ°)
|
|
91
|
+
- Bridge 3μ’
opt-in μλ΄
|
|
92
|
+
- 6 λ₯λ ₯ λ§€νΈλ¦μ€ 72% production-ready
|
|
93
|
+
|
|
94
|
+
### μμ°μ΄ λ§€ν μ κ· μΆκ° (AGENTS.md)
|
|
95
|
+
| μ¬μ©μ λ°ν | μ¦μ μ€ν |
|
|
96
|
+
|---|---|
|
|
97
|
+
| "μμ΄μ νΈ μΌμ€ / REPL λͺ¨λ" | `leerness agent .` |
|
|
98
|
+
| "Claude/Codex λν" | `leerness agent . --provider claude` |
|
|
99
|
+
| "λ€λ₯Έ provider / Tab" | REPLμμ `Tab` / `Shift+Tab` |
|
|
100
|
+
| "μΉ μ€ν¬λ¦°μ· / URL μΊ‘μ²" | `leerness web screenshot <url>` |
|
|
101
|
+
| "λ§μ°μ€ ν΄λ¦ / μλν" | `leerness pc click <x> <y>` |
|
|
102
|
+
| "ν¨μ μ°Ύμμ€ / μ¬λ³Ό μΆμΆ" | `leerness lsp symbols <file>` |
|
|
103
|
+
| "μ°Έμ‘° κ²μ" | `leerness lsp references <name> --in <dir>` |
|
|
104
|
+
| "κΆν λͺ¨λ νμΈ" | `leerness permissions list` |
|
|
105
|
+
| "μ΅μ λ²μ μλ νμΈ" | `leerness which` |
|
|
106
|
+
|
|
107
|
+
### Verified
|
|
108
|
+
- e2e 217/217 baseline μ μ§
|
|
109
|
+
- stress-v116: **20/20** (session-workflow 6 + AGENTS 4 + CLAUDE 3 + λμ νκ· 7)
|
|
110
|
+
- VERSION = 1.9.171 / autonomous-rounds = 101 / main μλ push 32 λΌμ΄λ μ°μ
|
|
111
|
+
|
|
112
|
+
---
|
|
113
|
+
|
|
3
114
|
## 1.9.170 β 2026-05-21 β π 100 λΌμ΄λ μμ¨ λ§μΌμ€ν€
|
|
4
115
|
|
|
5
116
|
**μ¬μ©μ λͺ
μ μμ² 2μ’
: REPL Tab cycle provider/model + μ€μκ° μ€νΈλ¦¬λ°.**
|
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.172 AI Agent Reliability Harness + Sandbox β
|
|
16
16
|
β verify Β· remember Β· orchestrate Β· audit Β· sandbox Β· drift β
|
|
17
|
-
β
|
|
17
|
+
β π¨ μ€νΈλ¦¬λ° spinner + tool_use κ°μν + diff μλ μκΉ β
|
|
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.
|
|
9
|
+
const VERSION = '1.9.172';
|
|
10
10
|
const MARK = '<!-- leerness:managed -->';
|
|
11
11
|
const README_START = '<!-- leerness:project-readme:start -->';
|
|
12
12
|
const README_END = '<!-- leerness:project-readme:end -->';
|
|
@@ -10552,6 +10552,7 @@ async function _cliChat(root, provider, prompt, opts) {
|
|
|
10552
10552
|
}
|
|
10553
10553
|
|
|
10554
10554
|
// 1.9.170: REPL μ€μκ° μ€νΈλ¦¬λ° β CLI stdoutμ μ¦μ ν°λ―Έλμ νμ (μ¬μ©μ λͺ
μ μμ²)
|
|
10555
|
+
// 1.9.172: μΆλ‘ μ€ spinner + Claude tool_use κ°μν + diff ν¨ν΄ μλ μκΉ (μ¬μ©μ λͺ
μ κ°ν)
|
|
10555
10556
|
// μΆλ‘ μ€/diff/thinking κ³Όμ μ΄ stdout μΌλ‘ νλ₯΄λ λμ μ€μκ° λ λλ§.
|
|
10556
10557
|
// runCommandSafe μ λ°°μΉ κ²°κ³Όμ λ¬λ¦¬ cp.spawn μ child.stdout μ μ§μ pipe.
|
|
10557
10558
|
// env scrub + cwd jail μ λμΌνκ² μ μ©.
|
|
@@ -10574,9 +10575,55 @@ async function _cliChatStream(root, provider, promptText, opts) {
|
|
|
10574
10575
|
let out = '', err = '';
|
|
10575
10576
|
let buf = ''; // claude stream-json λΌμΈ λ²νΌ
|
|
10576
10577
|
let firstChunk = true;
|
|
10578
|
+
let lineBuf = ''; // 1.9.172: diff ν¨ν΄ μκΉ μν λΌμΈ λ²νΌ
|
|
10577
10579
|
const isTty = process.stdout.isTTY;
|
|
10578
10580
|
const dim = isTty ? (s) => `\x1b[2m${s}\x1b[0m` : s => s;
|
|
10579
10581
|
const cy = isTty ? (s) => `\x1b[36m${s}\x1b[0m` : s => s;
|
|
10582
|
+
const green = isTty ? (s) => `\x1b[32m${s}\x1b[0m` : s => s;
|
|
10583
|
+
const red = isTty ? (s) => `\x1b[31m${s}\x1b[0m` : s => s;
|
|
10584
|
+
const yel = isTty ? (s) => `\x1b[33m${s}\x1b[0m` : s => s;
|
|
10585
|
+
|
|
10586
|
+
// 1.9.172: μΆλ‘ μ€ spinner β stdoutμ΄ μΌμ μκ° idle νλ©΄ κΉλΉ‘μ΄λ visual feedback
|
|
10587
|
+
// AIκ° μλ΅ μμνκΈ° μ (preprocessing/thinking) λμ μ¬μ©μκ° "λμ μ€" μΈμ§ νμΈ.
|
|
10588
|
+
const spinnerFrames = ['β ', 'β ', 'β Ή', 'β Έ', 'β Ό', 'β ΄', 'β ¦', 'β §', 'β ', 'β '];
|
|
10589
|
+
let spinnerIdx = 0;
|
|
10590
|
+
let spinnerActive = false;
|
|
10591
|
+
let lastActivity = Date.now();
|
|
10592
|
+
const spinnerInterval = isTty && !opts.noSpinner ? setInterval(() => {
|
|
10593
|
+
const idle = Date.now() - lastActivity;
|
|
10594
|
+
if (idle > 800) {
|
|
10595
|
+
if (!spinnerActive) { spinnerActive = true; }
|
|
10596
|
+
// νμ¬ λΌμΈμ ν΄λ¦¬μ΄νκ³ spinner νμ
|
|
10597
|
+
process.stdout.write(`\r\x1b[K${dim(spinnerFrames[spinnerIdx % spinnerFrames.length] + ' μΆλ‘ μ€... (' + Math.floor(idle / 1000) + 's)')}`);
|
|
10598
|
+
spinnerIdx++;
|
|
10599
|
+
}
|
|
10600
|
+
}, 120) : null;
|
|
10601
|
+
const stopSpinner = () => {
|
|
10602
|
+
if (spinnerActive) {
|
|
10603
|
+
process.stdout.write('\r\x1b[K'); // spinner λΌμΈ ν΄λ¦¬μ΄
|
|
10604
|
+
spinnerActive = false;
|
|
10605
|
+
}
|
|
10606
|
+
lastActivity = Date.now();
|
|
10607
|
+
};
|
|
10608
|
+
|
|
10609
|
+
// 1.9.172: diff ν¨ν΄ μλ μκΉ β `+ ` / `- ` / `@@` λΌμΈμ green/red/cyan
|
|
10610
|
+
function writeColored(s) {
|
|
10611
|
+
// λΌμΈ λ¨μλ‘ μ²λ¦¬ (λΌμΈ λκΉμ§ λͺ¨μ ν μκΉ μ
νκΈ°)
|
|
10612
|
+
lineBuf += s;
|
|
10613
|
+
const lines = lineBuf.split('\n');
|
|
10614
|
+
lineBuf = lines.pop() || '';
|
|
10615
|
+
for (const ln of lines) {
|
|
10616
|
+
if (/^\+(?!\+\+)/.test(ln)) process.stdout.write(green(ln) + '\n');
|
|
10617
|
+
else if (/^-(?!--)/.test(ln)) process.stdout.write(red(ln) + '\n');
|
|
10618
|
+
else if (/^@@.*@@/.test(ln)) process.stdout.write(cy(ln) + '\n');
|
|
10619
|
+
else if (/^(diff --git|---|\+\+\+|index )/.test(ln)) process.stdout.write(yel(ln) + '\n');
|
|
10620
|
+
else process.stdout.write(ln + '\n');
|
|
10621
|
+
}
|
|
10622
|
+
}
|
|
10623
|
+
function flushLineBuf() {
|
|
10624
|
+
if (lineBuf) { process.stdout.write(lineBuf); lineBuf = ''; }
|
|
10625
|
+
}
|
|
10626
|
+
|
|
10580
10627
|
process.stdout.write(dim(`\n ββ ${provider} stream ββ\n`));
|
|
10581
10628
|
let child;
|
|
10582
10629
|
try {
|
|
@@ -10587,6 +10634,7 @@ async function _cliChatStream(root, provider, promptText, opts) {
|
|
|
10587
10634
|
stdio: ['ignore', 'pipe', 'pipe']
|
|
10588
10635
|
});
|
|
10589
10636
|
} catch (e) {
|
|
10637
|
+
if (spinnerInterval) clearInterval(spinnerInterval);
|
|
10590
10638
|
return resolve({ ok: false, error: 'spawn μ€ν¨: ' + e.message, provider });
|
|
10591
10639
|
}
|
|
10592
10640
|
const timer = setTimeout(() => {
|
|
@@ -10594,6 +10642,7 @@ async function _cliChatStream(root, provider, promptText, opts) {
|
|
|
10594
10642
|
}, opts.timeout || 120000);
|
|
10595
10643
|
|
|
10596
10644
|
// Claude stream-json λͺ¨λ: κ° λΌμΈμ΄ JSON event. type=assistant_message_delta.text λ§ μΆλ ₯
|
|
10645
|
+
// 1.9.172: tool_use κ°μν μΆκ° (Read/Write/Bash νΈμΆ μ "π§ Tool: <name>" νμ)
|
|
10597
10646
|
function handleClaudeStream(chunk) {
|
|
10598
10647
|
buf += chunk.toString();
|
|
10599
10648
|
const lines = buf.split('\n');
|
|
@@ -10602,44 +10651,63 @@ async function _cliChatStream(root, provider, promptText, opts) {
|
|
|
10602
10651
|
if (!ln.trim()) continue;
|
|
10603
10652
|
try {
|
|
10604
10653
|
const ev = JSON.parse(ln);
|
|
10605
|
-
// assistant λ©μμ§ chunk
|
|
10654
|
+
// assistant λ©μμ§ chunk
|
|
10606
10655
|
if (ev.type === 'content_block_delta' && ev.delta?.text) {
|
|
10607
|
-
|
|
10656
|
+
stopSpinner();
|
|
10657
|
+
writeColored(ev.delta.text);
|
|
10608
10658
|
out += ev.delta.text;
|
|
10609
10659
|
} else if (ev.type === 'message_start' && firstChunk) {
|
|
10610
10660
|
firstChunk = false;
|
|
10661
|
+
stopSpinner();
|
|
10611
10662
|
process.stdout.write(dim(` [${ev.message?.model || provider}] `));
|
|
10612
10663
|
} else if (ev.type === 'thinking_delta' && ev.delta?.thinking) {
|
|
10664
|
+
stopSpinner();
|
|
10613
10665
|
process.stdout.write(dim(ev.delta.thinking));
|
|
10666
|
+
} else if (ev.type === 'content_block_start' && ev.content_block?.type === 'tool_use') {
|
|
10667
|
+
// 1.9.172: tool_use μμ μ "π§ Tool: Read" κ°μ μλ΄
|
|
10668
|
+
stopSpinner();
|
|
10669
|
+
const toolName = ev.content_block.name || 'tool';
|
|
10670
|
+
process.stdout.write(cy(`\n π§ Tool: ${toolName} νΈμΆ μ€...\n`));
|
|
10671
|
+
} else if (ev.type === 'tool_use' || ev.type === 'content_block_stop') {
|
|
10672
|
+
// λꡬ μλ£ μκ·Έλ (νμμ νλ νμ)
|
|
10614
10673
|
}
|
|
10615
10674
|
} catch {
|
|
10616
10675
|
// JSON μλλ©΄ κ·Έλλ‘ μΆλ ₯ (fallback)
|
|
10617
|
-
|
|
10676
|
+
stopSpinner();
|
|
10677
|
+
writeColored(ln + '\n');
|
|
10618
10678
|
out += ln + '\n';
|
|
10619
10679
|
}
|
|
10620
10680
|
}
|
|
10621
10681
|
}
|
|
10622
10682
|
|
|
10623
10683
|
child.stdout.on('data', chunk => {
|
|
10684
|
+
lastActivity = Date.now();
|
|
10624
10685
|
if (provider === 'claude') {
|
|
10625
10686
|
handleClaudeStream(chunk);
|
|
10626
10687
|
} else {
|
|
10688
|
+
stopSpinner();
|
|
10627
10689
|
const s = chunk.toString();
|
|
10628
10690
|
out += s;
|
|
10629
|
-
|
|
10691
|
+
writeColored(s);
|
|
10630
10692
|
}
|
|
10631
10693
|
});
|
|
10632
10694
|
child.stderr.on('data', chunk => {
|
|
10695
|
+
lastActivity = Date.now();
|
|
10696
|
+
stopSpinner();
|
|
10633
10697
|
const s = chunk.toString();
|
|
10634
10698
|
err += s;
|
|
10635
10699
|
// μΆλ‘ μ€/μ§ν λ©μμ§λ dim μΌλ‘ (μ€μ μλ¬λ μΆλ ₯ νμ μ’
ν©)
|
|
10636
10700
|
process.stdout.write(dim(s));
|
|
10637
10701
|
});
|
|
10638
10702
|
child.on('error', e => {
|
|
10703
|
+
if (spinnerInterval) clearInterval(spinnerInterval);
|
|
10639
10704
|
clearTimeout(timer);
|
|
10640
10705
|
resolve({ ok: false, error: 'child error: ' + e.message, provider });
|
|
10641
10706
|
});
|
|
10642
10707
|
child.on('close', code => {
|
|
10708
|
+
if (spinnerInterval) clearInterval(spinnerInterval);
|
|
10709
|
+
stopSpinner();
|
|
10710
|
+
flushLineBuf(); // 1.9.172: lineBuf μμ¬ flush
|
|
10643
10711
|
clearTimeout(timer);
|
|
10644
10712
|
const dt = Date.now() - t0;
|
|
10645
10713
|
process.stdout.write(dim(`\n ββ /stream (${dt}ms) ββ\n`));
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "leerness",
|
|
3
|
-
"version": "1.9.
|
|
3
|
+
"version": "1.9.172",
|
|
4
4
|
"description": "Leerness: λΉνκ΄΄ λ§μ΄κ·Έλ μ΄μ
, μλ λ²μ κ°μ§Β·μ
λ°μ΄νΈ, κ³ν/μ§ν/νΈλμ€ν μλν, κ²μΌλ¦Β·μν¬λ¦ΏΒ·μΈμ½λ© μλ κ°λ, Claude Code μ¬λμ ν΅ν©μ κ°μΆ νκ΅μ΄ μ°μ AI κ°λ° νλ€μ€.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"leerness",
|