Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 0 additions & 13 deletions .conductor/settings.toml

This file was deleted.

80 changes: 11 additions & 69 deletions .env.example
Original file line number Diff line number Diff line change
@@ -1,80 +1,22 @@
# Public site URL (used for metadata/OG). Production: https://axis.so
# Public site URL
NEXT_PUBLIC_SITE_URL=http://localhost:3000

# Supabase (Dashboard → Settings → API)
# Supabase (캐시·가격이력·클릭·로그인)
NEXT_PUBLIC_SUPABASE_URL=
NEXT_PUBLIC_SUPABASE_ANON_KEY=
SUPABASE_SERVICE_ROLE_KEY=

# Supabase Dashboard → Authentication → URL Configuration
# Site URL: http://localhost:3000
# Redirect URLs: http://localhost:3000/auth/callback

# AI (하나 이상 설정)
# OpenAI-compatible providers are supported via OPENAI_BASE_URL.
OPENAI_API_KEY=
OPENAI_MODEL=gpt-4o-mini
OPENAI_BASE_URL=

GROQ_API_KEY=

GEMINI_API_KEY=
GEMINI_MODEL=gemini-2.0-flash

ANTHROPIC_API_KEY=
ANTHROPIC_MODEL=claude-3-5-haiku-20241022

# openai | groq | gemini | anthropic (선택, 미설정 시 키 있는 첫 provider)
AI_PROVIDER=

# 공식 페이지 검색 provider (registry에 없는 제품의 공식 스펙 URL 발견)
# Brave 권장. Google은 Custom Search Engine(CX)이 필요합니다.
BRAVE_SEARCH_API_KEY=
GOOGLE_SEARCH_API_KEY=
GOOGLE_SEARCH_CX=

# 공식 스펙 추출 관리자 라우트 (/api/admin/extract)
# 로컬 검토 시에만 1로 켜고, 프로덕션에서는 보호된 환경변수로만 설정하세요.
AXIS_ADMIN=

# 가격 provider.
# - 로컬 데모: seed
# - 프로덕션: naver (또는 coupang). seed 금지 — 가짜 가격이 노출됩니다.
# - 미설정: 가격 UI 숨김
# 가격: 로컬 데모=seed / 프로덕션=naver (seed 금지)
AXIS_PRICE_SOURCE=
NAVER_CLIENT_ID=
NAVER_CLIENT_SECRET=

# 쿠팡 파트너스 (제휴 추적)
# NEXT_PUBLIC_COUPANG_AFFILIATE_ID=

# 검색엔진 사이트 인증 (Google Search Console / Naver Search Advisor 등록 후 발급)
# NEXT_PUBLIC_GOOGLE_SITE_VERIFICATION=
# NEXT_PUBLIC_NAVER_SITE_VERIFICATION=

# Vercel Cron (/api/cron/price-check). Vercel은 이 값을 Authorization: Bearer <CRON_SECRET>로 보냅니다.
# Vercel Cron (/api/cron/price-snapshot)
CRON_SECRET=

# Email alerts (Resend)
RESEND_API_KEY=
RESEND_FROM_EMAIL="Axis <alerts@axis.so>"

# Web Push / PWA alerts
NEXT_PUBLIC_VAPID_PUBLIC_KEY=
VAPID_PRIVATE_KEY=
VAPID_SUBJECT=mailto:hello@axis.so

# 개발 전용: 로컬에서 특정 플랜을 체감 (프로덕션 빌드에서는 무시됨). pro | plus | free
# AXIS_DEV_PLAN=pro

# 제휴 마케팅 (없으면 일반 검색 링크로 폴백)
# NEXT_PUBLIC_COUPANG_AFFILIATE_ID= # 쿠팡 파트너스 서브ID (한국) — 구매 URL 추적용
# NEXT_PUBLIC_AMAZON_AFFILIATE_US= # Amazon Associates tag (글로벌/영어)
# NEXT_PUBLIC_AMAZON_AFFILIATE_JP= # Amazon Japan tag (일본어)

