leerness 1.9.151 → 1.9.152
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 +33 -0
- package/README.md +2 -2
- package/bin/harness.js +73 -4
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,38 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 1.9.152 — 2026-05-20
|
|
4
|
+
|
|
5
|
+
**`agents multi` — 활성 N개 에이전트 일괄 dispatch + handoff 헤드라인 활성 에이전트 카운트 (1.9.151 복수 선택 후속).**
|
|
6
|
+
|
|
7
|
+
자율 모드 82 라운드. 1.9.151 install 복수 선택의 자연스러운 후속 — 실제 사용 시점에 선택된 에이전트들을 동시에 활용.
|
|
8
|
+
|
|
9
|
+
### Added — `leerness agents multi "<task>"` 신규 명령
|
|
10
|
+
- 활성 (ready) 에이전트들에 **일괄 dispatch 명령** 자동 생성 (claude/codex/gemini/copilot/ollama)
|
|
11
|
+
- `--only c1,c2` — 활성 중에서 추가 필터링
|
|
12
|
+
- `--write` — 파일 수정 권한 플래그 (각 CLI 별 적절한 옵션 자동 적용)
|
|
13
|
+
- `--json` — 구조화 출력 (`{ task, count, agents, commands }`)
|
|
14
|
+
- 메인 에이전트가 N개 sub-agent로 spawn 후 결과 합의/투표 → 가장 안정적인 답 선택
|
|
15
|
+
|
|
16
|
+
### Added — `agents dispatch --multi` / `--to all` alias routing
|
|
17
|
+
- 기존 `dispatch --to <id>` 와 동일한 인터페이스로 multi 모드 진입 가능
|
|
18
|
+
- `--to all` 또는 `--to *` 또는 `--multi` 플래그로 자동 routing
|
|
19
|
+
|
|
20
|
+
### Added — `_dispatchCommand(agentId, task, writeMode)` 공유 헬퍼
|
|
21
|
+
- single dispatch + multi dispatch 가 동일한 명령 빌더 사용 — 일관성 보장
|
|
22
|
+
- 5종 CLI 모두 지원 (claude/codex/gemini/copilot/ollama)
|
|
23
|
+
|
|
24
|
+
### Added — handoff 헤드라인 8번째 항목 — 활성 에이전트 카운트
|
|
25
|
+
- `🤖 agents N (claude,codex,...)` — 메인 에이전트가 매 세션 즉시 sub-agent 분배 가능성 인지
|
|
26
|
+
- 활성 0개면 표시 안 함 (노이즈 최소화)
|
|
27
|
+
- 1.9.151 복수 선택 결과가 .env 활성화 → 즉시 헤드라인 반영
|
|
28
|
+
|
|
29
|
+
### Verified
|
|
30
|
+
- e2e 217/217 ✓
|
|
31
|
+
- stress-v97: 18/18 (agents multi 6종 + handoff 헤드라인 3종 + help/fail-fast 2종 + 누적 회귀 7종)
|
|
32
|
+
- VERSION = 1.9.152 / autonomous-rounds = 82
|
|
33
|
+
|
|
34
|
+
---
|
|
35
|
+
|
|
3
36
|
## 1.9.151 — 2026-05-20
|
|
4
37
|
|
|
5
38
|
**install 흐름 — CLI 에이전트 복수 선택 + REPL 자동 시작 prompt + viewwork 제거 + help 검증 (사용자 명시 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,7 +12,7 @@
|
|
|
12
12
|
║ ██║ ██╔══╝ ██╔══╝ ██╔══██╗██║╚██╗██║██╔══╝ ╚════██║ ║
|
|
13
13
|
║ ███████╗███████╗███████╗██║ ██║██║ ╚████║███████╗███████║ ║
|
|
14
14
|
║ ╚══════╝╚══════╝╚══════╝╚═╝ ╚═╝╚═╝ ╚═══╝╚══════╝╚══════╝ ║
|
|
15
|
-
║ v1.9.
|
|
15
|
+
║ v1.9.152 AI Agent Reliability Harness + Sandbox ║
|
|
16
16
|
║ verify · remember · orchestrate · audit · sandbox · drift ║
|
|
17
17
|
╚══════════════════════════════════════════════════════════════╝
|
|
18
18
|
```
|
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.152';
|
|
10
10
|
const MARK = '<!-- leerness:managed -->';
|
|
11
11
|
const README_START = '<!-- leerness:project-readme:start -->';
|
|
12
12
|
const README_END = '<!-- leerness:project-readme:end -->';
|
|
@@ -2914,10 +2914,18 @@ function handoff(root) {
|
|
|
2914
2914
|
const lessons = exists(lessonsPath(root)) ? (read(lessonsPath(root)).match(/^### \d{4}-\d{2}-\d{2}/gm) || []).length : 0;
|
|
2915
2915
|
parts.push(`🧠 mem T${inProgressTasks}/D${decisions}/R${rulesActive}/P${planMilestones}/L${lessons}`);
|
|
2916
2916
|
} catch {}
|
|
2917
|
+
// 8) 1.9.152: 활성 외부 AI CLI 카운트 (1.9.151 복수 선택 결과 반영) — 메인 에이전트가 sub-agent 분배 가능성 즉시 인지
|
|
2918
|
+
try {
|
|
2919
|
+
_loadEnvFile(root); // .env 자동 로드 (handoff 컨텍스트)
|
|
2920
|
+
const ready = EXTERNAL_AGENTS.map(a => _checkAgent(a)).filter(c => c.status === 'ready');
|
|
2921
|
+
if (ready.length > 0) {
|
|
2922
|
+
parts.push(`🤖 agents ${ready.length} (${ready.map(c => c.id).join(',')})`);
|
|
2923
|
+
}
|
|
2924
|
+
} catch {}
|
|
2917
2925
|
if (parts.length) {
|
|
2918
2926
|
const isTty = process.stdout && process.stdout.isTTY;
|
|
2919
2927
|
const cy = s => isTty ? `\x1b[36m${s}\x1b[0m` : s;
|
|
2920
|
-
log(cy(`📊 헤드라인 (1.9.81/93/113): ${parts.join(' · ')}`));
|
|
2928
|
+
log(cy(`📊 헤드라인 (1.9.81/93/113/152): ${parts.join(' · ')}`));
|
|
2921
2929
|
}
|
|
2922
2930
|
} catch {}
|
|
2923
2931
|
}
|
|
@@ -5016,6 +5024,17 @@ async function setupAgentsCmd(root, opts = {}) {
|
|
|
5016
5024
|
log(' 다음: leerness agents list / leerness agents quota');
|
|
5017
5025
|
}
|
|
5018
5026
|
|
|
5027
|
+
// 1.9.152: 단일 agent dispatch 명령 빌더 — agents dispatch (단일) + agents multi (복수) 가 공유
|
|
5028
|
+
function _dispatchCommand(agentId, task, writeMode) {
|
|
5029
|
+
const q = String(task || '').replace(/"/g, '\\"');
|
|
5030
|
+
if (agentId === 'claude') return `claude ${writeMode ? '--print --dangerously-skip-permissions' : '--print'} "${q}"`;
|
|
5031
|
+
if (agentId === 'codex') return `codex ${writeMode ? 'exec --skip-git-repo-check --dangerously-bypass-approvals-and-sandbox' : 'exec --skip-git-repo-check'} "${q}"`;
|
|
5032
|
+
if (agentId === 'gemini') return `gemini ${writeMode ? '-p --yolo' : '-p'} "${q}"`;
|
|
5033
|
+
if (agentId === 'copilot') return `gh copilot suggest "${q}"`;
|
|
5034
|
+
if (agentId === 'ollama') return `# ollama — leerness agent "${q}" --provider ollama 로 직접 호출 (REPL: leerness agent)`;
|
|
5035
|
+
return `# ${agentId}: 명령 빌더 미정의`;
|
|
5036
|
+
}
|
|
5037
|
+
|
|
5019
5038
|
function agentsCmd(root, sub, ...args) {
|
|
5020
5039
|
root = absRoot(root || process.cwd());
|
|
5021
5040
|
// .env 자동 로드 (1.9.22)
|
|
@@ -5059,11 +5078,61 @@ function agentsCmd(root, sub, ...args) {
|
|
|
5059
5078
|
return agentsCmd(root, 'list'); // 비-JSON은 list와 동일
|
|
5060
5079
|
}
|
|
5061
5080
|
|
|
5081
|
+
// 1.9.152: agents multi — 1.9.151 install 복수 선택된 ready 에이전트들에 일괄 dispatch 명령 생성
|
|
5082
|
+
// 단일 task → 활성 N개 에이전트 동시 dispatch 명령들. 사용자가 한 번에 복사 실행하거나 메인 에이전트가 spawn.
|
|
5083
|
+
if (sub === 'multi') {
|
|
5084
|
+
const task = args.filter(x => !x.startsWith('-')).join(' ').trim() || arg('--task', null);
|
|
5085
|
+
if (!task) { fail('multi "<task>" 또는 --task 필요'); return process.exit(1); }
|
|
5086
|
+
const onlyArg = arg('--only', null); // 'claude,codex' 처럼 콤마 구분 — 활성 중에서 추가 필터
|
|
5087
|
+
const writeMode = has('--write');
|
|
5088
|
+
const checks = EXTERNAL_AGENTS.map(a => ({ def: a, status: _checkAgent(a) }));
|
|
5089
|
+
let ready = checks.filter(x => x.status.status === 'ready');
|
|
5090
|
+
if (onlyArg) {
|
|
5091
|
+
const wanted = new Set(onlyArg.split(/[,\s]+/).filter(Boolean));
|
|
5092
|
+
ready = ready.filter(x => wanted.has(x.def.id));
|
|
5093
|
+
}
|
|
5094
|
+
if (!ready.length) {
|
|
5095
|
+
fail('활성 (ready) 에이전트 없음 — `leerness agents list` 로 확인. 1.9.151 install 흐름에서 복수 선택 후 .env 활성화 필요.');
|
|
5096
|
+
return process.exit(1);
|
|
5097
|
+
}
|
|
5098
|
+
if (has('--json')) {
|
|
5099
|
+
log(JSON.stringify({
|
|
5100
|
+
task, count: ready.length,
|
|
5101
|
+
agents: ready.map(x => ({ id: x.def.id, version: x.status.version })),
|
|
5102
|
+
commands: ready.map(x => _dispatchCommand(x.def.id, task, writeMode))
|
|
5103
|
+
}, null, 2));
|
|
5104
|
+
return;
|
|
5105
|
+
}
|
|
5106
|
+
log(`# leerness agents multi (1.9.152) — ${ready.length}개 활성 에이전트 일괄 dispatch`);
|
|
5107
|
+
log(`task: ${task.slice(0, 120)}${task.length > 120 ? '…' : ''}`);
|
|
5108
|
+
log(`mode: ${writeMode ? '✏ write (파일 수정 가능)' : '🔒 read-only (분석 전용, 안전)'}`);
|
|
5109
|
+
log(`대상: ${ready.map(x => x.def.id).join(', ')}`);
|
|
5110
|
+
log('');
|
|
5111
|
+
log('## 각 에이전트 실행 명령 (사용자가 병렬 실행 또는 메인 에이전트가 spawn)');
|
|
5112
|
+
log('');
|
|
5113
|
+
for (const { def, status } of ready) {
|
|
5114
|
+
log(`### [${def.id}] (v${status.version || '?'})`);
|
|
5115
|
+
log('```sh');
|
|
5116
|
+
log(_dispatchCommand(def.id, task, writeMode));
|
|
5117
|
+
log('```');
|
|
5118
|
+
log('');
|
|
5119
|
+
}
|
|
5120
|
+
log('## 정책 (1.9.152)');
|
|
5121
|
+
log(` - leerness는 외부 CLI를 자동 호출하지 않음 (사용자/메인 에이전트가 명시적으로 실행)`);
|
|
5122
|
+
log(` - 메인 에이전트(Claude)가 위 ${ready.length}개 명령을 보고 ${ready.length}개 sub-agent로 spawn — 결과 합의/투표로 가장 안정적인 답 선택`);
|
|
5123
|
+
log(` - 활성 에이전트 변경: \`.env\`에서 LEERNESS_ENABLE_<CLI>=1/0 또는 \`leerness setup-agents\` 재실행`);
|
|
5124
|
+
log(` - quota 체크: \`leerness agents quota\``);
|
|
5125
|
+
return;
|
|
5126
|
+
}
|
|
5062
5127
|
if (sub === 'dispatch') {
|
|
5063
5128
|
const task = args.filter(x => !x.startsWith('-')).join(' ').trim() || arg('--task', null);
|
|
5064
5129
|
const target = arg('--to', null);
|
|
5065
5130
|
if (!task) { fail('dispatch "<task>" 또는 --task 필요'); return process.exit(1); }
|
|
5066
|
-
|
|
5131
|
+
// 1.9.152: --multi 또는 --to=all 또는 --to 없음 + 활성 ≥2 → multi 모드로 routing
|
|
5132
|
+
if (has('--multi') || target === 'all' || target === '*') {
|
|
5133
|
+
return agentsCmd(root, 'multi', ...args);
|
|
5134
|
+
}
|
|
5135
|
+
if (!target) { fail('--to <agent_id> 필요 (claude/codex/gemini/copilot) — 활성 전체에 일괄 분배는 `leerness agents multi`'); return process.exit(1); }
|
|
5067
5136
|
const agentDef = EXTERNAL_AGENTS.find(a => a.id === target);
|
|
5068
5137
|
if (!agentDef) { fail(`알 수 없는 agent: ${target}`); return process.exit(1); }
|
|
5069
5138
|
// 1.9.36: 작업 유형 키워드 분석 → 최적 CLI 추천 (ready 체크 전에 출력 — 비활성이어도 추천)
|
|
@@ -11151,7 +11220,7 @@ function reuseAutodetectCmd(root) {
|
|
|
11151
11220
|
}
|
|
11152
11221
|
|
|
11153
11222
|
function help() {
|
|
11154
|
-
log(`Leerness v${VERSION}\n\nUsage:\n leerness init [path] [--language auto|ko|en] [--skills recommended|all|a,b]\n leerness migrate [path] [--dry-run] [--force]\n leerness update [path] [--check|--yes|--force|--from <tarball>]\n leerness auto-update install [path]\n leerness status [path]\n leerness verify [path]\n leerness debug [path]\n leerness audit [path]\n leerness check [path]\n leerness scan secrets [path]\n leerness encoding check [path]\n leerness lazy detect [path]\n leerness memory search "query" [--limit 5]\n leerness handoff [path] [--all-apps] [--include p1,p2] [--since 24h|3d] [--compact] [--json] # 1.9.17-22 워크스페이스 (--compact: LLM 시스템 프롬프트용 1줄 요약)\n leerness orchestrate "<목표>" [--agents N] [--model qwen2.5:7b-instruct] [--retry-on-fail K] # 1.9.22 Ollama opt-in (LEERNESS_OLLAMA_BASE_URL 필요)\n leerness llm-bench record --score N --model X [--label L] [--tokens T] # 1.9.22 LLM 벤치 히스토리 누적\n leerness deps <capability> [--run-tests] [--json] # 1.9.24 depends-on 역방향 추적 + 자동 회귀 sweep\n leerness memory search "키" [--include-code] # 1.9.25 소스 코드 본문도 검색 (모순 감지 핵심)\n leerness brainstorm "주제" [--include-code] # 1.9.25 코드 본문 hits 포함\n leerness register-pending "<요청>" [--agent X] [--note Y] # 1.9.25 다중 세션 in-progress 즉시 등록\n leerness optimism-check <T-ID> [--json] # 1.9.26/27 낙관적 표시 감지 (1.9.27: 10 카테고리 + URL/메서드 매핑 + 신뢰도 점수)\n leerness persona list|show <id>|add <id> # 1.9.29 페르소나 카탈로그 (보안/성능/UX/testing/docs 5종 내장)\n leerness review <file> --persona <id1,id2,...> # 1.9.29 도메인 페르소나 리뷰 프롬프트 자동 생성\n leerness agents list|check|quota # 1.9.30/31 외부 AI CLI 가용성 + quota 추정 (claude/codex/gemini/copilot)\n leerness agents dispatch "<task>" --to <id> # 1.9.30 활성 CLI 대상 실행 명령 생성 (실 호출 X, 사용자 실행)\n leerness setup-agents [path] [--yes|--no-setup-agents] # 1.9.32 sub-agent CLI 인터랙티브 설정 (.env + 미설치 자동 설치)\n leerness init [path] [--no-stale-check] # 1.9.33 npx 캐시 함정 — 옛 버전 자동 경고 (끄려면 --no-stale-check)\n leerness contract verify <spec.md> <impl.js> [--json] # 1.9.35 명세 ↔ 구현 일치 검사 (함수/필드)\n leerness reuse autodetect [path] [--apply] [--json] # 1.9.35 src/*.js의 module.exports → reuse-map 후보 등록\n leerness audit [path] [--fix] # 1.9.35 --fix: session-handoff/current-state 자동 갱신\n leerness verify-claim <T-ID> ... [--strict-claims] # 1.9.26 verify-claim에 낙관적 표시 자동 검사 통합\n leerness reuse-map [path] [--all-apps] [--include p1,p2] [--strict-elements] [--json] # 1.9.18 중복/잠재중복/depends-on\n leerness verify-claim <T-ID> [--path .] [--run-tests] [--json] # 1.9.18-20 evidence 자동 검증 (1.9.20: scenes/scripts 등 도메인 폴더 + jest/mocha 파싱)\n leerness verify-code [path] [--build] [--bench] # 1.9.20 --bench: scripts.bench 추가 실행 + evidence 누적\n leerness session close [path]\n leerness route <task-type>\n leerness self check [path]\n leerness readme sync [path]\n leerness consistency check [path]\n leerness consistency merge-design-guide [path]\n leerness plan show|init|add|drop|progress|sync [args]\n leerness task list|add|update|drop|fix-evidence|relink [args]\n leerness skill list|info <name>\n leerness skill learn <id> --doc <url> --command "..." --capability "..." [--note ...]\n leerness skill use <id> [--note ...]\n leerness skill optimize <id> --before "..." --after "..." [--note ...]\n leerness skill remove <id>\n leerness skill consolidate [--threshold 0.3]\n leerness gate [path] # verify+audit+scan+encoding+lazy
|
|
11223
|
+
log(`Leerness v${VERSION}\n\nUsage:\n leerness init [path] [--language auto|ko|en] [--skills recommended|all|a,b]\n leerness migrate [path] [--dry-run] [--force]\n leerness update [path] [--check|--yes|--force|--from <tarball>]\n leerness auto-update install [path]\n leerness status [path]\n leerness verify [path]\n leerness debug [path]\n leerness audit [path]\n leerness check [path]\n leerness scan secrets [path]\n leerness encoding check [path]\n leerness lazy detect [path]\n leerness memory search "query" [--limit 5]\n leerness handoff [path] [--all-apps] [--include p1,p2] [--since 24h|3d] [--compact] [--json] # 1.9.17-22 워크스페이스 (--compact: LLM 시스템 프롬프트용 1줄 요약)\n leerness orchestrate "<목표>" [--agents N] [--model qwen2.5:7b-instruct] [--retry-on-fail K] # 1.9.22 Ollama opt-in (LEERNESS_OLLAMA_BASE_URL 필요)\n leerness llm-bench record --score N --model X [--label L] [--tokens T] # 1.9.22 LLM 벤치 히스토리 누적\n leerness deps <capability> [--run-tests] [--json] # 1.9.24 depends-on 역방향 추적 + 자동 회귀 sweep\n leerness memory search "키" [--include-code] # 1.9.25 소스 코드 본문도 검색 (모순 감지 핵심)\n leerness brainstorm "주제" [--include-code] # 1.9.25 코드 본문 hits 포함\n leerness register-pending "<요청>" [--agent X] [--note Y] # 1.9.25 다중 세션 in-progress 즉시 등록\n leerness optimism-check <T-ID> [--json] # 1.9.26/27 낙관적 표시 감지 (1.9.27: 10 카테고리 + URL/메서드 매핑 + 신뢰도 점수)\n leerness persona list|show <id>|add <id> # 1.9.29 페르소나 카탈로그 (보안/성능/UX/testing/docs 5종 내장)\n leerness review <file> --persona <id1,id2,...> # 1.9.29 도메인 페르소나 리뷰 프롬프트 자동 생성\n leerness agents list|check|quota # 1.9.30/31 외부 AI CLI 가용성 + quota 추정 (claude/codex/gemini/copilot)\n leerness agents dispatch "<task>" --to <id> # 1.9.30 활성 CLI 대상 실행 명령 생성 (실 호출 X, 사용자 실행)\n leerness agents multi "<task>" [--only c1,c2] [--write] # 1.9.152 활성 N개 에이전트 일괄 dispatch 명령 (복수 선택 후속)\n leerness agents dispatch "<task>" --multi # 1.9.152 multi 모드 alias (또는 --to all)\n leerness setup-agents [path] [--yes|--no-setup-agents] # 1.9.32 sub-agent CLI 인터랙티브 설정 (.env + 미설치 자동 설치)\n leerness init [path] [--no-stale-check] # 1.9.33 npx 캐시 함정 — 옛 버전 자동 경고 (끄려면 --no-stale-check)\n leerness contract verify <spec.md> <impl.js> [--json] # 1.9.35 명세 ↔ 구현 일치 검사 (함수/필드)\n leerness reuse autodetect [path] [--apply] [--json] # 1.9.35 src/*.js의 module.exports → reuse-map 후보 등록\n leerness audit [path] [--fix] # 1.9.35 --fix: session-handoff/current-state 자동 갱신\n leerness verify-claim <T-ID> ... [--strict-claims] # 1.9.26 verify-claim에 낙관적 표시 자동 검사 통합\n leerness reuse-map [path] [--all-apps] [--include p1,p2] [--strict-elements] [--json] # 1.9.18 중복/잠재중복/depends-on\n leerness verify-claim <T-ID> [--path .] [--run-tests] [--json] # 1.9.18-20 evidence 자동 검증 (1.9.20: scenes/scripts 등 도메인 폴더 + jest/mocha 파싱)\n leerness verify-code [path] [--build] [--bench] # 1.9.20 --bench: scripts.bench 추가 실행 + evidence 누적\n leerness session close [path]\n leerness route <task-type>\n leerness self check [path]\n leerness readme sync [path]\n leerness consistency check [path]\n leerness consistency merge-design-guide [path]\n leerness plan show|init|add|drop|progress|sync [args]\n leerness task list|add|update|drop|fix-evidence|relink [args]\n leerness skill list|info <name>\n leerness skill learn <id> --doc <url> --command "..." --capability "..." [--note ...]\n leerness skill use <id> [--note ...]\n leerness skill optimize <id> --before "..." --after "..." [--note ...]\n leerness skill remove <id>\n leerness skill consolidate [--threshold 0.3]\n leerness gate [path] # verify+audit+scan+encoding+lazy
|
|
11155
11224
|
leerness retro [path] [--days 7] [--all-apps] [--include p1,p2] [--json] # 회고 (1.9.13~1.9.16)
|
|
11156
11225
|
leerness insights [path] [--all-apps] [--include p1,p2] [--json] # 누적 통계 (1.9.13~1.9.16)
|
|
11157
11226
|
leerness brainstorm "<주제>" [--all-apps] [--include p1,p2] [--json] # 브레인스토밍 (1.9.13~1.9.16)
|