leerness 1.9.189 β 1.9.190
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 +110 -0
- package/README.md +3 -3
- package/bin/harness.js +27 -16
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,115 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 1.9.190 β 2026-05-21
|
|
4
|
+
|
|
5
|
+
**π¨ μ€μΉ κ°μ΄λ Ctrl+C λ―Έμλ BUG fix (μ¬μ©μ λͺ
μ β npx μ§ν μ°¨λ¨).**
|
|
6
|
+
|
|
7
|
+
μμ¨ λͺ¨λ 120 λΌμ΄λ. μ¬μ©μ λͺ
μ BUG:
|
|
8
|
+
> `npx --yes leerness@latest init` μΌλ‘ μ€μΉ κ°μ΄λμμ Ctrl+C λλ₯΄λ©΄ μ€μΉ μ§νμ΄ μ·¨μλμ΄μΌ νλλ°, μ§νλλ λ²κ·Έ.
|
|
9
|
+
|
|
10
|
+
### κ·Όλ³Έ μμΈ (μ½λ audit)
|
|
11
|
+
|
|
12
|
+
1.9.34~1.9.189 μ `_selectOne` / `_selectMany` μ raw mode μ½λ:
|
|
13
|
+
```js
|
|
14
|
+
} else if (key === '\x03' || key === 'q' || key === '\x1b') {
|
|
15
|
+
cleanup();
|
|
16
|
+
stdout.write('\n μ·¨μλ¨\n');
|
|
17
|
+
resolve(opts.defaultIndex != null ? options[opts.defaultIndex] : null); // β BUG
|
|
18
|
+
}
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
Ctrl+C (`\x03`)κ° `q`/`\x1b`(ESC)μ κ°μ λΆκΈ°λ‘ λ€μ΄κ°μ **default κ° λ°ν** β install νλ¦μ΄ default μ΅μ
μΌλ‘ κ³μ μ§ν β μ¬μ©μ μλ(μ·¨μ)μ μ λ°λ λμ.
|
|
22
|
+
|
|
23
|
+
λν 1.9.184μμ μΆκ°ν `process.on('SIGINT', _sigintHandler)` μ 2λ¨κ³ confirm μ readline raw mode κ° SIGINT signal μ체λ₯Ό κ°λ‘μ±μ νΈμΆλμ§ μμ.
|
|
24
|
+
|
|
25
|
+
### Fix #1 β `_selectOne` / `_selectMany`: Ctrl+C λͺ
μ λΆκΈ° + μ¦μ μ’
λ£
|
|
26
|
+
|
|
27
|
+
```diff
|
|
28
|
+
} else if (key === '\x03') {
|
|
29
|
+
+ // 1.9.190 (μ¬μ©μ λͺ
μ BUG fix): raw mode μμ Ctrl+C β μ¦μ μ€μΉ μ’
λ£ (npx μ§ν μ°¨λ¨).
|
|
30
|
+
+ // μ΄μ (1.9.34~1.9.189): default κ° λ°ν β install νλ¦ κ³μ μ§ν (μ¬μ©μ BUG λ³΄κ³ ).
|
|
31
|
+
cleanup();
|
|
32
|
+
stdout.write('\n \x1b[31mβ μ€μΉ μ€λ¨λ¨ (Ctrl+C)\x1b[0m\n');
|
|
33
|
+
process.exit(130);
|
|
34
|
+
+} else if (key === '\x1b' || key === 'q' || key === 'Q') {
|
|
35
|
+
+ // ESC/q/Q β λ¨μ μ·¨μ (default λ°ν, install νλ¦ κ³μ)
|
|
36
|
+
cleanup();
|
|
37
|
+
stdout.write('\n μ·¨μλ¨\n');
|
|
38
|
+
resolve(opts.defaultIndex != null ? options[opts.defaultIndex] : null);
|
|
39
|
+
}
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
Ctrl+C (\x03) μ ESC/q λΆκΈ°λ₯Ό **μμ λΆλ¦¬**:
|
|
43
|
+
- **Ctrl+C** β `process.exit(130)` μ¦μ μ’
λ£
|
|
44
|
+
- **ESC/q/Q** β default κ° λ°ν (μ·¨μλ§, νλ¦ κ³μ)
|
|
45
|
+
|
|
46
|
+
### Fix #2 β `ask()` readline SIGINT λͺ
μ μ²λ¦¬
|
|
47
|
+
|
|
48
|
+
```js
|
|
49
|
+
function ask(question) {
|
|
50
|
+
return new Promise(resolve => {
|
|
51
|
+
const rl = readline.createInterface({ input: process.stdin, output: process.stdout });
|
|
52
|
+
// 1.9.190: readline μ μ체 SIGINT μ²λ¦¬ β Ctrl+C μ μ¦μ μ’
λ£.
|
|
53
|
+
rl.on('SIGINT', () => {
|
|
54
|
+
try { rl.close(); } catch {}
|
|
55
|
+
process.stdout.write('\n \x1b[31mβ μ€μΉ μ€λ¨λ¨ (Ctrl+C)\x1b[0m\n');
|
|
56
|
+
process.exit(130);
|
|
57
|
+
});
|
|
58
|
+
rl.question(question, answer => { rl.close(); resolve(String(answer || '').trim()); });
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
readline μ `'SIGINT'` μ΄λ²€νΈ β λͺ
μ μ²λ¦¬ β μ¦μ exit.
|
|
64
|
+
|
|
65
|
+
### Fix #3 β `install()` SIGINT νΈλ€λ¬ λ¨μν (2λ¨κ³ confirm μ κ±°)
|
|
66
|
+
|
|
67
|
+
```diff
|
|
68
|
+
- // 1.9.184: 2λ¨κ³ confirm (첫 λλ¦ β μλ΄, 2μ΄ λ΄ λ λ²μ§Έ β μ’
λ£)
|
|
69
|
+
- let _sigintCount = 0; let _sigintTimer = null;
|
|
70
|
+
- const _sigintHandler = () => {
|
|
71
|
+
- _sigintCount++;
|
|
72
|
+
- if (_sigintCount === 1) {
|
|
73
|
+
- process.stdout.write('Ctrl+C λ₯Ό 2μ΄ μ΄λ΄μ ν λ² λ λλ₯΄λ©΄ μ’
λ£λ©λλ€...');
|
|
74
|
+
- _sigintTimer = setTimeout(() => { _sigintCount = 0; }, 2000);
|
|
75
|
+
- return;
|
|
76
|
+
- }
|
|
77
|
+
- process.exit(130);
|
|
78
|
+
- };
|
|
79
|
+
+ // 1.9.184+1.9.190: μ€μΉ λμ€ Ctrl+C μ μ¦μ μ’
λ£ (μ¬μ©μ λͺ
μ BUG fix β npx μ§ν μ°¨λ¨).
|
|
80
|
+
+ // readline raw mode κ° SIGINT κ°λ‘μ±μ 1.9.184 2λ¨κ³ confirm λμ μ ν¨ β μ¦μ μ’
λ£λ‘ λ¨μν.
|
|
81
|
+
+ const _sigintHandler = () => {
|
|
82
|
+
+ process.stdout.write('\n \x1b[31mβ μ€μΉ μ€λ¨λ¨ (Ctrl+C)\x1b[0m\n');
|
|
83
|
+
+ process.exit(130);
|
|
84
|
+
+ };
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
### μκ° ν¨κ³Ό (λͺ¨λ fix ν΅ν©)
|
|
88
|
+
|
|
89
|
+
```
|
|
90
|
+
$ npx --yes leerness@latest init
|
|
91
|
+
π leerness μ€μΉ μμ...
|
|
92
|
+
μ€μΉ μΈμ΄λ₯Ό μ ννμΈμ
|
|
93
|
+
ββ μ΄λ, Enter νμ , q μ·¨μ
|
|
94
|
+
β― μλ κ°μ§
|
|
95
|
+
νκ΅μ΄
|
|
96
|
+
English
|
|
97
|
+
^C
|
|
98
|
+
β μ€μΉ μ€λ¨λ¨ (Ctrl+C)
|
|
99
|
+
$
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
(μ΄μ μ Ctrl+C νμλ μ€μΉκ° κ³μ μ§νλμ΄ default κ°μΌλ‘ λͺ¨λ νμΌ μμ±λ¨ β μ¬μ©μ μλμ μ λ°λ)
|
|
103
|
+
|
|
104
|
+
### Verified
|
|
105
|
+
- stress-v135: **13/13 PASS** (μ¬μ©μ λͺ
μ 5 + νκ· 2 + λμ 6)
|
|
106
|
+
- e2e 217/217 baseline μ μ§
|
|
107
|
+
- `--yes` non-interactive install: νκ· μμ
|
|
108
|
+
- ESC/q λ¨μ μ·¨μ: νκ· μμ (default λ°ν)
|
|
109
|
+
- VERSION = 1.9.190 Β· autonomous-rounds = 120 Β· main μλ push 51 λΌμ΄λ μ°μ
|
|
110
|
+
|
|
111
|
+
---
|
|
112
|
+
|
|
3
113
|
## 1.9.189 β 2026-05-21
|
|
4
114
|
|
|
5
115
|
**β¨οΈ "/" slash λͺ
λ Ή μλ list + Tab cycle ν μ€ κ°±μ (μ¬μ©μ λͺ
μ 3μ’
).**
|
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.190 AI Agent Reliability Harness + Sandbox β
|
|
16
16
|
β verify Β· remember Β· orchestrate Β· audit Β· sandbox Β· drift β
|
|
17
|
-
β
|
|
17
|
+
β π¨ μ€μΉ Ctrl+C μ¦μ μ’
λ£ BUG fix Β· 51 λΌμ΄λ main push β
|
|
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.190';
|
|
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 μ²λ¦¬).
|
|
@@ -163,6 +163,13 @@ function fm(role, readWhen, updateWhen, body) {
|
|
|
163
163
|
function ask(question) {
|
|
164
164
|
return new Promise(resolve => {
|
|
165
165
|
const rl = readline.createInterface({ input: process.stdin, output: process.stdout });
|
|
166
|
+
// 1.9.190 (μ¬μ©μ λͺ
μ BUG fix): readline μ μ체 SIGINT μ²λ¦¬ β Ctrl+C μ μ¦μ μ’
λ£.
|
|
167
|
+
// process.on('SIGINT') νΈλ€λ¬λ readline raw mode μ κ°λ €μ Έ νΈμΆ μ λ¨ β μ¬κΈ°μ λͺ
μ μ²λ¦¬.
|
|
168
|
+
rl.on('SIGINT', () => {
|
|
169
|
+
try { rl.close(); } catch {}
|
|
170
|
+
process.stdout.write('\n \x1b[31mβ μ€μΉ μ€λ¨λ¨ (Ctrl+C)\x1b[0m\n');
|
|
171
|
+
process.exit(130);
|
|
172
|
+
});
|
|
166
173
|
rl.question(question, answer => { rl.close(); resolve(String(answer || '').trim()); });
|
|
167
174
|
});
|
|
168
175
|
}
|
|
@@ -783,20 +790,12 @@ async function resolveInstallOptions(root, opts = {}) {
|
|
|
783
790
|
|
|
784
791
|
async function install(root, opts = {}) {
|
|
785
792
|
root = absRoot(root); mkdirp(root);
|
|
786
|
-
// 1.9.184
|
|
787
|
-
//
|
|
788
|
-
//
|
|
789
|
-
let
|
|
793
|
+
// 1.9.184+1.9.190: μ€μΉ λμ€ Ctrl+C μ μ¦μ μ’
λ£ (μ¬μ©μ λͺ
μ BUG fix β npx μ€μΉ μ§ν μ°¨λ¨).
|
|
794
|
+
// 1.9.184 μ 2λ¨κ³ confirm μ readline raw mode κ° SIGINT κ°λ‘μ±μ νΈμΆ μ λ¨ β 1.9.190 μ¦μ μ’
λ£λ‘ λ¨μν.
|
|
795
|
+
// _selectOne/_selectMany λ stdin '\x03' μ§μ μ²λ¦¬, ask() λ rl.on('SIGINT') μ²λ¦¬, μ΄ νΈλ€λ¬λ fallback.
|
|
796
|
+
let _sigintTimer = null; // back-compat: 1.9.184 placeholder
|
|
790
797
|
const _sigintHandler = () => {
|
|
791
|
-
|
|
792
|
-
if (_sigintCount === 1) {
|
|
793
|
-
try { process.stdout.write('\n\n β μ€μΉ μ€λ¨νμκ² μ΅λκΉ? Ctrl+C λ₯Ό 2μ΄ μ΄λ΄μ ν λ² λ λλ₯΄λ©΄ μ’
λ£λ©λλ€. (κ·Έ μΈ β κ³μ μ§ν)\n'); } catch {}
|
|
794
|
-
clearTimeout(_sigintTimer);
|
|
795
|
-
_sigintTimer = setTimeout(() => { _sigintCount = 0; }, 2000);
|
|
796
|
-
return;
|
|
797
|
-
}
|
|
798
|
-
clearTimeout(_sigintTimer);
|
|
799
|
-
try { process.stdout.write('\n β μ€μΉ μ€λ¨λ¨ (μ¬μ©μ μμ²)\n'); } catch {}
|
|
798
|
+
try { process.stdout.write('\n \x1b[31mβ μ€μΉ μ€λ¨λ¨ (Ctrl+C)\x1b[0m\n'); } catch {}
|
|
800
799
|
process.exit(130);
|
|
801
800
|
};
|
|
802
801
|
if (!opts.migration && !opts.nonInteractive && process.stdin.isTTY) {
|
|
@@ -5539,7 +5538,13 @@ async function _selectOne(question, options, opts = {}) {
|
|
|
5539
5538
|
cleanup();
|
|
5540
5539
|
stdout.write('\n');
|
|
5541
5540
|
resolve(options[idx]);
|
|
5542
|
-
} else if (key === ''
|
|
5541
|
+
} else if (key === '') {
|
|
5542
|
+
// 1.9.190 (μ¬μ©μ λͺ
μ BUG fix): raw mode μμ Ctrl+C β μ¦μ μ€μΉ μ’
λ£ (npx μ§ν μ°¨λ¨).
|
|
5543
|
+
// μ΄μ (1.9.34~1.9.189): default κ° λ°ν β install νλ¦ κ³μ μ§ν (μ¬μ©μ BUG λ³΄κ³ ).
|
|
5544
|
+
cleanup();
|
|
5545
|
+
stdout.write('\n \x1b[31mβ μ€μΉ μ€λ¨λ¨ (Ctrl+C)\x1b[0m\n');
|
|
5546
|
+
process.exit(130);
|
|
5547
|
+
} else if (key === '' || key === 'q' || key === 'Q') {
|
|
5543
5548
|
cleanup();
|
|
5544
5549
|
stdout.write('\n' + C.dim(' μ·¨μλ¨') + '\n');
|
|
5545
5550
|
resolve(opts.defaultIndex != null ? options[opts.defaultIndex] : null);
|
|
@@ -5607,7 +5612,13 @@ async function _selectMany(question, options, opts = {}) {
|
|
|
5607
5612
|
cleanup();
|
|
5608
5613
|
stdout.write('\n');
|
|
5609
5614
|
resolve([...selected].sort((a, b) => a - b).map(i => options[i]));
|
|
5610
|
-
} else if (key === ''
|
|
5615
|
+
} else if (key === '') {
|
|
5616
|
+
// 1.9.190 (μ¬μ©μ λͺ
μ BUG fix): raw mode μμ Ctrl+C β μ¦μ μ€μΉ μ’
λ£ (npx μ§ν μ°¨λ¨).
|
|
5617
|
+
// μ΄μ (1.9.34~1.9.189): default κ° λ°ν β install νλ¦ κ³μ μ§ν (μ¬μ©μ BUG λ³΄κ³ ).
|
|
5618
|
+
cleanup();
|
|
5619
|
+
stdout.write('\n \x1b[31mβ μ€μΉ μ€λ¨λ¨ (Ctrl+C)\x1b[0m\n');
|
|
5620
|
+
process.exit(130);
|
|
5621
|
+
} else if (key === '' || key === 'q' || key === 'Q') {
|
|
5611
5622
|
cleanup();
|
|
5612
5623
|
stdout.write('\n' + C.dim(' μ·¨μλ¨ (κΈ°λ³Έκ° μ¬μ©)') + '\n');
|
|
5613
5624
|
resolve((opts.defaults || []).map(d => typeof d === 'number' ? options[d] : d).filter(Boolean));
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "leerness",
|
|
3
|
-
"version": "1.9.
|
|
3
|
+
"version": "1.9.190",
|
|
4
4
|
"description": "Leerness: λΉνκ΄΄ λ§μ΄κ·Έλ μ΄μ
, μλ λ²μ κ°μ§Β·μ
λ°μ΄νΈ, κ³ν/μ§ν/νΈλμ€ν μλν, κ²μΌλ¦Β·μν¬λ¦ΏΒ·μΈμ½λ© μλ κ°λ, Claude Code μ¬λμ ν΅ν©μ κ°μΆ νκ΅μ΄ μ°μ AI κ°λ° νλ€μ€.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"leerness",
|