Repository files navigation

Proov

프로젝트 설명

Proov는 공개 GitHub PR URL을 입력하면 AI가 PR diff를 분석해 코드 이해도 문제를 생성하는 개발 학습 플랫폼입니다. 사용자는 PR에서 생성된 객관식 문제를 한 문항씩 풀고 정답, 짧은 해설, 관련 파일명을 확인할 수 있습니다.

MVP Lite에서는 비로그인 상태로 공개 문제를 풀이할 수 있으며, PR URL 기반 문제 생성과 풀이 기록 저장/조회는 로그인 사용자에게 제공합니다.

기술스택

  • Next.js App Router
  • TypeScript
  • Tailwind CSS
  • Supabase Auth / PostgreSQL
  • OpenAI API
  • GitHub REST API
  • Zod
  • Vercel

디렉터리 설명

  • .docs: 서비스 개요, 기능 명세, AI 정책, DB/API 설계, 로드맵, 디자인 지침 문서
  • .codex: 프로젝트 작업에 사용하는 Codex 로컬 설정과 스킬
  • src/app: Next.js App Router 기반 페이지, 레이아웃, 전역 스타일
  • src/app/auth: 로그인, 회원가입 화면과 인증 관련 컴포넌트
  • src/app/practice: PR URL 입력과 문제 풀이 흐름 화면
  • 루트 설정 파일: Next.js, TypeScript, ESLint, Tailwind/PostCSS 설정과 패키지 관리 파일

백엔드 설정

  1. Supabase Dashboard → SQL Editor에서 supabase/schema.sql전체를 실행합니다.
    profiles, problem_sets, questions, submissions, submission_answers 테이블이 생겨야 풀이 기록 저장·조회가 동작합니다.
  2. 테이블을 비우고 다시 올리려면 supabase/reset.sql 실행 후 schema.sql을 실행합니다.
  3. .env.local.env.example의 값을 채웁니다.
  4. schema.sql에 개발용 계정(testuser@naver.com / testuser)과 큐레이션 문제 시드가 포함되어 있습니다. curated-problem-sets.ts를 수정했다면 npm run db:generate-seed로 큐레이션 시드 구간을 다시 생성한 뒤 SQL Editor에서 재실행하세요.
  5. OpenAI 모델명은 기본 gpt-5.4이며, 필요하면 OPENAI_MODEL로 재정의할 수 있습니다.

About

실제 GitHub PR 기반의 코드 변경사항 이해 문제를 풀며 기록을 쌓아가는 AI 기반 학습 플랫폼

Resources

Stars

0 stars

Watchers

0 watching

Forks

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all \u003cpre\u003e\u003ccode\u003e blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks"); } } catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); } })(); (function(){ try { var __m = "github.com"; var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Repository files navigation

Proov

프로젝트 설명

Proov는 공개 GitHub PR URL을 입력하면 AI가 PR diff를 분석해 코드 이해도 문제를 생성하는 개발 학습 플랫폼입니다. 사용자는 PR에서 생성된 객관식 문제를 한 문항씩 풀고 정답, 짧은 해설, 관련 파일명을 확인할 수 있습니다.

MVP Lite에서는 비로그인 상태로 공개 문제를 풀이할 수 있으며, PR URL 기반 문제 생성과 풀이 기록 저장/조회는 로그인 사용자에게 제공합니다.

기술스택

  • Next.js App Router
  • TypeScript
  • Tailwind CSS
  • Supabase Auth / PostgreSQL
  • OpenAI API
  • GitHub REST API
  • Zod
  • Vercel

디렉터리 설명

  • .docs: 서비스 개요, 기능 명세, AI 정책, DB/API 설계, 로드맵, 디자인 지침 문서
  • .codex: 프로젝트 작업에 사용하는 Codex 로컬 설정과 스킬
  • src/app: Next.js App Router 기반 페이지, 레이아웃, 전역 스타일
  • src/app/auth: 로그인, 회원가입 화면과 인증 관련 컴포넌트
  • src/app/practice: PR URL 입력과 문제 풀이 흐름 화면
  • 루트 설정 파일: Next.js, TypeScript, ESLint, Tailwind/PostCSS 설정과 패키지 관리 파일

