leerness 1.9.218 โ 1.9.220
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 +86 -0
- package/README.md +3 -3
- package/bin/harness.js +186 -2
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,91 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 1.9.220 โ 2026-05-22
|
|
4
|
+
|
|
5
|
+
**๐ ๋น์ ์ ์ข
๋ฃ ํ ์์จ ์ฌ๊ฐ ์์คํ
(์ฌ์ฉ์ ๋ช
์).**
|
|
6
|
+
|
|
7
|
+
### ์ฌ์ฉ์ ๋ช
์
|
|
8
|
+
> *"์์จ๋ชจ๋์ผ๋ ์ ์ ๋ชจ๋์๊ฑฐ๋, ์์คํ
์ข
๋ฃ๋ AI์์ด์ ํธ ์ธ์
์ข
๋ฃ๋ฑ์ผ๋ก ์์จ๊ฐ๋ฐ๋ชจ๋๊ฐ ๋น์ ์์ ์ผ๋ก ์ข
๋ฃ๋์๋ค๊ฐ ๋ค์ ์คํํ์ฌ ์ธ์
์ ์ด์ด๊ฐ๋, ๊ฐ์งํ๊ณ ์์
์ด ์ค๋จ๋์ง์ ์ด๋ ๋๋ฝ๋์์
์ ๊ฐ์งํ๊ณ ๊ฐ๋ฐ์์ด์ด๊ฐ๊ฑฐ๋ ์์จ๋ชจ๋๋ฅผ ๋ค์ ์งํ"*
|
|
9
|
+
|
|
10
|
+
### 1. `_detectAbnormalShutdown(root)` โ 5์ ํธ ์ข
ํฉ ๊ฐ์ง
|
|
11
|
+
| # | ์ ํธ | ํธ๋ฆฌ๊ฑฐ | severity |
|
|
12
|
+
|---|---|---|---|
|
|
13
|
+
| 1 | `last-handoff-stale` | gap > 60min (์ ์ 25min ๋๋น) | gap > 240min: high / else medium |
|
|
14
|
+
| 2 | `wakeup-missed` | active-wakeups pending โ 30min+ ์ง๋จ | gap > 120min: high |
|
|
15
|
+
| 3 | `in-progress-stale` | in-progress task + progress-tracker 24h+ stale | high |
|
|
16
|
+
| 4 | `auto-resume-plan-unused` | auto-resume-plan 60min+ ๋ฏธ์ฌ์ฉ | ageMin > 240: medium |
|
|
17
|
+
| 5 | `release-branch-pending` | 2+ release/* branch (sync-main ๋๋ฝ) | low |
|
|
18
|
+
|
|
19
|
+
### 2. `leerness session-resume` CLI
|
|
20
|
+
- ๋น์ ์ ์ข
๋ฃ ๊ฐ์ง + 5์ ํธ ๋ถ์
|
|
21
|
+
- ์๋ ์ฌ๊ฐ ๊ฐ์ด๋ ์ถ๋ ฅ (7๋จ๊ณ)
|
|
22
|
+
- `--json` ์ต์
(์ธ๋ถ ์๋ํ)
|
|
23
|
+
|
|
24
|
+
### 3. handoff ํค๋๋ผ์ธ 16๋ฒ์งธ ์์
|
|
25
|
+
- ๋น์ ์ ์ข
๋ฃ ๊ฐ์ง ์: `๐ ๋น์ ์์ข
๋ฃ <severity> (N์ ํธ)`
|
|
26
|
+
- ํค๋๋ผ์ธ ๋ผ๋ฒจ: `1.9.81/93/113/152/162/192/197/204/207/209/215/220`
|
|
27
|
+
|
|
28
|
+
### 4. ์ฌ๊ฐ ๊ฐ์ด๋ 7๋จ๊ณ (์๋ ์์ฑ)
|
|
29
|
+
์ ํธ๋ณ ๋ง์ถค ๊ฐ์ด๋:
|
|
30
|
+
1. `leerness handoff .` โ ํ์ฌ ์ํ ์ข
ํฉ
|
|
31
|
+
2. `leerness resume` โ auto-resume-plan ์ ์ฉ (auto-resume-plan-unused ์)
|
|
32
|
+
3. `leerness task list --status in-progress` โ stale task ๊ฒํ (in-progress-stale ์)
|
|
33
|
+
4. ScheduleWakeup ์ฌ๋ฑ๋ก (wakeup-missed ์)
|
|
34
|
+
5. `git branch -a` โ `leerness release sync-main` (release-branch-pending ์)
|
|
35
|
+
6. `leerness pre-wake-audit` โ ๋๋ฝ ์์
/ ์ถฉ๋ ์ ๊ฒ
|
|
36
|
+
7. `leerness requests audit` โ ๋ฏธ๋ต ์ฌ์ฉ์ ์์ฒญ ํ์ธ
|
|
37
|
+
|
|
38
|
+
### 5. ์ค ๊ฒ์ฆ ์๋๋ฆฌ์ค
|
|
39
|
+
- **์ ์ ์ํฌ์คํ์ด์ค** โ `abnormalShutdown: false / severity: none`
|
|
40
|
+
- **wakeup 2024๋ถ ์ง๋จ** (์๋ฎฌ๋ ์ด์
) โ `severity: high / wakeup-missed 1์ ํธ + ๊ฐ์ด๋ 4๋จ๊ณ ์๋ ์์ฑ`
|
|
41
|
+
|
|
42
|
+
### 6. ๋์ ํ๊ท (1.9.207~219) โ ๋ชจ๋ ์ ์ง
|
|
43
|
+
|
|
44
|
+
### 7. stress-v165 โ 18/18 PASS
|
|
45
|
+
- 1.9.220 (7): VERSION + 5์ ํธ ๋ฑ๋ก + ์ ์/๋น์ ์ ์๋๋ฆฌ์ค + handoff ํตํฉ + CLI ๋ผ์ฐํ
|
|
46
|
+
- ์ฑ๋ฅ (2): cold_start 461ms / MCP 59 ๋๊ตฌ 424ms
|
|
47
|
+
- ๋์ ํ๊ท (9): 1.9.207~219
|
|
48
|
+
|
|
49
|
+
### 8. ์๋ release (82 ๋ผ์ด๋ main-push streak ยท 43 ๋ผ์ด๋ npm publish streak)
|
|
50
|
+
|
|
51
|
+
๐ **์์จ ๋ชจ๋ ๋ณต์๋ ฅ ๊ฐํ** โ ์ ์ /์ข
๋ฃ/์ธ์
์ข
๋ฃ ๋ฌด๊ด, ์ฌ์์ ์ ์๋ ์ง๋จ + ์ฌ๊ฐ ๊ฐ๋ฅ
|
|
52
|
+
|
|
53
|
+
---
|
|
54
|
+
|
|
55
|
+
## 1.9.219 โ 2026-05-22
|
|
56
|
+
|
|
57
|
+
**๐ 80 ๋ผ์ด๋ ์์จ ๋ชจ๋ ๋ง์ผ์คํค + session-workflow.md ํตํฉ ๊ฐฑ์ .**
|
|
58
|
+
|
|
59
|
+
### 1. 80 ๋ผ์ด๋ ๋ง์ผ์คํค ๋ณด๊ณ ์
|
|
60
|
+
- `_reports/milestone-1.9.219-80-rounds.md` (private, npm ์ ์ธ)
|
|
61
|
+
- 1.9.140 main ์๋ push streak ์์ ์ดํ **80 ๋ผ์ด๋ ์ ํ ๋๋ฌ**
|
|
62
|
+
- Phase 1~5 ๋จ๊ณ๋ณ ์์ฝ (์๋ํ ์ธํ๋ผ โ ์์จ ๋ง์ผ์คํค โ 5์ถ ์์ฑ โ ์ฌ์ฉ์ ๋ช
์ ์์ง โ ์ด์ ๊ฐํ)
|
|
63
|
+
- 5์ถ ๋งคํธ๋ฆญ์ค 100/100 ๋ฌ์ฑ ๊ธฐ๋ก (1.9.218)
|
|
64
|
+
- ์ฌ์ฉ์ ๋ช
์ 7 ๋ผ์ด๋ (1.9.207~213) ์์ ์์ง ํ
|
|
65
|
+
|
|
66
|
+
### 2. session-workflow.md ํตํฉ ๊ฐฑ์ (drift ์ฐจ๋จ)
|
|
67
|
+
- `(1.9.217+) session close ์๋ ํธ์ถ 3์ข
๊ฒฐ๊ณผ ํ์ธ` ์ฒดํฌ๋ฆฌ์คํธ ์ถ๊ฐ
|
|
68
|
+
- `## ์ฌ์ฉ์ ๋ช
์ ์์ฒญ ์ฒ๋ฆฌ (1.9.207~213)` ์ ์ค ์น์
โ 5๋จ๊ณ ์์:
|
|
69
|
+
1. `leerness requests add` (1.9.207)
|
|
70
|
+
2. `leerness review-request` (1.9.176)
|
|
71
|
+
3. `leerness intent classify` (1.9.213, opt-in)
|
|
72
|
+
4. `leerness constraints check` (1.9.208)
|
|
73
|
+
5. `leerness task add` (์๋ dedup + auto review trigger)
|
|
74
|
+
- `## adaptive wakeup interval (1.9.210)` ์ ์ค โ opt-out ๊ฐ์ด๋
|
|
75
|
+
|
|
76
|
+
### 3. ๋์ ํ๊ท (1.9.207~218) โ ๋ชจ๋ ์ ์ง
|
|
77
|
+
|
|
78
|
+
### 4. stress-v164 โ 15/15 PASS
|
|
79
|
+
- 1.9.219 (3): VERSION + ๋ง์ผ์คํค ๋ณด๊ณ ์ + session-workflow ํตํฉ ๊ฒ์ฆ
|
|
80
|
+
- ์ฑ๋ฅ (2): cold_start 618ms / MCP 59 ๋๊ตฌ 501ms
|
|
81
|
+
- ๋์ ํ๊ท (10): 1.9.207~218 ์ ์ฒด
|
|
82
|
+
|
|
83
|
+
### 5. ์๋ release (81 ๋ผ์ด๋ main-push streak ยท 42 ๋ผ์ด๋ npm publish streak)
|
|
84
|
+
|
|
85
|
+
๐ **80 ๋ผ์ด๋ ์์จ ๋ชจ๋ ๋ง์ผ์คํค** + 5์ถ 100/100 + ๋ฐฑ๋ก๊ทธ 0 + MCP 59 ๋๊ตฌ
|
|
86
|
+
|
|
87
|
+
---
|
|
88
|
+
|
|
3
89
|
## 1.9.218 โ 2026-05-22
|
|
4
90
|
|
|
5
91
|
**๐ handoff --json ํตํฉ ๊ฐํ + 5์ถ ๋งคํธ๋ฆญ์ค ๋ณด๊ฐ (98โ100 ํ๋ณด).**
|
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) []() []() []() []() []() []() [-brightgreen)]() []() []() []() []() []()
|
|
6
6
|
|
|
7
7
|
```
|
|
8
8
|
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
|
|
@@ -12,9 +12,9 @@
|
|
|
12
12
|
โ โโโ โโโโโโ โโโโโโ โโโโโโโโโโโโโโโโโโโโโโโโ โโโโโโโโ โ
|
|
13
13
|
โ โโโโโโโโโโโโโโโโโโโโโโโโโโโ โโโโโโ โโโโโโโโโโโโโโโโโโโโโโ โ
|
|
14
14
|
โ โโโโโโโโโโโโโโโโโโโโโโโโโโโ โโโโโโ โโโโโโโโโโโโโโโโโโโโโ โ
|
|
15
|
-
โ v1.9.
|
|
15
|
+
โ v1.9.220 AI Agent Reliability Harness + Sandbox โ
|
|
16
16
|
โ verify ยท remember ยท orchestrate ยท audit ยท sandbox ยท drift โ
|
|
17
|
-
โ
|
|
17
|
+
โ ๐ ๋น์ ์ ์ข
๋ฃ โ ์์จ ์ฌ๊ฐ 5์ ํธ ์๋ ๊ฐ์ง (์ฌ์ฉ์ ๋ช
์) โ
|
|
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.220';
|
|
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 ์ฒ๋ฆฌ).
|
|
@@ -2251,6 +2251,140 @@ function _saveAndAppendPreWakeReport(root, audit) {
|
|
|
2251
2251
|
return audit;
|
|
2252
2252
|
}
|
|
2253
2253
|
|
|
2254
|
+
// 1.9.220: ๋น์ ์ ์ข
๋ฃ ๊ฐ์ง + ์์จ ์ฌ๊ฐ (์ฌ์ฉ์ ๋ช
์)
|
|
2255
|
+
// "์ ์ ๋ชจ๋/์์คํ
์ข
๋ฃ/AI์์ด์ ํธ ์ธ์
์ข
๋ฃ๋ก ๋น์ ์ ์ข
๋ฃ๋ ํ ์ฌ์คํ ์ ์ค๋จ์ง์ /๋๋ฝ์์
๊ฐ์ง"
|
|
2256
|
+
// 5์ ํธ ์ข
ํฉ ๋ถ์:
|
|
2257
|
+
// 1) last-handoff gap > 60min (1.9.199, 25min interval ๊ธฐ๋ ๋๋น 2.4๋ฐฐ+)
|
|
2258
|
+
// 2) wakeup miss (active-wakeups pending โ 30min+ ์ง๋จ, 1.9.205)
|
|
2259
|
+
// 3) in-progress task 24h+ ๊ฐฑ์ ์์ (stale, progress-tracker mtime)
|
|
2260
|
+
// 4) auto-resume-plan ์กด์ฌ + ageMin > 60min (1.9.203, ์ฌ์ฉ ์ ๋จ)
|
|
2261
|
+
// 5) release/X.X.X branch ์์ + main ๋ฏธ๋จธ์ง (release sync-main ๋๋ฝ)
|
|
2262
|
+
// ๊ฒฐ๊ณผ: { abnormalShutdown: true/false, signals: [...], severity, resumeGuide }
|
|
2263
|
+
function _detectAbnormalShutdown(root) {
|
|
2264
|
+
const result = {
|
|
2265
|
+
detectedAt: new Date().toISOString(),
|
|
2266
|
+
signals: [],
|
|
2267
|
+
severity: 'none',
|
|
2268
|
+
abnormalShutdown: false,
|
|
2269
|
+
resumeGuide: []
|
|
2270
|
+
};
|
|
2271
|
+
const now = Date.now();
|
|
2272
|
+
|
|
2273
|
+
// 1) last-handoff gap > 60min (์ ์ 25min interval ๋๋น)
|
|
2274
|
+
try {
|
|
2275
|
+
const lhFp = path.join(root, '.harness', 'last-handoff.json');
|
|
2276
|
+
if (exists(lhFp)) {
|
|
2277
|
+
const j = JSON.parse(read(lhFp));
|
|
2278
|
+
const last = j.lastAt || (j.history && j.history.length > 0 ? j.history[j.history.length - 1] : null);
|
|
2279
|
+
if (last) {
|
|
2280
|
+
const lastMs = new Date(last).getTime();
|
|
2281
|
+
const gapMin = Math.floor((now - lastMs) / 60000);
|
|
2282
|
+
if (gapMin > 60) {
|
|
2283
|
+
result.signals.push({
|
|
2284
|
+
kind: 'last-handoff-stale',
|
|
2285
|
+
gapMin,
|
|
2286
|
+
detail: `last handoff ${gapMin}๋ถ ์ (์ ์ 25min ๊ฐ๊ฒฉ ๋๋น ${Math.round(gapMin/25)}x ์ด๊ณผ) โ ์ ์ /์ข
๋ฃ ์์ฌ`,
|
|
2287
|
+
severity: gapMin > 240 ? 'high' : 'medium'
|
|
2288
|
+
});
|
|
2289
|
+
}
|
|
2290
|
+
}
|
|
2291
|
+
}
|
|
2292
|
+
} catch {}
|
|
2293
|
+
|
|
2294
|
+
// 2) wakeup miss (active-wakeups pending โ 30min+ ์ง๋จ)
|
|
2295
|
+
try {
|
|
2296
|
+
const wkStat = _analyzeWakeupStatus(root);
|
|
2297
|
+
if (wkStat.hasWakeup && wkStat.deltaMin > 30 && wkStat.kind === 'missed') {
|
|
2298
|
+
result.signals.push({
|
|
2299
|
+
kind: 'wakeup-missed',
|
|
2300
|
+
gapMin: wkStat.deltaMin,
|
|
2301
|
+
detail: `wakeup ${wkStat.deltaMin}๋ถ ์ง๋จ (status=pending) โ ์๋ ์ฌ๊ฐ ์คํจ`,
|
|
2302
|
+
severity: wkStat.deltaMin > 120 ? 'high' : 'medium'
|
|
2303
|
+
});
|
|
2304
|
+
}
|
|
2305
|
+
} catch {}
|
|
2306
|
+
|
|
2307
|
+
// 3) in-progress task 24h+ stale (progress-tracker mtime + ํ์ฑ task ์นด์ดํธ)
|
|
2308
|
+
try {
|
|
2309
|
+
const ptPath = path.join(root, '.harness', 'progress-tracker.md');
|
|
2310
|
+
if (exists(ptPath)) {
|
|
2311
|
+
const stat = fs.statSync(ptPath);
|
|
2312
|
+
const ageMin = Math.floor((now - stat.mtimeMs) / 60000);
|
|
2313
|
+
const content = read(ptPath);
|
|
2314
|
+
const inProgress = (content.match(/^\|\s*T-\d{4,}\s*\|\s*in-progress\s*\|/gm) || []).length;
|
|
2315
|
+
if (inProgress > 0 && ageMin > 24 * 60) {
|
|
2316
|
+
result.signals.push({
|
|
2317
|
+
kind: 'in-progress-stale',
|
|
2318
|
+
inProgressCount: inProgress,
|
|
2319
|
+
ageMin,
|
|
2320
|
+
detail: `${inProgress}๊ฑด in-progress task, progress-tracker ${Math.floor(ageMin/60)}h ๊ฐฑ์ ์์`,
|
|
2321
|
+
severity: 'high'
|
|
2322
|
+
});
|
|
2323
|
+
}
|
|
2324
|
+
}
|
|
2325
|
+
} catch {}
|
|
2326
|
+
|
|
2327
|
+
// 4) auto-resume-plan ์กด์ฌ + ageMin > 60min (์ฌ์ฉ ์ ๋จ)
|
|
2328
|
+
try {
|
|
2329
|
+
const plan = _loadAutoResumePlan(root);
|
|
2330
|
+
if (plan && plan.ageMin > 60) {
|
|
2331
|
+
result.signals.push({
|
|
2332
|
+
kind: 'auto-resume-plan-unused',
|
|
2333
|
+
ageMin: plan.ageMin,
|
|
2334
|
+
nextRound: plan.nextRoundVersion,
|
|
2335
|
+
detail: `auto-resume-plan ${plan.ageMin}๋ถ ์ ์์ฑ (${plan.nextRoundVersion}) โ ์ฌ์ฉ ์ ๋จ`,
|
|
2336
|
+
severity: plan.ageMin > 240 ? 'medium' : 'low'
|
|
2337
|
+
});
|
|
2338
|
+
}
|
|
2339
|
+
} catch {}
|
|
2340
|
+
|
|
2341
|
+
// 5) release/X.X.X branch ์์ + main ๋ฏธ๋จธ์ง (git ์ํ)
|
|
2342
|
+
try {
|
|
2343
|
+
const r = cp.spawnSync('git', ['branch', '--list', 'release/*'], { cwd: root, encoding: 'utf8', timeout: 3000 });
|
|
2344
|
+
if (r.status === 0) {
|
|
2345
|
+
const branches = (r.stdout || '').split('\n').map(s => s.trim().replace(/^\*?\s*/, '')).filter(b => b.startsWith('release/'));
|
|
2346
|
+
if (branches.length >= 2) { // 2๊ฐ ์ด์์ด๋ฉด ๋๋ฝ ๊ฐ๋ฅ์ฑ
|
|
2347
|
+
result.signals.push({
|
|
2348
|
+
kind: 'release-branch-pending',
|
|
2349
|
+
count: branches.length,
|
|
2350
|
+
recent: branches.slice(-3),
|
|
2351
|
+
detail: `${branches.length}๊ฑด release/* branch (sync-main ๋๋ฝ ๊ฐ๋ฅ)`,
|
|
2352
|
+
severity: 'low'
|
|
2353
|
+
});
|
|
2354
|
+
}
|
|
2355
|
+
}
|
|
2356
|
+
} catch {}
|
|
2357
|
+
|
|
2358
|
+
// ์ข
ํฉ ํ๋จ
|
|
2359
|
+
const high = result.signals.filter(s => s.severity === 'high').length;
|
|
2360
|
+
const medium = result.signals.filter(s => s.severity === 'medium').length;
|
|
2361
|
+
if (high > 0) { result.severity = 'high'; result.abnormalShutdown = true; }
|
|
2362
|
+
else if (medium > 0) { result.severity = 'medium'; result.abnormalShutdown = true; }
|
|
2363
|
+
else if (result.signals.length > 0) result.severity = 'low';
|
|
2364
|
+
|
|
2365
|
+
// ์ฌ๊ฐ ๊ฐ์ด๋
|
|
2366
|
+
if (result.abnormalShutdown) {
|
|
2367
|
+
result.resumeGuide.push('1. leerness handoff . โ ํ์ฌ ์ํ ์ข
ํฉ ํ์ธ');
|
|
2368
|
+
if (result.signals.some(s => s.kind === 'auto-resume-plan-unused')) {
|
|
2369
|
+
result.resumeGuide.push('2. leerness resume โ ์ ์ฅ๋ auto-resume-plan ์ ์ฉ (1.9.203)');
|
|
2370
|
+
}
|
|
2371
|
+
if (result.signals.some(s => s.kind === 'in-progress-stale')) {
|
|
2372
|
+
result.resumeGuide.push('3. leerness task list --status in-progress โ stale task ๊ฒํ (drop or ์ฌ๊ฐ)');
|
|
2373
|
+
}
|
|
2374
|
+
if (result.signals.some(s => s.kind === 'wakeup-missed')) {
|
|
2375
|
+
result.resumeGuide.push('4. ScheduleWakeup ์ฌ๋ฑ๋ก (์ฌ์ฉ์ ํธ๋ฆฌ๊ฑฐ ๋๋ R-0001 ๋ฃฐ)');
|
|
2376
|
+
}
|
|
2377
|
+
if (result.signals.some(s => s.kind === 'release-branch-pending')) {
|
|
2378
|
+
result.resumeGuide.push('5. git branch -a๋ก release/* ํ์ธ + leerness release sync-main ์ฌ์คํ');
|
|
2379
|
+
}
|
|
2380
|
+
result.resumeGuide.push('6. leerness pre-wake-audit โ ๋๋ฝ ์์
/ ์ถฉ๋ ์ข
ํฉ ์ ๊ฒ');
|
|
2381
|
+
result.resumeGuide.push('7. leerness requests audit โ ๋ฏธ๋ต ์ฌ์ฉ์ ์์ฒญ ํ์ธ');
|
|
2382
|
+
} else {
|
|
2383
|
+
result.resumeGuide.push('์ ์ ์ด์ ์ค โ ๋น์ ์ ์ข
๋ฃ ์ ํธ ์์');
|
|
2384
|
+
}
|
|
2385
|
+
return result;
|
|
2386
|
+
}
|
|
2387
|
+
|
|
2254
2388
|
// 1.9.210: adaptive wakeup interval (์ฌ์ฉ์ ๋ช
์)
|
|
2255
2389
|
// "wakeup 30๋ถ๋ฑ ๊ธด ์๊ฐ์ด ํ์์๋ค๋ฉด ๊ฐ๊ฒฉ์ ํ์ดํธํ๊ฒ ์๋์ผ๋ก ์กฐ์ ํ๋๋ก"
|
|
2256
2390
|
// ์ฌ์ฉ์ ํ๋๋ ๊ธฐ๋ฐ ๊ถ์ฅ interval ๊ณ์ฐ โ ScheduleWakeup ์ ์๋ ์ ์ฉ (R-0001 ๋ฃฐ ์ธ ๋์ ๋ณด์ )
|
|
@@ -2920,6 +3054,47 @@ function requestsCmd(root, sub, ...rest) {
|
|
|
2920
3054
|
process.exit(1);
|
|
2921
3055
|
}
|
|
2922
3056
|
|
|
3057
|
+
// 1.9.220: leerness session-resume โ ๋น์ ์ ์ข
๋ฃ ๊ฐ์ง + ์์จ ์ฌ๊ฐ ๊ฐ์ด๋ (์ฌ์ฉ์ ๋ช
์)
|
|
3058
|
+
function sessionResumeCmd(root) {
|
|
3059
|
+
root = absRoot(root);
|
|
3060
|
+
const isTty = process.stdout && process.stdout.isTTY;
|
|
3061
|
+
const cyan = s => isTty ? `\x1b[36m${s}\x1b[0m` : s;
|
|
3062
|
+
const grn = s => isTty ? `\x1b[32m${s}\x1b[0m` : s;
|
|
3063
|
+
const yel = s => isTty ? `\x1b[33m${s}\x1b[0m` : s;
|
|
3064
|
+
const red = s => isTty ? `\x1b[31m${s}\x1b[0m` : s;
|
|
3065
|
+
const dim = s => isTty ? `\x1b[2m${s}\x1b[0m` : s;
|
|
3066
|
+
|
|
3067
|
+
const result = _detectAbnormalShutdown(root);
|
|
3068
|
+
if (has('--json')) { log(JSON.stringify(result, null, 2)); return; }
|
|
3069
|
+
log(cyan(`# leerness session-resume (1.9.220) โ ๋น์ ์ ์ข
๋ฃ ๊ฐ์ง + ์์จ ์ฌ๊ฐ`));
|
|
3070
|
+
log(` detected at: ${result.detectedAt}`);
|
|
3071
|
+
log('');
|
|
3072
|
+
if (!result.abnormalShutdown) {
|
|
3073
|
+
log(grn(` โ ๋น์ ์ ์ข
๋ฃ ์ ํธ ์์ โ ์ ์ ์ด์ ์ค`));
|
|
3074
|
+
if (result.signals.length > 0) {
|
|
3075
|
+
log(dim(` (low-severity ์ ํธ ${result.signals.length}๊ฑด โ ๋ฌด์ ๊ฐ๋ฅ)`));
|
|
3076
|
+
}
|
|
3077
|
+
log('');
|
|
3078
|
+
log(dim(` โ ํ์๋๋ก leerness handoff . ๋ก ์์`));
|
|
3079
|
+
return;
|
|
3080
|
+
}
|
|
3081
|
+
const sevIcon = result.severity === 'high' ? '๐จ' : 'โ ';
|
|
3082
|
+
const sevColor = result.severity === 'high' ? red : yel;
|
|
3083
|
+
log(sevColor(` ${sevIcon} ๋น์ ์ ์ข
๋ฃ ๊ฐ์ง โ severity: ${result.severity} (signals: ${result.signals.length})`));
|
|
3084
|
+
log('');
|
|
3085
|
+
log(`## ๊ฐ์ง ์ ํธ`);
|
|
3086
|
+
for (const s of result.signals) {
|
|
3087
|
+
const icon = s.severity === 'high' ? '๐จ' : (s.severity === 'medium' ? 'โ ' : 'โน');
|
|
3088
|
+
const c = s.severity === 'high' ? red : (s.severity === 'medium' ? yel : dim);
|
|
3089
|
+
log(c(` ${icon} [${s.kind}] ${s.detail}`));
|
|
3090
|
+
}
|
|
3091
|
+
log('');
|
|
3092
|
+
log(`## ์ฌ๊ฐ ๊ฐ์ด๋`);
|
|
3093
|
+
for (const g of result.resumeGuide) {
|
|
3094
|
+
log(` ${g}`);
|
|
3095
|
+
}
|
|
3096
|
+
}
|
|
3097
|
+
|
|
2923
3098
|
// 1.9.208: leerness constraints <list|check|add> โ ํ๋ซํผ/API ์ ์ฝ ์ฌ์ ์ฒดํฌ CLI (์ฌ์ฉ์ ๋ช
์)
|
|
2924
3099
|
// "ํน์ ํ๋ซํผ์ API ... ํธ์ถ์๋๊ฐ ์ด๋น 5ํ ์ดํ๋ก๋ง ํด์ผํ๋ค๋ ๊ท์ ์ ๋จผ์ ํ์ธ"
|
|
2925
3100
|
// list โ ๋ฑ๋ก๋ ๋ชจ๋ ํ๋ซํผ catalog ์ถ๋ ฅ
|
|
@@ -5694,6 +5869,13 @@ function handoff(root) {
|
|
|
5694
5869
|
}
|
|
5695
5870
|
}
|
|
5696
5871
|
} catch {}
|
|
5872
|
+
// 16) 1.9.220: ๋น์ ์ ์ข
๋ฃ ๊ฐ์ง (์ฌ์ฉ์ ๋ช
์) โ ๊นจ์ด๋จ ์งํ ์๋ ๋
ธ์ถ
|
|
5873
|
+
try {
|
|
5874
|
+
const ad = _detectAbnormalShutdown(root);
|
|
5875
|
+
if (ad.abnormalShutdown) {
|
|
5876
|
+
parts.push(`๐ ๋น์ ์์ข
๋ฃ ${ad.severity} (${ad.signals.length}์ ํธ)`);
|
|
5877
|
+
}
|
|
5878
|
+
} catch {}
|
|
5697
5879
|
// 15) 1.9.215: ํ์ฌ ํ์ฑ task์์ constraints/intent ์๋ ๋ถ์ (1.9.208/213 ํตํฉ)
|
|
5698
5880
|
try {
|
|
5699
5881
|
// progress-tracker.md ์ ์ฒซ active task request ์ถ์ถ
|
|
@@ -5732,7 +5914,7 @@ function handoff(root) {
|
|
|
5732
5914
|
if (parts.length) {
|
|
5733
5915
|
const isTty = process.stdout && process.stdout.isTTY;
|
|
5734
5916
|
const cy = s => isTty ? `\x1b[36m${s}\x1b[0m` : s;
|
|
5735
|
-
log(cy(`๐ ํค๋๋ผ์ธ (1.9.81/93/113/152/162/192/197/204/207/209/215): ${parts.join(' ยท ')}`));
|
|
5917
|
+
log(cy(`๐ ํค๋๋ผ์ธ (1.9.81/93/113/152/162/192/197/204/207/209/215/220): ${parts.join(' ยท ')}`));
|
|
5736
5918
|
}
|
|
5737
5919
|
} catch {}
|
|
5738
5920
|
}
|
|
@@ -17197,6 +17379,8 @@ async function main() {
|
|
|
17197
17379
|
if (cmd === 'resume') return resumeCmd(arg('--path', process.cwd()));
|
|
17198
17380
|
// 1.9.207: leerness requests <audit|add|list|complete|drop> โ ์ฌ์ฉ์ ์์ฒญ ๋๋ฝ ํ์ธ ์ ์ฐจ (์ฌ์ฉ์ ๋ช
์)
|
|
17199
17381
|
if (cmd === 'requests') return requestsCmd(arg('--path', process.cwd()), args[1], ...args.slice(2));
|
|
17382
|
+
// 1.9.220: leerness session-resume โ ๋น์ ์ ์ข
๋ฃ ๊ฐ์ง + ์์จ ์ฌ๊ฐ ๊ฐ์ด๋ (์ฌ์ฉ์ ๋ช
์)
|
|
17383
|
+
if (cmd === 'session-resume') return sessionResumeCmd(arg('--path', process.cwd()));
|
|
17200
17384
|
// 1.9.208: leerness constraints <list|check|add> โ ํ๋ซํผ/API ์ ์ฝ ์ฌ์ ์ฒดํฌ (์ฌ์ฉ์ ๋ช
์)
|
|
17201
17385
|
if (cmd === 'constraints') return constraintsCmd(arg('--path', process.cwd()), args[1], ...args.slice(2));
|
|
17202
17386
|
// 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.
|
|
3
|
+
"version": "1.9.220",
|
|
4
4
|
"description": "Leerness: ๋นํ๊ดด ๋ง์ด๊ทธ๋ ์ด์
, ์๋ ๋ฒ์ ๊ฐ์งยท์
๋ฐ์ดํธ, ๊ณํ/์งํ/ํธ๋์คํ ์๋ํ, ๊ฒ์ผ๋ฆยท์ํฌ๋ฆฟยท์ธ์ฝ๋ฉ ์๋ ๊ฐ๋, Claude Code ์ฌ๋์ ํตํฉ์ ๊ฐ์ถ ํ๊ตญ์ด ์ฐ์ AI ๊ฐ๋ฐ ํ๋ค์ค.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"leerness",
|