# Form Tailor

> 기관 양식 샘플이나 이전 자료를 넣으면 그 틀·문체·서식을 학습해 새 내용을 같은 양식으로 만들어 주는 문서 생성 스킬. 고정 템플릿을 탑재하지 않고, 사용자가 런타임에 제공한 샘플(.hwp/.hwpx/.docx)에서 구조·글머리 체계(□ㅇ-*①Ⅰ)·개조식 문체·표 관행·제목/서명/날짜 형식을 추출(프로파일)한 뒤, 새 원고 내용을 그 프로파일에 맞춰 재구성하고 동일 형식으로 출력한다. 생성 후에는 샘플 대비 서식 충실도(섹션 순서·기호체계·문체 준수)를 점검해 보고한다. 다음 상황에서 반드시 사용한다: '기관 양식대로 만들어줘', '이 샘플처럼 작성', '양식 맞춰서', '이전 보고서 형식으로', '한글 보고서 양식', '보고서 서식 맞춤', '기관 서식 적용', '샘플 문서 틀 재사용' 등의 요청. 백지에서 자유 형식 문서를 쓰는 것이 아니라, 주어진 양식에 정확히 맞추는 작업에 적용한다. 내용 자체의 조사·집필은 별도 스킬/작업으로 하고, 이 스킬은 '양식 이식'에 집중한다.