백엔드 설정

  1. Supabase Dashboard → SQL Editor에서 supabase/schema.sql전체를 실행합니다.
    profiles, problem_sets, questions, submissions, submission_answers 테이블이 생겨야 풀이 기록 저장·조회가 동작합니다.
  2. 테이블을 비우고 다시 올리려면 supabase/reset.sql 실행 후 schema.sql을 실행합니다.
  3. .env.local.env.example의 값을 채웁니다.
  4. schema.sql에 개발용 계정(testuser@naver.com / testuser)과 큐레이션 문제 시드가 포함되어 있습니다. curated-problem-sets.ts를 수정했다면 npm run db:generate-seed로 큐레이션 시드 구간을 다시 생성한 뒤 SQL Editor에서 재실행하세요.
  5. OpenAI 모델명은 기본 gpt-5.4이며, 필요하면 OPENAI_MODEL로 재정의할 수 있습니다.

About

실제 GitHub PR 기반의 코드 변경사항 이해 문제를 풀며 기록을 쌓아가는 AI 기반 학습 플랫폼

Resources

Stars

0 stars

Watchers

0 watching

Forks

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

Proov

프로젝트 설명

Proov는 공개 GitHub PR URL을 입력하면 AI가 PR diff를 분석해 코드 이해도 문제를 생성하는 개발 학습 플랫폼입니다. 사용자는 PR에서 생성된 객관식 문제를 한 문항씩 풀고 정답, 짧은 해설, 관련 파일명을 확인할 수 있습니다.

MVP Lite에서는 비로그인 상태로 공개 문제를 풀이할 수 있으며, PR URL 기반 문제 생성과 풀이 기록 저장/조회는 로그인 사용자에게 제공합니다.

기술스택

  • Next.js App Router
  • TypeScript
  • Tailwind CSS
  • Supabase Auth / PostgreSQL
  • OpenAI API
  • GitHub REST API
  • Zod
  • Vercel

디렉터리 설명

  • .docs: 서비스 개요, 기능 명세, AI 정책, DB/API 설계, 로드맵, 디자인 지침 문서
  • .codex: 프로젝트 작업에 사용하는 Codex 로컬 설정과 스킬
  • src/app: Next.js App Router 기반 페이지, 레이아웃, 전역 스타일
  • src/app/auth: 로그인, 회원가입 화면과 인증 관련 컴포넌트
  • src/app/practice: PR URL 입력과 문제 풀이 흐름 화면
  • 루트 설정 파일: Next.js, TypeScript, ESLint, Tailwind/PostCSS 설정과 패키지 관리 파일

백엔드 설정

  1. Supabase Dashboard → SQL Editor에서 supabase/schema.sql전체를 실행합니다.
    profiles, problem_sets, questions, submissions, submission_answers 테이블이 생겨야 풀이 기록 저장·조회가 동작합니다.
  2. 테이블을 비우고 다시 올리려면 supabase/reset.sql 실행 후 schema.sql을 실행합니다.
  3. .env.local.env.example의 값을 채웁니다.
  4. schema.sql에 개발용 계정(testuser@naver.com / testuser)과 큐레이션 문제 시드가 포함되어 있습니다. curated-problem-sets.ts를 수정했다면 npm run db:generate-seed로 큐레이션 시드 구간을 다시 생성한 뒤 SQL Editor에서 재실행하세요.
  5. OpenAI 모델명은 기본 gpt-5.4이며, 필요하면 OPENAI_MODEL로 재정의할 수 있습니다.

About

실제 GitHub PR 기반의 코드 변경사항 이해 문제를 풀며 기록을 쌓아가는 AI 기반 학습 플랫폼

Resources

Stars

0 stars

Watchers

0 watching

Forks

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length \u003e 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

Proov

프로젝트 설명

Proov는 공개 GitHub PR URL을 입력하면 AI가 PR diff를 분석해 코드 이해도 문제를 생성하는 개발 학습 플랫폼입니다. 사용자는 PR에서 생성된 객관식 문제를 한 문항씩 풀고 정답, 짧은 해설, 관련 파일명을 확인할 수 있습니다.

