파일마다 포맷 폭이 달라(≈80 대 100) 한 줄만 고쳐도 포맷터가 무관한 줄을 대량 재포맷했음. 사용자 지시로 전체를 한 번에 맞춤. 코드 동작 변경 없음 — 포맷만. - 프론트엔드 `.ts/.css/.html` → 저장소 prettier (`.prettierrc`, printWidth 100) - `B07_DesignDetail/openwebcad/**` → 자체 biome (tab 들여쓰기·single quote·lineWidth 100). `biome format` 만 사용 — `biome lint --write` 는 포맷 아닌 코드 수정까지 하므로 제외 - 파이썬 → `ruff format` (엔진 코드는 이미 정합, resources·scratch 스크립트 24개만 변경) 두 포맷터가 서로 되돌리지 않도록 `.prettierignore` 신규 — openwebcad 와 빌드·산출물 폴더를 prettier 대상에서 뺌. `.prettierrc` 에 `endOfLine: "auto"` 추가 — 기본값 `lf` 가 `core.autocrlf=true` 로 받은 CRLF 파일을 매번 전부 다시 써서 `--list-different` 가 실제 포맷 차이를 가리고 있었음. 검증: `tsc --noEmit` 통과(루트·openwebcad 둘 다), pytest 349 passed / 17 skipped / 0 failed, CAD vitest 87건 중 81 passed / 6 failed(laptop-sub 기준선과 동일, 회귀 없음). 포맷터 재실행 시 prettier·biome 모두 변경 0건. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
_pipeline — 법령·기준 수집·변환 스크립트
original/ 하위 법령·행정규칙·표준시방서·KS 코퍼스를 수집·변환·색인하는 재현용 스크립트.
경로는 이 폴더 위치 기준 상대(ROOT_DIR = 상위 = original/)로 동작한다. 어느 PC에서 clone 해도 그대로 실행된다.
실행 전 준비
- Python 3.12 +
pymupdf,olefile - 인증키(커밋 금지):
resources/knowledge/.secrets.local.md에 KCSC 키 (스크립트가 자동 파싱) — 또는 환경변수KCSC_KEY- law.go.kr OC키는 기본
umsangdon(환경변수LAW_OC로 교체 가능)
스크립트 → 워크플로(README W1~W6) 대응
| 스크립트 | 역할 | 워크플로 |
|---|---|---|
check_law.py |
law.go.kr 현행본 시행일·개정일 조회 | W1 갱신 판별 |
collect_law.py |
법령·행정규칙 원문(현행+교본시점) + 별표 PDF 수집 | W2 |
patch_law_md.py |
보관 XML 기준으로 기존 법령 md의 누락분만 보충(부칙·목). 네트워크 미사용 | W2 보정 |
get_attach.py |
고시 첨부파일·안내문 별표의 HWP 원본 수집 | W3 |
get_kcsc.py |
국가건설기준센터 KCS 본문(OpenApi) 수집 | W2 |
get_ks.py |
e나라 표준인증 KS 메타데이터·이력 수집(원문은 DRM) | W2 |
hwp5_text.py |
구형 HWP5(OLE) 본문 텍스트 추출 | W5 |
hwpx_text.py |
HWPX(zip+XML) → md(공백·표 보존). 공백 소실 첨부 재추출 | W5 |
pdf2md.py |
별표·첨부 PDF → Markdown 변환(표 복원·이미지 pic/ 추출·손실 방지) | W4 |
fix_spacing.py |
HWP→PDF 공백 소실 별표/첨부의 프로즈 띄어쓰기 복원(표 보존) | W5 |
qc_lint.py |
md 전수 품질 점검(테이블·사진·내용누락·띄어쓰기·줄바꿈) | W5 |
verify_pdf2md.py |
변환 손실·줄누락 검증 | W5 |
build_srcmap.py |
law API 결과 → 시행일/개정일 맵(srcmap.json) | W6 |
gen_md.py |
../04_참조_법령기준_목록.md의 §5 원문 md 색인 절만 재생성 (AUTO:INDEX 마커 사이 스플라이스 — 등록표·큐레이션 절은 수기 관리, 2026-08-15 변경) |
W6 |
verify_structure.py |
법령 XML ↔ md 구조 회귀검사(부칙·목·별표 수량 대조). 네트워크 미사용 | W5 |
data/ (생성 데이터 = gen_md 입력)
이번 세션에서 만든 매핑. 수동 보정이 섞여 있어 함께 보관한다.
| 파일 | 내용 |
|---|---|
srcmap.json |
항목별 시행일·개정일·출처 |
collected_map.json |
law.go.kr 수집 결과(판본·별표·개정 횟수) |
ks_map.json |
KS 45건 메타·이력 |
kcsc_map.json |
표준시방서 ↔ KCS 코드 수 |
items_all.json |
collect_law.py 수집 대상 목록 |
ks_codes.json |
KS 조회 코드 목록 |
lawapi.json |
law.go.kr 조회 원자료 |
표준 실행 순서
cd resources/knowledge/original/_pipeline
python collect_law.py data/items_all.json # 법령·행정규칙 + 별표
python get_attach.py # 첨부·HWP
python get_kcsc.py # KCS 본문
python get_ks.py # KS 메타
python pdf2md.py # PDF → md (전건)
python verify_pdf2md.py # 검증
python gen_md.py # 색인 재생성
수집은 새로 받은 현행본을 현행_새시행일.* 로 추가한다(기존 판본 삭제 금지). 상세 규칙은 resources/knowledge/README.md W1~W6 참조.
변환 규칙이 바뀐 경우 (2026-08-14 감사 반영)
기존 법령 md 에는 수집 이후 후처리(ASCII 박스표 → 마크다운 표, 수식, 이미지)가
적용돼 있다. law_to_md() 로 전체를 다시 렌더링하면 그 결과가 사라지므로
전량 재생성 금지. 대신 누락분만 채우는 patch_law_md.py 를 쓴다.
python patch_law_md.py --dry # 보충량 확인
python patch_law_md.py # 저장
과거 결함 2건(이 도구로 보정 완료 — 부칙 2,264건·목 2,114줄):
부칙단위[:20]상한 → 법제처 XML 은 부칙이 오래된 순이라 최신 부칙(연도별 요율 특례 등)이 통째로 절단됐다. 상한 제거함.목(가·나·다…)이호가 아니라항의 직속 자식으로 오는 구조를 처리 못 해 누락. 항의 자식을 문서 순서대로 순회하도록 수정함.