## 2026-06-11 — 하네스 Claude 탭 개편: 파일명 타이틀 + 확대 에디터 + CLAUDE.local.md + Hooks + Skills

### 배경

하네스의 "메모리 파일" 섹션이 작은 고정 높이 textarea라 CLAUDE.md가 잘려 읽기 어려웠고, CLAUDE.local.md·hooks·skills 같은 Claude 프로젝트 설정은 아예 보이지 않았다.

### 주요 변경

#### 1. 메모리 에디터 개선 (`cf206eb`)

- **클라이언트**: 섹션 제목을 "메모리 파일" 대신 **실제 파일명**(`CLAUDE.md` / `GEMINI.md` / `AGENTS.md`)으로 표시. 기본 높이를 키우고(h-96) 우측 상단 확대 토글(75vh) 추가 — 긴 파일도 잘리지 않고 읽고 수정할 수 있다.

#### 2. CLAUDE.local.md (`cf206eb`)

- 파일이 있으면 CLAUDE.md 아래 같은 에디터로 표시·수정. 없으면 "CLAUDE.local.md 만들기" 점선 버튼 — 내용 작성 후 저장하면 생성.
- **서버**: `PUT /api/harness/:projectId/:cli/local-memory` 신설 (Claude 전용 — 어댑터 선택 기능).

#### 3. Hooks 패널 (`cf206eb`)

- `.claude/settings.json`의 `hooks` 블록을 **이벤트별 매처 + 실행 커맨드** 목록으로 표시. "JSON 편집" 모드에서 원본 JSON을 직접 수정·저장(파싱 검증 후 전체 교체, 비우고 저장하면 hooks 키 제거). settings.json의 다른 키는 보존.
- **서버**: `PUT /api/harness/:projectId/:cli/hooks`.

#### 4. Skills 패널 (`cf206eb`)

- `.claude/skills/*/SKILL.md`를 스캔해 **스킬 이름 + frontmatter description** 목록으로 표시. 행을 펼치면 SKILL.md 본문을 인라인 수정·저장.
- **서버**: `PUT /api/harness/:projectId/:cli/skills/:name`. 스킬 이름은 `safeJoin`으로 경로 탈출 차단.

### 수정된 주요 파일

| 파일 | 변경 내용 |
|------|----------|
| `src/server/plugins/harness/types.ts` | 스냅샷 확장(localMemory/hooks/skills) + 어댑터 선택 메서드 3종 |
| `src/server/plugins/harness/adapters/claude.ts` | local.md 읽기/쓰기, hooks 읽기/교체, skills 스캔(frontmatter 파싱)/쓰기 |
| `src/server/plugins/harness/router.ts` | local-memory / hooks / skills 라우트 (미지원 CLI는 400) |
| `src/client/src/plugins/harness/MemoryEditor.tsx` | 파일명 타이틀 + 확대 토글 + 높이 증가 |
| `src/client/src/plugins/harness/HooksPanel.tsx` (신규) | hooks 목록 + JSON 편집 |
| `src/client/src/plugins/harness/SkillsPanel.tsx` (신규) | skills 목록 + 인라인 편집 |
| `src/client/src/plugins/harness/CliTab.tsx` | Claude 탭에 local.md/Hooks/Skills 배선 |

### 아키텍처 결정

1. **어댑터 선택 기능(optional capability)**: local.md/hooks/skills는 Claude 컨벤션이므로 `HarnessAdapter`에 선택 메서드로 추가하고, 미구현 CLI 요청은 라우트에서 400으로 거른다 — Gemini/Codex 어댑터는 무변경.
2. **hooks는 전체 교체**: 부분 머지로는 항목 삭제를 표현할 수 없어 hooks 블록을 통째로 교체한다. settings.json의 나머지 키는 읽어서 보존.
