"""사용자 가이드 그림 자동 캡처(PLAN 539-1 · 요구 359-6) — 장면 목록대로 헤드리스 Edge 로 찍어 WebP. 쓰는 법(명령으로 돎 · 서버 안 스레드 아님) ./venv/Scripts/python.exe A05_EduDetail/A05_EduDetail_Guide_Capture.py --page B05 [--scene <이름>] [--vite http://localhost:5173] [--api ] [--out <폴더>] [--project-id ] [--force] [--list] [--headed] - 기본 out = A05_EduDetail/guide/<페이지>/ · 장면 목록 = out 폴더 `_scenes.json` · 그림 = out/<이름>.webp - --scene 여러 번 · 이름 일부(앞머리)도 됨 · --list = 브라우저 없이 목록 · 검사 · 건너뜀만 봄 - --force = `_manual.json` 그림도 찍음 · --headed = 창을 띄워 찍음(헤드리스에서 3D · 지도가 안 그려질 때) - 프로젝트 = A05_EduDetail/guide/_projects.json `{"road": "", "stab": "", "plan": ""}` · --project-id 를 주면 그 id 가 모든 프로젝트 장면에 우선(자기 검증 프로젝트로 시험할 때) - 로그인 = 장면 칸 account 대로 — sys(기본) = tmp/aislo_cred.json · company_admin · user = tmp/verify_accounts.json 의 「회사관리자」 · 「일반」 · 계정마다 컨텍스트를 따로 로그인(쓰는 것만 · 처음 쓸 때) · 값은 어디에도 찍지 않음 - 끝에 표(장면 · 크기 · kB · 걸린 시간 · 실패 까닭) · 실패가 하나라도 있으면 종료 코드 1 `_scenes.json` 꼴 = 장면(그림 하나) 목록 — 이 머리 설명이 기준 [ { "name": "B05_00_overview", 필수 · <페이지>_<두 자리>_<영문 소문자·숫자·_> · 그림 = .webp "route": "#/b05-profile", 필수 · 해시 주소("#/…") · vite 주소 뒤에 붙임 "account": "sys", 선택 · sys(기본 · 시스템 관리자) | company_admin | user · 역할마다 화면이 다른 페이지용 "project": "road", road | stab | plan | none(기본) · none = 현재 프로젝트 비움 "viewport": [1600, 900], 선택 · 화면 크기(CSS px) · 기본 1600×900 · 그림은 늘 2배 "before": [ 단계, … ], 선택 · 찍기 전 조작(아래 단계 꼴) "settle_ms": 500, 선택 · before 뒤 · 찍기 전 쉼(기본 500 · 3D · 지도는 2000~) "clip": null, 선택 · null = 화면 통째 · css = 그 요소만(번호 원까지 넣어 자름) "clip_pad": 16, 선택 · clip 둘레 여백(CSS px · 기본 16) "callouts": [ 선택 · 노란 둥근 테두리 + 검은 원 흰 번호 · 번호 = 글 번호 표 {"n": 1, "sel": "", "pos": "tl"} pos = 번호 원 자리 tl(기본) · tr · bl · br(바깥 모서리) {"n": 2, "sel": ["", ""]} sel 목록 = 여러 요소의 둘레를 하나로 묶은 상자 하나 + 번호 하나 ] 번호 원이 화면 밖으로 나가면 안쪽으로 밀어 넣음(넘칠 때만) · clip 은 원까지 넣어 자름 "after": [ 단계, … ], 선택 · 찍은 뒤 조작(확인창 [취소] · 모달 닫기) "allow_post": ["/api/b05/…"] 선택 · 허락할 POST 주소 조각(읽기용 POST 만 · 아래 지킴) } ] 단계 = 아래 열쇠 중 하나 + 덧붙임 {"click": ""} 누름 · {"click": …, "confirm": true} = 확인창만 여는 위험 단추(아래) {"fill": "", "value": "글"} 칸 채움 {"select": "", "value": "값"} 고르기 칸(