尚未偵測到更新。GitHub 發布版本後會顯示在這裡。
個人 GitHub 帳號下公開儲存庫的擁有者可以登入並驗證所有權,自行管理介紹,無需管理員核准。
登入並產生驗證檔案,在 30 分鐘內將其提交至此儲存庫的預設分支。其他分支或分叉儲存庫中的檔案無效。然後在下方檢查檔案,即可無需管理員核准直接管理專案。請保留檔案以維持管理權限。
如需登入,將前往登入頁面。登入後請回到此處,再次點擊所選的驗證按鈕。
在專案資料夾中執行 /nomorevibe verify,即可驗證所有權並自行管理介紹。
一分鐘完成驗證正在載入完整 README。 以下為已儲存的摘錄。
전시·박람회를 같이 걷는 관람 동행자. 방문객이 부스를 발견하고, 왜 그 부스가 자기에게 맞는지 판단하고, 본 것을 기록하도록 돕는다. + 주최자용 관리·분석 콘솔. 특정 전시 전용이 아니다 — 현재 들어 있는 서울국제도서전(SIBF)·서울일러스트레이션페어(SIF)· 하우스아카이브 데이터는 시드다. 전시 추가는 코드 변경 없이 데이터로 가능하다. 반응할수록 정확해져 — 로미가 미리 아는 건 전시고, 사용자는 아직 모른다. 그래서 추천은 정답이 아니라 가설이고, 반응하면 갱신된다. 브랜드·보이스 기준은 docs/brand.md. Next.js 16 (App Router) · React 19 · TypeScript · Tailwind v4 · shadcn/ui · Supabase · Google Gemini. 디자인 톤: Apple HIG + Toss (미니멀·반응형·라이트/다크).檢視完整 README ↗
전시·박람회를 같이 걷는 관람 동행자. 방문객이 부스를 발견하고, 왜 그 부스가 자기에게 맞는지 판단하고, 본 것을 기록하도록 돕는다. + 주최자용 관리·분석 콘솔.
특정 전시 전용이 아니다 — 현재 들어 있는 서울국제도서전(SIBF)·서울일러스트레이션페어(SIF)· 하우스아카이브 데이터는 시드다. 전시 추가는 코드 변경 없이 데이터로 가능하다.
반응할수록 정확해져 — 로미가 미리 아는 건 전시고, 사용자는 아직 모른다. 그래서 추천은 정답이 아니라 가설이고, 반응하면 갱신된다. 브랜드·보이스 기준은
docs/brand.md.
Next.js 16 (App Router) · React 19 · TypeScript · Tailwind v4 · shadcn/ui · Supabase · Google Gemini. 디자인 톤: Apple HIG + Toss (미니멀·반응형·라이트/다크).
npm install
npm run dev # http://localhost:3000
환경변수 없이도 뜬다. Supabase 키가 없으면 in-memory MockRepository(src/lib/mock/seed.ts)로
전시 데모가 그대로 돌아간다. 실제 DB를 쓰려면 .env.example → .env.local에 Supabase 키를 채우면
자동으로 Postgres로 전환된다 (GET /api/health가 활성 mode를 보고한다).
mock 강제 미리보기:
NEXT_PUBLIC_SUPABASE_URL= NEXT_PUBLIC_SUPABASE_ANON_KEY= SUPABASE_SERVICE_ROLE_KEY= npx next dev
| 명령 | 설명 |
|---|---|
npm run dev | 개발 서버 |
npm run build / npm start | 프로덕션 빌드 / 서빙 |
npm run typecheck | tsc --noEmit |
npm test | Vitest (엔진·피드·메모리·저장소·컴포넌트) |
npm run test:watch | Vitest watch |
npm run lint | ESLint |
변경 후에는 세 개를 모두 돌린다: npm run typecheck · npm test · npm run lint.
src/lib/repositories — Repository 인터페이스 + 두 구현
(MockRepository, SupabaseRepository), 런타임 getRepository()가 선택. UI·API·검증·테스트가
인프라 없이 동작하고 env로 Postgres로 넘어간다.
요청 단위 캐시는 repositories/cached.ts의 getExhibitionCached(React cache).src/lib/engine — 순수·결정론. scoring.ts(부스 점수) + service.ts
(rankForExhibition). I/O 없음, 유닛 테스트 완비.src/lib/feed — curate.ts(안정·낯선·모험 믹스, LLM 없음) ·
grounding.ts(근거 카드) · cue.ts(실시간 판단 큐) · rhythm.ts(6칸 결정 큐).src/lib/memory — 신호 → 브레인 증류(distill.ts), 확신도(confidence.ts),
회고(reflect-questions.ts · retro-outcomes.ts).src/app/api/* Route Handlers — 모든 입력 Zod 검증(src/lib/schemas),
일관된 { data } | { error } 봉투(src/lib/api/http.ts).supabase/migrations/000N_*.sql. ⚠️ supabase/는 gitignore라 레포에 올라가지 않는다.PostgREST는 실패해도 예외를 던지지 않는다. supabase/repository.ts의 모든 쓰기는
wrote()/maybeWrote()(도메인, 실패=throw) 또는 loggedWrite()(텔레메트리, 실패=에러 로그)를
반드시 통과해야 한다. 빠뜨리면 FK 위반·스키마 드리프트가 201 성공으로 위장되고 로그에도
남지 않는다 (2026-07-27 감사에서 북마크·커뮤니티 전량 유실로 확인).
로그인 필수. 방문객 앱 전체가 인증 게이트 뒤에 있다 (src/proxy.ts — roam_user 쿠키가
없으면 /login?next=로 307). 예외는 /login·/auth·/admin·/api·정적 파일.
로그인(닉네임 또는 Google OAuth)
→ 전시 홈 (가치 온보딩 + 관심 피드 + 근거 카드)
→ 인터랙티브 지도 (온사이트 공간 참조)
→ 부스 상세 (리뷰·이벤트·웰컴키트)
→ 노트·커뮤니티
→ "오늘 관람 마치기" (회고 → 기억 쓰기)
판단 어휘 — 관람 전(피드) 꼭 갈래 · 끌려 · 패스, 관람 중·후(지도·상세)
좋았어 · 그냥그랬어 · 아니었어. 예측과 결과가 직교해야 로미가 자기 추천이 틀렸다는 걸 배운다.
⚠️ 과거의 동선 제품(
route.ts시간예산 그리디,navigation.ts턴바이턴)은 없다. 피드로 대체되며 제거됐다. 지도는 중심 인터페이스가 아니라 부가 서비스다.
/api/ai/booth-summary · /api/ai/community-summary ·
/api/ai/screenshot · /api/exhibitions/[slug]/keywords.thinkingConfig.thinkingBudget=0 필수. gemini-2.5-flash는 thinking이 기본 ON이라
빼면 8~15초+로 느려져 전부 결정론 폴백된다.src/lib/ai/gemini.ts — generateJSON/generateText/generateGrounded, server-only,
재시도 + 모델 폴백, hasGemini 게이트./admin — 전시·부스·이벤트·대기 관리 + 분석 대시보드(히트맵·인기 부스·동선 흐름·퍼널·
이슈 모니터링·계정 상세). 자체 코드 게이트 + 이메일 allowlist.
| 위치 | 내용 |
|---|---|
docs/brand.md | 브랜드북 — 정체·로미 캐릭터·보이스&톤·비주얼·네이밍 |
docs/decisions/ | 결정 기록 (변경마다 /why로 이유를 남긴다) |
docs/superpowers/plans · specs | 기능별 설계·구현 계획 |
docs/booth-enrichment.md | 부스 근거 데이터 수동 입력 양식 |
.claude/plans/ | architecture.md · erd.md · api-spec.md |
CLAUDE.md | 코드베이스 작업 규약 (에이전트용) |
visitor_session.id 기준이라 계정에 묶이지 않는다 (미해결, P1).node scripts/gen-seed.mjs는 실행 불가 — supabase/가 gitignore라 레포에 없다.