Atlas / Skills / eum-jium / hwpx-reporter

hwpx-reporterBLOCK

skills/eum-jium/hwpx-reporter

한/글 없이 HWPX 문서를 만들고 읽는 파이썬 툴킷 · MCP 서버 · claude.ai 스킬 — 2026-10-14 공개 스냅샷(동결)

Verdict
BLOCK
Grade
D
Trust score
69 /100
Version
—
Hosts
2 documented
License
MIT
Stars
0
01

Overview

From the repository's own README, as read at the audited commit. Badges and raw HTML are left out.

공개 스냅샷 · 2026-10-14 동결. 이 리포는 그 시점의 공개본이다. 개발은 비공개로 이어지고 여기는 갱신되지 않는다.

한/글(HWP) 프로그램 없이 공공기관 표준서식 보고서(.hwpx)를 만들고 읽는 도구. 공문서 관행(□ ◦ 항목부호, 【주관】 블록, 휴먼명조 15pt, 간격·내어쓰기 규칙)을 코드로 옮겨, LLM 은 본문 내용만 쓰고 서식은 엔진이 결정론적으로 보장하는 구조다.

한국수자원공사 AI혁신처에서 함께 만든 프로젝트다. 기관이 공식 배포하는 도구는 아니다.

위 문서가 엔진 출력 그대로다 — 제목박스·【주관】 블록·항목부호·간격을 코드가 맞추고, 본문은 줄 길이(□ 30~38자 · ◦ 66~70자)·어절 경계·종결 규격을 통과한 예시다(렌더 경고 0건). 실물: docs/examplebusinessresult.hwpx

두 가지 타입

두 타입은 같은 엔진(packages/ 의 hwpx-core · hwpx-skeleton)과 같은 작성 규칙을 쓴다 — 같은 원고면 같은 문서가 나온다.

스킬 타입

파이썬 환경 없이 대화만으로 쓴다. 클론 후(빌드는 표준 라이브러리만 쓴다):

python skill/build_skill.py           # 엔진 스킬 → build/skill/hwpx-skill-rev.zip
python skill/build_template_skill.py  # 양식 스킬 → build/skill/hwpx-template-skill-rev.zip

생성된 zip 둘을 claude.ai 설정 → 기능(Capabilities) → 스킬에 업로드하면 끝. 엔진 스킬이 문서를 만들고 읽고, 양식 스킬이 양식 파일과 작성 규칙(골격·문체·줄 길이·표 규격)을 얹는다. 대화에서 "결과보고서 써줘"라고 하면 표준서식 .hwpx 를 만들어 주고, 기존 보고서 검토·첨삭도 한다. 엔진 소스가 zip 에 통째로 들어가므로(vendored) claude.ai 쪽 설치는 없다. Claude Code 사용자는 zip 을 ~/.claude/skills/ 에 풀면 같은 스킬이 로드된다.

MCP 타입

사내 챗봇에 넣은 보고서 에이전트다. Agentflow 하나(4노드)에서 큰 모델 하나가 도구 여덟을 골라 부르며 골격 → 본문 → 검토 → .hwpx 파일까지 사용자와 대화로 만든다. 엔진 휠을 플랫폼 패키지 저장소에 올리고, 도구 파일을 MCP 도구 코드칸에 붙여 넣고, 워크플로를 임포트한 뒤 손으로 채울 자리 몇 곳을 채운다 — 순서·환경변수·도구 목록은 mcp/README.md.

엔진 패키지

Read from source at commit e1f4c118db30OBSERVED · 2026-10-14
Advertisement
02

Install

Commands as the repository documents them. They are shown, not run.

pip install -e packages/hwpx-core -e packages/hwpx-reader -e packages/hwpx-skeleton -e packages/hwpx-writer -e packages/hwpx-report
pip install pytest
pip install -e packages/hwpx-core   # 리포 안에서(로컬 경로)
pip install -e packages/hwpx-core -e packages/hwpx-reader     # 개발(모노레포)
pip install -e packages/hwpx-core -e packages/hwpx-skeleton      # 개발(core 와 함께)
pip install -e packages/hwpx-core -e packages/hwpx-writer   # core 와 함께(로컬 경로)
03

Host compatibility

What the documentation claims. We have not run a compatibility test.

HostStatusNotes
claude-codementioned
claude-desktopmentioned
04

What it tells the agent

The instruction file, verbatim from the audited commit — this is the text the model reads, and the surface the audit's instruction layer examines. Quoted here so you can judge it without cloning anything.

