폰트 빌드 파이프라인
SVG 글리프 → TTF 컴파일은 반드시 번들 스크립트로 수행한다. 매번 새 스크립트를 작성하면 y축 변환·메트릭 처리가 미묘하게 달라져 라운드 간 비교가 오염된다.
사전 조건
- fontTools 필요:
python3 -c "import fontTools"실패 시pip3 install --user fonttools - 입력 SVG는 glyph-design 스킬 규약 준수 (viewBox 0 0 1000 1000, 최상위 path만, stroke 금지, 베이스라인 y=880)
manifest 규약
빌드 입력은 SVG 디렉토리가 아니라 manifest다. 각 글리프 디렉토리에 manifest.json:
{
"glyphs": {
"한": "han.svg",
"A": { "file": "A.svg", "advance": 620 }
}
}
- 키는 반드시 1글자. 경로는 manifest 위치 기준 상대 경로
advance생략 시 1000 (한글 전각). 라틴·부호는 반드시 advance 명시
빌드 절차
- 빌드 전 검증 (위반 글리프는 제작자에게 반환):
grep -l 'stroke' _workspace/glyphs/{콘셉트}/**/*.svg # 결과가 있으면 규약 위반
- 컴파일:
python3 .claude/skills/font-build/scripts/build_font.py \
--manifest _workspace/glyphs/{콘셉트}/generated/manifest.json \
--family "Cheonjiin" --family-ko "천지인" --version 0.{N} \
--out _workspace/build/Cheonjiin-v0.{N}.ttf
--family는 반드시 ASCII. 이유: PostScript명(nameID 6)은 ASCII만 허용되고, 비ASCII 기본 이름은 macOS Font Book이 "서체 이름 없음"으로 설치를 거부한다 (v0.4에서 실제 발생). 한국어 표시명은--family-ko로 — 로컬라이즈 레코드(0x0412)에 들어가 한국어 환경에서는 한글 이름으로 표시된다- 라이선스(SIL OFL 1.1)·저작권 name 레코드는 스크립트가 자동 임베드한다
- 산출물 검증:
python3 -m fontTools.ttx -l _workspace/build/{파일}.ttf # 테이블 목록 확인
- 글리프 수가 manifest 합계 +1(.notdef)인지 확인
- 스크립트가 출력한 실패 목록이 비어 있는지 확인 — 실패 글리프는 빈 글리프로 대체되므로 방치하면 투명 글자가 된다
- 설치 안내: macOS는
open _workspace/build/{파일}.ttf→ Font Book에서 설치. 사용자에게 경로를 알려준다
버전 규칙
- 라운드와 동기화: round-3 시안 → v0.3
- 이전 빌드를 덮어쓰지 않는다 —
_workspace/build/에 버전별 보존 (회귀 비교용)
알려진 함정
- stroke로 그린 획은 컴파일 시 소실된다 — 빌드 전 검증이 이를 잡는다
- 카운터(ㅇ 속공간)가 채워져 나오면 안팎 윤곽 방향이 같은 것이다 — 글리프 수정 필요 (fill-rule은 폰트에 없다)
- transform 속성·중첩 그룹은 무시될 수 있다 — 규약대로 최상위 path만
- 3차 베지어(C)는 스크립트가 cu2qu로 자동 변환한다 (TrueType glyf는 2차만 허용) — 별도 처리 불필요
- 비ASCII
--family는 macOS 설치 오류를 낳는다 — 스크립트가 경고를 출력하니 무시하지 말 것
릴리스 절차 (사용자가 배포·업로드를 요청할 때)
- 최신 버전 TTF를
fonts/에 복사한다 —fonts/는 배포 폴더로 최신 릴리스 1개만 유지 (구버전은_workspace/build/와 git 이력에 보존) - README.md 갱신: 설치 경로의 파일명, 버전 표에 변경 내용 한 줄 추가
- CLAUDE.md 변경 이력에 기록
- 커밋(메시지는 한글) 후
git push— 저장소: github.com/revfactory/font-harness (public, OFL 1.1) - 라이선스 변경 시 OFL.txt와 스크립트의 name 테이블 문자열을 함께 갱신한다