MVP Lite에서는 비로그인 상태로 공개 문제를 풀이할 수 있으며, PR URL 기반 문제 생성과 풀이 기록 저장/조회는 로그인 사용자에게 제공합니다.

기술스택

  • Next.js App Router
  • TypeScript
  • Tailwind CSS
  • Supabase Auth / PostgreSQL
  • OpenAI API
  • GitHub REST API
  • Zod
  • Vercel

디렉터리 설명

  • .docs: 서비스 개요, 기능 명세, AI 정책, DB/API 설계, 로드맵, 디자인 지침 문서
  • .codex: 프로젝트 작업에 사용하는 Codex 로컬 설정과 스킬
  • src/app: Next.js App Router 기반 페이지, 레이아웃, 전역 스타일
  • src/app/auth: 로그인, 회원가입 화면과 인증 관련 컴포넌트
  • src/app/practice: PR URL 입력과 문제 풀이 흐름 화면
  • 루트 설정 파일: Next.js, TypeScript, ESLint, Tailwind/PostCSS 설정과 패키지 관리 파일

백엔드 설정

  1. Supabase Dashboard → SQL Editor에서 supabase/schema.sql전체를 실행합니다.
    profiles, problem_sets, questions, submissions, submission_answers 테이블이 생겨야 풀이 기록 저장·조회가 동작합니다.
  2. 테이블을 비우고 다시 올리려면 supabase/reset.sql 실행 후 schema.sql을 실행합니다.
  3. .env.local.env.example의 값을 채웁니다.
  4. schema.sql에 개발용 계정(testuser@naver.com / testuser)과 큐레이션 문제 시드가 포함되어 있습니다. curated-problem-sets.ts를 수정했다면 npm run db:generate-seed로 큐레이션 시드 구간을 다시 생성한 뒤 SQL Editor에서 재실행하세요.
  5. OpenAI 모델명은 기본 gpt-5.4이며, 필요하면 OPENAI_MODEL로 재정의할 수 있습니다.

About

실제 GitHub PR 기반의 코드 변경사항 이해 문제를 풀며 기록을 쌓아가는 AI 기반 학습 플랫폼

Resources

Stars

0 stars

Watchers

0 watching

Forks

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Repository files navigation

Proov

프로젝트 설명

Proov는 공개 GitHub PR URL을 입력하면 AI가 PR diff를 분석해 코드 이해도 문제를 생성하는 개발 학습 플랫폼입니다. 사용자는 PR에서 생성된 객관식 문제를 한 문항씩 풀고 정답, 짧은 해설, 관련 파일명을 확인할 수 있습니다.

MVP Lite에서는 비로그인 상태로 공개 문제를 풀이할 수 있으며, PR URL 기반 문제 생성과 풀이 기록 저장/조회는 로그인 사용자에게 제공합니다.

기술스택

  • Next.js App Router
  • TypeScript
  • Tailwind CSS
  • Supabase Auth / PostgreSQL
  • OpenAI API
  • GitHub REST API
  • Zod
  • Vercel

디렉터리 설명

  • .docs: 서비스 개요, 기능 명세, AI 정책, DB/API 설계, 로드맵, 디자인 지침 문서
  • .codex: 프로젝트 작업에 사용하는 Codex 로컬 설정과 스킬
  • src/app: Next.js App Router 기반 페이지, 레이아웃, 전역 스타일
  • src/app/auth: 로그인, 회원가입 화면과 인증 관련 컴포넌트
  • src/app/practice: PR URL 입력과 문제 풀이 흐름 화면
  • 루트 설정 파일: Next.js, TypeScript, ESLint, Tailwind/PostCSS 설정과 패키지 관리 파일

백엔드 설정

  1. Supabase Dashboard → SQL Editor에서 supabase/schema.sql전체를 실행합니다.
    profiles, problem_sets, questions, submissions, submission_answers 테이블이 생겨야 풀이 기록 저장·조회가 동작합니다.
  2. 테이블을 비우고 다시 올리려면 supabase/reset.sql 실행 후 schema.sql을 실행합니다.
  3. .env.local.env.example의 값을 채웁니다.
  4. schema.sql에 개발용 계정(testuser@naver.com / testuser)과 큐레이션 문제 시드가 포함되어 있습니다. curated-problem-sets.ts를 수정했다면 npm run db:generate-seed로 큐레이션 시드 구간을 다시 생성한 뒤 SQL Editor에서 재실행하세요.
  5. OpenAI 모델명은 기본 gpt-5.4이며, 필요하면 OPENAI_MODEL로 재정의할 수 있습니다.