# 네이버 쇼핑 Open API (실시간 최저가 — AXIS_PRICE_SOURCE=naver 시 필요, 무료·즉시 발급)
# https://developers.naver.com/apps/#/register → 쇼핑 API 신청
# NAVER_CLIENT_ID=
# NAVER_CLIENT_SECRET=

# 쿠팡 파트너스 Open API (AXIS_PRICE_SOURCE=coupang 시 필요)
# 파트너스 포털 → 추가기능 → 파트너스API → Access Key / Secret Key
# ⚠️ 누적 판매 15만원 달성 후 최종승인 완료 계정만 발급 가능
# COUPANG_ACCESS_KEY=
# COUPANG_SECRET_KEY=
# 검색엔진 사이트 인증 (선택)
# NEXT_PUBLIC_GOOGLE_SITE_VERIFICATION=
# NEXT_PUBLIC_NAVER_SITE_VERIFICATION=
114 changes: 10 additions & 104 deletions AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,111 +3,17 @@
## 프로젝트

- 이름: Axis
- 현재 repo 루트만 작업한다.
- DB: Supabase.
- PM만 최종 승인과 배포를 한다.
- **범위:** 한국 · 노트북 · 검증 스펙 비교 · 쿠팡 제휴
- **금지:** AI 채팅형 답변, 푸시/이메일 알림, 게스트 공유, 관리자 추출, Conductor
- DB: Supabase (캐시·가격이력·클릭만)
- PM만 배포 승인

## Conductor 역할 흐름
## 결정 규칙

1. PM이 Codex FE/BE에게 작업 지시.
2. Codex FE와 Codex BE가 각자 영역에서 구현, todo 관리, lint/typecheck/test/build 실행.
3. FE/BE는 각자 작업 결과를 종합해 수정 파일, 실행 명령, 실패/남은 이슈를 역할 노트에 기록한다.
4. PM이 "검증 단계로 넘겨" 또는 "검증" 지시 전까지 Codex Security는 개입하지 않는다.
5. Security가 1차 검증을 수행한다: 전체 diff, FE/BE 연결, 보안, 권한, 타입, 테스트, 런타임 위험.
6. Security는 발견한 문제를 Security 선에서 전부 수정하고, 수정 내용과 남은 리스크를 `security-report.md`에 기록한다.
7. Security 완료 후 Claude Lead가 2차 검증과 최종 종합을 수행한다: security-report, diff, test 결과, 구조 리스크, 남은 이슈, 다음 작업, merge 가능 여부.
- 스펙은 `lib/specs/dataset/` (+ 규칙 스크래핑)만. AI로 스펙/승자 만들지 않음.
- primary 스펙이 tier 1~2일 때만 `verified`.
- 결과 포맷 바꾸면 `CACHE_VERSION` 올리기 (현재 v10).

## 파일 경계
## 역할 (스킬 예정)

### Codex FE

담당:
- UI/UX, 컴포넌트, 화면, 스타일, 반응형, 클라이언트 상태, API 연결부, 프론트 테스트

금지:
- `api/`, `server/`, `src/server/`, `supabase/`, `data/`, `engine/`, `config/`, `lib/specs/`, `lib/pricing/`, `lib/ai/` 직접 수정
- API 스펙 임의 변경
- DB schema/migration/auth 임의 변경

### Codex BE

담당:
- API, 서버 로직, `lib/specs/`, `lib/pricing/`, `lib/ai/`, DB 연결, migration, auth, permission, validation, backend security, backend test

금지:
- `components/`, `pages/`, `screens/`, `ui/`, `styles/`, 프론트 화면 파일 직접 수정
- 응답 형식 임의 변경
- package/lockfile 임의 변경

### Codex Security

- PM 검증 지시 후에만 실행.
- 검증: FE/BE API 불일치, request/response 타입, auth/session, permission 우회, DB/migration, secret/env 노출, webhook/결제/파일업로드, lint/typecheck/test/build, 런타임 에러, 파일 범위 침범.
- 발견한 보안/타입/설정/구조 문제는 Security 선에서 전부 수정한다.
- 수정한 내용, 수정하지 못한 리스크, 검증 결과를 `.context/security-report.md`에 기록한다.

### Claude Lead

