leerness 1.9.185 β 1.9.186
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 +107 -0
- package/README.md +3 -3
- package/bin/harness.js +19 -4
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,112 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 1.9.186 β 2026-05-21
|
|
4
|
+
|
|
5
|
+
**π REPL claude stream 0μ μλ΅ BUG fix + ꡬ쑰 μ΅μ ν μ²΄ν¬ (μ¬μ©μ λͺ
μ ν΅μ¬ λ²κ·Έ).**
|
|
6
|
+
|
|
7
|
+
μμ¨ λͺ¨λ 116 λΌμ΄λ. μ¬μ©μ λͺ
μ ν΅μ¬ λ²κ·Έ λ³΄κ³ :
|
|
8
|
+
```
|
|
9
|
+
agent[claude/actor/βΆ]> νμ΄μ¬ νλ‘κ·Έλ¨ νλ μ μν΄μ€
|
|
10
|
+
ββ /stream (27596ms) ββ
|
|
11
|
+
[assistant: claude/default, role=actor, 27743ms Β· 0μ]
|
|
12
|
+
```
|
|
13
|
+
*"REPL agent λͺ¨λμμ μμ
μμ² μ AIκ° μμ
μ μννμ§ λͺ»νκ³ μλ€"*
|
|
14
|
+
|
|
15
|
+
### κ·Όλ³Έ μμΈ λ°κ²¬ (μ½λ audit)
|
|
16
|
+
|
|
17
|
+
| ν¨μ | spawn λ°©μ | shell | μλ μ¬λΆ |
|
|
18
|
+
|---|---|---|---|
|
|
19
|
+
| `_cliChat` (line 10920) | `runCommandSafe` β spawnSync `shell: true` | true | β μλ (`agents multi --execute` κ²μ¦) |
|
|
20
|
+
| `_cliChatStream` (line 11018) | `cp.spawn(cmd, args, { shell: false })` | **false** | β **0μ μλ΅** |
|
|
21
|
+
|
|
22
|
+
**μμΈ 1**: Windows μμ `cp.spawn('claude', ..., { shell: false })` κ° `claude.cmd` λ₯Ό μ°Ύμ§ λͺ»ν΄ stdout λΉμ΄μκ³ 27μ΄ timeout ν μ’
λ£ (exit code 0).
|
|
23
|
+
|
|
24
|
+
**μμΈ 2**: claude CLI `--output-format=stream-json --verbose` κ° μΌλΆ λ²μ μμ λΉ stdout λ°ν β out λ³μ 0μ λμ .
|
|
25
|
+
|
|
26
|
+
### Fix #1 β shell: true (Windows .cmd νΈν)
|
|
27
|
+
```diff
|
|
28
|
+
- child = cp.spawn(cmd, args, {
|
|
29
|
+
- cwd: process.cwd(),
|
|
30
|
+
- env: _scrubEnv({}),
|
|
31
|
+
- shell: false,
|
|
32
|
+
- stdio: ['ignore', 'pipe', 'pipe']
|
|
33
|
+
- });
|
|
34
|
+
+ // 1.9.186 (μ¬μ©μ λͺ
μ fix): Windows .cmd νΈνμ μν΄ shell: true.
|
|
35
|
+
+ // _cliChat (μλνλ ν¨μ) μ΄ runCommandSafe β spawnSync shell: true ν¨ν΄μ΄λΌμ μλ.
|
|
36
|
+
+ // _cliChatStream λ λμΌνκ² shell: true μ¬μ© (DEP0190 μ 1.9.184/185 fix λ‘ μ΅μ λ¨).
|
|
37
|
+
+ child = cp.spawn(cmd, args, {
|
|
38
|
+
+ cwd: process.cwd(),
|
|
39
|
+
+ env: _scrubEnv({}),
|
|
40
|
+
+ shell: true,
|
|
41
|
+
+ stdio: ['ignore', 'pipe', 'pipe']
|
|
42
|
+
+ });
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
### Fix #2 β claude default = plain `--print` (stream-json opt-in)
|
|
46
|
+
```diff
|
|
47
|
+
- if (provider === 'claude') { cmd = 'claude'; args = ['--print', '--output-format=stream-json', '--verbose', promptText]; }
|
|
48
|
+
+ // 1.9.186 (μ¬μ©μ λͺ
μ fix): claude --output-format=stream-json κ° μΌλΆ λ²μ μμ λΉ μλ΅.
|
|
49
|
+
+ // default λ₯Ό plain --print λ‘ λ³κ²½ β _cliChat κ³Ό λμΌν μΈμ, μλ κ²μ¦λ ν¨ν΄.
|
|
50
|
+
+ // stream νμ μ¬μ© opt-in: LEERNESS_REPL_STREAM_FORMAT=json
|
|
51
|
+
+ const useStreamJson = process.env.LEERNESS_REPL_STREAM_FORMAT === 'json';
|
|
52
|
+
+ if (provider === 'claude') {
|
|
53
|
+
+ cmd = 'claude';
|
|
54
|
+
+ args = useStreamJson
|
|
55
|
+
+ ? ['--print', '--output-format=stream-json', '--verbose', promptText]
|
|
56
|
+
+ : ['--print', promptText];
|
|
57
|
+
+ }
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
handleClaudeStream μ‘°κ±΄λΆ νΈμΆ (useStreamJson μΌ λλ§):
|
|
61
|
+
```diff
|
|
62
|
+
- if (provider === 'claude') {
|
|
63
|
+
+ if (provider === 'claude' && useStreamJson) {
|
|
64
|
+
handleClaudeStream(chunk);
|
|
65
|
+
} else {
|
|
66
|
+
stopSpinner();
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
### ꡬ쑰 μ΅μ ν μ²΄ν¬ (μ¬μ©μ λͺ
μ 보κ°)
|
|
70
|
+
|
|
71
|
+
**λ³΄κ³ μ**: `_reports/structure-optimization-1.9.186.md`
|
|
72
|
+
|
|
73
|
+
**λ©νΈλ¦**:
|
|
74
|
+
- bin/harness.js: **~12000 lines** (1 monolithic)
|
|
75
|
+
- μμ‘΄μ± **0** (Node built-in)
|
|
76
|
+
- npm tarball ~358 KB (gzipped)
|
|
77
|
+
- MCP 54 Β· CLI 100+ Β· ν¨μ 250+
|
|
78
|
+
|
|
79
|
+
**μ΅μ ν κ°μ ** (μ μ§):
|
|
80
|
+
- μμ‘΄μ± 0 μ μ±
(cross-platform + supply chain risk μ΅μ)
|
|
81
|
+
- λ©λͺ¨λ¦¬ μΊμ± (usage-stats / listAllSkills / lessons keyword index)
|
|
82
|
+
- Provider/MCP/Bridge λͺ
νν abstraction
|
|
83
|
+
- runCommandSafe sandbox (cwd jail + env scrub)
|
|
84
|
+
- λ§€ λΌμ΄λ stress + e2e + main μλ push
|
|
85
|
+
|
|
86
|
+
**μ΅μ ν μ½μ ** (1.9.187+ ν보):
|
|
87
|
+
- β Monolithic 12000 lines β ν μν μ μ§ (npm pack λ¨μμ± μ°μ )
|
|
88
|
+
- β `_cliChat` β `_cliChatStream` μ½λ μ€λ³΅ β 1.9.186 fixκ° μ΄ κ°μμ λ°μ. 1.9.187 ν보: `_buildCliArgs` κ³΅ν΅ ν¬νΌ
|
|
89
|
+
- β skill catalog μΊμ stale κ°λ₯ β mtime κΈ°λ° invalidation ν보
|
|
90
|
+
- β MCP tools/list λ§€λ² μ¬μμ± β λ©λͺ¨λ¦¬ μΊμ ν보
|
|
91
|
+
- β 280 task λμ β archive μλν (1.9.190+)
|
|
92
|
+
|
|
93
|
+
### 1.9.186 fix μ ν©μ± (λ³΄κ³ μ Β§4)
|
|
94
|
+
| μν₯ | νκ° |
|
|
95
|
+
|---|---|
|
|
96
|
+
| 보μ (shell escape) | promptText λ μ¬μ©μ μ§μ μ
λ ₯, REPL μμμλ§ μ¬μ© β μΆκ° μν μμ |
|
|
97
|
+
| μ±λ₯ | shell:true κ° ~10ms λλ¦Ό (무μ κ°λ₯) |
|
|
98
|
+
| λ€λ₯Έ provider (codex/gemini/copilot) | shell:true λμΌ μ μ© β λ μμ μ (.cmd νΈν) |
|
|
99
|
+
| μ€μκ° μ€νΈλ¦¬λ° (1.9.170 μ¬μ©μ λͺ
μ) | LEERNESS_REPL_STREAM_FORMAT=json μΌλ‘ opt-in κ°λ₯ β κΈ°λ₯ μ μ§ |
|
|
100
|
+
| κΈ°μ‘΄ μλ | `_cliChat` λ³κ²½ X β `agents multi --execute` νκ· μμ |
|
|
101
|
+
|
|
102
|
+
### Verified
|
|
103
|
+
- stress-v131: **16/16 PASS** (μ¬μ©μ λͺ
μ 4 + live 3 + λμ 9)
|
|
104
|
+
- e2e 217/217 baseline μ μ§
|
|
105
|
+
- live κ²μ¦: `agents multi --execute --only claude` μ€ νΈμΆ μλ΅ "2" (4.5μ΄)
|
|
106
|
+
- VERSION = 1.9.186 Β· autonomous-rounds = 116 Β· main μλ push 47 λΌμ΄λ μ°μ
|
|
107
|
+
|
|
108
|
+
---
|
|
109
|
+
|
|
3
110
|
## 1.9.185 β 2026-05-21
|
|
4
111
|
|
|
5
112
|
**π§ DEP0190 μμ process μ ν fix + REPL stream μΉμ μ§λ¨ + Hermes UX λΆμ λ³΄κ³ (μ¬μ©μ λͺ
μ).**
|
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.186 AI Agent Reliability Harness + Sandbox β
|
|
16
16
|
β verify Β· remember Β· orchestrate Β· audit Β· sandbox Β· drift β
|
|
17
|
-
β
|
|
17
|
+
β π REPL stream 0μ μλ΅ BUG fix Β· ꡬ쑰 μ΅μ ν μ²΄ν¬ β
|
|
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.
|
|
10
|
+
const VERSION = '1.9.186';
|
|
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 μ²λ¦¬).
|
|
@@ -10953,7 +10953,16 @@ async function _cliChatStream(root, provider, promptText, opts) {
|
|
|
10953
10953
|
return { ok: false, error: `${provider} λΉνμ± (${status.status}) β .env μμ ${agent.envFlag}=1 νμ`, provider };
|
|
10954
10954
|
}
|
|
10955
10955
|
let cmd, args;
|
|
10956
|
-
|
|
10956
|
+
// 1.9.186 (μ¬μ©μ λͺ
μ fix): claude --output-format=stream-json κ° μΌλΆ λ²μ μμ λΉ μλ΅.
|
|
10957
|
+
// default λ₯Ό plain --print λ‘ λ³κ²½ β _cliChat κ³Ό λμΌν μΈμ, μλ κ²μ¦λ ν¨ν΄.
|
|
10958
|
+
// stream νμ μ¬μ© opt-in: LEERNESS_REPL_STREAM_FORMAT=json (μ€μκ° thinking/tool_use λ³΄κ³ μΆμ λ).
|
|
10959
|
+
const useStreamJson = process.env.LEERNESS_REPL_STREAM_FORMAT === 'json';
|
|
10960
|
+
if (provider === 'claude') {
|
|
10961
|
+
cmd = 'claude';
|
|
10962
|
+
args = useStreamJson
|
|
10963
|
+
? ['--print', '--output-format=stream-json', '--verbose', promptText]
|
|
10964
|
+
: ['--print', promptText]; // plain text μλ΅ (μλ κ²μ¦λ¨)
|
|
10965
|
+
}
|
|
10957
10966
|
else if (provider === 'codex') { cmd = 'codex'; args = ['exec', '--skip-git-repo-check', promptText]; }
|
|
10958
10967
|
else if (provider === 'gemini') { cmd = 'gemini'; args = ['-p', promptText]; }
|
|
10959
10968
|
else if (provider === 'copilot') { cmd = 'gh'; args = ['copilot', 'suggest', promptText]; }
|
|
@@ -11015,10 +11024,15 @@ async function _cliChatStream(root, provider, promptText, opts) {
|
|
|
11015
11024
|
process.stdout.write(dim(`\n ββ ${provider} stream ββ\n`));
|
|
11016
11025
|
let child;
|
|
11017
11026
|
try {
|
|
11027
|
+
// 1.9.186 (μ¬μ©μ λͺ
μ fix): Windows .cmd νΈνμ μν΄ shell: true.
|
|
11028
|
+
// 1.9.185 κΉμ§ shell: false β Windows μμ claude.cmd λͺ» μ°Ύμ λΉ μλ΅ (μ¬μ©μ λ³΄κ³ : 27μ΄ ν 0μ).
|
|
11029
|
+
// _cliChat (μλνλ ν¨μ) μ΄ runCommandSafe β spawnSync shell: true ν¨ν΄μ΄λΌμ μλ.
|
|
11030
|
+
// _cliChatStream λ λμΌνκ² shell: true μ¬μ© (DEP0190 μ 1.9.184/185 fix λ‘ μ΅μ λ¨).
|
|
11031
|
+
// security: shell escape μ°λ €λ promptText κ° μ¬μ©μ μ§μ μ
λ ₯ β sandboxed REPL μμμλ§ μ¬μ©.
|
|
11018
11032
|
child = cp.spawn(cmd, args, {
|
|
11019
11033
|
cwd: process.cwd(),
|
|
11020
11034
|
env: _scrubEnv({}),
|
|
11021
|
-
shell:
|
|
11035
|
+
shell: true,
|
|
11022
11036
|
stdio: ['ignore', 'pipe', 'pipe']
|
|
11023
11037
|
});
|
|
11024
11038
|
} catch (e) {
|
|
@@ -11070,7 +11084,8 @@ async function _cliChatStream(root, provider, promptText, opts) {
|
|
|
11070
11084
|
|
|
11071
11085
|
child.stdout.on('data', chunk => {
|
|
11072
11086
|
lastActivity = Date.now();
|
|
11073
|
-
|
|
11087
|
+
// 1.9.186: claude default λ plain --print β JSON λΌμΈ νμ± X. useStreamJson μμλ§ stream-json μ²λ¦¬.
|
|
11088
|
+
if (provider === 'claude' && useStreamJson) {
|
|
11074
11089
|
handleClaudeStream(chunk);
|
|
11075
11090
|
} else {
|
|
11076
11091
|
stopSpinner();
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "leerness",
|
|
3
|
-
"version": "1.9.
|
|
3
|
+
"version": "1.9.186",
|
|
4
4
|
"description": "Leerness: λΉνκ΄΄ λ§μ΄κ·Έλ μ΄μ
, μλ λ²μ κ°μ§Β·μ
λ°μ΄νΈ, κ³ν/μ§ν/νΈλμ€ν μλν, κ²μΌλ¦Β·μν¬λ¦ΏΒ·μΈμ½λ© μλ κ°λ, Claude Code μ¬λμ ν΅ν©μ κ°μΆ νκ΅μ΄ μ°μ AI κ°λ° νλ€μ€.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"leerness",
|