17 Commits

Author SHA1 Message Date
d48d15f09a feat(ui): 대시보드 페이지당 저장소 10개로 조정
PAGE_SIZE 20 → 10. 한 화면에 부담 없이 보이도록. 페이저는 기존대로
동적 계산(ceil(total/PAGE_SIZE)). 테스트도 10/페이지 기준으로 갱신.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-10 10:06:27 +09:00
9b686e35ba feat(ui): 콘솔 재디자인 적용 (Toss 스타일) + Pico v2 호환 수정
디자인 핸드오프(design_handoff_console_redesign)를 실제 앱에 반영.
CSS 드롭인 교체 + 최소 마크업 추가, HTMX 훅·id·data 속성은 모두 보존.

- app.css: 재디자인 토큰/컴포넌트로 교체(요약카드 호버 리프트, 표
  제브라, 중앙 경고형 배포 모달, secondary/ghost/danger 버튼 체계,
  진행률·상태칩·스켈레톤 등).
- base.html: 브랜드 로고 큐브(.brand-mark) 추가 + 데모 배너.
- repo_list: 요약 카드 .card-top/.card-ico + 검색 돋보기 아이콘.
- table_wrap: 회전형 정렬 인디케이터, 동기화 버튼 아이콘.
- progress: .sync-head/.sync-pct/.is-active/.indeterminate 구조.
- deploy_modal: 중앙 경고형 + 현재→대상 프리뷰 카드 + 타입-투-컨펌
  체크/X 시각 상태.
- deploy_success: 그려지는 체크 원 배너.
- version_list: 표 → .version-item 카드 리스트.

Pico v2 호환(미리보기는 pico-shim 기준이라 안 드러났던 것):
- Pico 의 `:is(...).secondary`(0,2,0)·hover(0,4,0) 특정성을 이기도록
  오버라이드를 :is() 형태로 상향 → 동기화 버튼 흰배경+파란글씨 유지,
  hover 시 어두워지던 문제 해결.
- `input[type=search]` 의 Pico 기본 돋보기 배경 제거(아이콘 중복).
- `td` 배경을 투명 처리해 tr 제브라/hover 가 보이도록(Pico 의
  `td{background:var(--pico-background-color)}` 가 덮던 문제), 줄무늬
  색을 --bg-alt 로 또렷하게.
- .row-action 을 40px 고정 → 버튼↔진행률↔배지 교체 시 높이 흔들림·
  위아래 테두리 잘림 해소.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-10 10:05:17 +09:00
07094d9352 feat(demo): expose demo_mode to templates + 연결 배지 데모 표시
- deps.py: PULP_DEMO 설정을 Jinja 전역(demo_mode)으로 노출 → 모든
  템플릿에서 참조 가능. 실연동 오인 방지(데모는 화면 확인 전용).
- health.html: 데모 모드일 때 연결 배지를 "데모 모드 · 가짜 데이터"
  칩으로 표시.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-10 10:03:45 +09:00
c303040ae2 chore: htmx 2.0.10 갱신 (폐쇄망 반입 준비) 2026-07-09 17:12:08 +09:00
bfd84fe94a fix+style: deploy modal/banner, back button, table stability
버그픽스
- 배포 확정 활성화: tojson 따옴표가 oninput 속성을 깨뜨리던 것 → data-confirm 비교로 수정
- ghost 버튼 호버 시 글자 하얘짐 → 호버 색 명시(새로고침/페이저/테마토글 공통)

UX/디자인
- 배포 모달: 취소·배포확정 한 줄, 저장소명만 mono, 순 변화 +초록/−빨강, 표 chrome 제거
- 배포 성공: 별도 다이얼로그 제거 → 모달 닫힘 + 배지 이동 + 완료 배너(여백·크기 정돈)
- 대시보드 백링크: ghost 버튼 + 화살표, 제목과 간격 확보
- 표 액션 셀 고정 박스(172x36) → 동기화/완료/진행 전환 시 행·열 안 흔들림
  (완료 'v3', 진행 'n/m·NN%', 실패는 축약+title 로 사유)

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-17 16:53:01 +09:00
59134927d8 feat(demo): reflect deploys in demo state so the badge moves
- _DEPLOYED 가변 맵 + create_publication/update_distribution/wait_for_task 가
  배포한 버전을 기록 → 데모에서도 '운영 배포 중' 배지가 방금 버전으로 이동

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-17 16:52:43 +09:00
84fb568e96 feat: dark mode toggle
- [data-theme=dark] 팔레트 토큰 오버라이드 → 컴포넌트 자동 적용
- 네비에 테마 토글(달/해 아이콘), localStorage 저장 + OS 선호 감지
- FOUC 방지용 head 인라인 스크립트로 페인트 전 테마 설정
- 기본은 라이트(design-ref: 다크는 기본 캔버스로 쓰지 않음), 토글 옵션 제공

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-17 14:25:43 +09:00
8a6a88d7c4 style: button hierarchy, full-width search, inline status row
- 버튼 위계 정리: 파란 틴트=동작(동기화/배포), ghost=네비/유틸(새로고침·이전·다음)
- 새로고침: ghost + 원형화살표 아이콘 + 컴팩트, 페이저: ghost + ◀/▶ 삼각형
- 검색창 가로 꽉(width 100%) + 얇게
- 헤더(th) 한글 라벨에 모노 폰트 안 먹게 td 로 한정 + 모노 스택에 한글 폴백
- 상태: '상태'+연결배지 한 줄 배치, '상태'='저장소' 글자 크기 통일, 배지 14px

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-17 14:23:05 +09:00
abf8654b52 feat: repo list search, header sort, pagination (stage 6)
- list_repos: Pulp next 페이지 끝까지 순회 (첫-페이지-only 누락 수정)
- BFF 메모리 검색(이름)·정렬(이름/검증/버전/패키지/동기화)·페이지네이션(20/페이지)
- GET /repos/table 조각: 검색창은 표 밖(포커스 유지), 정렬헤더/페이저는 표 안,
  hx-include 로 검색어·정렬상태 상호 전송