About

실제 GitHub PR 기반의 코드 변경사항 이해 문제를 풀며 기록을 쌓아가는 AI 기반 학습 플랫폼

Resources

Stars

0 stars

Watchers

0 watching

Forks

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

Proov

프로젝트 설명

Proov는 공개 GitHub PR URL을 입력하면 AI가 PR diff를 분석해 코드 이해도 문제를 생성하는 개발 학습 플랫폼입니다. 사용자는 PR에서 생성된 객관식 문제를 한 문항씩 풀고 정답, 짧은 해설, 관련 파일명을 확인할 수 있습니다.

MVP Lite에서는 비로그인 상태로 공개 문제를 풀이할 수 있으며, PR URL 기반 문제 생성과 풀이 기록 저장/조회는 로그인 사용자에게 제공합니다.

기술스택

  • Next.js App Router
  • TypeScript
  • Tailwind CSS
  • Supabase Auth / PostgreSQL
  • OpenAI API
  • GitHub REST API
  • Zod
  • Vercel

디렉터리 설명

  • .docs: 서비스 개요, 기능 명세, AI 정책, DB/API 설계, 로드맵, 디자인 지침 문서
  • .codex: 프로젝트 작업에 사용하는 Codex 로컬 설정과 스킬
  • src/app: Next.js App Router 기반 페이지, 레이아웃, 전역 스타일
  • src/app/auth: 로그인, 회원가입 화면과 인증 관련 컴포넌트
  • src/app/practice: PR URL 입력과 문제 풀이 흐름 화면
  • 루트 설정 파일: Next.js, TypeScript, ESLint, Tailwind/PostCSS 설정과 패키지 관리 파일

백엔드 설정

  1. Supabase Dashboard → SQL Editor에서 supabase/schema.sql전체를 실행합니다.
    profiles, problem_sets, questions, submissions, submission_answers 테이블이 생겨야 풀이 기록 저장·조회가 동작합니다.
  2. 테이블을 비우고 다시 올리려면 supabase/reset.sql 실행 후 schema.sql을 실행합니다.
  3. .env.local.env.example의 값을 채웁니다.
  4. schema.sql에 개발용 계정(testuser@naver.com / testuser)과 큐레이션 문제 시드가 포함되어 있습니다. curated-problem-sets.ts를 수정했다면 npm run db:generate-seed로 큐레이션 시드 구간을 다시 생성한 뒤 SQL Editor에서 재실행하세요.
  5. OpenAI 모델명은 기본 gpt-5.4이며, 필요하면 OPENAI_MODEL로 재정의할 수 있습니다.

About

실제 GitHub PR 기반의 코드 변경사항 이해 문제를 풀며 기록을 쌓아가는 AI 기반 학습 플랫폼

Resources

Stars

0 stars

Watchers

0 watching

Forks

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

Proov

프로젝트 설명

Proov는 공개 GitHub PR URL을 입력하면 AI가 PR diff를 분석해 코드 이해도 문제를 생성하는 개발 학습 플랫폼입니다. 사용자는 PR에서 생성된 객관식 문제를 한 문항씩 풀고 정답, 짧은 해설, 관련 파일명을 확인할 수 있습니다.

MVP Lite에서는 비로그인 상태로 공개 문제를 풀이할 수 있으며, PR URL 기반 문제 생성과 풀이 기록 저장/조회는 로그인 사용자에게 제공합니다.

기술스택

  • Next.js App Router
  • TypeScript
  • Tailwind CSS
  • Supabase Auth / PostgreSQL
  • OpenAI API
  • GitHub REST API
  • Zod
  • Vercel

