feat: StationOverlay 렌더링 최적화 및 스무딩 적용 close #1
- 텍스트(측점/POI) 전 프레임 사전 계산 Map (requestIdleCallback 백그라운드) - 드론 데이터 이동 평균 스무딩 (smoothFrame ±N프레임) - 30fps→60fps 프레임 간 선형 보간 (performance.now() 기반) - EMA(지수이동평균) 표시 위치 스무딩 (α=0.01 기본값) - 글씨 2배 크기, bold, strokeText 테두리, 배경 박스 제거 - 카메라 파라미터 패널에 smooth/EMA α 슬라이더 추가 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
36
.claude/skills/ffmpeg-cmd/SKILL.md
Normal file
36
.claude/skills/ffmpeg-cmd/SKILL.md
Normal file
@@ -0,0 +1,36 @@
|
||||
---
|
||||
name: ffmpeg-cmd
|
||||
description: 자연어 설명을 FFmpeg/FFprobe 명령으로 변환하고 실행합니다.
|
||||
argument-hint: "<설명>"
|
||||
disable-model-invocation: true
|
||||
---
|
||||
|
||||
## FFmpeg 명령 생성 및 실행
|
||||
|
||||
요청: **$ARGUMENTS**
|
||||
|
||||
### 실행 규칙
|
||||
|
||||
1. **CLAUDE.md**의 FFmpeg 관련 규칙을 먼저 확인하세요:
|
||||
- HLS 변환: 세그먼트 6초, 키프레임 2초, H.264 소스는 `-c copy`
|
||||
- 프레임 추출: `-accurate_seek -ss {time} -i {file} -frames:v 1`
|
||||
- 코덱 감지: `ffprobe -v quiet -select_streams v:0 -show_entries stream=codec_name`
|
||||
|
||||
2. 요청 내용을 FFmpeg/FFprobe 명령으로 변환
|
||||
|
||||
3. 실행 전 다음을 표시:
|
||||
- 생성된 명령
|
||||
- 각 플래그의 의미 (한줄 설명)
|
||||
- 예상 결과
|
||||
|
||||
4. 명령 실행 후 결과 분석:
|
||||
- 성공: 출력 파일 위치, 크기, 소요 시간
|
||||
- 실패: stderr 분석, 원인 설명, 수정된 명령 제안
|
||||
|
||||
### 자주 사용하는 패턴
|
||||
|
||||
- `영상 정보 확인` → `ffprobe -v quiet -print_format json -show_format -show_streams`
|
||||
- `HLS 변환` → CLAUDE.md의 HLS 변환 명령 패턴 사용
|
||||
- `프레임 추출` → `-accurate_seek -ss {time} -i {file} -frames:v 1`
|
||||
- `코덱 확인` → `ffprobe -v quiet -select_streams v:0 -show_entries stream=codec_name -of csv=p=0`
|
||||
- `썸네일 스프라이트` → 10초 간격 프레임 추출 후 타일링
|
||||
40
.claude/skills/review/SKILL.md
Normal file
40
.claude/skills/review/SKILL.md
Normal file
@@ -0,0 +1,40 @@
|
||||
---
|
||||
name: review
|
||||
description: 최근 코드 변경사항을 CLAUDE.md 규칙 기준으로 리뷰합니다.
|
||||
disable-model-invocation: true
|
||||
context: fork
|
||||
agent: code-reviewer
|
||||
---
|
||||
|
||||
## 코드 리뷰
|
||||
|
||||
최근 변경사항을 CLAUDE.md의 핵심 구현 규칙 기준으로 리뷰하세요.
|
||||
|
||||
### 리뷰 범위
|
||||
|
||||
변경된 파일 확인:
|
||||
!`git diff --name-only HEAD~1 2>/dev/null || echo "git diff 불가 - 전체 파일 리뷰"`
|
||||
|
||||
### 리뷰 기준 (CLAUDE.md에서 발췌)
|
||||
|
||||
**보안:**
|
||||
- Path traversal 방어 (path.resolve + 허용 디렉토리 검증)
|
||||
- 업로드 MIME + FFprobe 검증
|
||||
- CORS 설정
|
||||
|
||||
**메모리:**
|
||||
- URL.createObjectURL → revokeObjectURL 쌍
|
||||
- Canvas 재사용
|
||||
- hls.js backBufferLength: 30
|
||||
|
||||
**성능:**
|
||||
- timeupdate 직접 DOM 조작 금지
|
||||
- requestAnimationFrame/requestVideoFrameCallback 사용
|
||||
- 이진 탐색 O(log n)
|
||||
|
||||
**패턴 준수:**
|
||||
- Range Request: createReadStream + pipeline
|
||||
- FFmpeg: child_process.spawn 래퍼
|
||||
- Video.js: ref + useEffect 패턴
|
||||
|
||||
피드백을 Critical / Warning / Suggestion 으로 분류하세요.
|
||||
25
.claude/skills/status/SKILL.md
Normal file
25
.claude/skills/status/SKILL.md
Normal file
@@ -0,0 +1,25 @@
|
||||
---
|
||||
name: status
|
||||
description: 프로젝트 진행 상태를 확인하고 다음 작업을 제안합니다.
|
||||
disable-model-invocation: true
|
||||
---
|
||||
|
||||
## 프로젝트 진행 상태 확인
|
||||
|
||||
아래 파일들을 읽고 현재 상태를 요약하세요:
|
||||
|
||||
1. **PROGRESS.md** 읽기 — 현재 상태 요약, 단계별 진행 기록
|
||||
|
||||
2. **PLAN.md** 읽기 — 미완료 태스크 (`- [ ]`) 개수 파악
|
||||
|
||||
3. 다음 내용을 표 형태로 보고:
|
||||
|
||||
| 단계 | 상태 | 완료 태스크 | 남은 태스크 |
|
||||
|------|------|------------|------------|
|
||||
|
||||
4. **다음에 할 작업** 제안:
|
||||
- 의존성이 충족된 다음 단계 식별
|
||||
- 블로커가 있으면 강조
|
||||
- 병렬 진행 가능한 단계가 있으면 알림
|
||||
|
||||
5. 블로커/이슈가 있으면 빨간색으로 강조
|
||||
34
.claude/skills/step/SKILL.md
Normal file
34
.claude/skills/step/SKILL.md
Normal file
@@ -0,0 +1,34 @@
|
||||
---
|
||||
name: step
|
||||
description: PLAN.md의 특정 단계를 실행합니다. 단계 번호를 인자로 전달합니다.
|
||||
argument-hint: "<단계번호>"
|
||||
disable-model-invocation: true
|
||||
---
|
||||
|
||||
## 단계 $ARGUMENTS 실행
|
||||
|
||||
step-worker 에이전트를 사용하여 PLAN.md의 **단계 $ARGUMENTS**를 수행합니다.
|
||||
|
||||
### 실행 프로토콜
|
||||
|
||||
1. 먼저 아래 3개 파일을 순서대로 읽으세요:
|
||||
- `CLAUDE.md` — 프로젝트 규칙/아키텍처
|
||||
- `PLAN.md` — 단계 $ARGUMENTS의 세부 태스크 확인
|
||||
- `PROGRESS.md` — 이전 단계 완료 여부, 블로커, 인계사항
|
||||
|
||||
2. PROGRESS.md에서 단계 $ARGUMENTS의 상태를 "🔄 진행 중"으로 업데이트
|
||||
|
||||
3. PLAN.md의 단계 $ARGUMENTS 태스크를 위에서 아래로 순서대로 수행:
|
||||
- 각 태스크 완료 시 PLAN.md에서 `- [ ]`를 `- [x]`로 변경
|
||||
- 의미 있는 마일스톤마다 PROGRESS.md 업데이트
|
||||
|
||||
4. 모든 태스크 완료 후:
|
||||
- PLAN.md의 **산출물(완료 기준)**을 직접 검증
|
||||
- PROGRESS.md에 최종 결과 기록 (완료 항목, 미완료/이슈, 다음 단계 참고)
|
||||
- 산출물 충족 시 상태를 "✅ 완료"로 변경
|
||||
|
||||
### 주의사항
|
||||
|
||||
- 이전 단계가 완료되지 않았으면 사용자에게 알리고 중단
|
||||
- 블로커 발견 시 PROGRESS.md에 기록 후 사용자에게 보고
|
||||
- 이전 에이전트가 작성한 코드를 이유 없이 변경하지 않음
|
||||
34
.claude/skills/verify/SKILL.md
Normal file
34
.claude/skills/verify/SKILL.md
Normal file
@@ -0,0 +1,34 @@
|
||||
---
|
||||
name: verify
|
||||
description: 특정 단계의 산출물(완료 기준)을 검증합니다. 단계 번호를 인자로 전달합니다.
|
||||
argument-hint: "<단계번호>"
|
||||
disable-model-invocation: true
|
||||
---
|
||||
|
||||
## 단계 $ARGUMENTS 검증
|
||||
|
||||
PLAN.md의 **단계 $ARGUMENTS**에 정의된 산출물(완료 기준)을 하나씩 검증합니다.
|
||||
|
||||
### 검증 프로토콜
|
||||
|
||||
1. **PLAN.md** 읽기 → 단계 $ARGUMENTS의 "산출물 (완료 기준)" 섹션 확인
|
||||
2. **PROGRESS.md** 읽기 → 현재 상태, 알려진 이슈 확인
|
||||
|
||||
3. 각 산출물 항목을 실제로 실행하여 검증:
|
||||
- 빌드 확인: `npx tsc --noEmit`, `npm run build`
|
||||
- 서버 기동: 서버 시작 후 API 엔드포인트 curl 테스트
|
||||
- 클라이언트: 개발 서버 기동 확인, 빌드 성공 확인
|
||||
- 기능 테스트: 해당 단계의 핵심 기능 동작 확인
|
||||
|
||||
4. 각 항목에 대해 결과 보고:
|
||||
- ✅ 통과: 확인 방법 + 결과
|
||||
- ❌ 실패: 에러 내용 + 원인 분석 + 수정 제안
|
||||
- ⚠️ 부분 통과: 동작하지만 이슈 있음
|
||||
|
||||
5. 종합 결과를 PROGRESS.md에 기록
|
||||
|
||||
### 주의사항
|
||||
|
||||
- 실행 중인 프로세스는 검증 후 반드시 종료
|
||||
- 서버 포트 충돌 시 기존 프로세스 확인 후 처리
|
||||
- 검증만 수행하고 코드 수정은 하지 않음 (수정이 필요하면 보고)
|
||||
Reference in New Issue
Block a user