- Security 통과 뒤 마지막에만 실행.
- 담당: 2차 검증, 최종 종합, 큰 구조 리뷰, 변경 요약, 남은 이슈, 다음 task 설계, merge 가능 여부 판단.
- 2차 검증에서는 `security-report.md`, FE/BE 노트, 전체 diff, lint/typecheck/test/build 결과, 파일 범위 침범 여부를 다시 확인한다.
- 코드 대량 수정 금지.

## 기록 위치

- `.context/handoff.md`
- `.context/fe-notes.md`
- `.context/be-notes.md`
- `.context/security-report.md`
- 필요 시 `docs/inbox/frontend.md`, `docs/inbox/backend.md`, `docs/inbox/security.md`, `docs/inbox/lead.md`

## 보고 형식

토큰 절약을 위해 모든 역할은 기본 보고를 아래 형식으로 끝낸다.

```text
한것: file1, file2
검증: lint ✅ type ✅ test ✅ build ✅
남은것: 없음
```

문제 있을 때만 짧게 이유를 붙인다.

```text
한것: file1
검증: test ❌ — 핵심 이유
남은것: 해야 할 일
```

Lead 최종 보고는 아래 형식을 쓴다.

```text
판정: merge 가능/불가
한것: 핵심 3줄 이하
검증: Security ✅ Lead ✅
남은것: 없음/항목
```

긴 설명, 전체 파일 출력, 장문 로그 붙여넣기는 금지한다. 상세 판단은 Conductor diff/test 결과로 한다.

## 공통 규칙

- 기본은 자율 수행이다. 역할 범위 안 코드 수정, 검증 명령 실행, 문서/.context 기록, 작은 설정 수정은 PM 승인 없이 진행한다.
- 단, 아래 항목은 반드시 PM 승인 후 진행한다:
- 개인정보/시크릿/env 값 생성·수정·노출
- DB schema/rules/migration 실제 적용
- 인증 방식 변경
- 결제/웹훅/권한 구조 변경
- package.json/lockfile 변경
- 새 유료 서비스/API 도입
- 배포 실행
- git push/merge/delete branch
- 대량 삭제
- 프로젝트 밖 파일 수정
- package.json/lockfile 변경은 PM 승인 후.
- DB schema/migration 변경은 PM 승인 후.
- 인증 방식 변경은 PM 승인 후.
- 배포 실행은 PM만.
- 시크릿/앱키를 클라이언트 번들에 넣지 않는다.
- 실패한 명령은 숨기지 않고 역할 노트에 기록한다.
- 긴 전체 파일 출력 금지. diff, 테스트 결과, 수정 파일 목록 중심으로 보고한다.
FE / BE / SEC / LEAD — 파일 경계는 기존과 동일. 보고는 `한것/검증/남은것`.
37 changes: 8 additions & 29 deletions CLAUDE.md
Original file line number Diff line number Diff line change
@@ -1,40 +1,19 @@
# CLAUDE.md

Axis 코드베이스에서 작업할 때 따라야 할 규칙. 프로젝트 개요·아키텍처는
[README.md](README.md), 상세 개발 노트는 [DEV_NOTES.md](DEV_NOTES.md) 참고.
Axis 코드베이스 규칙. 개요는 [README.md](README.md), 상세는 [DEV_NOTES.md](DEV_NOTES.md).

## 절대 규칙

1. **배포는 문맥상 명확할 때 실행한다.** 사용자가 다음 단계 진행을 요청하면
`vercel --prod` 등 배포 명령을 직접 실행한다.
2. **결과/추천 로직은 건드리지 않는다.** `selectedOption`, `reasons`,
`oneLineConclusion`, per-option 분석 등 결정·추천 생성 로직은 사용자가
프롬프트로 직접 작업한다. 요청 없이 수정 금지.
3. **스펙은 DB에서 꺼내지 않는다.** 비교 스펙은 공식 페이지를 AI로 읽어 검증하거나
`lib/specs/dataset/`의 수동 검증 데이터에서 가져온다. DB(Supabase)는
계정/히스토리/가격추적/알림 전용.
4. **검증 게이트를 지킨다.** primary 스펙이 공식 소스(tier 1~2)로 뒷받침될 때만
`verified`. AI 추정값으로 "verified"를 만들지 않는다. 뻥스펙·하드코딩 fallback
추천 금지 — 없는 제품은 "찾을 수 없음"으로 떨어뜨린다.
1. **범위:** 한국 · 노트북 · 검증 스펙 비교 · 쿠팡 제휴. 잡다한 기능 추가 금지.
2. **AI 채팅형 답변 금지.** 승자·근거는 검증 스펙표 점수(`buildDeterministicDecision`)만.
3. **스펙은 DB에서 꺼내지 않는다.** `lib/specs/dataset/` + 규칙 스크래핑만.
4. **검증 게이트.** primary가 tier 1~2일 때만 `verified`. 없는 제품은 "찾을 수 없음".
5. 배포는 문맥상 명확할 때 / PM 승인 하에.