디렉터리 설명

  • .docs: 서비스 개요, 기능 명세, AI 정책, DB/API 설계, 로드맵, 디자인 지침 문서
  • .codex: 프로젝트 작업에 사용하는 Codex 로컬 설정과 스킬
  • src/app: Next.js App Router 기반 페이지, 레이아웃, 전역 스타일
  • src/app/auth: 로그인, 회원가입 화면과 인증 관련 컴포넌트
  • src/app/practice: PR URL 입력과 문제 풀이 흐름 화면
  • 루트 설정 파일: Next.js, TypeScript, ESLint, Tailwind/PostCSS 설정과 패키지 관리 파일

백엔드 설정

  1. Supabase Dashboard → SQL Editor에서 supabase/schema.sql전체를 실행합니다.
    profiles, problem_sets, questions, submissions, submission_answers 테이블이 생겨야 풀이 기록 저장·조회가 동작합니다.
  2. 테이블을 비우고 다시 올리려면 supabase/reset.sql 실행 후 schema.sql을 실행합니다.
  3. .env.local.env.example의 값을 채웁니다.
  4. schema.sql에 개발용 계정(testuser@naver.com / testuser)과 큐레이션 문제 시드가 포함되어 있습니다. curated-problem-sets.ts를 수정했다면 npm run db:generate-seed로 큐레이션 시드 구간을 다시 생성한 뒤 SQL Editor에서 재실행하세요.
  5. OpenAI 모델명은 기본 gpt-5.4이며, 필요하면 OPENAI_MODEL로 재정의할 수 있습니다.

About

실제 GitHub PR 기반의 코드 변경사항 이해 문제를 풀며 기록을 쌓아가는 AI 기반 학습 플랫폼

Resources

Stars

0 stars

Watchers

0 watching

Forks

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Repository files navigation

Proov

프로젝트 설명

Proov는 공개 GitHub PR URL을 입력하면 AI가 PR diff를 분석해 코드 이해도 문제를 생성하는 개발 학습 플랫폼입니다. 사용자는 PR에서 생성된 객관식 문제를 한 문항씩 풀고 정답, 짧은 해설, 관련 파일명을 확인할 수 있습니다.

MVP Lite에서는 비로그인 상태로 공개 문제를 풀이할 수 있으며, PR URL 기반 문제 생성과 풀이 기록 저장/조회는 로그인 사용자에게 제공합니다.

기술스택

  • Next.js App Router
  • TypeScript
  • Tailwind CSS
  • Supabase Auth / PostgreSQL
  • OpenAI API
  • GitHub REST API
  • Zod
  • Vercel

디렉터리 설명

  • .docs: 서비스 개요, 기능 명세, AI 정책, DB/API 설계, 로드맵, 디자인 지침 문서
  • .codex: 프로젝트 작업에 사용하는 Codex 로컬 설정과 스킬
  • src/app: Next.js App Router 기반 페이지, 레이아웃, 전역 스타일
  • src/app/auth: 로그인, 회원가입 화면과 인증 관련 컴포넌트
  • src/app/practice: PR URL 입력과 문제 풀이 흐름 화면
  • 루트 설정 파일: Next.js, TypeScript, ESLint, Tailwind/PostCSS 설정과 패키지 관리 파일

백엔드 설정

  1. Supabase Dashboard → SQL Editor에서 supabase/schema.sql전체를 실행합니다.
    profiles, problem_sets, questions, submissions, submission_answers 테이블이 생겨야 풀이 기록 저장·조회가 동작합니다.
  2. 테이블을 비우고 다시 올리려면 supabase/reset.sql 실행 후 schema.sql을 실행합니다.
  3. .env.local.env.example의 값을 채웁니다.
  4. schema.sql에 개발용 계정(testuser@naver.com / testuser)과 큐레이션 문제 시드가 포함되어 있습니다. curated-problem-sets.ts를 수정했다면 npm run db:generate-seed로 큐레이션 시드 구간을 다시 생성한 뒤 SQL Editor에서 재실행하세요.
  5. OpenAI 모델명은 기본 gpt-5.4이며, 필요하면 OPENAI_MODEL로 재정의할 수 있습니다.

About

실제 GitHub PR 기반의 코드 변경사항 이해 문제를 풀며 기록을 쌓아가는 AI 기반 학습 플랫폼

Resources

Stars

0 stars

Watchers

0 watching

Forks

Contributors

Languages