---
name: hwpx-template
description: 한글(HWPX) 보고서·공문서를 **쓸 때 함께 쓰는** 양식과 작성 규칙. hwpx 스킬(엔진)과 짝이며, 한글 보고서·계획서·검토보고를 만들거나 고치는 요청이면 양식 지정이 없어도 이 스킬을 함께 읽는다 — 샘플 골격(단은 가변 · 마지막 단은 향후계획), 문체(개조식 체언 종결), 줄 길이(□ 30~38자 · ◦ 66~70자), 말머리, 표 규격, 향후계획 일정 줄, 취지 상자 문구, 검토 지적표가 여기 있다. 양식 파일(govbasic 등)도 여기서 골라 hwpx 의 render_md 에 template_path 로 넘긴다. hwpx 문서를 읽기만 하거나 남의 문서에 메모만 다는 일이면 이 스킬은 필요 없다.
---

# HWPX 양식과 보고서 관행

<!-- skill-rev: 7 -->
**rev 7** — 올린 판이 어느 것인지 헷갈리지 않게 붙인 번호다. 빌드가 이 값을
읽어 `hwpx-template-skill-rev7.zip` 으로 내보내므로, 판을 올릴 때는 **여기만** 고친다.
· rev 6 → rev 7: 찍을 때 유형을 `template_key` 로 함께 준다 · 향후계획 일정 줄의 두 꼴 · 모범 예제 설명.
· rev 5 → rev 6: 모범 예제를 지금 규격으로 다시 찍었다(렌더 경고 0건).
· rev 3 → rev 5: 기본 양식 이름을 `govbasic` 으로 · 예시 값 정리. 규칙은 그대로.
· rev 2 → rev 3: 작성 규칙을 보고서 에이전트(`mcp/`) 판으로 갈아 끼웠다 — 목차는 샘플(가변),
  □ 30~38자 · ◦ 66~70자, 향후계획은 날짜 일정 줄, 검토는 지적표, 재 보기(`layout.py`).

**이 스킬은 양식 파일과 보고서 관행을 들고 있다.** 문서를 만드는 엔진(읽기·쓰기·재 보기·
도해·그림·붙임·메모)은 `hwpx` 스킬에 있다.
⚠️**두 스킬이 같이 있어야 동작한다.** `hwpx` 스킬이 안 보이면 그것부터 올린다.

## 헌법 — 모든 판단의 최종 기준

- 보고서는 글이 아니라 의사결정 도구다.
- 잘 쓴 보고서란 독자(결재권자)가 치를 인지 비용을 작성자가 미리 다 지불해 놓은 문서다.
- 규칙이 충돌하면 이 기준으로 판정한다: **"이 선택이 결재권자의 결정을 더 싸고 빠르게 만드는가?"**

## 가진 양식

| 양식 | 파일 | 무엇 |
|---|---|---|
| `govbasic` | `templates/govbasic.hwpx` | 표준서식 한 벌 — 제목박스·【주관】 블록·취지 상자()·표·붙임까지 갖춘 기본판 |

## 쓰는 순서

```python
import sys, os
sys.path.insert(0, os.path.join("<hwpx 스킬 폴더>", "scripts"))
from render_report import render_md
from layout import sample_outline, view_layout, check_rules

print(sample_outline(2))                 # 1 장수에 맞춘 샘플 골격에서 시작한다
md = """## 1. 추진배경
- **(필요성) ...**
  - ...
"""                                      # 2 아래 규칙대로 마크다운 원고를 쓴다
print(view_layout(md, target_pages=2))   # 3 쪽에 어떻게 앉나 — 자수 안 맞는 줄·표 밀림/접힘
print(check_rules(md, refs=참고자료글))   #    규칙에 걸리는 줄 — 종결·경어체·한자·날짜·자료에 없는 수치
res = render_md(md,                      # 4 양식으로 찍는다
    template_path="<이 스킬 폴더>/templates/govbasic.hwpx",
    template_key="plan",                 #    유형 — plan · result · review (아래 '단을 가르는 법')
    fields={"title": "..."}, intent="...", output_dir="output")
assert res["status"] == "success", res   # 5 res["warnings"] 를 본다 — hwpx 스킬 '반환값과 경고'
```

- 유형(`template_key`)은 양식 파일을 줘도 **따로 준다** — 안 주면 계획 골격으로 보고,
  검토보고에 「마지막 단은 향후계획」 경고가 뜬다.

- 사용자가 골격을 먼저 보자고 하면 2를 **골격 원고**(아래 꼴)로 내고, 좋다고 하면 본문을 쓴다.
  짧은 보고서는 골격 없이 본문으로 가도 된다.
