leerness 1.36.57 → 1.36.58

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 CHANGED
@@ -1,5 +1,14 @@
1
1
  # Changelog
2
2
 
3
+ ## 1.36.58 — 2026-07-21 — MCP core 프로필 (외부감사 F-09 종결) — R-0001 검수 3회전
4
+
5
+ 86종 전체 tools/list(약 45KB)가 세션 시작 토큰/도구 선택 혼선을 키우는 클라이언트용 경량 프로필.
6
+
7
+ - **`leerness mcp serve --profile core`** (또는 `LEERNESS_MCP_PROFILE=core`): 핵심 20종만 노출 — 에이전트 1세션 필수 루프(handoff→기억 CRUD→verify→인수인계) + 상태 substrate + get_project_context/about/brief. 비노출 도구 호출은 -32601 일관 거부(노출=호출가능). **기본 full 무변경**(검수 실측: tools/list 바이트 동일).
8
+ - (검수 Medium) 오타 프로필 fail-open 차단 — core/full 외에는 exit 1 거부(제한 요청의 무언 무력화 방지). (검수 Low) CORE 를 비열거+freeze — for..in/Object.keys 소비자 오인 차단.
9
+ - 검증: 검수 통과 프로브(20종 전원 _mcpToCliArgs 해석·policy 동일 적용·initialize/ping 불변·README 배지 86 유지·CORE 무누출), selftest 331(+1), 게이트.
10
+ - 외부 GPT 감사 백로그 정리: P0 5건 + P1 중 F-04/F-06/F-09 종결 — 잔여 F-05(en 완전 번역)는 규모상 별도 시리즈.
11
+
3
12
  ## 1.36.57 — 2026-07-21 — integrity check --repair: managed 문서 무결성 복구 (외부감사 F-04) — R-0001 검수 2회전
4
13
 
5
14
  drift(신선도)와 별개로 "파일 자체가 잘리거나 사라진" 손상을 감지/복구. R-0001 codex 검수가 High 2 포함 5건을 지적 — 전건 재현·보정 후 재검(minimal 오판·repair 실패 exit 0 는 검수 없이는 출하됐을 결함).
package/README.md CHANGED
@@ -122,7 +122,7 @@ MIT
122
122
  <!-- leerness:project-readme:start -->
123
123
  ## Leerness Project Harness
124
124
 
125
- 이 프로젝트는 Leerness v1.36.57 하네스를 사용합니다. AI 에이전트는 작업 전 `leerness handoff`로 컨텍스트를 적재하고, 작업 후 `leerness check`/`leerness audit`/`leerness session close`를 수행해야 합니다.
125
+ 이 프로젝트는 Leerness v1.36.58 하네스를 사용합니다. AI 에이전트는 작업 전 `leerness handoff`로 컨텍스트를 적재하고, 작업 후 `leerness check`/`leerness audit`/`leerness session close`를 수행해야 합니다.
126
126
 
127
127
  ### 정체성 — AI 에이전트 운영 레이어 (UR-0030)
128
128
 
@@ -176,7 +176,7 @@ leerness memory restore decision <date|title>
176
176
 
177
177
  ### MCP server (외부 AI 통합)
178
178
 
179
- Leerness v1.36.57는 stdio JSON-RPC MCP server를 내장합니다 — Claude Code · Cursor · Codex CLI 등 외부 AI에 **86개 도구**를 노출:
179
+ Leerness v1.36.58는 stdio JSON-RPC MCP server를 내장합니다 — Claude Code · Cursor · Codex CLI 등 외부 AI에 **86개 도구**를 노출:
180
180
 
