Phase 1.3: 시드 크롤 — by-project 엔드포인트 + CrawlPage 폼/폴링/취소

세션 영구화: UI_REBUILD_PLAN.md 신설
- 사용자 비전 5가지 흐름 + Phase 보드 + 작업 재개 가이드
- 세션이 끊겨도 이 파일 + git log로 어디까지 했는지 즉시 복원

백엔드 (crawler_platform/app/api/):
- routes.py: POST /crawl-site/by-project 추가 — config_path 의존 제거
  - SiteCrawlByProjectRequest: project_name 기반, DB project.config 재구성
  - run_site_crawl_job이 __config_dict 메타키 인식하도록 최소 변경
- config/loader.py: project_config_from_dict() 헬퍼 추출 (DB dict ↔ ProjectConfig)

프론트엔드 API (src/lib/api/):
- crawl.ts: crawlApi.startByProject/getJob/cancel + Zod 스키마
  - 종료 상태 판정 헬퍼 isCrawlTerminal()

TanStack Query 훅 (src/hooks/):
- useCrawl.ts: useStartSiteCrawl, useCrawlJob (2초 폴링, 종료 시 자동 중단), useCancelCrawl
- queryKeys에 crawl.job 키

UI 프리미티브 (src/components/ui/):
- select.tsx, progress.tsx, badge.tsx (success/warning/destructive variants 포함)

CrawlPage 완전 교체 (src/pages/):
- 2열 레이아웃: 좌측 크롤 설정 폼 + 우측 진행 상태
- 폼: 소스 선택 (드롭다운, 비어있으면 소스 추가 안내) + 시드 URL + max_depth/max_pages + same_domain_only
  - react-hook-form + zod 검증
- 진행 상태: 상태 배지, 진행률 바, visited/queued/analyzed 카운터, 최근 페이지, 에러 details
- 크롤 종료시 폴링 자동 중단, 완료시 "결과 검토" 버튼
- 취소 버튼 → /crawl-site/jobs/{id}/cancel
- sonner 토스트

i18n: crawl.* 키 (한/영)

다음 단계: Phase 1.4 — 자율 연구 (POST /research/run by-project 마이그레이션 + ResearchPage)

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
lasta
2026-05-14 15:04:41 +09:00
parent 461ebc062b
commit aaaaa054a7
13 changed files with 1009 additions and 28 deletions

View File

@@ -57,6 +57,34 @@
"deleted": "Source deleted: {{name}}",
"deleteFailed": "Delete failed: {{msg}}"
},
"crawl": {
"title": "Seed Crawl",
"formTitle": "Crawl Settings",
"formDesc": "Start from a seed URL and follow links to extract information",
"source": "Source",
"pickSource": "Pick a source...",
"noSources": "No sources registered. Add a reference source first.",
"addSource": "Add Source",
"seedUrl": "Seed URL",
"maxDepth": "Max Depth",
"maxPages": "Max Pages",
"sameDomainOnly": "Same domain only",
"start": "Start Crawl",
"started": "Crawl started (job #{{id}})",
"startFailed": "Start failed: {{msg}}",
"cancel": "Cancel",
"cancelRequested": "Cancel requested",
"cancelFailed": "Cancel failed: {{msg}}",
"progressTitle": "Progress",
"idleHint": "Enter a seed URL and start the crawl",
"visited": "Visited",
"queued": "Queued",
"analyzed": "Analyzed",
"latestPage": "Latest Page",
"errorsCount": "{{count}} errors",
"doneHint": "Crawl complete. Go review the results.",
"review": "Review"
},
"common": {
"retry": "Retry",
"cancel": "Cancel",

View File

@@ -57,6 +57,34 @@
"deleted": "소스가 삭제되었습니다: {{name}}",
"deleteFailed": "삭제 실패: {{msg}}"
},
"crawl": {
"title": "시드 크롤",
"formTitle": "크롤 설정",
"formDesc": "시드 URL에서 시작해 링크를 따라가며 정보를 추출합니다",
"source": "참고 소스",
"pickSource": "소스를 선택하세요...",
"noSources": "등록된 소스가 없습니다. 먼저 참고 소스를 추가하세요.",
"addSource": "소스 추가",
"seedUrl": "시드 URL",
"maxDepth": "최대 깊이",
"maxPages": "최대 페이지",
"sameDomainOnly": "동일 도메인만 따라가기",
"start": "크롤 시작",
"started": "크롤이 시작되었습니다 (job #{{id}})",
"startFailed": "시작 실패: {{msg}}",
"cancel": "취소",
"cancelRequested": "취소 요청됨",
"cancelFailed": "취소 실패: {{msg}}",
"progressTitle": "진행 상태",
"idleHint": "왼쪽에서 시드 URL을 입력하고 시작하세요",
"visited": "방문",
"queued": "대기",
"analyzed": "분석",
"latestPage": "최근 페이지",
"errorsCount": "에러 {{count}}건",
"doneHint": "크롤 완료. 결과 검토로 이동하세요.",
"review": "결과 검토"
},
"common": {
"retry": "다시 시도",
"cancel": "취소",