- 3에서 뜬 줄은 고쳐서 다시 잰다. 흐름·정합성(단끼리 겹침, 표와 본문의 수치)은 기계가 못
  본다 — 읽어서 짚는다.
- 표·도해·그림·붙임을 얹는 법은 `hwpx` 스킬(`tables_images.md`·`diagrams.md`·`attachments.md`).
  `render_md(md, tables=..., images=..., attachments=...)` 로 함께 넘긴다.

## 단을 가르는 법

- 시작점은 **샘플 골격**(`sample_outline(장수)`)이다 — 추진배경 · 현황 · 주요내용 · 추진방안 ·
  향후계획에서 장수만큼 고른 것. 거기에 사용자 말과 참고자료를 반영해 그린다.
  이름은 소재에 맞게 바꿔도 된다(`2. 교육과정 구성`).
- 단마다 목적이 있다. 그 목적은 골격의 요지 줄(없으면 샘플의 역할 줄), 사용자 말, 참고자료를 따른다.
- **마지막 단은 `향후계획`** 이다 — 언제 무엇을 할지. 일정은 여기 둔다.
- 단마다 무게가 다르다 — 첫 단은 가장 가볍게, 가운데 단들이 무게중심, 마지막 단은 다시 가볍다.
  채울 말이 없는 단은 뺀다.
- 표는 가운데 단들에 하나씩 들어간다. 표는 머리글까지 행마다 약 0.04장으로 그 단의 분량에 든다.
- 보고가 답하는 질문으로 시작점을 고른다 — **무엇을 할 것인가**(계획 · 위 샘플) ·
  **무엇을 했는가**(결과 · 방안 자리가 `추진결과`) · **이 사안을 어떻게 볼 것인가**
  (검토 · `개요 · 세부내용 · 검토의견` 3단, 향후계획 없음 — 사실과 판단을 한 문장에 섞지 않는다).
  애매하면 묻는다.

### 골격 원고의 형태

`## 1.` 로 시작해 마지막 단으로 끝난다. 단마다 이 꼴이다.

```
## N. 단명
- [내용] 이 단에 무엇이 들어가는지 한 줄. 단마다 정확히 하나.
- [분량] 1.1장 · 표 하나      ← 장수는 소수 첫째 자리, 합이 목표 분량. 표가 서는 단에만 「· 표 하나」
- [표] 표 제목               ← 표 하나가 있는 단에만. 20자 안팎, 무엇을 무엇별로 늘어놓는 표인가
```

## 본문 원고의 형태 — 마크다운 다섯 가지

```
## 1. 개요                  (대제목. 번호를 붙인다)
- **(말머리) 항목내용**      (들여쓰기 0칸, □ — 말머리 + 항목내용, 30~38자)
  - 세부                    (들여쓰기 2칸, ◦ — 수치·근거는 여기, 한 서술 66~70자)
    - 상세                  (들여쓰기 4칸, - · 계층은 □·◦ 두 단계가 기본이라 꼭 필요할 때만)
> 참고                      (`* ` 로 변환 — 각주·비고·그림 캡션)
| 구분 | 2024 | 2025 |      (표. 변환기가 [표N] 자리로 옮긴다)
```

- 마크다운은 이 다섯 가지뿐이다. 옮기는 규칙은 `hwpx` 스킬 `references/markdown.md`.
- 일부 수정이면 지시한 곳만 바꾸고 그 단의 나머지 줄은 글자 그대로 둔다.

## 분량

- 단의 목표 장수는 골격의 [분량]이고, 사용자 말에 적힌 값이 있으면 그것이 우선이다.
  목표 분량은 1~5장(말이 없으면 2장, 6장 이상은 5장).
- **줄이라는 요청은 줄을 지우라는 뜻이다** — ◦ 를 통째로 지우고, 그다음 □ 를 묶는다.
  남긴 줄의 길이는 그대로 둔다.
- **늘리라는 요청은 줄을 더하라는 뜻이다** — ◦ 를 더하고, 그다음 □ 를 더한다. 더한 줄도
  [줄 길이]대로 쓴다.
- 쪽수는 `view_layout(md, target_pages=N)` 로 잰다 — 단별 쪽 자리와 표가 쪽 금에 걸리는 곳을 알려 준다.

## 본문 구조

