Skip to content
Merged
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
1 change: 1 addition & 0 deletions .claude/hooks/clear-marker-on-start.sh
Original file line number Diff line number Diff line change
Expand Up @@ -3,4 +3,5 @@ PROJECT_ROOT="${CLAUDE_PROJECT_DIR:-$(cd "$(dirname "${BASH_SOURCE[0]}")/../.."
rm -f "${PROJECT_ROOT}/.claude/.pending-doc-check"
rm -f "${PROJECT_ROOT}/.claude/.pending-rust-check"
rm -f "${PROJECT_ROOT}/.claude/.pending-spec-check"
rm -f "${PROJECT_ROOT}/.claude/.pending-fe-check"
rm -f "${PROJECT_ROOT}/.claude/.plan-exists"
2 changes: 2 additions & 0 deletions .claude/hooks/coverage-check-fe.sh
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
#!/bin/bash
PROJECT_ROOT="${CLAUDE_PROJECT_DIR:-$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)}"
# 프론트 소스가 실제로 변경됐을 때만 실행 (마커 게이트). 대화만 한 턴은 즉시 통과.
[ ! -f "${PROJECT_ROOT}/.claude/.pending-fe-check" ] && exit 0
FE_DIR="${PROJECT_ROOT}/frontend"
[ ! -d "$FE_DIR" ] && exit 0
[ ! -d "$FE_DIR/node_modules" ] && exit 0
Expand Down
8 changes: 7 additions & 1 deletion .claude/hooks/mark-pending.sh
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ PROJECT_ROOT="${CLAUDE_PROJECT_DIR:-$(cd "$(dirname "${BASH_SOURCE[0]}")/../.."
MARKER="${PROJECT_ROOT}/.claude/.pending-doc-check"
RUST_MARKER="${PROJECT_ROOT}/.claude/.pending-rust-check"
SPEC_MARKER="${PROJECT_ROOT}/.claude/.pending-spec-check"
FE_MARKER="${PROJECT_ROOT}/.claude/.pending-fe-check"
PLAN_MARKER="${PROJECT_ROOT}/.claude/.plan-exists"

# docs/plans/ 작성 시 플랜 마커 생성
Expand All @@ -16,7 +17,7 @@ fi

# docs/works/ 또는 specification/ 작성 시 마커 제거
if echo "$FILE_PATH" | grep -qE '(docs/works/|specification/)'; then
rm -f "$MARKER" "$RUST_MARKER" "$SPEC_MARKER"
rm -f "$MARKER" "$RUST_MARKER" "$SPEC_MARKER" "$FE_MARKER"
exit 0
fi

Expand All @@ -31,6 +32,11 @@ if echo "$FILE_PATH" | grep -qE '(backend/src/|frontend/src/|frontend/app/|backe
touch "$MARKER"
fi

# 프론트 소스 변경 시 fe-check 마커 생성 (Stop 훅의 커버리지 게이트용)
if echo "$FILE_PATH" | grep -qE '(frontend/src/|frontend/app/)'; then
touch "$FE_MARKER"
fi

# .rs 변경 시 rust-check 마커 생성
if echo "$FILE_PATH" | grep -qE 'backend/.*\.rs$'; then
touch "$RUST_MARKER"
Expand Down
4 changes: 4 additions & 0 deletions .claude/hooks/session-doc-on-stop.sh
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,10 @@ STOP_HOOK_ACTIVE=$(echo "$INPUT" | jq -r '.stop_hook_active // false')
if [ "$STOP_HOOK_ACTIVE" = "true" ]; then exit 0; fi
PROJECT_ROOT="${CLAUDE_PROJECT_DIR:-$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)}"

# 코드 작업이 있었던 턴에서만 세션 문서를 생성 (마커 게이트).
# 대화만 한 턴은 무거운 claude --print 호출 없이 즉시 통과.
[ ! -f "${PROJECT_ROOT}/.claude/.pending-doc-check" ] && exit 0

TRANSCRIPT=$(echo "$INPUT" | jq -r '.transcript_path // ""')
[ -z "$TRANSCRIPT" ] || [ ! -f "$TRANSCRIPT" ] && exit 0

Expand Down
8 changes: 8 additions & 0 deletions backend/.env.example
Original file line number Diff line number Diff line change
Expand Up @@ -2,3 +2,11 @@ DATABASE_URL=postgres://postgres:password@localhost:5432/coupang_review_ai
JWT_SECRET=your-secret-key-here
JWT_EXPIRES_IN=86400
SERVER_PORT=8080
GEMINI_API_KEY=your-gemini-api-key-here
GEMINI_MODEL=gemini-2.5-flash

# 크롤러 모드: http(기본, 실제 쿠팡) | mock(픽스처 리뷰, 로컬 데모용)
CRAWLER_MODE=http
# 스크래핑 API 프록시(선택). {url} 에 타겟 URL 이 치환된다. 예: ScraperAPI/ZenRows
# 설정 시 모든 크롤링이 프록시 경유(anti-bot/IP 로테이션을 벤더가 처리).
# COUPANG_PROXY_URL=https://api.scraperapi.com/?api_key=YOUR_KEY&url={url}
2 changes: 1 addition & 1 deletion backend/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -29,9 +29,9 @@ tower = "0.4"
tower-http = { version = "0.5", features = ["cors", "trace"] }
tracing = "0.1"
tracing-subscriber = { version = "0.3", features = ["env-filter"] }
reqwest = { version = "0.11", features = ["json"] }

[dev-dependencies]
reqwest = { version = "0.11", features = ["json"] }
tokio = { version = "1", features = ["full"] }
dotenvy = "0.15"
testcontainers-modules = { version = "0.11", features = ["postgres"] }
7 changes: 7 additions & 0 deletions backend/migrations/00002_users.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
CREATE TABLE users (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
email TEXT NOT NULL UNIQUE,
password_hash TEXT NOT NULL,
plan TEXT NOT NULL DEFAULT 'free',
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
);
12 changes: 12 additions & 0 deletions backend/migrations/00003_analyses.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
CREATE TABLE analyses (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
user_id UUID NOT NULL REFERENCES users(id),
urls TEXT[] NOT NULL,
review_limit INT NOT NULL DEFAULT 100,
status TEXT NOT NULL DEFAULT 'pending',
result JSONB,
error TEXT,
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
completed_at TIMESTAMPTZ
);
CREATE INDEX idx_analyses_user_created ON analyses (user_id, created_at DESC);
Loading
Loading