#리팩토링
22개의 게시물
다리건너기를 관전 게임에서 직접 조종 게임으로 뜯어고침
🤖 3562 in / 1994 out / 5556 total tokens Changed the entire identity of Bridge Cross. It used to be a "pick a color and watch" game — now every player directly chooses top or bottom each column, li
지도 마커에 하드코딩된 색상값 싹 지우고 테마 토큰으로 교체
🤖 1770 in / 1062 out / 2832 total tokens 지도 마커 SVG에 색상이 하드코딩되어 있으니 다크모드 전환 시 파란색 마커가 배경이랑 충돌하더라. Kakao/Naver 마커 둘 다 그랬고, 자동완성 결과 이름 색상도 마찬가지. 3274F9 같은 매직 넘버를 여기저기 흩뿌려놓은 게 화근이었다. getAccentColor(),
CLAUDE.md를 Brain/Hands/Session 3계층으로 쪼갠 이유
🤖 1495 in / 1478 out / 2973 total tokens CLAUDE.md가 한 덩어리로 있으니 Claude가 계획 단계에서 코드 실행 규칙까지 동시에 읽어서 컨텍스트가 낭비되더라. 그래서 역할별로 세 계층으로 분리했다. Brain은 오케스트레이션 계층이다. harness, workflow, commands 문서가 여기 속한다. "언
경마 신규 탈것 4종이 안 나오던 버그 수정 — 하드코딩 목록 불일치가 원인
🤖 1855 in / 1415 out / 3270 total tokens 경마 게임에서 기사, 공룡, 닌자, 게 탈것이 절대 출전하지 않는 버그를 수정했다. 원인은 단순했다. horse.js에는 15종 전체 탈것 목록이 있었는데, rooms.js에서 새 유저 입장 시 탈것을 초기화하는 코드가 11종만 있는 구버전 하드코딩 목록을 그대로 쓰고 있었다.
경마 실시간 순위 패널, HTML 하드코딩 떼고 JS에서 동적 생성으로 이관
🤖 1605 in / 1740 out / 3345 total tokens horse-race-multiplayer.html에 인라인으로 박혀있던 liveRankingPanel div를 싹 지우고, js/horse-race.js의 startRaceAnimation에서 동적으로 생성하도록 바꿨다. 렌더링 결과는 동일하고, 레이스 중 실시간 순위 표시 기능
게임 서버에서 텔레그램 봇 코드 전부 뜯어냄
🤖 2274 in / 1495 out / 3769 total tokens 게임 서버에 텔레그램 봇 설정 페이지, 알림 유틸리티, 라우팅까지 다 박아놨던 걸 전부 제거했다. 총 435줄 삭제, 16줄 추가. 삭제가 압도적으로 많은 게 포인트다. LAMDiceBot 프로젝트 자체가 주사위/경마 게임 서버인데, 개발 편하다고 텔레그램 알림이랑 봇 설정 H
ranking-shared.js 하드코딩 색상 30곳 넘게 CSS 변수로 싹 정리
🤖 1498 in / 1372 out / 2870 total tokens ranking 오버레이에 색상이 하드코딩되어 있던 걸 전부 CSS 커스텀 프로퍼티로 뽑아냈다. ranking-overlay 스코프 안에 --rk-bg-start, --rk-accent, --rk-gold 같은 변수 18개를 정의하고, 30곳이 넘는 하드코딩 값을 var(--rk-
히스토리 패널 UI 일관성 맞추기 — 평가자 피드백 반영
🤖 1720 in / 1517 out / 3237 total tokens 평가자가 "주사위 히스토리 패널만 스타일이 다르다"고 지적했다. 맞는 말이었다. 룰렛과 경마는 border-radius: 12px에 그림자도 가벼운데, 주사위만 20px에 그림자가 무거웠다. 처음 만들 때는 "좀 더 둥글게 하면 예쁘겠지" 생각했는데, 결과적으로 통일감을 해친 셈
로비 광고 위치 통일 — 룰렛/경마 ad-lobby를 접속자 목록 아래로 이동
🤖 1629 in / 1426 out / 3055 total tokens 세 게임(주사위, 룰렛, 경마)의 로비 광고 배치가 제각각이었다. 주사위는 접속자 목록 아래, 룰렛과 경마는 게임 섹션 하단(리플레이/채팅 사이)에 있었다. 사용자 입장에서 UI 일관성이 없으니 어색할 수밖에 없다. 변경은 단순하다. roulette-game-multiplaye
카카오맵 스타일로 검색창/태그 상단 이동
🤖 847 in / 869 out / 1716 total tokens 모바일 UI를 카카오맵처럼 상단 중심 구조로 개선했다. 기존엔 검색창과 카테고리 태그가 분산되어 있었는데, 사용자 시선이 위로 몰리는 자연스러운 흐름으로 재배치했다. BottomQuickBar에서 QUICK_CATEGORIES 배열을 제거하고, page.tsx의 상단 검색바 영역으
GitHub Actions로 Daily AI 포스트 자동 발행 설정
🤖 1059 in / 713 out / 1772 total tokens GitHub Actions 워크플로우를 만들어 매시간 자동으로 AI 뉴스 다이제스트를 발행하도록 했다. API 엔드포인트 호출 방식으로, BLOG_API_KEY 시크릿을 사용해 인증한다. 기존에 하드코딩돼 있던 AI 클라이언트 설정을 getAIConfig 함수로 통합했다. gen
radarlog.kr 도메인 적용하고 AI 프로바이더 멀티 지원으로 변경
🤖 2296 in / 1380 out / 3676 total tokens 커스텀 도메인을 radarlog.kr로 확정했다. site config, docs, env example, seed script 등 모든 URL 참조를 기존 railway 서브도메인에서 새 도메인으로 일괄 변경했다. AI 프로바이더를 동적으로 선택할 수 있게 개선했다. Anth
게시글 slug를 숫자 방식으로 전환했다
🤖 1211 in / 782 out / 1993 total tokens 기존엔 제목을 한글/영문 혼합으로 변환해 slug를 만들었다. URL이 길어지고 가독성도 좋지 않았다. 그래서 단순 순번 숫자로 바꿨다. 새 글 생성 시 prisma.post.count()로 현재 개수를 구하고 +1한 값을 slug로 쓴다. 기존 글들은 /api/admin/pos
마크다운 프리뷰, 직접 짜다가 라이브러리로 갈아탐
🤖 797 in / 995 out / 1792 total tokens 에디터 페이지에서 쓰던 regex 기반 renderMarkdown 함수를 걷어내고 react-markdown 기반의 MarkdownPreview 컴포넌트로 교체했다. 순수 정규식으로 마크다운을 파싱하려니 엣지 케이스가 끝도 없었고, 코드 블록 안에서 이스케이프 처리하다가 머리가 아팠
로그인 페이지 UI 개선과 레이아웃 분리
🤖 779 in / 678 out / 1457 total tokens 로그인 페이지를 깔끔하게 다듬었다. 큰 입력창과 카드 레이아웃을 적용해서 시인성을 높였고, 전체적으로 더 모던한 느낌으로 변경했다. AppShell 컴포넌트를 새로 만들어서 레이아웃 로직을 분리했다. usePathname으로 현재 경로를 확인해서 로그인 페이지일 때는 Navbar를
TypeScript 타입 에러 3개를 0개로: 테스트 Mock 타입 확장하기
🤖 771 in / 792 out / 1563 total tokens search-cache.test.ts에서 발생하던 TypeScript 타입 에러 3개를 모두 해결했다. 기존 MockPlace 타입이 실제 DetourResult 타입과 맞지 않아 에러가 발생했다. MockPlace를 MockDetourResult로 확장하고, Place와 Rout
ESLint any 타입 경고 21개를 모두 해결했다
🤖 1442 in / 604 out / 2046 total tokens v0.52.0에서 @typescript-eslint/no-explicit-any 경고 21개를 전부 제거했다. 이제 코드베이스에 any 타입이 없다. 주요 변경은 명시적 타입 정의다. PersonalizedDetourResult는 개인화 점수가 포함된 결과를, CacheQuery
LocaleContext ESLint 에러 해결과 useState lazy initialization
🤖 794 in / 722 out / 1516 total tokens v0.49.0에서 LocaleContext의 ESLint set-state-in-effect 경고를 해결했다. 기존에는 useEffect 내부에서 localStorage 값을 읽어 setState를 호출하는 패턴이었다. 이는 React 팀에서 권장하지 않는 방식이라 ESLint가
v0.25.0: any 타입 정리하고 린트 0 달성했다
🤖 1062 in / 625 out / 1687 total tokens 코드 품질 개선 작업을 진행했다. 9개였던 린트 경고를 모두 해결했고, any 타입을 구체적인 인터페이스로 교체해 타입 안전성을 높였다. ErrorBoundary와 performance 모듈에서 Sentry 관련 any 타입이 문제였다. WindowWithSentry와 Sentr
검색창을 button으로 변경하여 UX 개선
🤖 389 in / 612 out / 1001 total tokens 검색창을 input에서 button으로 교체했다. 기존엔 input을 클릭하면 검색 오버레이가 열리는 구조였다. 문제는 실제로 텍스트를 입력할 수 없는데 input처럼 보인다는 점. 사용자가 커서가 깜빡이는 걸 보고 입력을 시도하다 혼란을 겪을 수 있다. 그래서 아예 button으
접근성 라벨 보완과 죽은 코드 정리
🤖 1043 in / 1761 out / 2804 total tokens 검색 관련 컴포넌트의 접근성을 개선했다. 스크린 리더 사용자가 버튼의 목적을 명확히 인식할 수 있도록 aria-label을 체계적으로 추가했다. SearchOverlay 닫기 버튼은 '뒤로 가기'로, 저장된 장소 카드는 '{장소명} 카테고리로 검색'으로, ResultCard 전
v3.3.0: 봇/게임 테스트 35개 추가, 커버리지 보강
🤖 1557 in / 839 out / 2396 total tokens 이번 커밋은 봇과 게임 어댑터의 테스트 커버리지를 대폭 보강했다. 총 35개 테스트가 추가되어 127개에서 162개로 늘었고, 전부 통과다. FlappyBirdBot은 신규 테스트 파일을 만들어 decide()의 파이프 감지, _pendingTick 흐름, _findNextPip