181
181
  ```jsonc
182
182
  // 카테고리별
@@ -197,7 +197,7 @@ Leerness v1.36.57는 stdio JSON-RPC MCP server를 내장합니다 — Claude Cod
197
197
  `<<autonomous-loop-dynamic>>` 신호만 보내면 AI가:
198
198
  1) 다음 라운드 후보 선정 → 2) 코드 변경 → 3) 회귀 테스트 갱신 → 4) 전체 e2e 스위트 통과 → 5) npm publish + git tag → 6) main push → 7) session close → 8) 다음 라운드 예약.
199
199
 
200
- 현재 누적: **v1.9.x → 1.36.57 릴리스 태그 이력** (수백 라운드) · _reports/는 비공개 보존.
200
+ 현재 누적: **v1.9.x → 1.36.58 릴리스 태그 이력** (수백 라운드) · _reports/는 비공개 보존.
201
201
 
202
202
  ### 성능 가이드
203
203
 
@@ -235,6 +235,6 @@ leerness release pack --close --auto-main-push
235
235
  - `.harness/session-handoff.md`: 다음 세션 인수인계 (자동 작성)
236
236
  - `.harness/lessons.md` / `decisions.md` / `rules.md`: 영구 메모리 (5 surface)
237
237
 
238
- Last synced by Leerness v1.36.57: 2026-07-21
238
+ Last synced by Leerness v1.36.58: 2026-07-22
239
239
  <!-- leerness:project-readme:end -->
240
240
 
package/bin/leerness.js CHANGED
@@ -34,7 +34,7 @@ const { CAPABILITY_SURFACE, POWERFUL_COMMANDS, ADAPTERS, REUSE_CATEGORIES, REUSE
34
34
  const { tokenizeForRank: _tokenizeForRank, expandQuery: _expandQuery, scoreHits: _scoreHits, suggestTerms: _suggestTerms } = require('../lib/search-core'); // 1.36.23: memory search 랭킹 코어(순수·0-deps)
35
35
  const { findCorruptedStateJson: _findCorruptedStateJson } = require('../lib/state-integrity'); // 1.36.1 (클린룸 리뷰 FN): .harness/*.json 상태 무결성 (audit/health/check 공유)
36
36
 
37
- const VERSION = '1.36.57';
37
+ const VERSION = '1.36.58';
38
38
 
39
39
  // 1.9.290 (UR-0037, Codex gpt-5.5 #4 수렴): CLI 전용 부작용은 require 시 실행하지 않는다.
40
40
  // 이전: warning listener 제거 / NODE_OPTIONS 변경 / chcp IIFE 가 top-level 즉시 실행 → require('harness') 시 호스트 프로세스 오염.
@@ -5181,6 +5181,17 @@ function _selfTestCases() {
5181
5181
  const cleanAfter = process.exitCode !== 1;
5182
5182
  return detected && repaired && backed && customKept && cleanAfter;
5183
5183
  } finally { process.stdout.write = _w; process.argv = saveArgv; process.exitCode = saveExit; try { fs.rmSync(tmp, { recursive: true, force: true }); } catch {} }
5184
+ } },
5185
+ { name: 'MCP core 프로필 (1.36.58, 외부감사 F-09): CORE 20종 전원 실존 + 필수 루프 포함 + 기본 full 무변경 — 행위검사', run: () => {
5186
+ const m = require('../lib/mcp-tools');
5187
+ const names = new Set(m.map(t => t.name));
5188
+ const allExist = Array.isArray(m.CORE) && m.CORE.length >= 15 && m.CORE.length < m.length && m.CORE.every(n => names.has(n));
5189
+ const loop = ['leerness_handoff', 'leerness_session_close', 'leerness_verify_claim', 'leerness_state_handoff', 'leerness_get_project_context'].every(n => m.CORE.includes(n));
5190
+ // CORE 프로퍼티가 배열 직렬화를 오염하지 않음 (tools/list JSON 에 CORE 미포함)
5191
+ const cleanSer = !JSON.stringify(m).includes('"CORE"');
5192
+ const s = read(__filename);
5193
+ const wired = s.includes("_profile === 'core' ? _ALL_TOOLS.filter") && s.includes("Unknown tool: ${name} (core profile");
5194
+ return allExist && loop && cleanSer && wired;
5184
5195
  } }
5185
5196
  ];
5186
5197
  }
@@ -18553,7 +18564,13 @@ function mcpServeCmd(root) {
18553
18564
  root = absRoot(root || process.cwd());
18554
18565
  // 노출할 leerness 도구 목록
18555
18566
  // 1.9.297 (UR-0025 5단계): MCP 도구 정의를 lib/mcp-tools.js 단일출처로 분리 (Codex #5 regex self-count 영구 해소).
18556
- const TOOLS = require('../lib/mcp-tools');
18567
+ const _ALL_TOOLS = require('../lib/mcp-tools');
18568
+ // 1.36.58 (외부 GPT 감사 F-09): core 프로필 — 86종 전체(약 45KB tools/list)가 세션 시작 토큰/도구 선택 혼선을
18569
+ // 키우는 클라이언트를 위해 핵심 20종만 노출. opt-in(--profile core / LEERNESS_MCP_PROFILE=core), 기본 full 무변경.
18570
+ const _profile = String(arg('--profile', null) || process.env.LEERNESS_MCP_PROFILE || 'full').trim().toLowerCase();
18571
+ // (검수) 오타 프로필이 무언 full 로 새지 않게 — 제한 요청이 조용히 무력화되는 fail-open 차단
18572
+ if (_profile !== 'core' && _profile !== 'full') { fail(`알 수 없는 MCP 프로필: ${_profile} (가능: core, full)`); return process.exit(1); }
18573
+ const TOOLS = _profile === 'core' ? _ALL_TOOLS.filter(t => _ALL_TOOLS.CORE.includes(t.name)) : _ALL_TOOLS;
18557
18574
 
18558
18575
  function send(obj) {
18559
18576
  process.stdout.write(JSON.stringify(obj) + '\n');
@@ -18593,6 +18610,10 @@ function mcpServeCmd(root) {
18593
18610
  return send({ jsonrpc: '2.0', id, error: { code: -32602, message: 'Invalid params: arguments must be an object' } });
18594
18611
  }
18595
18612
  const args = _rawArgs || {};
18613
+ // 1.36.58 (F-09): core 프로필에서는 노출 집합 = 호출 가능 집합 (광고 안 한 도구 호출은 unknown 과 동일 처리)
18614
+ if (_profile === 'core' && !TOOLS.some(t => t.name === name)) {
18615
+ return send({ jsonrpc: '2.0', id, error: { code: -32601, message: `Unknown tool: ${name} (core profile — full: leerness mcp serve --profile full)` } });
18616
+ }
18596
18617
  // 1.36.39 (#3): 도구 inputSchema 기반 타입 검증 — {"title":{...}} 같은 비문자열이 "[object Object]" 로 영속되던 것 차단.
18597
18618
  {
18598
18619
  const _td = TOOLS.find(t => t.name === name);
package/lib/mcp-tools.js CHANGED
@@ -92,3 +92,19 @@ module.exports = [
92
92
  { name: 'leerness_honesty_check', requiredTier: 'read-only', description: '1.9.305 (사용자 명시) — AI 인식론적 정직성 점검. 주장/evidence 텍스트가 (1) 모르는 걸 아는 척(근거 없는 단정), (2) 검증 없는 섣부른 판단(추정+완료 결론), (3) 외부 정보 미수집(API/버전/스펙 언급+수집흔적 없음) 중 무엇에 해당하는지 휴리스틱 탐지. read-only. 에이전트가 자기 주장을 단언 전 self-check. 인자: { path?, taskId?, text? }. 응답: { ok, findings[], dimensions[], highCount }.', inputSchema: { type: 'object', properties: { path: { type: 'string' }, taskId: { type: 'string' }, text: { type: 'string' } } } },
93
93
  { name: 'leerness_brief', requiredTier: 'read-only', description: '1.9.308 (UR-0055) — 프로젝트 청사진 회수. 프로젝트 개요/소개/목적/기능/스택/아키텍처/성공기준/방향이력을 구조화 반환(show) 또는 복사용 blueprint 텍스트(export=true). read-only. 외부 에이전트가 "이 프로젝트가 무엇이고 어디로 가는가"를 1콜로 파악하거나, 신규 프로젝트 계획으로 복사. 인자: { path?, export? }. 응답(show): { project, intro, purpose, features[], stack[], directionHistory[], ... }.', inputSchema: { type: 'object', properties: { path: { type: 'string' }, export: { type: 'boolean' } } } }
94
94
  ];
95
+
96
+ // 1.36.58 (외부 GPT 감사 F-09): core 프로필 — 세션 시작 토큰/도구 선택 비용을 줄이는 핵심 20종.
97
+ // `leerness mcp serve --profile core` (또는 LEERNESS_MCP_PROFILE=core) 에서 tools/list·tools/call 이 이 집합만 노출.
98
+ // 기본은 full(무변경). 선정 기준: 에이전트 1세션의 필수 루프(컨텍스트 적재→기억 CRUD→검증→인수인계) + 상태 substrate.
99
+ // (검수) 비열거 프로퍼티 — Object.keys/for..in 을 쓰는 미래 소비자가 87번째 '요소'로 오인하지 않게.
100
+ Object.defineProperty(module.exports, 'CORE', {
101
+ enumerable: false,
102
+ value: Object.freeze([
103
+ 'leerness_handoff', 'leerness_session_close', 'leerness_get_project_context', 'leerness_about',
104
+ 'leerness_task_add', 'leerness_task_update', 'leerness_task_list',
105
+ 'leerness_decision_add', 'leerness_lesson_save', 'leerness_lessons', 'leerness_rule_list',
106
+ 'leerness_verify_claim', 'leerness_lazy_detect', 'leerness_drift_check', 'leerness_health',
107
+ 'leerness_state_show', 'leerness_state_start', 'leerness_state_record', 'leerness_state_handoff',
108
+ 'leerness_brief',
109
+ ]),
110
+ });
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "leerness",
3
- "version": "1.36.57",
3
+ "version": "1.36.58",
4
4
  "description": "The AI-coding operations layer that makes \"done\" require evidence — persistent memory, evidence-gated completion checks, and clean handoffs for any AI agent (Claude Code, Codex, Cursor). State lives as plain files in your repo. CLI + MCP, 0 runtime dependencies.",
5
5
  "keywords": [
6
6
  "leerness",