## 작업 흐름

- **코드 수정 후 반드시** `npm test` 실행 (특히 레지스트리/데이터셋/파이프라인 변경 시).
- 타입 체크: `npx tsc --noEmit`.
- 데이터셋 변경 시 `dataset.test.ts` 무결성 검사 통과 확인.
- 스키마·결과 포맷을 바꾸면 `lib/comparison-cache.ts`의 `CACHE_VERSION`을 올려
구버전 캐시를 무효화한다 (현재 **v9**).

## 데이터셋 작업

- 수동 검증 데이터: `lib/specs/dataset/{index,smartphones,earphones,laptops,tablets}.ts` (+ `kr/`)
- 제품명은 로케일 정규화됨 — `canonicalName`(한국어) + `nameEn` + `nameJa`.
EN/JA 로케일에서 어필리에이트 검색어·표시명이 이 필드로 결정된다.
- 새 제품 추가 시: `id`는 lowercase-kebab, spec 키는 카테고리 스키마에 존재해야 함.

## 비밀번호·보안

- `CRON_SECRET` 등 시크릿을 코드/문서에 하드코딩하지 않는다.
- 수정 후 `npm test` + `npx tsc --noEmit`.
- 스키마·결과 포맷 변경 시 `CACHE_VERSION` 올리기 (현재 **v10**).

## 응답 언어

Expand Down
10 changes: 6 additions & 4 deletions DEV_NOTES.md
Original file line number Diff line number Diff line change
@@ -1,11 +1,13 @@
# Axis — 개발 노트

> 마지막 업데이트: 2026-07-16
> 테스트: `npm test` 통과 기준 유지 · 캐시 버전: **v9**
> 마지막 업데이트: 2026-07-17 (essentials strip)
> 캐시 버전: **v10** · 범위: KR · 노트북 · 검증 스펙표 · 쿠팡 제휴
> 프로덕션: https://axis-app-beta.vercel.app
>
> 이 문서는 개발 단일 참조점이다. 제품 방향·진행 현황·아키텍처·남은 작업을 모두 담는다.
> 작업 규칙은 [CLAUDE.md](CLAUDE.md), 공개 소개는 [README.md](README.md).
> AI 채팅/푸시/공유/admin/비노트북 SEO 제거. 본문 일부(구 122개·다국가)는 구버전 서술일 수 있음.
>
> 작업 규칙 [CLAUDE.md](CLAUDE.md) · 공개 소개 [README.md](README.md).


---

Expand Down
4 changes: 2 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,9 +8,9 @@

한국(한국어) · 미국(English) · 일본(日本語) 3개 시장을 동시 지원합니다.

**프로덕션:** https://axis-app-beta.vercel.app · **상태:** 베타, 사업성 검증 단계 (한국 · 노트북 · 제휴)
**프로덕션:** https://axis-app-beta.vercel.app · **상태:** 베타 (한국 · 노트북 · 검증 스펙 · 쿠팡 제휴)

> SEO: `verified`만 색인 (`partial`/`unverified`는 noindex). 캐시 버전: **v9**.
> 캐시 **v10**. AI 채팅 답변·푸시·공유·비노트북 SEO 제거. `verified`만 색인.

---

Expand Down
54 changes: 0 additions & 54 deletions app/account/page.tsx

This file was deleted.

28 changes: 0 additions & 28 deletions app/admin/sources/page.tsx

This file was deleted.

Loading