- 항목(□)은 그 아래 세부(◦)를 한 범주로 묶는 이름이다 — 세부내용은 ◦ 에 있다.
- 항목(□) 하나에 세부(◦)를 둘~셋 단다. 할 말이 적으면 항목끼리 묶는다.
- 향후계획은 **날짜가 앞에 오는 일정 줄로만** 쓴다 — `- '26. 8월  대상 정수장 확정`.
  · `- 추진 일정` 한 줄 아래에 두 칸 들여 `  - '26. 8월  ...` 로 내려 써도 된다 — 엔진은 두 꼴을
    다 받는다(모범 예제가 이 꼴이다). 한 문서 안에서는 한 꼴로 쓴다.
  · 일정 줄은 다섯 줄이 상한이다. 넘으면 묶는다.
  · 날짜와 내용 사이는 공백 두 칸이면 변환기가 탭으로 바꿔 열을 맞춘다. 일정 줄은 굵게 쓰지 않는다.
- 현황과 추진방안은 겹쳐도 된다 — 층이 다르다. 현황은 무엇을 알아냈나, 추진방안은 그래서 어떻게 하나.
- 단 제목을 소리 내어 읽고 바로 다음 말머리가 발화 흐름에 맞는지 본다.
- 표는 쪽에 걸치지 않게 만든다.
- 본문은 1~5장으로 끊고 상세자료(명단·서식·법령 인용)는 붙임으로 뺀다(`hwpx` 스킬 `attachments.md`).

## 말머리

- 각 단의 항목(□)마다 `(말머리) 항목내용` 꼴로 쓴다 — 말머리가 붙은 단과 안 붙은 단이 섞이면 층위가 안 읽힌다.
- 말머리는 그 항목이 무엇을 말하는지 밝히는 2~5자 요약어다.
  · 개요=(필요성)·(추진배경)·(현황) / 주요내용=(운영결과)·(추진실적)·(문제점) / 추진방안=(추가확대)·(개선방안)·(대안)
- 같은 단의 말머리끼리는 시각 폭을 맞춘다. 말머리가 짧으면 괄호 안 공백으로 패딩한다 — `(근    거)` / `(추진방안)`.
- 말머리는 하위 내용을 전부 덮는 것으로 고른다 — 포섭 안 되는 항목이 있으면 말머리가 틀린 것이다.
- 향후계획은 날짜가 말머리 노릇을 하므로 말머리를 붙이지 않는다.

## 줄 길이

- 항목(□)은 **30~38자**다 — 한 줄 안에 드는 길이다.
  · 38자를 넘기면 넘치는 내용을 아래 세부(◦)로 내린다.
  · 30자에 못 미치면 다른 항목과 합친다.
  · 말머리도 자수에 든다 — 말머리가 길면 2~5자로 줄인다.
- 세부(◦)는 **66~70자**다 — 두 줄(첫 줄 38자·둘째 줄 32자)을 꽉 채운 길이다.
  · 70자를 넘기면 덜어서 70자 안으로 되돌린다.
  · 66자에 못 미치면 그 서술 안에 수치·근거·조건을 보태고, 채울 사실이 없으면 그 세부를 지운다.
  · 한 세부에 두 가지를 담았으면 둘로 쪼갠다 — 쪼갠 둘이 **각각 66~70자**라야 한다.
- 자수는 줄 앞 기호 두 칸(`◦ `·`□ `)을 넣어 센다 — `view_layout` 이 세는 것과 같은 셈이다.
- 짧은 항목을 나열하는 세부와 향후계획의 일정 줄은 짧게 쓴다 — 이 자수에서 예외다.

## 표 쓰는 법

- 표는 골격에 「표 하나」가 있는 단에 넣는다. 비교축(연도별·전후·목표대비·대상별·단계별·
  역할분담)이 있을 때 쓴다 — ◦ 안에 쉼표로 셋 이상 늘어놓은 자리가 표로 펼 자리다.
- 표 규격 — 폭이 정해져 있어 넘치면 셀 안에서 줄이 접힌다.
  · 열은 3~5개.
  · 첫 열은 짧을수록 읽기 좋다 — 4자를 노리고, 7자를 넘기면 접힌다.
  · 나머지 칸은 8자 이내, 머리글은 6자 이내. 13자를 넘기면 접힌다.
  · 숫자는 값만 적고 단위는 머리글에 쓴다 — `시설용량(천m3/일)`. 단위가 붙은 머리글은 6자 예외다.
