hwpx-kit-cli 0.1.2__tar.gz → 0.2.1__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (82) hide show
  1. {hwpx_kit_cli-0.1.2 → hwpx_kit_cli-0.2.1}/.claude-plugin/plugin.json +1 -1
  2. hwpx_kit_cli-0.2.1/.github/ISSUE_TEMPLATE/bug_report.yml +47 -0
  3. hwpx_kit_cli-0.2.1/.github/ISSUE_TEMPLATE/config.yml +5 -0
  4. hwpx_kit_cli-0.2.1/.github/workflows/tests.yml +25 -0
  5. {hwpx_kit_cli-0.1.2 → hwpx_kit_cli-0.2.1}/CLAUDE.md +3 -3
  6. {hwpx_kit_cli-0.1.2 → hwpx_kit_cli-0.2.1}/PKG-INFO +6 -4
  7. {hwpx_kit_cli-0.1.2 → hwpx_kit_cli-0.2.1}/README.md +170 -168
  8. {hwpx_kit_cli-0.1.2 → hwpx_kit_cli-0.2.1}/pyproject.toml +1 -1
  9. {hwpx_kit_cli-0.1.2 → hwpx_kit_cli-0.2.1}/scripts/build_skill_package.py +4 -4
  10. {hwpx_kit_cli-0.1.2 → hwpx_kit_cli-0.2.1}/skills/doc-create/SKILL.md +4 -2
  11. {hwpx_kit_cli-0.1.2 → hwpx_kit_cli-0.2.1}/skills/hwpx-form/SKILL.md +11 -12
  12. {hwpx_kit_cli-0.1.2 → hwpx_kit_cli-0.2.1}/skills/office-export/SKILL.md +12 -3
  13. {hwpx_kit_cli-0.1.2 → hwpx_kit_cli-0.2.1}/src/hwpx_kit/adapter/hwpx_engine.py +140 -5
  14. {hwpx_kit_cli-0.1.2 → hwpx_kit_cli-0.2.1}/src/hwpx_kit/cli.py +43 -3
  15. hwpx_kit_cli-0.2.1/src/hwpx_kit/commands/table_rows.py +27 -0
  16. {hwpx_kit_cli-0.1.2 → hwpx_kit_cli-0.2.1}/tests/test_analyze.py +21 -0
  17. hwpx_kit_cli-0.2.1/tests/test_table_rows.py +195 -0
  18. {hwpx_kit_cli-0.1.2 → hwpx_kit_cli-0.2.1}/.claude-plugin/marketplace.json +0 -0
  19. {hwpx_kit_cli-0.1.2 → hwpx_kit_cli-0.2.1}/.gitignore +0 -0
  20. {hwpx_kit_cli-0.1.2 → hwpx_kit_cli-0.2.1}/LICENSE +0 -0
  21. {hwpx_kit_cli-0.1.2 → hwpx_kit_cli-0.2.1}/commands/hwpx.md +0 -0
  22. {hwpx_kit_cli-0.1.2 → hwpx_kit_cli-0.2.1}/install.ps1 +0 -0
  23. {hwpx_kit_cli-0.1.2 → hwpx_kit_cli-0.2.1}/install.sh +0 -0
  24. {hwpx_kit_cli-0.1.2 → hwpx_kit_cli-0.2.1}/sample-values.json +0 -0
  25. {hwpx_kit_cli-0.1.2 → hwpx_kit_cli-0.2.1}/scripts/check_stdout_purity.py +0 -0
  26. {hwpx_kit_cli-0.1.2 → hwpx_kit_cli-0.2.1}/scripts/make_sample.py +0 -0
  27. {hwpx_kit_cli-0.1.2 → hwpx_kit_cli-0.2.1}/skills/format-convert/SKILL.md +0 -0
  28. {hwpx_kit_cli-0.1.2 → hwpx_kit_cli-0.2.1}/skills/gongmun-format/SKILL.md +0 -0
  29. {hwpx_kit_cli-0.1.2 → hwpx_kit_cli-0.2.1}/skills/table-calc/SKILL.md +0 -0
  30. {hwpx_kit_cli-0.1.2 → hwpx_kit_cli-0.2.1}/src/hwpx_kit/__init__.py +0 -0
  31. {hwpx_kit_cli-0.1.2 → hwpx_kit_cli-0.2.1}/src/hwpx_kit/adapter/__init__.py +0 -0
  32. {hwpx_kit_cli-0.1.2 → hwpx_kit_cli-0.2.1}/src/hwpx_kit/adapter/base.py +0 -0
  33. {hwpx_kit_cli-0.1.2 → hwpx_kit_cli-0.2.1}/src/hwpx_kit/adapter/kordoc_engine.py +0 -0
  34. {hwpx_kit_cli-0.1.2 → hwpx_kit_cli-0.2.1}/src/hwpx_kit/adapter/office_readers.py +0 -0
  35. {hwpx_kit_cli-0.1.2 → hwpx_kit_cli-0.2.1}/src/hwpx_kit/commands/__init__.py +0 -0
  36. {hwpx_kit_cli-0.1.2 → hwpx_kit_cli-0.2.1}/src/hwpx_kit/commands/analyze.py +0 -0
  37. {hwpx_kit_cli-0.1.2 → hwpx_kit_cli-0.2.1}/src/hwpx_kit/commands/convert.py +0 -0
  38. {hwpx_kit_cli-0.1.2 → hwpx_kit_cli-0.2.1}/src/hwpx_kit/commands/export.py +0 -0
  39. {hwpx_kit_cli-0.1.2 → hwpx_kit_cli-0.2.1}/src/hwpx_kit/commands/fill.py +0 -0
  40. {hwpx_kit_cli-0.1.2 → hwpx_kit_cli-0.2.1}/src/hwpx_kit/commands/fmt.py +0 -0
  41. {hwpx_kit_cli-0.1.2 → hwpx_kit_cli-0.2.1}/src/hwpx_kit/commands/generate.py +0 -0
  42. {hwpx_kit_cli-0.1.2 → hwpx_kit_cli-0.2.1}/src/hwpx_kit/commands/outline.py +0 -0
  43. {hwpx_kit_cli-0.1.2 → hwpx_kit_cli-0.2.1}/src/hwpx_kit/commands/page_break.py +0 -0
  44. {hwpx_kit_cli-0.1.2 → hwpx_kit_cli-0.2.1}/src/hwpx_kit/commands/read.py +0 -0
  45. {hwpx_kit_cli-0.1.2 → hwpx_kit_cli-0.2.1}/src/hwpx_kit/commands/render.py +0 -0
  46. {hwpx_kit_cli-0.1.2 → hwpx_kit_cli-0.2.1}/src/hwpx_kit/commands/row_height.py +0 -0
  47. {hwpx_kit_cli-0.1.2 → hwpx_kit_cli-0.2.1}/src/hwpx_kit/commands/table_clear.py +0 -0
  48. {hwpx_kit_cli-0.1.2 → hwpx_kit_cli-0.2.1}/src/hwpx_kit/commands/table_copy.py +0 -0
  49. {hwpx_kit_cli-0.1.2 → hwpx_kit_cli-0.2.1}/src/hwpx_kit/commands/table_map_cmd.py +0 -0
  50. {hwpx_kit_cli-0.1.2 → hwpx_kit_cli-0.2.1}/src/hwpx_kit/commands/table_new.py +0 -0
  51. {hwpx_kit_cli-0.1.2 → hwpx_kit_cli-0.2.1}/src/hwpx_kit/commands/table_set.py +0 -0
  52. {hwpx_kit_cli-0.1.2 → hwpx_kit_cli-0.2.1}/src/hwpx_kit/commands/validate.py +0 -0
  53. {hwpx_kit_cli-0.1.2 → hwpx_kit_cli-0.2.1}/src/hwpx_kit/format.py +0 -0
  54. {hwpx_kit_cli-0.1.2 → hwpx_kit_cli-0.2.1}/src/hwpx_kit/output.py +0 -0
  55. {hwpx_kit_cli-0.1.2 → hwpx_kit_cli-0.2.1}/templates/Default_Template.hwpx +0 -0
  56. {hwpx_kit_cli-0.1.2 → hwpx_kit_cli-0.2.1}/tests/__init__.py +0 -0
  57. {hwpx_kit_cli-0.1.2 → hwpx_kit_cli-0.2.1}/tests/conftest.py +0 -0
  58. {hwpx_kit_cli-0.1.2 → hwpx_kit_cli-0.2.1}/tests/fixtures/real/legacy-sample.hwp +0 -0
  59. {hwpx_kit_cli-0.1.2 → hwpx_kit_cli-0.2.1}/tests/fixtures/real/seoul-attachment.hwpx +0 -0
  60. {hwpx_kit_cli-0.1.2 → hwpx_kit_cli-0.2.1}/tests/fixtures/real/seoul-body.hwpx +0 -0
  61. {hwpx_kit_cli-0.1.2 → hwpx_kit_cli-0.2.1}/tests/fixtures/real/seoul-report-brief.hwpx +0 -0
  62. {hwpx_kit_cli-0.1.2 → hwpx_kit_cli-0.2.1}/tests/fixtures/real/seoul-report-cover.hwpx +0 -0
  63. {hwpx_kit_cli-0.1.2 → hwpx_kit_cli-0.2.1}/tests/test_adapter.py +0 -0
  64. {hwpx_kit_cli-0.1.2 → hwpx_kit_cli-0.2.1}/tests/test_cli.py +0 -0
  65. {hwpx_kit_cli-0.1.2 → hwpx_kit_cli-0.2.1}/tests/test_convert.py +0 -0
  66. {hwpx_kit_cli-0.1.2 → hwpx_kit_cli-0.2.1}/tests/test_export.py +0 -0
  67. {hwpx_kit_cli-0.1.2 → hwpx_kit_cli-0.2.1}/tests/test_fill.py +0 -0
  68. {hwpx_kit_cli-0.1.2 → hwpx_kit_cli-0.2.1}/tests/test_format.py +0 -0
  69. {hwpx_kit_cli-0.1.2 → hwpx_kit_cli-0.2.1}/tests/test_integration.py +0 -0
  70. {hwpx_kit_cli-0.1.2 → hwpx_kit_cli-0.2.1}/tests/test_kordoc.py +0 -0
  71. {hwpx_kit_cli-0.1.2 → hwpx_kit_cli-0.2.1}/tests/test_office_readers.py +0 -0
  72. {hwpx_kit_cli-0.1.2 → hwpx_kit_cli-0.2.1}/tests/test_output.py +0 -0
  73. {hwpx_kit_cli-0.1.2 → hwpx_kit_cli-0.2.1}/tests/test_page_break.py +0 -0
  74. {hwpx_kit_cli-0.1.2 → hwpx_kit_cli-0.2.1}/tests/test_read_validate.py +0 -0
  75. {hwpx_kit_cli-0.1.2 → hwpx_kit_cli-0.2.1}/tests/test_real_forms.py +0 -0
  76. {hwpx_kit_cli-0.1.2 → hwpx_kit_cli-0.2.1}/tests/test_row_height.py +0 -0
  77. {hwpx_kit_cli-0.1.2 → hwpx_kit_cli-0.2.1}/tests/test_skill_package.py +0 -0
  78. {hwpx_kit_cli-0.1.2 → hwpx_kit_cli-0.2.1}/tests/test_stdout_purity.py +0 -0
  79. {hwpx_kit_cli-0.1.2 → hwpx_kit_cli-0.2.1}/tests/test_table_clear.py +0 -0
  80. {hwpx_kit_cli-0.1.2 → hwpx_kit_cli-0.2.1}/tests/test_table_copy.py +0 -0
  81. {hwpx_kit_cli-0.1.2 → hwpx_kit_cli-0.2.1}/tests/test_table_map_new.py +0 -0
  82. {hwpx_kit_cli-0.1.2 → hwpx_kit_cli-0.2.1}/tests/test_table_set.py +0 -0
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "hwpx-kit",
3
3
  "description": "한글(HWPX/HWP) 문서 자동화 스킬 모음 — 양식 분석·채우기·백지 생성·표기 변환·공문 규약·표 계산·오피스 출력. CLI는 첫 사용 시 스킬이 설치를 안내 (Python 3.10+ 필요).",
