목표: 면접관이 링크를 열고 2~3분 안에 핵심(언어별 실행 시뮬레이터 + 개념 전용 시각화)을 보게 만든다. 운영용 부가 기능은 걷어내고, Python Tutor와의 차별점("예측하고 틀려보는 시각화") 하나만 추가한다.
브랜치: portfolio-slim (작업 완료 후 main 머지)
- 각 단계 끝에
pnpm build통과 확인 후 커밋 (단계당 1커밋) - 삭제 전
grep으로 참조 확인, 삭제 후 참조 0건 확인 (rules/REFACTORING.md) - 루트의 AI 에이전트 설정 파일(AGENTS.md, SOUL.md 등,
.ralph/)은 건드리지 않음
- 로그인 완전 제거 → 사용자/진도 서버 저장도 함께 제거 (계정 없는 순수 데모)
- 다국어(한/영)는 유지
- C++ 시뮬레이터·강의 제거 (C와 중복)
- 연락처 CSV 5개: git 히스토리에서 제거 후 force push ✅ 완료
- 시뮬레이터: C, Python, JS, Java (backend
modules/simulators) - 시각화:
features/visualizers(EventLoop, Promise, PrototypeChain, 포인터, LoopTrack 등) - Playground
- 강의: C / Python / JS / Java (콘텐츠 조회 API만)
- 다국어
-
git filter-repo로 main, portfolio-slim에서korea-*-contacts*.csv제거 -
mainforce push,portfolio-slimpush
-
router.tsx에서 dashboard, report, admin, profile, quiz/* 라우트 제거 -
ai-literacy,python-practical강의 라우트 + 강의 목록 카드 제거 -
Sidebar.tsx: 퀴즈/리포트/Admin 메뉴, 신고 버튼, 프로필 링크 제거 -
TopBar.tsx: 스트릭 카드 제거 - 빌드 확인 → 커밋
-
features/{dashboard,report,admin,gamification,profile,auth,legal,quiz},visualizers/cpp삭제 - 로그인 제거: firebase 서비스, authStore, tokenManager, ProtectedRoute, Nickname/Onboarding/Report 모달, axios 인증 헤더·401 재시도
- Sidebar/TopBar/푸터의 로그인·프로필·문의 영역,
/login·/privacy·/terms라우트 제거 - services(gamification, notes, analytics, reports, standalone-quiz, user, admob, cppSimulator), store의 streak/user 상태 삭제
- 진도: 서버 저장 → localStorage(
stores/progressStore.ts)로 대체 -
python-practical/ai-literacy/cpp잔여 참조 정리 (LessonUnifiedView의 AI 리터러시 전용 UI 포함) - Playground persist v3 마이그레이션: 저장된 언어가 제거된 언어면 C로
- Firebase 환경변수 필수 조건 제거 → env 없이 실행 가능
- e2e: 인증/퀴즈 테스트·fixture 삭제, 홈 테스트를 Playground 버튼 기준으로 수정
-
firebase의존성 제거 - 덤:
LessonPage조건부 Hook 호출 버그 수정,vitest.config.ts의pathimport 누락 수정 - 타입 체크·빌드 확인 → 커밋
- 남김: Capacitor(Android 앱 래퍼), 번역 JSON의 미사용 키 → 7단계에서 정리
-
modules/{gamification,analytics,notes,admin,reports,problems,submissions,standalone-quizzes,users}삭제 -
modules/simulators/cpp삭제 - 인증 제거:
plugins/auth.ts,config/firebase.ts, rateLimit 키를 IP 기준으로, CORS Authorization 헤더·credentials 제거 -
courses: 진도 API 3개와streakService결합 제거, 콘텐츠 조회만 남김 - C 시뮬레이터의
/judge(문제 채점, 프론트 미사용) 엔드포인트·executor 메서드·타입 제거 - 미사용 환경변수 제거: Firebase, xAI, DeepSeek, Brevo, C_JUDGE_TIMEOUT
- 미사용 의존성 제거: firebase-admin, @google/generative-ai, @notionhq/client, @babel/*
-
app.ts라우트 등록,swagger.ts태그·스키마 정리 - 타입 체크 0 에러, 테스트 107 통과 / 12 실패 (기준선과 동일: 로컬에 gdb 없음)
- 남김: libsql/better-sqlite3/Prisma adapter 의존성 (코드에서 미사용, 4단계에서 DB 정리하며 확인)
- 남긴 모델: Language, Chapter, Lesson, LessonContent, Quiz (17개 모델 제거)
- 마이그레이션
20261008000000_portfolio_slim: FK·테이블 DROP(IF EXISTS), cpp/python-practical/ai-literacy 강의 행 삭제 - seed: 제외 강의 블록 제거,
prisma/content/{cpp,python-practical,ai-literacy,quizzes}삭제 - 사용자·문제 관련 스크립트 16개, 커밋돼 있던 사용자 백업 JSON, 죽은 npm 스크립트 5개 삭제
- 미사용 의존성 제거: libsql, better-sqlite3, Prisma sqlite/libsql adapter, zod-to-json-schema
- 보안:
prisma.config.ts,scripts/check-seed.ts에 하드코딩된 Neon 접속 URL(비밀번호 포함) 제거 - 검증 (임시 Docker Postgres): 기존 마이그레이션 + 운영 유사 데이터 → 새 마이그레이션 적용 → 테이블 23→6, cpp 데이터만 삭제, 스키마 drift 없음, seed 202 레슨, API·Python/JS 시뮬레이터 정상
- 남김: 개발용 스크립트 3개의 기존 타입 에러(backup-courses, restore-courses, validate-simulators)
⚠️ 사용자 조치 필요: Neon DB 비밀번호 교체 (공개 히스토리에 노출됨) → RenderDATABASE_URL갱신
- 홈 슬라이드 패널(지운 기능을 그린 SVG 8개) → 실행 시각화 데모(
features/home/HomeDemo.tsx)로 교체- Python 참조/별칭: 녹화된 시뮬레이터 응답 → Playground와 같은 변환(
toPythonLessonSteps) - JS 이벤트 루프: 녹화된 레슨
js-1-4→ 레슨과 같은 변환(resolveStepLines) - 자동 재생(2.6초, 반복), 직접 넘기면 정지,
prefers-reduced-motion이면 정지 상태로 시작 - 캡션·출력 줄, 한/영/중 i18n
- Python 참조/별칭: 녹화된 시뮬레이터 응답 → Playground와 같은 변환(
- 녹화 스크립트
packages/frontend/scripts/record-home-demo.mjs(백엔드 콜드 스타트 없이 즉시 재생) - 홈 로그인 버튼 → Playground 버튼 (2단계에서 처리)
- 진도 localStorage (2단계에서 처리)
- 헤드리스 Chromium으로 데스크톱/모바일 확인, 콘솔 에러 없음
- 데이터: 레슨 스텝에
predict { question, options, answer }(sharedStepPredictSchema, answer 범위 검증) - 위치: 2라운드(시각화) — 다음 스텝에 predict가 있으면 이동을 막고 질문, 시각화는 현재 상태 유지 + 코드는 다음 줄 하이라이트
-
usePredictGate훅: 버튼·키보드·스와이프 이동이 모두 gate 경유, 질문 중 "다음" 무시·"이전"은 질문 닫기 - 답한 뒤: 정답/오답 + 내 예측 vs 실제 피드백, 시각화가 실제 변화 표시
- 결과 localStorage 기록(첫 답만), 레슨 완료 화면에 "예측 n개 중 m개 정답"
- 적용:
c-2-4(역참조 쓰기),py-3-1(append/del),java-3-2(참조 전달 vs 재할당),js-1-4(microtask 순서) × ko/en/zh - 테스트 9개 (gate 판단, 훅 흐름, 첫 답 기록), 프론트
test스크립트 추가 - E2E 수동 확인 (임시 DB + 로컬 백엔드 + 헤드리스 브라우저): C·JS 레슨 질문 → 오답 → 피드백 → 기록
- 참고: shared 스키마를 바꾼 뒤 dev 서버는
vite --force로 재시작해야 함 (optimizeDeps 캐시)
- README를 포트폴리오 관점으로 재작성 (차별점, 아키텍처, 설계 결정, Firebase 없는 실행 방법, 현재 UI 스크린샷)
-
render.yaml,.env.example2개, docker-compose: 코드가 실제로 읽는 변수만 남김, 불필요한docker.sock마운트 제거 - 번역: 하드코딩 문구 ~45곳 i18n, 미사용 네임스페이스 13개·C++ 언급 삭제
- Android(Capacitor·AdMob, 커밋된 키스토어 포함) 제거 — Play 스토어 미배포 확인
- 영업 메일 자동화 스크립트 7개 삭제
- 보안: 요청 속도 제한이 실제로는 어느 라우트에도 적용되지 않던 문제 수정 (전역 IP당 분당 100회, 429 응답)
- 전체 화면 확인 (ko/en, 홈·코스·챕터·레슨·Playground 실행·삭제된 경로): 콘솔 에러·실패 요청 없음
- Neon DB 비밀번호 교체 (새 비밀번호 접속 OK, 옛 비밀번호 거부 확인)
- main 머지
- Fly: 1월에 만든
codeinsight-backend재사용, 미사용 시크릿 7개·예전 머신·볼륨 삭제, 새DATABASE_URL -
fly.toml: nrt, 1GB, 자동 정지,release_command로 migrate + seed - 배포하며 고친 것: 런타임 이미지에
prisma.config.ts·src/utils누락, Node 20 → 22 (JS 시뮬레이터 WebSocket) - 운영 DB에
portfolio_slim마이그레이션 적용 (테이블 23 → 6) - Vercel 프로젝트
codeinsight(rootpackages/frontend), Vercel Authentication 해제(공개) - 운영 확인: 홈 데모, 레슨·예측, Playground C·JS 실행, 4개 시뮬레이터 API, CORS
- 설명 라운드 → 시각화 라운드 2단 구조 제거 → 한 스텝 = 설명(위, 접기) + 시각화(아래)
-
useRoundNavigation→useStepNavigation, 시각화 없는 스텝은 직전 시각화 유지 - 예측이 다음 스텝 설명보다 먼저 → 실제 예측이 됨
- 테스트 11개 (예측 8, 스텝 이동 3)
- README, 패키지 README 2개, CONTRIBUTING, ROADMAP,
.claude/CLAUDE.md·rules·context·deployment_info - 백엔드 기본 포트 3000 → 3002 (프론트 기본값과 불일치하던 문제)
- 지난 기록 문서 삭제 (계획서·감사·세션 로그·E2E 보고서·옛 예시 코드·법적 고지 페이지·옛 데모 GIF 등) → 현재 코드 기준 문서만 남김
-
docs/principle.md(시뮬레이터 원리)를 현재 코드에 맞게 갱신 (C/trace, JavasourceCode, JS V8 Inspector, 파일 구조)
- 일부 레슨 콘텐츠의 영어/중국어 번역 누락 (예:
py-3-1설명) - JS 시뮬레이터는 동기 구간만 추적 (비동기 콜백 실행은 사전 제작 레슨 데이터로 대체)
- C 시뮬레이터 테스트 12개는 gdb가 있는 환경에서만 통과
- 개발용 스크립트 3개의 기존 타입 에러 (backup-courses, restore-courses, validate-simulators)
- DeepSeek·FAL·Firebase API 키는 각 서비스 콘솔에서 직접 폐기 필요