- 열 폭은 `render_md` 가 내용에 맞춰 넓힌다. 그래도 안 드는 칸은 `view_layout` 이
  `표1 6행
05

Trust audit

BLOCKgrade D · trust 69/100 Do not install this without reading the findings. The audit found something that could harm you or your machine.

LayerWhat it checksResult
L0Provenance & inventoryWARN
L1Static analysis of the codeFAIL
L2Instruction surface (what it tells the agent)PASS
L3Class-specific surfacePASS
L4Behavioural (sandbox)SKIPPED

What the source does

Filesystem
declared (5 observation(s))
Network
declared (3 observation(s))
Shell
declared (1 observation(s))
Dependencies
pinned
Secrets in source
found

Findings (12)

HIGHCode injection · code.eval_exec · CWE-78, CWE-94, CWE-95
skill/build_skill.py:268
exec(compile(src, MEASURE_SRC, "exec"), ns)
Why it matters. evaluates text as code
Fix. remove; use a parser or a dispatch table
MEDIUMInventory / provenance · inv.binary · CWE-1104
packages/hwpx-skeleton/src/hwpx_skeleton/assets/templates/insert_image.hwpx
insert_image.hwpx
Why it matters. a compiled or binary member cannot be reviewed from source
Fix. ship source, or explain the binary in the README
MEDIUMInventory / provenance · inv.binary · CWE-1104
packages/hwpx-skeleton/src/hwpx_skeleton/assets/templates/plain.hwpx
plain.hwpx
Why it matters. a compiled or binary member cannot be reviewed from source
Fix. ship source, or explain the binary in the README
MEDIUMInventory / provenance · inv.binary · CWE-1104
packages/hwpx-skeleton/src/hwpx_skeleton/assets/templates/standard.hwpx
standard.hwpx
Why it matters. a compiled or binary member cannot be reviewed from source
Fix. ship source, or explain the binary in the README
MEDIUMInventory / provenance · inv.binary · CWE-1104
packages/hwpx-skeleton/src/hwpx_skeleton/assets/templates/table.hwpx
table.hwpx
Why it matters. a compiled or binary member cannot be reviewed from source
Fix. ship source, or explain the binary in the README
MEDIUMHard-coded secrets · secret.private_key · CWE-798, CWE-321
packages/hwpx-writer/tests/test_review_fixes.py:158
fake.write_bytes(b"-----BEGIN OPENSSH PRIVATE KEY-----")
LOWInventory / provenance · inv.binary · CWE-1104
docs/example_business_result.hwpx
example_business_result.hwpx
Why it matters. a compiled or binary member cannot be reviewed from source
Fix. ship source, or explain the binary in the README
LOWObfuscation / stealth · obf.decode_call · CWE-506, CWE-94
packages/hwpx-core/src/hwpx_core/bindata.py:171
data = base64.b64decode(str(block["b64"]), validate=True)
LOWObfuscation / stealth · obf.decode_call · CWE-506, CWE-94
packages/hwpx-writer/src/hwpx_mcp/engine/images.py:97
data = base64.b64decode(image_b64, validate=True)
LOWObfuscation / stealth · obf.decode_call · CWE-506, CWE-94
packages/hwpx-writer/src/hwpx_mcp/engine/images.py:112
data = base64.b64decode(block["b64"])
LOWObfuscation / stealth · obf.decode_call · CWE-506, CWE-94
packages/hwpx-writer/tests/test_review_fixes.py:21
PNG_1PX = base64.b64decode(
LOWObfuscation / stealth · obf.decode_call · CWE-506, CWE-94
packages/hwpx-writer/tests/test_version_guard.py:39
png = base64.b64decode(

Gates applied: no_behavioural_pass.

Audited 2026-10-14 · audit v0.4.1 · source sha e1f4c118db30full audit observations/trust-audit/skill/eum-jium__hwpx-reporter.json · Report an issue / request a re-scan
06

Audit history

Every audit this skill has had.

DateSourceVerdictGradeScoreChange
2026-10-14e1f4c118db30BLOCKD69first audit
07

Questions

What does the hwpx-reporter skill do?

한/글 없이 HWPX 문서를 만들고 읽는 파이썬 툴킷 · MCP 서버 · claude.ai 스킬 — 2026-10-14 공개 스냅샷(동결)

Is hwpx-reporter safe to install?

No — not without reading the findings first. The audit graded it D (69/100) and found 1 critical or high issue in the source. Each one is listed on this page with the file and line it is on.

What can hwpx-reporter access on my machine?

The audit observed that it reaches the network, runs shell commands and reads or writes files. Each of those is consistent with what it says it does. Secrets in the source: found — see the findings.

Which assistants does hwpx-reporter work with?

Its documentation mentions claude-code and claude-desktop. That is what the text claims, not a compatibility test we ran.

How current is this page?

The grade is for one exact copy of the source (e1f4c118db30), read on 2026-10-14. The repository is watched, and a new audit runs when it changes — this is the first audit.

Advertisement