Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
56 commits
Select commit Hold shift + click to select a range
f7fcf9d
feat: OBS 모드 상태 모델 및 WS 프로토콜 타입 정의
lee-sihun Mar 7, 2026
3976c45
feat: ObsBridgeService 구현 (WebSocket 서버)
lee-sihun Mar 7, 2026
fd58478
feat: AppState에 ObsBridge 통합 + OBS Tauri 커맨드 + 키/설정 이벤트 연동
lee-sihun Mar 7, 2026
49a76de
feat: OBS 초기 스냅샷 캐싱 + 카운터/프리셋 broadcast 연동
lee-sihun Mar 7, 2026
2f6cc10
refactor: OverlayScene 공용 렌더링 컴포넌트 추출
lee-sihun Mar 7, 2026
2a4db36
feat: OBS standalone 페이지 구현 (WebSocket 클라이언트 + OverlayScene)
lee-sihun Mar 7, 2026
c61f35f
feat: 메인 윈도우 OBS 설정 UI 추가
lee-sihun Mar 7, 2026
7f2fff2
fix: ObsBridge clippy 경고 수정
lee-sihun Mar 7, 2026
8a00651
chore: Rust 빌드 경고 수정 및 설계 문서 정리
lee-sihun Mar 7, 2026
5fdb3d8
feat: OBS v2 — HTTP 정적 서빙 + 레이아웃 동기화 + 캐시 갱신
lee-sihun Mar 7, 2026
88dff32
fix: Codex 리뷰 기반 OBS 모드 보안/안정성 수정
lee-sihun Mar 7, 2026
1c89ed9
feat: OBS 설정 영속화 + 부팅 자동시작
lee-sihun Mar 7, 2026
2ffad95
feat: OBS 모드 오버레이 연동 + KPS 로컬 계산
lee-sihun Mar 7, 2026
3bd6a15
feat: OBS 모드 UI 안내 문구 추가
lee-sihun Mar 7, 2026
a99e638
docs: OBS v3 로드맵 상태 업데이트
lee-sihun Mar 7, 2026
4d1e38f
feat: OBS keyDisplayDelayMs + per-key noteEffectEnabled 지원
lee-sihun Mar 7, 2026
90f508d
docs: OBS v3 P2 로드맵 상태 업데이트
lee-sihun Mar 7, 2026
4bbd90e
refactor: 레이아웃 계산 로직을 공용 computeLayout() 함수로 추출 (#11)
lee-sihun Mar 7, 2026
6d47c42
feat: OBS WS 세션 보안 토큰 추가 (#9)
lee-sihun Mar 7, 2026
ec15b2e
feat: OBS 커스텀 CSS 실시간 주입 (#5)
lee-sihun Mar 7, 2026
71879fd
feat: OBS 미디어 파일 HTTP 서빙 (#6)
lee-sihun Mar 7, 2026
4522ad0
feat: OBS dev 모드 Vite dev server 프록시 (#10)
lee-sihun Mar 7, 2026
51c59e8
docs: OBS v3 P2 로드맵 전체 완료 표시
lee-sihun Mar 7, 2026
9b65c61
fix: OBS SPA fallback이 정적 리소스에 index.html 반환하는 버그 수정
lee-sihun Mar 7, 2026
79cfe15
fix: dev 모드에서 Vite dev server를 static_dir보다 우선 사용
lee-sihun Mar 7, 2026
e0218bd
fix: OBS HTTP 서버 static_dir을 renderer 루트로 변경하여 asset 404 해결
lee-sihun Mar 7, 2026
76ab792
docs: OverlayHost 호환성 레이어 설계 문서화 (§12)
lee-sihun Mar 7, 2026
791bc3c
refactor: useOverlayRuntime 훅 추출 및 obs/App.tsx 단순화
lee-sihun Mar 7, 2026
8f456f9
fix: OBS bridge를 Tauri 임베딩 에셋으로 전환하여 포터블 exe 지원
lee-sihun Mar 7, 2026
0ca539c
docs: §12 Tauri IPC Shim 호환성 레이어 설계로 전면 개편
lee-sihun Mar 8, 2026
dac007a
feat: IPC Shim 재작성 — denyList 동적 수신, tauri_event, convertFileSrc base…
lee-sihun Mar 8, 2026
3893666
feat: 백엔드 WS RPC 핸들러 — invoke_request → webview.on_message() 자동 디스패치
lee-sihun Mar 8, 2026
28adb94
feat: Tauri 이벤트 → OBS WS 포워딩 브릿지 구현
lee-sihun Mar 8, 2026
f32faf4
feat: BootstrapPayload에 layerGroups, tabNoteOverrides, tabCssOverride…
lee-sihun Mar 8, 2026
9cc15e0
refactor: 레거시 OBS 훅 및 obs/App.tsx 제거
lee-sihun Mar 8, 2026
c012333
docs: OBS 설계 문서에 v4 IPC Shim 구현 결과 반영
lee-sihun Mar 8, 2026
4a35883
fix: invoke_request 필드명 수정 + 전용 WS 메시지를 tauri_event로 통합
lee-sihun Mar 8, 2026
3aeb48e
fix: snapshotCache 증분 갱신 복원 + obs.ts 미사용 타입 정리
lee-sihun Mar 8, 2026
8ee4a8d
refactor: ipcShim을 완전 generic으로 정리 — 캐시/분기 코드 제거
lee-sihun Mar 8, 2026
2783c57
refactor: listen → listen_any로 변경 + OBS 이벤트 가이드 문서화
lee-sihun Mar 8, 2026
b1f20aa
docs: OBS 모드 가이드를 Tauri 커맨드 아래로 이동 + deny list 서술 추가
lee-sihun Mar 8, 2026
8ff8668
feat: OBS 모드 시 오버레이 윈도우 destroy + 이벤트 기반 상태 동기화
lee-sihun Mar 8, 2026
f2b95ac
fix: auto_start_obs에서 초기 스냅샷 캐싱 누락 수정
lee-sihun Mar 8, 2026
5591074
fix: obs_stop을 async로 변경하여 WebView2 초기화 문제 해결 + destroy 방식 정리
lee-sihun Mar 8, 2026
5bbb353
agents: 스킬 업데이트
lee-sihun Mar 9, 2026
7ff5a7e
agents: Codex 대기 정책 명시 — timeout ≠ fallback
lee-sihun Mar 9, 2026
9efa796
feat: OBS 세션 토큰 영구 저장 + 토큰 재생성 기능
lee-sihun Mar 10, 2026
553e1cc
refactor: OBS 포트 수동 설정 제거 + 자동 포트 fallback 구현
lee-sihun Mar 10, 2026
ce84c64
docs: obs-mode-improvements 업데이트 + Codex 스킬에 피드백 필터링 규칙 추가
lee-sihun Mar 10, 2026
c54c7f6
fix: clippy 에러 및 경고 수정, ESLint 경고 해결
lee-sihun Mar 10, 2026
b368d40
fix: clippy 경고 전면 해소 + cargo fmt 적용
lee-sihun Mar 10, 2026
2c11d70
fix: Tauri ACL remote URL regex로 인한 200MB 힙 메모리 누수 해결
lee-sihun Mar 10, 2026
a4f4310
fix: OBS 모드 해제 후 오버레이 비표시 상태에서 앱 프리징 해결
lee-sihun Mar 10, 2026
3b4c829
feat: 트레이 아이콘 좌클릭 시 메인 윈도우 즉시 표시
lee-sihun Mar 10, 2026
0f44ea4
refactor: OBS 모드 설정 섹션 디자인을 프로젝트 패턴에 맞게 개선
lee-sihun Mar 10, 2026
9888cef
feat: obs 모드 개선
lee-sihun Mar 10, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
46 changes: 35 additions & 11 deletions .claude/CLAUDE.md
Original file line number Diff line number Diff line change
@@ -1,41 +1,65 @@
# 로컬 워크플로 규칙

## 구현 요청 시 필수 행동

사용자가 다음 중 하나에 해당하는 요청을 하면, **무조건 첫 번째 도구 호출로 `Skill` 도구를 사용하여 `/codex-plan`을 실행**해야 합니다:
- 기능 구현/추가 ("~해줘", "~추가해줘", "~구현해줘", "~만들어줘")
- 리팩토링/아키텍처 변경
- 설계 논의/계획 수립

이것은 이 프로젝트의 **절대 규칙**입니다:
1. 사용자 메시지를 읽는다
2. 구현 요청인지 판단한다
3. 구현 요청이면 → **즉시 `Skill(skill: "codex-plan", args: "사용자 요청 내용")`을 호출한다**
4. Read, Grep, Glob, Agent 등 다른 도구는 `/codex-plan` 스킬 실행 후에만 사용한다

**위반 금지**: 파일을 먼저 읽거나, 코드를 분석하거나, 계획을 직접 세우는 행위는 이 규칙의 위반입니다.

예외: 단순 버그 수정(1~2줄), 오타/포맷팅 수정, 질문/설명 요청

## 기본 워크플로

모든 구현 작업은 다음 워크플로를 따릅니다.

### 1. 계획 수립 (필수)
사용자의 구현 요청이나 설계 논의가 있으면 `/plan` 스킬을 사용하여 Codex와 함께 계획을 수립합니다.
- 단순 버그 수정이나 1~2줄 변경이 아닌 이상 항상 plan을 먼저 실행
- Claude 선분석 → Codex 검증 → 최종 계획 확정
위 규칙에 따라 `/codex-plan` 스킬을 호출합니다.
- Claude 선분석 → Codex 독립 검증 → 최종 계획 확정

### 2. 단계별 구현 + 코드 리뷰
확정된 계획을 단계별로 나누어 구현하고, 각 단계마다 `/codex-review`로 코드 리뷰를 수행합니다.
확정된 계획을 단계별로 나누어 구현합니다.
- 한 번에 모든 변경을 하지 않고, 논리적 단위로 분리
- 각 단계 완료 후 Codex 리뷰 → 이슈 있으면 수정 → 리뷰 통과 확인
- 각 단계 완료 후 변경의 규모와 리스크를 판단하여 Codex 리뷰 필요 여부를 결정
- Codex 리뷰가 필요하다고 판단되면 `/codex-review` 실행
- 리뷰 없이 진행할 경우 그 판단 근거를 간단히 명시

### 3. 빌드/린트 검증
변경 내용에 따라 적절한 검증을 수행합니다.
- Rust 변경: `cargo check`, `cargo clippy`
- TypeScript 변경: `npx tsc --noEmit`, `npm run lint`
- 검증 주체(Claude/Codex)는 상황에 따라 자유롭게 결정

### 3. 자동 커밋
각 단계의 리뷰가 통과되면 해당 변경사항을 즉시 커밋합니다.
### 4. 자동 커밋
각 단계의 검증이 통과되면 해당 변경사항을 즉시 커밋합니다.
- 커밋 메시지는 변경 내용에 맞게 작성
- 단계별로 커밋하여 git 히스토리를 깔끔하게 유지

### 워크플로 예시
```
사용자: "키보드 입력 시스템에 딜레이 옵션 추가해줘"

1. /plan 실행 → Codex와 구현 계획 수립
1. Skill(skill: "codex-plan", args: "키보드 입력 시스템에 딜레이 옵션 추가") ← 무조건 첫 번째
2. 단계 1: Rust 백엔드 커맨드 추가 → /codex-review → 커밋
3. 단계 2: 프론트엔드 설정 UI 추가 → /codex-review → 커밋
3. 단계 2: 프론트엔드 설정 UI 추가 → 변경 소규모로 판단, Claude 자체 검증 → 커밋
4. 단계 3: 오버레이 반영 로직 수정 → /codex-review → 커밋
```

### 4. 최종 보고
### 5. 최종 보고
모든 단계가 완료되면 작업 결과를 정리하여 보고합니다.
- 변경된 파일 목록과 각 변경 요지
- 커밋 히스토리 요약
- Codex 리뷰에서 나온 주요 피드백과 반영 여부
- 남은 리스크나 후속 작업이 있으면 명시

## 예외
- 1~2줄 수정, 오타 수정, 포맷팅 등 사소한 변경은 plan/review 없이 직접 처리
- 사소한 변경(오타, 포맷팅, import 정리 등)은 plan/review 없이 직접 처리
- 긴급 핫픽스는 plan 없이 구현 후 review만 수행
90 changes: 90 additions & 0 deletions .claude/skills/codebase-memory-exploring/SKILL.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,90 @@
---
name: codebase-memory-exploring
description: >
This skill should be used when the user asks to "explore the codebase",
"understand the architecture", "what functions exist", "show me the structure",
"how is the code organized", "find functions matching", "search for classes",
"list all routes", "show API endpoints", or needs codebase orientation.
---

# Codebase Exploration via Knowledge Graph

Use graph tools for structural code questions. They return precise results in ~500 tokens vs ~80K for grep-based exploration.

## Workflow

### Step 1: Check if project is indexed

```
list_projects
```

If the project is missing from the list:

```
index_repository(repo_path="/path/to/project")
```

If already indexed, skip — auto-sync keeps the graph fresh.

### Step 2: Get a structural overview

```
get_graph_schema
```

This returns node label counts (functions, classes, routes, etc.), edge type counts, and relationship patterns. Use it to understand what's in the graph before querying.

### Step 3: Find specific code elements

Find functions by name pattern:
```
search_graph(label="Function", name_pattern=".*Handler.*")
```

Find classes:
```
search_graph(label="Class", name_pattern=".*Service.*")
```

Find all REST routes:
```
search_graph(label="Route")
```

Find modules/packages:
```
search_graph(label="Module")
```

Scope to a specific directory:
```
search_graph(label="Function", qn_pattern=".*services\\.order\\..*")
```

### Step 4: Read source code

After finding a function via search, read its source:
```
get_code_snippet(qualified_name="project.path.to.FunctionName")
```

### Step 5: Understand structure

For file/directory exploration within the indexed project:
```
list_directory(path="src/services")
```

## When to Use Grep Instead

- Searching for **string literals** or error messages → `search_code` or Grep
- Finding a file by exact name → Glob
- The graph doesn't index text content, only structural elements

## Key Tips

- Results default to 10 per page. Check `has_more` and use `offset` to paginate.
- Use `project` parameter when multiple repos are indexed.
- Route nodes have a `properties.handler` field with the actual handler function name.
- `exclude_labels` removes noise (e.g., `exclude_labels=["Route"]` when searching by name pattern).
101 changes: 101 additions & 0 deletions .claude/skills/codebase-memory-quality/SKILL.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,101 @@
---
name: codebase-memory-quality
description: >
This skill should be used when the user asks about "dead code",
"find dead code", "detect dead code", "show dead code", "dead code analysis",
"unused functions", "find unused functions", "unreachable code",
"identify high fan-out functions", "find complex functions",
"code quality audit", "find functions nobody calls",
"reduce codebase size", "refactor candidates", "cleanup candidates",
or needs code quality analysis.
---

# Code Quality Analysis via Knowledge Graph

Use graph degree filtering to find dead code, high-complexity functions, and refactor candidates — all in single tool calls.

## Workflow

### Dead Code Detection

Find functions with zero inbound CALLS edges, excluding entry points:

```
search_graph(
label="Function",
relationship="CALLS",
direction="inbound",
max_degree=0,
exclude_entry_points=true
)
```

`exclude_entry_points=true` removes route handlers, `main()`, and framework-registered functions that have zero callers by design.

### Verify Dead Code Candidates

Before deleting, verify each candidate truly has no callers:

```
trace_call_path(function_name="SuspectFunction", direction="inbound", depth=1)
```

Also check for read references (callbacks, stored in variables):

```
query_graph(query="MATCH (a)-[r:USAGE]->(b) WHERE b.name = 'SuspectFunction' RETURN a.name, a.file_path LIMIT 10")
```

### High Fan-Out Functions (calling 10+ others)

These are often doing too much and are refactor candidates:

```
search_graph(
label="Function",
relationship="CALLS",
direction="outbound",
min_degree=10
)
```

### High Fan-In Functions (called by 10+ others)

These are critical functions — changes have wide impact:

```
search_graph(
label="Function",
relationship="CALLS",
direction="inbound",
min_degree=10
)
```

### Files That Change Together (Hidden Coupling)

Find files with high git change coupling:

```
query_graph(query="MATCH (a)-[r:FILE_CHANGES_WITH]->(b) WHERE r.coupling_score >= 0.5 RETURN a.name, b.name, r.coupling_score, r.co_change_count ORDER BY r.coupling_score DESC LIMIT 20")
```

High coupling between unrelated files suggests hidden dependencies.

### Unused Imports

```
search_graph(
relationship="IMPORTS",
direction="outbound",
max_degree=0,
label="Module"
)
```

## Key Tips

- `search_graph` with degree filters has no row cap (unlike `query_graph` which caps at 200).
- Use `file_pattern` to scope analysis to specific directories: `file_pattern="**/services/**"`.
- Dead code detection works best after a full index — run `index_repository` if the project was recently set up.
- Paginate results with `limit` and `offset` — check `has_more` in the response.
Loading