- Skill: `parkjui92/form-tailor` (Agent Skill, multi-file: 7 files)
- Install (CLI): `npx skillmds@latest add parkjui92/form-tailor`
- Raw SKILL.md: https://api.skillmd.com/api/skills/parkjui92/form-tailor/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Docs & Writing
- Author: parkjui92 (https://skillmd.com/u/parkjui92)
- Updated: 2026-09-17
- Page: https://skillmd.com/skills/parkjui92/form-tailor

---


# form-tailor — 기관 양식 맞춤 제작

**핵심 아이디어:** 이 스킬은 특정 기관의 템플릿을 내장하지 않는다. 대신 **사용자가 제공한 샘플에서 "양식"을 데이터로 추출**하고, 새 내용을 그 틀에 부어 같은 형식으로 출력한다. 즉 양식은 코드가 아니라 **런타임 입력**이다 — 그래서 어느 기관 양식에도 적용되고, 저장소에는 어떤 기관의 자산도 담기지 않는다.

```
[샘플 양식] ──파싱──▶ [양식 프로파일] ──┐
                                       ├──▶ [양식에 맞춘 새 문서] ──▶ [충실도 점검]
[새 내용/원고] ────정리──────────────────┘
```

---

## 입력 두 가지

1. **양식 샘플(필수)**: 따라 할 틀. 기관 배포 서식, 지난번 보고서/계획서, 빈 양식 폼 등. `.hwp` / `.hwpx` / `.docx` / (`.pdf`는 구조 참고용).
2. **채울 내용(필수)**: 새로 담을 원고·메모·요점. 이미 다른 형식으로 쓴 초안이어도 되고, 항목만 나열한 메모여도 된다.

둘 중 하나라도 없으면 사용자에게 요청한다. 특히 샘플 없이 "기관 양식"만 언급되면, "따라 할 샘플 파일을 주시면 그 틀대로 맞춰 드립니다"라고 안내한다(임의로 지어낸 양식을 쓰지 않는다).

---

## Phase 1: 양식 프로파일 추출 (learn-from-sample)

샘플을 파싱해 **양식 프로파일**을 만든다. 도구 우선순위:

| 형식 | 파싱 도구 (우선순위) |
|------|---------------------|
| `.hwp` / `.hwpx` | **kordoc MCP** — `parse_document`(구조), `parse_form`(폼필드), `extract_profile`(스타일), `parse_table`(표), `detect_format` |
| `.docx` | **python-docx** (아래 레시피) → 또는 docx 스킬 |
| `.pdf` | pdf 스킬로 텍스트·레이아웃 참고(정밀 서식은 제한적) |

> **도구 부재 시**: kordoc·pandoc·soffice가 모두 없고 입력이 `.docx`면 **python-docx가 유일 경로**다. 이때 아래 레시피를 반드시 따른다. 입력이 `.hwp/.hwpx`인데 kordoc이 없으면, 사용자에게 kordoc 설치를 안내하거나 `.docx`로 저장해 달라고 요청한다(LibreOffice 변환은 표가 평탄화될 수 있음을 알림).

### .docx 파싱 레시피 (python-docx)

python-docx는 고수준 API가 스타일 상속을 해석하지 않으므로, 아래 폴백을 지켜야 프로파일이 반쪽으로 비지 않는다:

- **글머리 레벨 감지**: 각 문단 텍스트의 **선행 글머리 글자**(□ ㅇ - * ① Ⅰ)와, 그 앞의 **선행 공백 수**(`text[:len(text)-len(text.lstrip())]`의 길이) 또는 `paragraph_format.left_indent`로 레벨을 판정. 둘 중 관측되는 것을 기록(둘 다 없으면 미관측).
- **본문 글꼴**: `run.font.name/size`가 `None`이면 → `styles['Normal'].font` → 그래도 None이면 docDefaults 상속(미해석)으로 보고 **"미관측"** 표기. ("본문 15pt"식 단정은 관측될 때만.)
- **표 헤더 음영**: 고수준 API 없음. 셀 XML의 `tcPr/w:shd@w:fill`(예: `D9D9D9`)을 직접 읽는다.
- **여백·용지**: `section.page_width/height`, `*_margin`은 EMU로 **정확 관측·복제 가능**(신뢰 필드).
- **줄간격**: `paragraph_format.line_spacing`이 None이면 미관측.

> 원칙: **관측된 것만 프로파일에 적고, 못 읽은 필드는 `UNOBSERVED`로 명시**한다(지어내지 않는다). 무엇이 관측되고 무엇이 안 되는지를 사용자에게 알린다.

추출할 프로파일 항목(→ `references/profile-schema.md`의 스키마로 기록):

- **문서 유형·용도**, **섹션 골격**(대제목→절→항목→번호 계층·순서, 필수 섹션), **글머리 기호 체계**(레벨별 기호·들여쓰기), **문체**(개조식 어미/시제), **머리 정보**(제목·부제·날짜표기·서명형식·문서번호), **표 관행**(열 구성·헤더·정렬·음영), **강조**, **분량**, **글꼴·여백**(관측 가능한 것만; hwpx는 원본 스타일 공여 보존).

### 프로파일 승인 게이트

프로파일을 사용자에게 요약 보고하고 확인받는다 — "이 샘플에서 이런 틀을 읽었습니다(관측 못 한 항목: …). 이대로 맞출까요?" 잘못 읽은 틀로 전체를 생성하는 낭비를 막는다.

> **비대화형·단발 실행(배치·서브에이전트 등) 폴백**: 확인을 기다릴 수 없으면 **프로파일(UNOBSERVED 포함)을 산출물로 남기고 진행**한다. 확인이 필요한 항목은 Phase 4 점검표에 ⚠️로 집약한다. 중단하지 않는다.

## Phase 2: 내용 매핑

새 내용을 프로파일의 골격에 배치한다.

1. 새 원고를 섹션 골격에 매핑한다. 프로파일에 있는 **필수 섹션**이 비면 사용자에게 물어 채운다.
2. **머리 정보 결측 처리**: 새 내용에 날짜·서명자 등 머리 정보가 없으면, **지어내지 말고** 형식만 적용한 placeholder(예: 날짜 형식 유지 + "(작성일)", 서명 "직책 (이름)")를 넣고 Phase 4 점검표에 ⚠️로 표시해 확인을 요청한다.
3. 각 항목을 프로파일의 **글머리 레벨**에 할당한다(기호·선행공백은 텍스트에 넣지 않는다 — Phase 3 생성기가 부착. 이중부착 금지).
4. 프로파일의 **문체 규칙**을 적용한다: 개조식이면 `references/korean-form-conventions.md`의 **명사구→개조식 변환표**(섹션 성격별 시제 매핑)를 따라 어미를 정규화. 제목·날짜·시간도 관행에 맞춰 정규화.
5. **표 스키마 충돌 규칙(중요)**: 새 데이터의 자연스러운 열 수가 샘플 표의 열 수와 **다르면**, 샘플 열에 **무단 편입하지 않는다**(빈 칸을 "-"로 메우거나 한 값을 반복해 채우면 데이터가 왜곡됨). 사용자에게 "샘플 표 열(구분/현황/계획/비고)에 맞출지, 데이터에 맞는 열로 새 표를 만들지"를 묻는다. 비대화형이면 **데이터 형상에 맞는 표로 생성하고** 그 사실을 Phase 4에 ⚠️로 표시한다.
6. 내용의 사실·수치는 **바꾸지 않는다.** 양식만 이식한다. (문체 변환 중 의미가 바뀌면 안 됨 — 애매하면 원문 유지 후 플래그.)

산출 중간물: `profile-schema.md` 형식의 **채워진 spec(JSON/YAML)**.

## Phase 3: 생성

프로파일에 맞는 형식으로 출력한다. **글머리 기호·선행공백은 이 단계에서 부착**한다(레벨별 기호 + 관측된 들여쓰기).

- **hwpx 샘플 → hwpx 출력**: 폼필드 양식이면 kordoc `fill_form`. **완성 문서형 샘플이면 "스타일 클론" 방식**을 쓴다 — 샘플 패키지의 스타일 시스템(명명 스타일·문단/글자 모양·표 서식 `borderFill`·판형·머리말·masterpage)을 통째 상속하고 본문(`section0.xml`)만 원고에서 재구성하는 것으로, 프리셋 생성보다 서식 충실도가 월등하다. 절차는 ①샘플 스타일 프로파일링 → ②상속 빌드 → ③검증(고아 스타일 참조 0·표 행렬 1:1·왕복 대조). 샘플이 `.hwp`면 한글에서 `.hwpx`로 저장을 요청한 뒤 사용한다.
  - 함정: ●형 글머리는 문단 모양에 붙은 이미지라 텍스트로 중복 입력하지 말 것 · 장/절 제목이 그림+글상자 묶음이면 통째로 복제 · 여백 지정이 `hc:switch` 안에 있을 수 있음 · HWPUNIT = px×75 · 네임스페이스 접두사는 원본 그대로 보존.
- **docx 샘플 → docx 출력**: python-docx로 생성. **원본에서 관측한 서식을 명시적으로 재적용**한다(제목 글꼴·크기·정렬, □절 볼드, 셀 음영 `w:shd`, 여백 EMU, 본문 Normal 스타일). docx 스킬이 있으면 활용.
- 사용자가 원하면 마크다운 초안도 병행 출력(검토용).

출력 경로는 사용자 지정 또는 작업 디렉터리. 원본 샘플을 덮어쓰지 않는다(새 파일명).

## Phase 4: 충실도 점검 (검증 내장 — 이 스킬의 차별점)

생성물을 **샘플 프로파일과 대조**해 서식 충실도를 점검하고 보고한다. `references/fidelity-checklist.md`를 사용한다(hwpx·docx 각각의 서식 보존 항목 포함). hwpx는 kordoc `compare_documents`로 구조 비교 가능.

```
## 양식 충실도 점검

| 항목 | 샘플 | 생성물 | 판정 |
|------|------|--------|------|
| 섹션 골격·순서 | Ⅰ□ㅇ- 계층 | 동일 | ✅ |
| 글머리 기호체계 | ㅇ1/-3/*5칸 | 동일 | ✅ |
| 기호 이중부착 | — | 0건 | ✅ |
| 개조식 문체 | ~함/~임 | 3개 항목 서술체 잔존 | ⚠️ 위치 명시 |
| 날짜 표기 | '26. 5. 7.(목) | 형식 일치, 값 placeholder | ⚠️ 확인요청 |
| 표 열 구성 | 4열 | 데이터 형상에 맞춰 2열 생성 | ⚠️ 사유 명시 |
| 서명 실명 | (샘플 실명) | 미복제 | ✅(확인요청) |
| 필수 섹션 | 붙임 포함 | 누락 | 🔴 |

→ ⚠️/🔴 항목은 수정 위치를 명시하고, 승인 시 반영.
```

충실도 점검은 "양식을 지켰다는 착각"을 막는다 — 생성 자체보다 이 대조가 이 스킬의 값이다.

---

## 안전·범위 원칙

1. **독점 템플릿 미탑재**: 이 스킬은 어떤 기관의 템플릿·서식 파일도 내장하지 않는다. 양식은 항상 사용자가 런타임에 제공하며, 그 샘플은 사용자의 것이다.
2. **양식 이식에 집중**: 내용의 조사·집필·사실 생성은 이 스킬의 일이 아니다. 내용이 부족하면 지어내지 말고 사용자에게 요청한다.
3. **사실 불변**: 문체·서식 변환이 수치·고유명사·주장을 바꾸지 않는다. 애매하면 원문 유지 후 플래그.
4. **샘플 개인정보 미복제**: 샘플의 실명 서명·연락처가 새 문서에 그대로 복제되지 않도록, 머리 정보는 새 내용 기준으로 채우고 남은 잔여는 점검에서 표시한다.
5. **관측만 기록**: 못 읽은 서식은 지어내지 않고 `UNOBSERVED`로 남긴다.
6. **경량 승인 게이트**: 프로파일 요약(Phase 1)과 충실도 점검(Phase 4)에서 확인. 비대화형이면 산출물로 남기고 진행.

## 관련 도구·레퍼런스

- 양식 프로파일 스키마: `references/profile-schema.md`
- 한국 공문서 일반 작성 관행 + **명사구→개조식 변환표**: `references/korean-form-conventions.md`
- 충실도 점검 항목(hwpx·docx): `references/fidelity-checklist.md`
- hwpx 심화(스타일 공여 빌드, 폼필드 채움)는 kordoc MCP 문서 참조. kordoc 미설치 시 위 .docx 레시피로 폴백하되 hwpx 고유 서식 보존은 제한됨을 알린다.

