leerness 1.9.183 β 1.9.184
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 +87 -0
- package/README.md +3 -3
- package/bin/harness.js +53 -4
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,92 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 1.9.184 β 2026-05-21
|
|
4
|
+
|
|
5
|
+
**π¨ μ€μΉ UX 4μ’
β Ctrl+C νμΈ prompt + λ‘λ©λ° + skillpack μ μΈ + DEP0190 μ΅μ (μ¬μ©μ λͺ
μ).**
|
|
6
|
+
|
|
7
|
+
μμ¨ λͺ¨λ 114 λΌμ΄λ. μ¬μ©μ λͺ
μ 4μ’
:
|
|
8
|
+
1. *"μ€μΉ κ°μ΄λμμ Ctrl+C μ
λ ₯ μ μ€μΉ μ’
λ£ μ¬λΆ νμΈ λ‘μ§ μΆκ°"* β SIGINT handler (2λ¨κ³ confirm)
|
|
9
|
+
2. *"leerness νμΌ μ€μΉ μμ μ λ‘λ©λ°λ‘ ꡬν + μμ± λͺ©λ‘ λμ΄ X"* β progress bar (TTY)
|
|
10
|
+
3. *"leerness-skillpack λ―Έμ¬μ© μμ β μ μΈ"* β μλ΄ λ©μμ§ μ κ±°
|
|
11
|
+
4. *"REPL agent λͺ¨λ μ§μ
μ DEP0190 deprecation warning μ κ±°"* β process warning handler
|
|
12
|
+
|
|
13
|
+
### Fix #1 β Ctrl+C μ’
λ£ νμΈ prompt
|
|
14
|
+
```js
|
|
15
|
+
// 1.9.184 (μ¬μ©μ λͺ
μ): μ€μΉ λμ€ Ctrl+C μ μ’
λ£ νμΈ prompt.
|
|
16
|
+
// 첫 Ctrl+C β μλ΄ (2μ΄ μ΄λ΄ ν λ² λ β μ’
λ£, κ·Έ μΈ β κ³μ).
|
|
17
|
+
let _sigintCount = 0; let _sigintTimer = null;
|
|
18
|
+
const _sigintHandler = () => {
|
|
19
|
+
_sigintCount++;
|
|
20
|
+
if (_sigintCount === 1) {
|
|
21
|
+
process.stdout.write('\n\n β μ€μΉ μ€λ¨νμκ² μ΅λκΉ? Ctrl+C λ₯Ό 2μ΄ μ΄λ΄μ ν λ² λ λλ₯΄λ©΄ μ’
λ£λ©λλ€. (κ·Έ μΈ β κ³μ μ§ν)\n');
|
|
22
|
+
_sigintTimer = setTimeout(() => { _sigintCount = 0; }, 2000);
|
|
23
|
+
return;
|
|
24
|
+
}
|
|
25
|
+
process.exit(130);
|
|
26
|
+
};
|
|
27
|
+
```
|
|
28
|
+
install μμμ λ±λ‘, μ’
λ£/REPL μ§μ
μ cleanup.
|
|
29
|
+
|
|
30
|
+
### Fix #2 β νμΌ μ€μΉ progress bar (μμ± λͺ©λ‘ λ―Ένμ)
|
|
31
|
+
**Before** (line by line):
|
|
32
|
+
```
|
|
33
|
+
β create: AGENTS.md
|
|
34
|
+
β create: CLAUDE.md
|
|
35
|
+
β create: .harness/HARNESS_VERSION
|
|
36
|
+
β create: .harness/manifest.json
|
|
37
|
+
... (μμ μ€)
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
**After** (single progress bar):
|
|
41
|
+
```
|
|
42
|
+
ββββββββββββββββββββ 24/30 (80%) .harness/skills/office/SKILL.md
|
|
43
|
+
```
|
|
44
|
+
μλ£ μ:
|
|
45
|
+
```
|
|
46
|
+
β leerness νμΌ μ€μΉ μλ£ (30κ°)
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
### Fix #3 β leerness-skillpack μλ΄ μ κ±°
|
|
50
|
+
```diff
|
|
51
|
+
- if (SKILLPACK_SOURCE === 'builtin') log(`Skill catalog source: builtin (leerness-skillpack λ―Έμ€μΉ β npm i leerness-skillpack λ‘ νμ₯ κ°λ₯)`);
|
|
52
|
+
- else log(`Skill catalog source: ${SKILLPACK_SOURCE} (leerness-skillpack${SKILLPACK_META ? ` v${SKILLPACK_META.version}` : ''})`);
|
|
53
|
+
+ // 1.9.184 (μ¬μ©μ λͺ
μ): leerness-skillpack λ―Έμ¬μ© μ μ±
β μλ΄ λ©μμ§ μ κ±°. builtin catalog λ§ μ¬μ©.
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
### Fix #4 β DEP0190 DeprecationWarning μ΅μ
|
|
57
|
+
νμΌ μ΅μλ¨μμ process warning handler λ±λ‘:
|
|
58
|
+
```js
|
|
59
|
+
// 1.9.184: DEP0190 (child_process shell: true) deprecation warning μ΅μ (μ¬μ©μ λͺ
μ).
|
|
60
|
+
// leerness λ cross-platform PATH resolution μ μν΄ shell: true λ₯Ό μλμ μΌλ‘ μ¬μ©.
|
|
61
|
+
process.removeAllListeners('warning');
|
|
62
|
+
process.on('warning', (w) => {
|
|
63
|
+
if (w && (w.code === 'DEP0190' || /DEP0190/.test(String(w.message || '')))) return;
|
|
64
|
+
process.stderr.write(`(node:${process.pid}) ${w.name || 'Warning'}: ${w.message || w}\n`);
|
|
65
|
+
});
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
**Before** (REPL μ§μ
μ):
|
|
69
|
+
```
|
|
70
|
+
agent[claude/actor/βΆ]> (node:54076) [DEP0190] DeprecationWarning: Passing args to a child process with shell option true...
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
**After** (REPL μ§μ
μ):
|
|
74
|
+
```
|
|
75
|
+
agent[claude/actor/βΆ]> _
|
|
76
|
+
```
|
|
77
|
+
κΉλ.
|
|
78
|
+
|
|
79
|
+
### Verified
|
|
80
|
+
- stress-v129: **14/14 PASS** (μ¬μ©μ λͺ
μ 4 + live install 3 + λμ 7)
|
|
81
|
+
- e2e 217/217 baseline μ μ§
|
|
82
|
+
- live install κ²μ¦:
|
|
83
|
+
- DEP0190 μΆλ ₯ μ λ¨ β
|
|
84
|
+
- "Skill catalog source: builtin" μλ΄ μμ β
|
|
85
|
+
- νμΌ μμ± λͺ©λ‘ 0건 (non-TTY) β
|
|
86
|
+
- VERSION = 1.9.184 Β· autonomous-rounds = 114 Β· main μλ push 45 λΌμ΄λ μ°μ
|
|
87
|
+
|
|
88
|
+
---
|
|
89
|
+
|
|
3
90
|
## 1.9.183 β 2026-05-21
|
|
4
91
|
|
|
5
92
|
**π¦ npm i leerness + ꡬλ²μ μλ κ°μ§/κ²½κ³ /μ
λ°μ΄νΈ λͺ
λ Ήμ΄ μλ΄ (μ¬μ©μ λͺ
μ 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.184 AI Agent Reliability Harness + Sandbox β
|
|
16
16
|
β verify Β· remember Β· orchestrate Β· audit Β· sandbox Β· drift β
|
|
17
|
-
β
|
|
17
|
+
β π¨ μ€μΉ UX κ°μ (λ‘λ©λ°Β·Ctrl+CνμΈΒ·DEP0190 μ΅μ Β·κΉ¨λν REPL) β
|
|
18
18
|
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
|
|
19
19
|
```
|
|
20
20
|
|
package/bin/harness.js
CHANGED
|
@@ -7,7 +7,17 @@ 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.184';
|
|
11
|
+
|
|
12
|
+
// 1.9.184: DEP0190 (child_process shell: true) deprecation warning μ΅μ (μ¬μ©μ λͺ
μ).
|
|
13
|
+
// leerness λ cross-platform PATH resolution μ μν΄ shell: true λ₯Ό μλμ μΌλ‘ μ¬μ© (claude.cmd / ollama.cmd λ± Windows .cmd μ²λ¦¬).
|
|
14
|
+
// μΈμ escape κ° νμν μμΉλ κ²μ¦λ μ
λ ₯λ§ spawnSync μ μ λ¬. REPL agent μ§μ
μ _checkAgent κ° λ°μ°νλ λ
Έμ΄μ¦ μ κ±°.
|
|
15
|
+
process.removeAllListeners('warning');
|
|
16
|
+
process.on('warning', (w) => {
|
|
17
|
+
if (w && (w.code === 'DEP0190' || /DEP0190/.test(String(w.message || '')))) return;
|
|
18
|
+
process.stderr.write(`(node:${process.pid}) ${w.name || 'Warning'}: ${w.message || w}\n`);
|
|
19
|
+
});
|
|
20
|
+
|
|
11
21
|
const MARK = '<!-- leerness:managed -->';
|
|
12
22
|
const README_START = '<!-- leerness:project-readme:start -->';
|
|
13
23
|
const README_END = '<!-- leerness:project-readme:end -->';
|
|
@@ -767,6 +777,26 @@ async function resolveInstallOptions(root, opts = {}) {
|
|
|
767
777
|
|
|
768
778
|
async function install(root, opts = {}) {
|
|
769
779
|
root = absRoot(root); mkdirp(root);
|
|
780
|
+
// 1.9.184 (μ¬μ©μ λͺ
μ): μ€μΉ λμ€ Ctrl+C μ μ’
λ£ νμΈ prompt.
|
|
781
|
+
// 첫 Ctrl+C β μλ΄ (2μ΄ μ΄λ΄ ν λ² λ β μ’
λ£, κ·Έ μΈ β κ³μ).
|
|
782
|
+
// readline raw mode μ readline μ΄ 'SIGINT' μ΄λ²€νΈλ‘ ν‘μν μ μμ΄ process-level + finally ν΄μ .
|
|
783
|
+
let _sigintCount = 0; let _sigintTimer = null;
|
|
784
|
+
const _sigintHandler = () => {
|
|
785
|
+
_sigintCount++;
|
|
786
|
+
if (_sigintCount === 1) {
|
|
787
|
+
try { process.stdout.write('\n\n β μ€μΉ μ€λ¨νμκ² μ΅λκΉ? Ctrl+C λ₯Ό 2μ΄ μ΄λ΄μ ν λ² λ λλ₯΄λ©΄ μ’
λ£λ©λλ€. (κ·Έ μΈ β κ³μ μ§ν)\n'); } catch {}
|
|
788
|
+
clearTimeout(_sigintTimer);
|
|
789
|
+
_sigintTimer = setTimeout(() => { _sigintCount = 0; }, 2000);
|
|
790
|
+
return;
|
|
791
|
+
}
|
|
792
|
+
clearTimeout(_sigintTimer);
|
|
793
|
+
try { process.stdout.write('\n β μ€μΉ μ€λ¨λ¨ (μ¬μ©μ μμ²)\n'); } catch {}
|
|
794
|
+
process.exit(130);
|
|
795
|
+
};
|
|
796
|
+
if (!opts.migration && !opts.nonInteractive && process.stdin.isTTY) {
|
|
797
|
+
process.on('SIGINT', _sigintHandler);
|
|
798
|
+
}
|
|
799
|
+
const _cleanupSigint = () => { try { process.removeListener('SIGINT', _sigintHandler); clearTimeout(_sigintTimer); } catch {} };
|
|
770
800
|
// 1.9.41: migrate μ§μ μ΄μ λ²μ μΊ‘μ² β μ°¨λΆ μλ΄μ μ¬μ©
|
|
771
801
|
try {
|
|
772
802
|
const hv = path.join(root, '.harness', 'HARNESS_VERSION');
|
|
@@ -796,8 +826,7 @@ async function install(root, opts = {}) {
|
|
|
796
826
|
if (resolved.startRepl) log(`REPL μλ μμ: μ (μ€μΉ μλ£ ν \`leerness agent\` μ§μ
)`);
|
|
797
827
|
if (resolved.permissionMode) log(`Agent κΆν λͺ¨λ: ${resolved.permissionMode} (1.9.174 β REPLμμ \`:permissions extended|full\` λ‘ μ¦μ λ³κ²½ κ°λ₯)`);
|
|
798
828
|
// 1.9.10: μ€ν¬ μΉ΄νλ‘κ·Έ μΆμ² μλ΄
|
|
799
|
-
|
|
800
|
-
else log(`Skill catalog source: ${SKILLPACK_SOURCE} (leerness-skillpack${SKILLPACK_META ? ` v${SKILLPACK_META.version}` : ''})`);
|
|
829
|
+
// 1.9.184 (μ¬μ©μ λͺ
μ): leerness-skillpack λ―Έμ¬μ© μ μ±
β μλ΄ λ©μμ§ μ κ±°. builtin catalog λ§ μ¬μ©.
|
|
801
830
|
const files = coreFiles(root, lang, skills);
|
|
802
831
|
const backup = createBackup(root, opts.force ? 'force' : (opts.migration ? 'migration' : 'init'), files, opts.dry);
|
|
803
832
|
if (opts.dry) {
|
|
@@ -816,7 +845,20 @@ async function install(root, opts = {}) {
|
|
|
816
845
|
'.claude/commands/handoff.md','.claude/commands/session-close.md','.claude/commands/audit.md','.claude/commands/lazy-detect.md','.claude/commands/update.md',
|
|
817
846
|
'.claude/skills/leerness.md'
|
|
818
847
|
]);
|
|
848
|
+
// 1.9.184 (μ¬μ©μ λͺ
μ): νμΌ μ€μΉ β μμ± λͺ©λ‘ λμ΄ X, λ‘λ©λ° + λ¨μΌ μλ£ λ©μμ§.
|
|
819
849
|
const actions = [];
|
|
850
|
+
const totalFiles = Object.keys(files).length;
|
|
851
|
+
const isTty = process.stdout.isTTY && !opts.dry;
|
|
852
|
+
const drawProgress = (done, file) => {
|
|
853
|
+
if (!isTty) return;
|
|
854
|
+
const pct = Math.round(done * 100 / totalFiles);
|
|
855
|
+
const filled = Math.floor(pct / 5);
|
|
856
|
+
const bar = '\x1b[36m' + 'β'.repeat(filled) + '\x1b[2m' + 'β'.repeat(20 - filled) + '\x1b[0m';
|
|
857
|
+
const truncFile = (file || '').length > 32 ? '...' + file.slice(-29) : (file || '');
|
|
858
|
+
process.stdout.write(`\r ${bar} \x1b[1m${done}/${totalFiles}\x1b[0m (${pct}%) \x1b[2m${truncFile}\x1b[0m\x1b[K`);
|
|
859
|
+
};
|
|
860
|
+
drawProgress(0, '');
|
|
861
|
+
let _done = 0;
|
|
820
862
|
for (const [f, c] of Object.entries(files)) {
|
|
821
863
|
const existsNow = exists(path.join(root, f));
|
|
822
864
|
const mergeManaged = managedOverwrite.has(f);
|
|
@@ -828,7 +870,12 @@ async function install(root, opts = {}) {
|
|
|
828
870
|
}
|
|
829
871
|
const r = writeIfSafe(root, f, c, { force: opts.force, mergeManaged, archiveDir: backup.archiveDir });
|
|
830
872
|
actions.push(r);
|
|
831
|
-
|
|
873
|
+
_done++;
|
|
874
|
+
drawProgress(_done, f);
|
|
875
|
+
}
|
|
876
|
+
if (isTty) {
|
|
877
|
+
process.stdout.write('\r\x1b[K'); // clear progress line
|
|
878
|
+
log(` \x1b[32mβ\x1b[0m leerness νμΌ μ€μΉ μλ£ (${totalFiles}κ°)`);
|
|
832
879
|
}
|
|
833
880
|
if (!opts.dry) {
|
|
834
881
|
mergeLinesFile(path.join(root, '.gitignore'), [
|
|
@@ -943,11 +990,13 @@ async function install(root, opts = {}) {
|
|
|
943
990
|
log('');
|
|
944
991
|
log('π μ€μΉ μλ£ β REPL agent λͺ¨λλ₯Ό μμν©λλ€...');
|
|
945
992
|
log('');
|
|
993
|
+
_cleanupSigint(); // 1.9.184: REPL μ§μ
μ SIGINT handler ν΄μ (readline μ΄ μ체 μ²λ¦¬)
|
|
946
994
|
try {
|
|
947
995
|
await _agentRepl(root, { role: 'actor' }); // provider λ―Έμ§μ β _agentRepl μ auto-select λμ (1.9.181 fix)
|
|
948
996
|
} catch (e) { warn('REPL μ§μ
μ€ν¨: ' + e.message); }
|
|
949
997
|
}
|
|
950
998
|
}
|
|
999
|
+
_cleanupSigint(); // 1.9.184: install ν¨μ μ’
λ£ μ SIGINT handler ν΄μ (λͺ¨λ μ’
λ£ κ²½λ‘)
|
|
951
1000
|
}
|
|
952
1001
|
|
|
953
1002
|
function installSkills(root, skills) { for (const name of skills) addSkill(root, name, true); }
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "leerness",
|
|
3
|
-
"version": "1.9.
|
|
3
|
+
"version": "1.9.184",
|
|
4
4
|
"description": "Leerness: λΉνκ΄΄ λ§μ΄κ·Έλ μ΄μ
, μλ λ²μ κ°μ§Β·μ
λ°μ΄νΈ, κ³ν/μ§ν/νΈλμ€ν μλν, κ²μΌλ¦Β·μν¬λ¦ΏΒ·μΈμ½λ© μλ κ°λ, Claude Code μ¬λμ ν΅ν©μ κ°μΆ νκ΅μ΄ μ°μ AI κ°λ° νλ€μ€.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"leerness",
|