.gitea/workflows/deploy.yml이 실제 실행되는 파일.
actions/checkout, actions/setup-node, appleboy/ssh-action을
모두 직접 실행 방식으로 대체.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
actions/setup-node → curl + apt-get 직접 설치
docker/login-action + build-push-action → docker CLI 직접 사용
appleboy/ssh-action → ssh 직접 실행
Gitea runner가 github.com에서 action clone 실패하는 문제 해결.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- SSAFY OAuth state 파라미터 전달 추가 (로그인 불능 해결)
- POST/PUT/DELETE 5xx 및 네트워크 에러 재시도 방지 (멱등 요청만 재시도)
- UserAdmin 페이지네이션 추가 (offset/limit)
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- test job: lint + vitest + build
- docker job: main 머지 시 nginx 이미지 빌드/푸시
- deploy job: SSH로 docker compose pull web && up
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Vitest 4.x가 jsdom에 --localstorage-file을 빈 경로로 전달할 때
localStorage가 .clear()가 없는 stub 객체가 되는 문제 수정.
setup.js에서 Storage 전체 구현체로 폴백.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- ErrorBoundary에 에러 유형/메시지 표시 + 다시 시도/새로고침 버튼 추가
- admin 컴포넌트 CSS Modules 전환 (클래스명 충돌 방지)
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
보안:
- SSAFY OAuth URL https 스킴 검증
- CSRF 방어 X-Requested-With 헤더 추가
- 업로드 에러 상태코드별 메시지 분기 (413, 409, 5xx)
UX:
- Admin 페이지 Toast 알림 통합
- API 에러 메시지 한글화 (localizeError)
- og:title, og:description 메타 태그 추가
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- useCallback → 일반 함수 + eslint-disable (초기 데이터 fetch)
- ToastProvider: useCallback 프로퍼티 할당 → useMemo 객체 패턴
- SSAFYCallbackPage: eslint-disable-line 추가
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Dockerfile에 nginx HEALTHCHECK 추가 (wget, 30s 간격)
- deploy 단계 git clone에 set +x / --quiet / 2>/dev/null 적용
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- DownloadSection loadInfo useCallback 래핑
- DownloadAdmin reload 중복 → 단일 load 함수
- LoginPage/RegisterPage 에러 메시지 role="alert"
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Toast 알림 컴포넌트 추가 (success/error/warn/info)
- AnnouncementAdmin 초기 로딩 상태 + 에러 표시
- DownloadAdmin 로딩 상태 추가
- UserAdmin/AnnouncementAdmin에 Toast 피드백 적용
- API client 5xx/네트워크 에러 자동 재시도
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- 회원가입 username 검증을 서버와 동일하게 맞춤
- 비밀번호 maxLength를 bcrypt 제한(72)에 맞춤
- 공지사항 줄바꿈 CSS 처리 (pre→white-space)
- 어드민 페이지 에러 로깅 추가
- 다운로드 섹션 로딩 스켈레톤 추가
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- 로그인/회원가입 입력 길이 제한 (username 50자, password 100자)
- 공지사항 관리 입력 길이 제한 (제목 200자, 내용 10000자)
- AnnouncementBoard aria-expanded 접근성 속성 추가
- DownloadSection useEffect 중복 API 호출 제거
- nginx 보안 헤더 (X-Content-Type-Options, X-Frame-Options)
- nginx /assets/ 장기 캐싱 (immutable, 1년)
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- refreshToken 중복 로직 일원화 (동시 호출 방지 포함)
- 파일 업로드 401 시 토큰 갱신 후 재시도 추가
- XHR JSON.parse 에러 보호
- index.html lang="ko", title "One of the plans" 변경
- Vite 기본 에셋(vite.svg, react.svg) 및 빈 App.css 제거
- 공지 CRUD API 레이어 분리 (AnnouncementAdmin → announcements.js)
- load 함수 useCallback 적용 및 useEffect 의존성 정상화
- 로딩/빈 목록 상태 표시 추가 (AnnouncementBoard, UserAdmin)
- 누락 CSS 정의 추가 (announcement-error, announcement-empty)
- 로그인/회원가입 빈 필드 클라이언트 검증 추가
- 공지 등록 시 빈 제목/내용 에러 피드백 추가
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- 게임 시작 전 토큰 리프레시 (만료 토큰 전달 방지)
- 토큰 null 가드 (다른 탭 로그아웃 시 로그인 유도)
- 토큰 URL 인코딩 (encodeURIComponent)
- 런처 미설치 시 힌트 강조 표시
- 게임 시작 버튼 로딩 상태 + 더블 클릭 방지
- 다운로드 정보 실패 시 재시도 버튼 추가
- 비밀번호 강도 실시간 피드백 (약함/보통/강함)
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- api/client: 리프레시 토큰 자동 갱신 (401 시 재시도, 동시 요청 dedup)
- api/client: 204 No Content 처리 추가 (res.json() 크래시 방지)
- api/client: 서버 에러 메시지 body에서 파싱하여 전달
- api/auth: logout 함수 추가 (서버 세션 삭제), 미사용 refreshToken 함수 제거
- AuthContext: 로그인 시 refreshToken 저장, 로그아웃 시 서버 호출 분리
- AuthContext: 401 이벤트는 로컬 세션만 정리 (clearSession 분리)
- DownloadSection: 게임 시작 토큰을 localStorage에서 직접 읽기 (스테일 방지)
- DownloadAdmin: XHR 401 처리, Content-Type 헤더 추가
- AnnouncementAdmin: 등록/수정/삭제 에러 상태 표시 추가
- AnnouncementBoard: API 실패 시 에러 메시지 표시
- UserAdmin: 권한 변경/삭제 에러 처리 추가
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
blur 이벤트 기반 런처 감지 로직을 제거하고 런처 다운로드 버튼을
항상 노출하도록 변경. 레지스트리만 남아있고 런처 파일이 없는 경우에도
사용자가 직접 런처를 재다운로드할 수 있도록 함.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- DownloadSection에 a301:// 커스텀 URI로 게임 실행하는 버튼 추가
- AuthContext에서 createContext와 useAuth 훅을 별도 파일로 분리하여 react-refresh 린트 에러 해결
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- 401 응답 시 auth:unauthorized 이벤트 발생 (client.js)
- AuthContext에서 이벤트 수신 시 자동 로그아웃
- 관리자 페이지에서 인증 만료 시 메인으로, 그 외는 로그인 페이지로 이동
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- RegisterPage 추가 (아이디/비밀번호/비밀번호 확인 폼, 클라이언트 유효성 검사)
- /register 라우트 추가 (로그인 상태 시 홈 리다이렉트)
- 로그인 페이지에 회원가입 링크 및 가입 완료 안내 메시지 추가
- api/auth.js에 register() 함수 추가
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- /admin 라우트 추가 (admin 권한 전용)
- 공지사항 CRUD, 다운로드 정보 수정, 유저 권한/삭제 관리
- AuthContext에 role 추가 및 localStorage 저장
- 홈 헤더에 admin 링크 표시 (admin만 노출)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- React Router v7: public home page, /login page
- Auth context with JWT localStorage management
- Login: ID/PW form + SSAFY login button (UI only)
- Home: hero banner, download section (login required), announcement board
- API layer with mock data (ready for Go Fiber backend)
- Color scheme: #2E2C2F dark + #BACDB0 accent
- Add .env.example for environment variable reference
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>