- 폰트 재조정: 데이터 셀 14px, 헤더 13px, 배지/액션버튼 14px (동기화 버튼 대비 균형)
- 버전 페이지 제목↔검증상세 마진, 데모 저장소 26개로 확장

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-17 14:04:54 +09:00
15bb0994be style: mono data font, compact actions, polish, favicon; slow status poll to 30s
- JetBrains Mono(로컬 동봉) → 저장소명/버전/패키지수/시각 등 영문·숫자 데이터에 적용
- 동기화/배포 버튼 컴팩트(btn-sm) + 액션 셀 높이 고정(row-action)으로 행 점프 제거
- 표 행 높이/hover, 요약 카드 강조(동기화중=blue, GPG통과=mint) + hover, 버튼 누름 피드백
- 연결 상태 폴링 10s → 30s
- SVG favicon (Toss blue 라운드 사각 + 스냅샷 레이어)

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-17 13:53:49 +09:00
aef4124da0 refactor: audit log to Postgres + split /healthz liveness from Pulp status
- audit.record_deploy 를 JSONL 파일 → Postgres deploy_audit 테이블로 (재배포 휘발 방지)
  - psycopg 지연 import, _write 는 테스트에서 monkeypatch 지점, DATABASE_URL 사용
  - 감사 기록 실패는 배포 완료를 막지 않고 UI 경고(audit_ok)
- /healthz: Pulp 무관 라이브니스 {"ok":true} (컨테이너 health check),
  Pulp 연결 배지는 /pulp-status 로 분리 (대시보드가 폴링)
- config: DATABASE_URL 추가, audit_log_path 제거

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-17 13:42:11 +09:00
7ad6d65a11 feat: gated deploy with preview, audit log, rollback trail (stage 4)
- pulp_client: create_publication / update_distribution / wait_for_task
- GET /repos/{uuid}/deploy/confirm: 미리보기(현재→대상, 순 변화) + type-to-confirm 모달
- POST /repos/{uuid}/deploy: 검증 게이트(서버측 재확인) → publication 생성 →
  distribution 교체 → 감사 로그. 2단계 실패 시 '운영망 변경 여부' 명확화
- audit.record_deploy: 누가/언제/repo/이전버전→대상버전 JSONL (롤백 추적)
- 배포 버튼은 검증 통과 + 미배포 버전만 활성, 성공 시 버전목록 OOB 갱신
- 인증은 TODO (operator placeholder, 배포 비밀번호 재확인 예정)

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-17 13:31:15 +09:00
72c75252d3 feat: version list with verification + deployed badge (stage 3)
- pulp_client: list_versions / list_distributions / get_publication
- GET /repos/{uuid}/versions: 버전 목록 페이지(최신순)
- 현재 운영 배포 버전 판별: Distribution→publication→repository_version 역추적
- views.build_version_view: vN, 생성일시, 패키지 수, 증감(+/-), 검증 배지, 배포 여부
- views.verification_detail: gpgcheck/repo-gpgcheck/checksum 상세 (화면4)
- 대시보드 저장소명 → 버전 페이지 링크, [이 버전 배포] 버튼은 단계4용 placeholder
- 단계1 TODO(배포 버전 역추적) 해소

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-17 11:15:31 +09:00
6c41b89c53 feat: sync execution with 3s progress polling (stage 2)
- pulp_client: get_repo / sync_repo / get_task (비동기 task href 반환)
- POST /repos/{uuid}/sync: remote 확인 후 동기화 시작, 진행률 조각 반환
- GET /repos/{uuid}/progress: progress_reports 합산 → 바/퍼센트,
  완료/실패 시 hx-trigger 제거로 폴링 중단
- task_store: uuid→task_href 메모리 추적 (단일 인스턴스), 대시보드 '동기화 중' 집계
- views.task_progress: state/done/total/percent + created_resources에서 새 vN
- 동기화는 안전 동작이라 확인 모달 없이 실행 (스펙 §5-1)

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-17 11:09:37 +09:00
c1192ab09d chore: temporary demo mode for previewing populated dashboard
PULP_DEMO=true 시 가짜 Pulp 데이터로 대시보드 미리보기. 실제 Pulp 연동/단계5 전 제거 가능.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-17 10:55:19 +09:00
6f0649cf2b style: apply Toss-style design system from design-ref
- design tokens (Toss Blue 단일 accent, 상태색, 7px/12px radii)
- 색상 칩 배지(이모지 제거), tabular 숫자, 카드형 표, 상단 내비
- Pretendard variable 폰트 로컬 동봉 (@font-face)

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-17 10:55:18 +09:00
3622b4f20a feat: FastAPI console with dashboard, Pulp client, healthz (stages 0-1)
- config: PULP_* env + 사내 CA(verify=) 대응
- pulp_client: Basic Auth get/post/patch, status/list_repos/get_version
- BFF 라우트: GET / (대시보드), GET /repos (조각), GET /healthz
- views: Pulp JSON → 표시 모델 (GPG 검증 배지 3단계, 요약 집계)
- HTMX + Jinja 템플릿, vendored pico.css/htmx.js (CDN 의존 0)
- 브라우저는 Pulp 직접 호출 안 함 — 모두 BFF 경유 (스펙 §2)
- 테스트: pulp_client(respx), 라우트(dependency_overrides), views 순수함수

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-17 10:55:01 +09:00