ワンクリックで
verify-cross-store-sync
todoStore↔timerStore 간 연동 및 삭제 안전성 SYNC-1~6 검증.
Codex または Claude でインストール この Prompt をコピーして Codex、Claude、または他のアシスタントに貼り付けると、Skill ページを確認してインストールできます。
メニュー
todoStore↔timerStore 간 연동 및 삭제 안전성 SYNC-1~6 검증.
Codex または Claude でインストール この Prompt をコピーして Codex、Claude、または他のアシスタントに貼り付けると、Skill ページを確認してインストールできます。
SOC 職業分類に基づく
세션 변경사항을 분석하여 검증 스킬 누락을 탐지합니다. 기존 스킬을 동적으로 탐색하고, 새 스킬을 생성하거나 기존 스킬을 업데이트한 뒤 CLAUDE.md를 관리합니다.
프로젝트의 모든 verify 스킬을 순차 실행하여 통합 검증 보고서를 생성합니다. 기능 구현 후, PR 전, 코드 리뷰 시 사용.
서버 사이드 타이머 동기화 SYNC-T1~T5 검증. 브라우저 닫아도 타이머 상태 유지, 서버 시간 기준 경과시간 계산.
UX/동작 규칙 E1-E9 검증. 컴포넌트, CSS, App 레이아웃 변경 후 사용.
프론트↔백엔드 API 연동 API-1~7 검증. todoStore, 서버 라우트 변경 후 사용.
프런트엔드·백엔드 빌드 검증 BUILD-1~4. 소스 변경 후 타입 체크와 프로덕션 빌드가 에러 없이 통과하는지 확인.
| name | verify-cross-store-sync |
| description | todoStore↔timerStore 간 연동 및 삭제 안전성 SYNC-1~6 검증. |
todoStore와 timerStore 간 연동 및 삭제 안전성을 검증합니다:
src/stores/todoStore.ts 또는 src/stores/timerStore.ts 수정 후src/components/TodoItem.tsx 삭제/시작 버튼 로직 변경 후| File | Purpose |
|---|---|
src/stores/todoStore.ts | deleteTodo, incrementPomodoro 액션 |
src/stores/timerStore.ts | activeTodoId, reset, onPhaseComplete |
src/components/TodoItem.tsx | 삭제 버튼, ▶ 시작 버튼 UI |
src/components/TodoList.tsx | 삭제 핸들러 (위치에 따라) |
파일: src/stores/todoStore.ts, src/components/TodoItem.tsx
검사: deleteTodo 시 activeTodoId와 비교 후 reset 호출
grep -n "activeTodoId\|timerStore\|useTimerStore" src/stores/todoStore.ts
grep -n "reset\|activeTodoId" src/components/TodoItem.tsx src/components/TodoList.tsx
grep -B2 -A5 "deleteTodo\|handleDelete" src/components/TodoItem.tsx
PASS: 삭제 대상 === activeTodoId 비교 + reset() 호출 존재 FAIL: deleteTodo가 timerStore를 전혀 참조하지 않음
수정 방법: 삭제 핸들러에서 useTimerStore.getState().activeTodoId === id 체크 후 reset() 호출
파일: src/components/TodoItem.tsx
검사: 삭제 전 confirm() 또는 커스텀 모달 존재
grep -n "confirm\|Confirm\|확인\|삭제" src/components/TodoItem.tsx
grep -n "confirm\|Confirm" src/components/TodoList.tsx
PASS: window.confirm() 또는 커스텀 확인 UI 존재 + 취소 시 삭제 미실행
FAIL: 삭제 버튼 클릭 즉시 삭제
수정 방법: if (!window.confirm('정말 삭제하시겠습니까?')) return; 추가
파일: src/stores/timerStore.ts
검사: onPhaseComplete에서 work 페이즈 완료 시 incrementPomodoro 호출
grep -B2 -A10 "onPhaseComplete\|phaseComplete" src/stores/timerStore.ts
grep -n "incrementPomodoro\|todoStore\|useTodoStore" src/stores/timerStore.ts
PASS: phase === 'work' 조건 + incrementPomodoro(activeTodoId) 호출 존재
FAIL: timerStore가 todoStore를 참조하지 않음
수정 방법: onPhaseComplete에 if (phase === 'work' && activeTodoId) useTodoStore.getState().incrementPomodoro(activeTodoId) 추가
파일: src/components/TodoItem.tsx
검사: completed Todo의 리스트 클릭 시 뽀모도로 선택 차단
grep -B2 -A5 "handleItemClick" src/components/TodoItem.tsx
grep -n "todo.completed" src/components/TodoItem.tsx
PASS: todo.completed 체크로 뽀모도로 선택 차단 (return early)
FAIL: 완료된 Todo에서도 뽀모도로 선택 가능
파일: src/components/TodoItem.tsx
검사: 실행 중(active + running)인 TODO의 체크박스 클릭 시 alert 경고 + 확인 후 토글+리셋
grep -n "alert\|window.confirm\|초기화" src/components/TodoItem.tsx
grep -n "handleCheckbox" src/components/TodoItem.tsx
PASS: 실행중 TODO 체크박스에 alert/confirm 경고 + "초기화" 안내 + 확인 시 toggle+reset FAIL: 실행중 TODO도 경고 없이 즉시 완료 토글
수정 방법: handleCheckboxChange에서 isActive + running 체크 → confirm 후 onToggle + reset
파일: src/components/TodoItem.tsx
검사: 타이머 실행 중에 다른 TODO를 클릭하면 confirm 경고 후 전환
grep -B2 -A8 "handleItemClick" src/components/TodoItem.tsx
grep -n "isRunning.*isActive\|!isActive" src/components/TodoItem.tsx
PASS: isRunning && !isActive 조건 + confirm 경고("초기화됩니다") + 취소 시 전환 안 함
FAIL: 실행 중에 다른 TODO 클릭 시 경고 없이 즉시 전환
수정 방법: handleItemClick에서 isRunning && !isActive 체크 → confirm 후 onSelectTodo
| Step | 검사 | 판정 | 비고 |
|------|------|------|------|
| 1 | 삭제→타이머 리셋 | PASS/FAIL | 상세 |
| 2 | 삭제 confirm | PASS/FAIL | 상세 |
| 3 | 카운트 연동 | PASS/FAIL | 상세 |
| 4 | 완료 Todo 차단 | PASS/FAIL | 상세 |
| 5 | 실행중 완료 경고 | PASS/FAIL | 상세 |
| 6 | 실행중 전환 경고 | PASS/FAIL | 상세 |
useXxxStore.getState() 직접 호출 또는 컴포넌트 레벨 조합 모두 허용confirm() 사용 가능node_modules/ 제외