4
- "version": "0.1.2",
4
+ "version": "0.2.1",
5
5
  "author": {
6
6
  "name": "6aneffy",
7
7
  "email": "tkdgus990809@gmail.com"
@@ -0,0 +1,47 @@
1
+ name: 버그 제보 (Bug report)
2
+ description: analyze/fill 실패, 서식 깨짐 등 — 실패 사례 제보가 가장 값집니다
3
+ labels: [bug]
4
+ body:
5
+ - type: markdown
6
+ attributes:
7
+ value: |
8
+ > 🔴 **기관 내부 문서를 첨부하지 마세요.** 업무 문서는 공개 저장소에 영구히 남습니다.
9
+ > 같은 구조를 한글에서 새로 만든 **합성 예시 파일**로 재현해서 첨부해 주세요.
10
+ > (공개 출처 서식 — 예: 정보공개포털의 공개 서식 — 은 첨부 가능합니다)
11
+ - type: textarea
12
+ id: what
13
+ attributes:
14
+ label: 무슨 일이 있었나요
15
+ description: 기대한 동작과 실제 동작
16
+ placeholder: "table:성명 채우기가 다른 셀에 들어감 / fill 후 한글에서 열면 표 테두리가 사라짐 …"
17
+ validations:
18
+ required: true
19
+ - type: textarea
20
+ id: repro
21
+ attributes:
22
+ label: 재현 방법
23
+ description: 실행한 명령(또는 Claude에게 한 요청)과 합성 예시 파일
24
+ placeholder: |
25
+ 1. hwpx-kit analyze 예시.hwpx --json
26
+ 2. hwpx-kit fill 예시.hwpx --data 값.json --out 결과.hwpx
27
+ 3. 결과.hwpx를 한글에서 열면 …
28
+ validations:
29
+ required: true
30
+ - type: textarea
31
+ id: envelope
32
+ attributes:
33
+ label: CLI 출력 (--json 봉투)
34
+ description: 실패한 명령의 JSON 출력을 그대로 붙여넣기 (문서 내용이 섞였으면 가려도 됩니다)
35
+ render: json
36
+ - type: input
37
+ id: version
38
+ attributes:
39
+ label: 버전
40
+ description: "`hwpx-kit --version` 출력"
41
+ validations:
42
+ required: true
43
+ - type: input
44
+ id: os
45
+ attributes:
46
+ label: 환경
47
+ placeholder: "Windows 11 / macOS 15, Python 3.12, 한글 2024 유무"
@@ -0,0 +1,5 @@
1
+ blank_issues_enabled: true
2
+ contact_links:
3
+ - name: 기능 제안·질문
4
+ url: https://github.com/6aneffy/hwpx-kit/discussions
5
+ about: 버그가 아닌 제안·질문은 Discussions로 (없으면 그냥 이슈로 열어도 됩니다)
@@ -0,0 +1,25 @@
1
+ name: tests
2
+
3
+ on:
4
+ push:
5
+ branches: [main]
6
+ pull_request:
7
+
8
+ jobs:
9
+ pytest:
10
+ runs-on: ${{ matrix.os }}
11
+ strategy:
12
+ fail-fast: false
13
+ matrix:
14
+ os: [ubuntu-latest, windows-latest]
15
+ python-version: ["3.10", "3.12"]
16
+ steps:
17
+ - uses: actions/checkout@v4
18
+ - uses: astral-sh/setup-uv@v5
19
+ with:
20
+ python-version: ${{ matrix.python-version }}
21
+ - name: Install dependencies
22
+ run: uv sync
23
+ - name: Run tests
24
+ # 한글 COM·kordoc 의존 테스트는 러너에 해당 환경이 없어 자동 스킵됨
25
+ run: uv run pytest -q
@@ -26,7 +26,7 @@ skills/*/SKILL.md → Claude Code 플러그인 스킬들 (.claude-plugin/plugin.
26
26
  └─ office-export → hwpx→docx(변환)·pptx/xlsx(재구성, officecli 선택 의존)
27
27
 
28
28
  CLI (cli.py) — JSON 봉투, 종료코드 0/1/2
29
- └─ commands/ (analyze·fill·read·validate·convert·export·render·generate·fmt·row-height·table-clear·table-set·table-copy·table-map·table-new·page-break·outline)
29
+ └─ commands/ (analyze·fill·read·validate·convert·export·render·generate·fmt·row-add·row-del·row-height·table-clear·table-set·table-copy·table-map·table-new·page-break·outline)
30
30
  ├─ format.py ← 순수함수 (금액한글화·요일·만나이) — 엔진 임포트 금지, fmt는 파일 인수 없음(FILE_NOT_FOUND 가드 우회)
31
31
  └─ adapter/ ← 명령 계층은 어댑터 인터페이스만 사용 (엔진 직접 import 금지)
32
32
  ├─ hwpx_engine.py → python-hwpx (hwpx 분석·채우기·검증·표 조작, 순수 Python)
@@ -64,10 +64,10 @@ CLI (cli.py) — JSON 봉투, 종료코드 0/1/2
64
64
  - 표 셀 문단의 `p.remove()`는 예외 없이 무효될 수 있음 → 삭제는 blank-first
65
65
  - kordoc render는 한컴 저장본(조판 캐시)만 정밀 — 우리가 만든 파일은 `--reflow` 합성 렌더로 자동 폴백되는데 **겹침 등 부정확. 대략 확인용일 뿐, 정확한 검증은 한글로 여는 것**
66
66
  - 한글 COM(convert/export) 함정 3가지: ① SaveAs의 워드 형식 문자열은 `"OOXML"` — "DOCX"/"MSWORD"는 False 반환하며 조용히 실패 ② visible=False에서 경고 팝업 뜨면 무한대기 — `set_message_box_mode(AUTO_ANSWER_MODE)` 필수 (convert.py 상수) ③ **좀비 Hwp 프로세스가 남아 있으면 다음 COM 세션이 그냥 멈춤** — hang 시 `Stop-Process -Name Hwp -Force` 먼저
67
- - python-hwpx에는 표 행 추가/삭제 API 없음 (`add_table`/`merge_table_cells`뿐) — 개수 변경은 사용자가 한글에서, 높이 정돈은 `row-height`, 내용 비우기는 `table-clear`, 좌표 기입은 `table-set`
67
+ - 표 행 추가/삭제는 어댑터 자체 구현(`add_table_rows`/`delete_table_rows` — 엔진엔 API 없음): tr deepcopy + cellAddr 시프트 + rowCnt 갱신. 세로 병합에 걸리면 거부(가드). 🔴 **원시 XML 수정 후엔 반드시 `_mark_sections_dirty()`**dirty가 서면 저장이 원본 바이트를 재사용해 수정이 통째 증발 (2026-07-11 실증, `test_row_add_new_row_writable_and_persists`가 회귀 감지)
68
+ - analyze 마커 탐지는 표 셀 안 {{마커}}도 잡음 (2026-07-11 `_iter_all_paragraphs`로 확장 — 이전 "본문만" 제약 해소)
68
69
  - **셀 비우기는 서식을 잃지 않는다** (실험 확인): `set_cell_text('')`가 텍스트만 지우고 빈 런의 글자모양(charPr) 참조는 유지 → 재기입 시 원래 서식 물려받음. table-clear가 안전한 근거
69
70
  - 병합 셀은 엔진 표 맵에서 같은 텍스트가 격자 전체에 복제되어 보임 — 어댑터 table_map()이 셀별 `is_anchor`를 덧붙이고, 라벨 후보·#N 열거는 anchor만 센다 (복제를 세면 #N 오염 + 같은 논리 셀 이중 기입으로 값 유실)
70
- - analyze의 마커 탐지는 본문 문단만 훑음 — 표 셀 안 {{마커}}는 못 잡음 (fill은 됨) ← 개선 후보
71
71
 
72
72
  ## 개발 환경
73
73
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: hwpx-kit-cli
3
- Version: 0.1.2
3
+ Version: 0.2.1
4
4
  Summary: 한글(HWPX) 문서 자동화 CLI — Korean HWPX document automation for AI agents: analyze, fill, read, validate, table ops
5
5
  Project-URL: Homepage, https://github.com/6aneffy/hwpx-kit
6
6
  Project-URL: Repository, https://github.com/6aneffy/hwpx-kit
@@ -33,7 +33,7 @@ Description-Content-Type: text/markdown
33
33
  [![PyPI](https://img.shields.io/pypi/v/hwpx-kit-cli.svg)](https://pypi.org/project/hwpx-kit-cli/)
34
34
  [![Python](https://img.shields.io/badge/python-3.10%2B-3776AB.svg)](https://www.python.org/)
35
35
  [![Claude Code](https://img.shields.io/badge/Claude%20Code-plugin-d97757.svg)](https://claude.com/claude-code)
36
- [![Tests](https://img.shields.io/badge/tests-145%20passing-brightgreen.svg)](tests/)
36
+ [![Tests](https://img.shields.io/badge/tests-160%20passing-brightgreen.svg)](tests/)
37
37
 
38
38
  </div>
39
39
 
@@ -124,6 +124,8 @@ hwpx-kit table-set 문서.hwpx --table 3 --data 셀.json --out 결과.hwpx #
124
124
  hwpx-kit table-clear 문서.hwpx --table 3 --rows 1-20 --out 결과.hwpx # 셀 내용 비우기
125
125
  hwpx-kit table-copy 문서.hwpx --table 1 --after-table 4 --out 결과.hwpx # 표 통째 복제 (서식·병합 유지)
126
126
  hwpx-kit table-new 문서.hwpx --rows 6 --cols 4 --like-table 3 --after-text "앵커" --out 결과.hwpx
127
+ hwpx-kit row-add 문서.hwpx --table 3 --like 2 --count 3 --out 결과.hwpx # 행 추가 (기준 행 서식 승계)
128
+ hwpx-kit row-del 문서.hwpx --table 3 --rows 5-7 --out 결과.hwpx # 행 삭제
127
129
  hwpx-kit row-height 문서.hwpx --table 3 --like 1 --rows 2-5 --out 결과.hwpx # 행 높이 정돈
128
130
  hwpx-kit page-break 문서.hwpx --table 5 --out 결과.hwpx # 쪽나눔 (새 장 시작)
129
131
 
@@ -162,7 +164,7 @@ hwpx-kit render 문서.hwpx --out p.svg # SVG 미리보기 (kordoc)
162
164
  ## 아키텍처
163
165
 
164
166
  ```
165
- Claude Code 스킬 6종 ──→ hwpx-kit CLI (19 명령, JSON 봉투)
167
+ Claude Code 스킬 6종 ──→ hwpx-kit CLI (21 명령, JSON 봉투)
166
168
  └─ adapter/ ← 엔진 격리 계층
167
169
  ├─ python-hwpx hwpx 분석·채우기·표 조작
168
170
  ├─ pypdf·python-docx·openpyxl 타 포맷 읽기
@@ -178,7 +180,7 @@ templates/ 기본 계획서 템플릿 (표지·장 헤더·표 골격, 마커
178
180
 
179
181
  ## 검증
180
182
 
181
- - 자동 테스트 145개 (pytest)
183
+ - 자동 테스트 160개 (pytest)
182
184
  - 실서식 수렴 테스트: 보도자료·신청서·계획서·회의록·공고문 5계열,
183
185
  실제 공공기관 문서 30여 종으로 analyze→fill→validate 왕복
184
186
  - 실사용 시나리오 테스트 3회 (백지 생성 12분 완주, 장·표 동적 추가, 보도자료 변환)
@@ -1,168 +1,170 @@
1
- <div align="center">
2
-
3
- # hwpx-kit
4
-
5
- **한글(HWPX) 문서 자동화 — Claude Code 플러그인 & CLI**
6
-
7
- *"이 양식에 채워줘" 한마디로, 서식 무손상 한글 문서가 나옵니다.*
8
-
9
- [![License](https://img.shields.io/badge/license-Apache--2.0-blue.svg)](LICENSE)
10
- [![PyPI](https://img.shields.io/pypi/v/hwpx-kit-cli.svg)](https://pypi.org/project/hwpx-kit-cli/)
11
- [![Python](https://img.shields.io/badge/python-3.10%2B-3776AB.svg)](https://www.python.org/)
12
- [![Claude Code](https://img.shields.io/badge/Claude%20Code-plugin-d97757.svg)](https://claude.com/claude-code)
13
- [![Tests](https://img.shields.io/badge/tests-145%20passing-brightgreen.svg)](tests/)
14
-
15
- </div>
16
-
17
- ---
18
-
19
- ## 무엇이 되나
20
-
21
- 한글(HWP/HWPX)은 한국 공공·기업 문서의 표준이지만, AI가 다룰 수 있는 도구가 사실상 없었습니다.
22
- hwpx-kit은 **AI 에이전트가 한글 문서를 읽고, 채우고, 고치고, 새로 만들 수 있게** 하는 도구 모음입니다.
23
-
24
- ```
25
- 👤 "이 양식에 채워줘" → 서식(폰트·표·조판) 무손상으로 값만 채운 사본
26
- 👤 "이 기획서를 ○○사업용으로 바꿔줘" → 기존 문서를 양식 삼아 내용 전면 교체
27
- 👤 "한글로 새 기획서 만들어줘" → 내장 템플릿으로 표지·장·표 갖춘 문서 생성
28
- 👤 "예산 앞에 장 하나 추가하고 표 넣어줘" → 장 헤더 복제·새 표 생성·쪽나눔까지
29
- 👤 "금액 한글로 병기해줘" → 금12,340원(금일만이천삼백사십원) — 계산 착오 0
30
- 👤 "이거 워드로도 줘" / "PPT로 만들어줘" → docx 변환 / 발표자료 재구성
31
- ```
32
-
33
- 모든 채우기는 **원본을 절대 수정하지 않고** 사본에만 씁니다. 실제 공공기관 서식
34
- (보도자료·신청서·계획서·회의록·공고문)으로 왕복 검증했습니다.
35
-
36
- | | hwpx-kit 없이 | hwpx-kit으로 |
37
- |---|---|---|
38
- | 양식 채우기 | 한글 열고 칸마다 복붙, 서식 깨지면 수작업 복구 | 파일 주고 한마디 — 서식 무손상 사본 |
39
- | 새 기획서 | 백지에서 표지·표·조판 직접 | 내장 템플릿에 내용만 — 몇 분 완주 |
40
- | 금액 병기 | 손으로 한글 표기 (오타 위험) | 결정론 계산 — `금12,340원(금일만이천삼백사십원)` |
41
- | AI에게 한글 파일 | 못 읽음 · PDF 변환 우회 | hwpx·hwp 직접 읽기/쓰기 |
42
-
43
- **이런 분들을 위해 만들었습니다**: 공공기관·학교의 서식 담당자, 사업계획서를 반복 작성하는
44
- 창업자·연구자, 한글 문서를 AI 워크플로에 넣고 싶은 개발자.
45
-
46
- ## 30초 설치
47
-
48
- Claude Code에서:
49
-
50
- ```
51
- /plugin marketplace add 6aneffy/hwpx-kit
52
- /plugin install hwpx-kit@hwpx-kit-market
53
- ```
54
-
55
- 이게 전부입니다. CLI 런타임은 첫 사용 때 스킬이 알아서 설치를 진행합니다
56
- (PC에 Python 3.10+만 있으면 됩니다).
57
-
58
- <details>
59
- <summary>수동 설치</summary>
60
-
61
- ```bash
62
- pip install hwpx-kit-cli
63
- ```
64
-
65
- ```powershell
66
- # Windows 일괄 (CLI + 플러그인 등록)
67
- irm https://raw.githubusercontent.com/6aneffy/hwpx-kit/main/install.ps1 | iex
68
- ```
69
- </details>
70
-
71
- ## 스킬 (Claude Code 플러그인)
72
-
73
- | 스킬 | 트리거 | 역할 |
74
- |------|--------|------|
75
- | **hwpx-form** | "이 양식에 채워줘" | 분석→채우기→검증 코어 워크플로. 표 조작·강조·워드 출력 포함 |
76
- | **doc-create** | "기획서 만들어줘" (파일 없이) | 백지 생성 라우터 — 내장 템플릿(표지·장 헤더·표 골격) 기반 |
77
- | **format-convert** | "금액 한글로", "요일 붙여줘" | 금액 병기·날짜 요일·만나이 — 결정론 계산 (LLM 암산 금지) |
78
- | **gongmun-format** | "공문 형식으로" | 행안부 공문 규약 — 글머리 위계(□○-※\*), 표기, 텍스트 정리 |
79
- | **table-calc** | "증감 채워줘" | 보고서 표 증감(△·%p)·비율·합계 계산과 관습 표기 |
80
- | **office-export** | "워드로", "PPT로" | docx 변환(한글 COM) / pptx·xlsx 재구성 |
81
-
82
- 스킬은 사용자에게 **필수 정보를 먼저 묻고**(선택지 UI), 초안을 확정받은 뒤 작업합니다.
83
- 말하지 않은 값을 지어내지 않습니다.
84
-
85
- ## CLI
86
-
87
- 모든 명령은 `--json`으로 한 줄 JSON 봉투(`ok`/`data`/`warnings`/`error`)를 반환합니다.
88
- 종료 코드: `0` 성공 · `1` 오류 · `2` 부분 성공.
89
-
90
- ```bash
91
- # 읽기·분석
92
- hwpx-kit analyze 양식.hwpx --json # 채울 수 있는 필드 탐지 (fill_key 반환)
93
- hwpx-kit read 문서 --format md # 본문 추출 — hwpx·PDF·DOCX·XLSX 내장 지원
94
- hwpx-kit outline 문서.hwpx --json # 문단·표 배치 지도 (삽입 앵커 탐색)
95
- hwpx-kit table-map 문서.hwpx --table 3 --json # 표 셀 좌표·병합 상태
96
- hwpx-kit validate 문서.hwpx --json # 구조 검증
97
-
98
- # 채우기·편집 (원본 불변 — 항상 --out 사본)
99
- hwpx-kit fill 양식.hwpx --data 값.json --out 결과.hwpx
100
- hwpx-kit table-set 문서.hwpx --table 3 --data 셀.json --out 결과.hwpx # 좌표 셀 쓰기
101
- hwpx-kit table-clear 문서.hwpx --table 3 --rows 1-20 --out 결과.hwpx # 셀 내용 비우기
102
- hwpx-kit table-copy 문서.hwpx --table 1 --after-table 4 --out 결과.hwpx # 표 통째 복제 (서식·병합 유지)
103
- hwpx-kit table-new 문서.hwpx --rows 6 --cols 4 --like-table 3 --after-text "앵커" --out 결과.hwpx
104
- hwpx-kit row-height 문서.hwpx --table 3 --like 1 --rows 2-5 --out 결과.hwpx # 행 높이 정돈
105
- hwpx-kit page-break 문서.hwpx --table 5 --out 결과.hwpx # 쪽나눔 (새 장 시작)
106
-
107
- # 변환·생성
108
- hwpx-kit fmt --amount 12340 --json # 금12,340원(금일만이천삼백사십원)
109
- hwpx-kit fmt --date 20260101 --json # 2026.1.1.(목)
110
- hwpx-kit convert 문서.hwp --json # .hwp → .hwpx (Windows + 한글)
111
- hwpx-kit export 문서.hwpx --to docx --json # 워드로 내보내기 (Windows + 한글)
112
- hwpx-kit generate 초안.md --out 새문서.hwpx # Markdown공문서 (kordoc)
113
- hwpx-kit render 문서.hwpx --out p.svg # SVG 미리보기 (kordoc)
114
- ```
115
-
116
- ## fill_key 계약
117
-
118
- `analyze`가 주는 키를 그대로 데이터 JSON의 키로 씁니다.
119
-
120
- | | 대상 | 예시 |
121
- |----|------|------|
122
- | `clickhere:<이름>` | 누름틀 필드 | `"clickhere:신청자": "김철수"` |
123
- | `marker:<키>` | `{{키}}` 마커 | `"marker:출장기간": "7/14~7/16"` |
124
- | `table:<라벨>` | 라벨 오른쪽 | `"table:성명": "김철수"` |
125
- | `table:<라벨>#N` | 같은 라벨 N번째 | `"table:담당 부서#2": "운영과"` |
126
- | `table:<라벨> > <방향>` | 방향 체인 | `"table:과 장 > right > right": "010-…"` |
127
- | `text:<원문>` | 문장 교체 (서식 보존) | `"text:○○○ 사업": "청년 AI교육 사업"` |
128
- | `delete:<문단원문>` | 안내문 삭제 | `"delete:(예시입니다)": ""` |
129
- | `bold:` / `underline:<원문>` | 굵게·밑줄 | `"bold:핵심 성과": ""` |
130
-
131
- ## 요구 사항
132
-
133
- | 기능 | 필요한 것 |
134
- |------|-----------|
135
- | 분석·채우기·검증·표 조작·표기 변환·PDF/DOCX/XLSX 읽기 | **Python 3.10+ 만** (순수 파이썬) |
136
- | `.hwp` 변환, 워드(docx) 내보내기 | Windows + 한글(한컴오피스) |
137
- | 한글 없는 환경(Mac 등)의 구형 `.hwp` 읽기, MD→HWPX, SVG | [kordoc](https://github.com/chrisryugj/kordoc) (Node 18+, 선택) |
138
-
139
- ## 아키텍처
140
-
141
- ```
142
- Claude Code 스킬 6종 ──→ hwpx-kit CLI (19 명령, JSON 봉투)
143
- └─ adapter/ ← 엔진 격리 계층
144
- ├─ python-hwpx hwpx 분석·채우기·표 조작
145
- ├─ pypdf·python-docx·openpyxl 타 포맷 읽기
146
- ├─ pyhwpx(COM) .hwp 변환·docx 내보내기
147
- └─ kordoc 구형 .hwp·생성·렌더 (선택)
148
- templates/ 기본 계획서 템플릿 (표지·장 헤더·표 골격, 마커 내장)
149
- ```
150
-
151
- 설계 불변 원칙: **① 원본 절대 수정 금지 ② `--json` stdout은 봉투 한 줄만
152
- ③ 서식은 항상 보존** (셀을 비워도 글자모양이 유지되어 재기입 시 원래 서식을 물려받음).
153
-
154
- > 🚧 같은 코어를 MCP 서버로 노출하는 버전도 제작 중입니다 (Claude Desktop 등 MCP 클라이언트용).
155
-
156
- ## 검증
157
-
158
- - 자동 테스트 145개 (pytest)
159
- - 실서식 수렴 테스트: 보도자료·신청서·계획서·회의록·공고문 5계열,
160
- 실제 공공기관 문서 30여 종으로 analyze→fill→validate 왕복
161
- - 실사용 시나리오 테스트 3회 (백지 생성 12분 완주, 장·표 동적 추가, 보도자료 변환)
162
-
163
- ## 라이선스
164
-
165
- [Apache-2.0](LICENSE) · © 2026 [6aneffy](https://github.com/6aneffy)
166
-
167
- 이슈·PR 환영합니다. 특히 실제 기관 양식에서의 analyze/fill 실패 사례 제보가 가장 값집니다
168
- (단, **기관 내부 문서를 이슈에 첨부하지 마세요** — 재현 가능한 합성 예시로 부탁드립니다).
1
+ <div align="center">
2
+
3
+ # hwpx-kit
4
+
5
+ **한글(HWPX) 문서 자동화 — Claude Code 플러그인 & CLI**
6
+
7
+ *"이 양식에 채워줘" 한마디로, 서식 무손상 한글 문서가 나옵니다.*
8
+
9
+ [![License](https://img.shields.io/badge/license-Apache--2.0-blue.svg)](LICENSE)
10
+ [![PyPI](https://img.shields.io/pypi/v/hwpx-kit-cli.svg)](https://pypi.org/project/hwpx-kit-cli/)
11
+ [![Python](https://img.shields.io/badge/python-3.10%2B-3776AB.svg)](https://www.python.org/)
12
+ [![Claude Code](https://img.shields.io/badge/Claude%20Code-plugin-d97757.svg)](https://claude.com/claude-code)
13
+ [![Tests](https://img.shields.io/badge/tests-160%20passing-brightgreen.svg)](tests/)
14
+
15
+ </div>
16
+
17
+ ---
18
+
19
+ ## 무엇이 되나
20
+
21
+ 한글(HWP/HWPX)은 한국 공공·기업 문서의 표준이지만, AI가 다룰 수 있는 도구가 사실상 없었습니다.
22
+ hwpx-kit은 **AI 에이전트가 한글 문서를 읽고, 채우고, 고치고, 새로 만들 수 있게** 하는 도구 모음입니다.
23
+
24
+ ```
25
+ 👤 "이 양식에 채워줘" → 서식(폰트·표·조판) 무손상으로 값만 채운 사본
26
+ 👤 "이 기획서를 ○○사업용으로 바꿔줘" → 기존 문서를 양식 삼아 내용 전면 교체
27
+ 👤 "한글로 새 기획서 만들어줘" → 내장 템플릿으로 표지·장·표 갖춘 문서 생성
28
+ 👤 "예산 앞에 장 하나 추가하고 표 넣어줘" → 장 헤더 복제·새 표 생성·쪽나눔까지
29
+ 👤 "금액 한글로 병기해줘" → 금12,340원(금일만이천삼백사십원) — 계산 착오 0
30
+ 👤 "이거 워드로도 줘" / "PPT로 만들어줘" → docx 변환 / 발표자료 재구성
31
+ ```
32
+
33
+ 모든 채우기는 **원본을 절대 수정하지 않고** 사본에만 씁니다. 실제 공공기관 서식
34
+ (보도자료·신청서·계획서·회의록·공고문)으로 왕복 검증했습니다.
35
+
36
+ | | hwpx-kit 없이 | hwpx-kit으로 |
37
+ |---|---|---|
38
+ | 양식 채우기 | 한글 열고 칸마다 복붙, 서식 깨지면 수작업 복구 | 파일 주고 한마디 — 서식 무손상 사본 |
39
+ | 새 기획서 | 백지에서 표지·표·조판 직접 | 내장 템플릿에 내용만 — 몇 분 완주 |
40
+ | 금액 병기 | 손으로 한글 표기 (오타 위험) | 결정론 계산 — `금12,340원(금일만이천삼백사십원)` |
41
+ | AI에게 한글 파일 | 못 읽음 · PDF 변환 우회 | hwpx·hwp 직접 읽기/쓰기 |
42
+
43
+ **이런 분들을 위해 만들었습니다**: 공공기관·학교의 서식 담당자, 사업계획서를 반복 작성하는
44
+ 창업자·연구자, 한글 문서를 AI 워크플로에 넣고 싶은 개발자.
45
+
46
+ ## 30초 설치
47
+
48
+ Claude Code에서:
49
+
50
+ ```
51
+ /plugin marketplace add 6aneffy/hwpx-kit
52
+ /plugin install hwpx-kit@hwpx-kit-market
53
+ ```
54
+
55
+ 이게 전부입니다. CLI 런타임은 첫 사용 때 스킬이 알아서 설치를 진행합니다
56
+ (PC에 Python 3.10+만 있으면 됩니다).
57
+
58
+ <details>
59
+ <summary>수동 설치</summary>
60
+
61
+ ```bash
62
+ pip install hwpx-kit-cli
63
+ ```
64
+
65
+ ```powershell
66
+ # Windows 일괄 (CLI + 플러그인 등록)
67
+ irm https://raw.githubusercontent.com/6aneffy/hwpx-kit/main/install.ps1 | iex
68
+ ```
69
+ </details>
70
+
71
+ ## 스킬 (Claude Code 플러그인)
72
+
73
+ | 스킬 | 트리거 | 역할 |
74
+ |------|--------|------|
75
+ | **hwpx-form** | "이 양식에 채워줘" | 분석→채우기→검증 코어 워크플로. 표 조작·강조·워드 출력 포함 |
76
+ | **doc-create** | "기획서 만들어줘" (파일 없이) | 백지 생성 라우터 — 내장 템플릿(표지·장 헤더·표 골격) 기반 |
77
+ | **format-convert** | "금액 한글로", "요일 붙여줘" | 금액 병기·날짜 요일·만나이 — 결정론 계산 (LLM 암산 금지) |
78
+ | **gongmun-format** | "공문 형식으로" | 행안부 공문 규약 — 글머리 위계(□○-※\*), 표기, 텍스트 정리 |
79
+ | **table-calc** | "증감 채워줘" | 보고서 표 증감(△·%p)·비율·합계 계산과 관습 표기 |
80
+ | **office-export** | "워드로", "PPT로" | docx 변환(한글 COM) / pptx·xlsx 재구성 |
81
+
82
+ 스킬은 사용자에게 **필수 정보를 먼저 묻고**(선택지 UI), 초안을 확정받은 뒤 작업합니다.
83
+ 말하지 않은 값을 지어내지 않습니다.
84
+
85
+ ## CLI
86
+
87
+ 모든 명령은 `--json`으로 한 줄 JSON 봉투(`ok`/`data`/`warnings`/`error`)를 반환합니다.
88
+ 종료 코드: `0` 성공 · `1` 오류 · `2` 부분 성공.
89
+
90
+ ```bash
91
+ # 읽기·분석
92
+ hwpx-kit analyze 양식.hwpx --json # 채울 수 있는 필드 탐지 (fill_key 반환)
93
+ hwpx-kit read 문서 --format md # 본문 추출 — hwpx·PDF·DOCX·XLSX 내장 지원
94
+ hwpx-kit outline 문서.hwpx --json # 문단·표 배치 지도 (삽입 앵커 탐색)
95
+ hwpx-kit table-map 문서.hwpx --table 3 --json # 표 셀 좌표·병합 상태
96
+ hwpx-kit validate 문서.hwpx --json # 구조 검증
97
+
98
+ # 채우기·편집 (원본 불변 — 항상 --out 사본)
99
+ hwpx-kit fill 양식.hwpx --data 값.json --out 결과.hwpx
100
+ hwpx-kit table-set 문서.hwpx --table 3 --data 셀.json --out 결과.hwpx # 좌표 셀 쓰기
101
+ hwpx-kit table-clear 문서.hwpx --table 3 --rows 1-20 --out 결과.hwpx # 셀 내용 비우기
102
+ hwpx-kit table-copy 문서.hwpx --table 1 --after-table 4 --out 결과.hwpx # 표 통째 복제 (서식·병합 유지)
103
+ hwpx-kit table-new 문서.hwpx --rows 6 --cols 4 --like-table 3 --after-text "앵커" --out 결과.hwpx
104
+ hwpx-kit row-add 문서.hwpx --table 3 --like 2 --count 3 --out 결과.hwpx # 행 추가 (기준 행 서식 승계)
105
+ hwpx-kit row-del 문서.hwpx --table 3 --rows 5-7 --out 결과.hwpx # 삭제
106
+ hwpx-kit row-height 문서.hwpx --table 3 --like 1 --rows 2-5 --out 결과.hwpx # 행 높이 정돈
107
+ hwpx-kit page-break 문서.hwpx --table 5 --out 결과.hwpx # 쪽나눔 (새 장 시작)
108
+
109
+ # 변환·생성
110
+ hwpx-kit fmt --amount 12340 --json # 금12,340원(금일만이천삼백사십원)
111
+ hwpx-kit fmt --date 20260101 --json # 2026.1.1.()
112
+ hwpx-kit convert 문서.hwp --json # .hwp.hwpx (Windows + 한글)
113
+ hwpx-kit export 문서.hwpx --to docx --json # 워드로 내보내기 (Windows + 한글)
114
+ hwpx-kit generate 초안.md --out 새문서.hwpx # Markdown → 공문서 (kordoc)
115
+ hwpx-kit render 문서.hwpx --out p.svg # SVG 미리보기 (kordoc)
116
+ ```
117
+
118
+ ## fill_key 계약
119
+
120
+ `analyze`가 주는 키를 그대로 데이터 JSON의 키로 씁니다.
121
+
122
+ | | 대상 | 예시 |
123
+ |----|------|------|
124
+ | `clickhere:<이름>` | 누름틀 필드 | `"clickhere:신청자": "김철수"` |
125
+ | `marker:<키>` | `{{키}}` 마커 | `"marker:출장기간": "7/14~7/16"` |
126
+ | `table:<라벨>` | 라벨 오른쪽 | `"table:성명": "김철수"` |
127
+ | `table:<라벨>#N` | 같은 라벨 N번째 | `"table:담당 부서#2": "운영과"` |
128
+ | `table:<라벨> > <방향>` | 방향 체인 | `"table:과 장 > right > right": "010-…"` |
129
+ | `text:<원문>` | 문장 교체 (서식 보존) | `"text:○○○ 사업": "청년 AI교육 사업"` |
130
+ | `delete:<문단원문>` | 안내문 삭제 | `"delete:(예시입니다)": ""` |
131
+ | `bold:` / `underline:<원문>` | 굵게·밑줄 | `"bold:핵심 성과": ""` |
132
+
133
+ ## 요구 사항
134
+
135
+ | 기능 | 필요한 |
136
+ |------|-----------|
137
+ | 분석·채우기·검증·표 조작·표기 변환·PDF/DOCX/XLSX 읽기 | **Python 3.10+ 만** (순수 파이썬) |
138
+ | `.hwp` 변환, 워드(docx) 내보내기 | Windows + 한글(한컴오피스) |
139
+ | 한글 없는 환경(Mac 등)의 구형 `.hwp` 읽기, MD→HWPX, SVG | [kordoc](https://github.com/chrisryugj/kordoc) (Node 18+, 선택) |
140
+
141
+ ## 아키텍처
142
+
143
+ ```
144
+ Claude Code 스킬 6종 ──→ hwpx-kit CLI (21 명령, JSON 봉투)
145
+ └─ adapter/ ← 엔진 격리 계층
146
+ ├─ python-hwpx hwpx 분석·채우기·표 조작
147
+ ├─ pypdf·python-docx·openpyxl 타 포맷 읽기
148
+ ├─ pyhwpx(COM) .hwp 변환·docx 내보내기
149
+ └─ kordoc 구형 .hwp·생성·렌더 (선택)
150
+ templates/ 기본 계획서 템플릿 (표지·장 헤더·표 골격, 마커 내장)
151
+ ```
152
+
153
+ 설계 불변 원칙: **① 원본 절대 수정 금지 ② `--json` stdout은 봉투 한 줄만
154
+ 서식은 항상 보존** (셀을 비워도 글자모양이 유지되어 재기입 원래 서식을 물려받음).
155
+
156
+ > 🚧 같은 코어를 MCP 서버로 노출하는 버전도 제작 중입니다 (Claude Desktop 등 MCP 클라이언트용).
157
+
158
+ ## 검증
159
+
160
+ - 자동 테스트 160개 (pytest)
161
+ - 실서식 수렴 테스트: 보도자료·신청서·계획서·회의록·공고문 5계열,
162
+ 실제 공공기관 문서 30여 종으로 analyze→fill→validate 왕복
163
+ - 실사용 시나리오 테스트 3회 (백지 생성 12분 완주, 장·표 동적 추가, 보도자료 변환)
164
+
165
+ ## 라이선스
166
+
167
+ [Apache-2.0](LICENSE) · © 2026 [6aneffy](https://github.com/6aneffy)
168
+
169
+ 이슈·PR 환영합니다. 특히 실제 기관 양식에서의 analyze/fill 실패 사례 제보가 가장 값집니다
170
+ (단, **기관 내부 문서를 이슈에 첨부하지 마세요** — 재현 가능한 합성 예시로 부탁드립니다).
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "hwpx-kit-cli"
3
- version = "0.1.2"
3
+ version = "0.2.1"
4
4
  description = "한글(HWPX) 문서 자동화 CLI — Korean HWPX document automation for AI agents: analyze, fill, read, validate, table ops"
5
5
  readme = "README.md"
6
6
  requires-python = ">=3.10"
@@ -8,7 +8,7 @@
8
8
  ├── hwpx-kit-plugin/ ← 플러그인 겸 자기-마켓플레이스 (통째 복사)
9
9
  │ ├── .claude-plugin/{plugin.json, marketplace.json}
10
10
  │ └── skills/*/SKILL.md
11
- ├── hwpx_kit-<버전>-*.whl ← CLI 런타임
11
+ ├── hwpx_kit_cli-<버전>-*.whl ← CLI 런타임
12
12
  ├── install.ps1 / install.sh ← wheel 설치 + 플러그인 등록
13
13
  └── README.md
14
14
  """
@@ -39,7 +39,7 @@ if ($ver.Trim() -ne "True") {
39
39
  exit 1
40
40
  }
41
41
 
42
- $wheel = Get-ChildItem "$here\\hwpx_kit-*.whl" | Select-Object -First 1
42
+ $wheel = Get-ChildItem "$here\\hwpx_kit_cli-*.whl" | Select-Object -First 1
43
43
  if (-not $wheel) { Write-Host "번들에 wheel이 없습니다."; exit 1 }
44
44
 
45
45
  Write-Host "hwpx-kit CLI 설치 중..."
@@ -99,7 +99,7 @@ fi
99
99
  python3 -c 'import sys; sys.exit(0 if sys.version_info >= (3, 10) else 1)' \\
100
100
  || { echo "Python 3.10 이상 필요. 현재: $(python3 --version)"; exit 1; }
101
101
 
102
- WHEEL="$(ls "$HERE"/hwpx_kit-*.whl | head -n 1)"
102
+ WHEEL="$(ls "$HERE"/hwpx_kit_cli-*.whl | head -n 1)"
103
103
  echo "hwpx-kit CLI 설치 중..."
104
104
  python3 -m pip install --user --upgrade "$WHEEL"
105
105
 
@@ -175,7 +175,7 @@ def build(out_dir: Path) -> Path:
175
175
  ["uv", "build", "--wheel", "--out-dir", td], cwd=str(REPO), check=True,
176
176
  capture_output=True,
177
177
  )
178
- wheel = next(Path(td).glob("hwpx_kit-*.whl"))
178
+ wheel = next(Path(td).glob("hwpx_kit_cli-*.whl"))
179
179
 
180
180
  bundle = out_dir / f"hwpx-kit-plugin-{version}.zip"
181
181
  with zipfile.ZipFile(bundle, "w", zipfile.ZIP_DEFLATED) as zf:
@@ -53,8 +53,10 @@ AskUserQuestion으로 확인** (탐색은 토큰 낭비, 답이 "있음"일 때
53
53
  - **안 쓰는 마커 문단은 delete:로 제거** — 원문은 read 출력에서 그대로
54
54
  복사 (마커 앞 공백이 미묘해서 손으로 치면 빗나간다)
55
55
  - **예산표 채우기 요령**: 비목·항목명은 셀 한 줄에 들어가게 짧게(6자 내외
56
- — 길면 행이 부풀어 총계가 다음 쪽으로 밀린다). 잔여 행은 두고
57
- "필요 없으면 한글에서 삭제" 안내
56
+ — 길면 행이 부풀어 총계가 다음 쪽으로 밀린다). 예산표는 비목 열이
57
+ 세로 병합이라 `row-add`/`row-del`이 거부된다(정상 병합 훼손 방지):
58
+ 잔여 빈 행은 두고 "필요 없으면 한글에서 행 삭제" 안내. 커리큘럼 표
59
+ (병합 없음)는 `row-add`/`row-del`로 행 수를 직접 맞춘다
58
60
  - 안 쓰는 골격 표(커리큘럼·예산)는 table-clear로 비우거나 한글 삭제 안내
59
61
  - 다른 크기 표가 필요하면 `table-new --rows R --cols C --like-table <기존표>`
60
62
  (기존 표 서식 차용). 표 상태 검사는 `table-map` (원시 XML 파싱 금지)
@@ -47,8 +47,9 @@ CLI `hwpx-kit`으로 hwpx 문서를 다룬다. 항상 `--json`을 붙여 실행
47
47
  2. **구조 대조 보고**: read/analyze로 원본 구조 vs 새 내용을 대조해
48
48
  안 맞는 표·섹션 목록(예: 원본 20일 커리큘럼 표 vs 새 10일 과정)을 보여주고
49
49
  진행 방식을 사용자와 확정:
50
- - (a) 사용자가 한글에서 구조 정리(불필요 표·행 삭제) 파일 다시 제공 —
51
- 가장 깔끔. 높이가 어긋나면 `row-height`로 도구가 정돈
50
+ - (a) 도구로 구조 정리 개수는 `row-add`/`row-del`로 직접 맞추고
51
+ (세로 병합 걸리면 거부됨 그때만 사용자에게 한글 수정 요청),
52
+ 불필요한 표 통째 삭제는 사용자가 한글에서. 행 높이는 `row-height`
52
53
  - (b) **기본값: 안 맞는 내용은 비운다** — 표는
53
54
  `hwpx-kit table-clear <파일> --table N [--rows A-B] --out <결과>`,
54
55
  문단은 `delete:<원문>` 키. 원본 내용을 그대로 남겨두면 안 됨 (엉뚱한
@@ -83,16 +84,14 @@ CLI `hwpx-kit`으로 hwpx 문서를 다룬다. 항상 `--json`을 붙여 실행
83
84
  나온다 — 내용 셀이 다음 셀의 라벨로 잡히는 잡음이 대부분이다.
84
85
  `prefilled: false`(빈칸)와 사용자가 바꾸겠다고 한 항목만 추리고 나머지는 무시.
85
86
  빈 표(예산표 등)는 라벨 평키 + `> right` 체인 + `#N`으로 행 단위 채우기
86
- - **표 구조 변경(행·열 추가/삭제, 병합)은 불가** 내용만 바꿀 있다.
87
- 행을 "비우기"는 내용만 지우는 것이라 **빈 껍데기가 표에 남는다.**
88
- 내용이 크기와 맞으면(커리큘럼 20일→15일 등) 채우기 전에 멈추고
89
- 사용자에게 요청: "한글에서 표를 N행으로 맞춰(행 추가/삭제) 다시 주시면
90
- 이어서 채우겠다." 구조가 맞은 파일을 받아 진행하는 정답 순서
91
- 행을 남기거나 내용을 우겨넣지
92
- - 사용자가 행을 추가하면 **높이가 기본값으로 붙어 들쭉날쭉할 수 있다** —
93
- 그건 사용자에게 시키지 말고 도구로 정돈:
94
- `hwpx-kit row-height <파일> --table <표인덱스> --like <기준행> --rows <대상행들> --out <결과>`
95
- (인덱스는 analyze의 table_index/row 그대로 0-기준, 기준 행은 병합 없는 행으로)
87
+ - **행 개수가 맞으면 직접 맞춘다** (커리큘럼 20일→15일 등) 채우기 전에:
88
+ 추가는 `hwpx-kit row-add <파일> --table N --like <기준행> --count K [--at 위치] --out <결과>`
89
+ (기준 서식·높이 승계, 내용은 채로 삽입 기준 행은 병합 없는 행으로),
90
+ 삭제는 `hwpx-kit row-del <파일> --table N --rows <행들> --out <결과>`.
91
+ **세로 병합에 걸리면 명령이 거부한다** 표만 사용자에게 한글 수정을
92
+ 요청 (병합 구간 전체를 함께 지정하는 삭제는 허용). 열 추가/삭제·병합
93
+ 변경은 여전히 불가 사용자에게. 높이만 어긋난 표는
94
+ `hwpx-kit row-height <파일> --table N --like <기준행> --rows <대상행들> --out <결과>`
96
95
  - **장(章)이나 표를 늘려야 할 때** (템플릿은 5장인데 8장 필요 등): 장 제목
97
96
  박스는 실은 1x3 표다 —
98
97
  `hwpx-kit table-copy <파일> --table <헤더표 인덱스> --after-text "<삽입 위치 문단 원문>" --out <결과>`