kordoc 4.14.3 → 4.15.0

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 (145) hide show
  1. package/README.md +30 -4
  2. package/dist/{-7XBPXCXN.js → -WXTUDCBW.js} +11 -11
  3. package/dist/{chunk-UVVEBI22.js → chunk-23AJ65GX.js} +707 -62
  4. package/dist/chunk-23AJ65GX.js.map +1 -0
  5. package/dist/chunk-2FT2DHE6.js +2400 -0
  6. package/dist/chunk-2FT2DHE6.js.map +1 -0
  7. package/dist/{chunk-EBZUZC6F.cjs → chunk-3CWXYYCL.cjs} +38 -30
  8. package/dist/chunk-3CWXYYCL.cjs.map +1 -0
  9. package/dist/{chunk-A275ZQLX.js → chunk-4OLS5RDH.js} +707 -62
  10. package/dist/chunk-4OLS5RDH.js.map +1 -0
  11. package/dist/{chunk-NQCUAGLR.js → chunk-6BWU6SQX.js} +1 -1
  12. package/dist/{chunk-2LQGSDZ6.js.map → chunk-6BWU6SQX.js.map} +1 -1
  13. package/dist/{chunk-2LQGSDZ6.js → chunk-6CUIXJOC.js} +1 -1
  14. package/dist/{chunk-NQCUAGLR.js.map → chunk-6CUIXJOC.js.map} +1 -1
  15. package/dist/{chunk-L5EH2NVO.js → chunk-6Y6KUOA6.js} +14 -3
  16. package/dist/chunk-6Y6KUOA6.js.map +1 -0
  17. package/dist/{chunk-QGW7NMTX.js → chunk-AKWMQ5XT.js} +17 -9
  18. package/dist/chunk-AKWMQ5XT.js.map +1 -0
  19. package/dist/{chunk-O2PGQNYE.js → chunk-B3NAP4FA.js} +2 -2
  20. package/dist/{chunk-CVEERPMP.js → chunk-DTM6FV74.js} +1727 -1680
  21. package/dist/chunk-DTM6FV74.js.map +1 -0
  22. package/dist/{chunk-IW2CB755.cjs → chunk-EP4DTCVJ.cjs} +392 -42
  23. package/dist/chunk-EP4DTCVJ.cjs.map +1 -0
  24. package/dist/{chunk-5VVS2QIJ.cjs → chunk-FSQJJTHS.cjs} +3 -3
  25. package/dist/{chunk-5VVS2QIJ.cjs.map → chunk-FSQJJTHS.cjs.map} +1 -1
  26. package/dist/{chunk-D6KQKMU3.js → chunk-H5XLUEZG.js} +2 -2
  27. package/dist/{chunk-GTINVM5K.js → chunk-IMR5HSB5.js} +2 -2
  28. package/dist/{chunk-FAZR34CA.js → chunk-KNZUG3SV.js} +2 -2
  29. package/dist/{chunk-I4NNYWIR.js → chunk-KO5S25RD.js} +23 -3
  30. package/dist/chunk-KO5S25RD.js.map +1 -0
  31. package/dist/{chunk-EMGF6EEV.cjs → chunk-LBYKEJUJ.cjs} +17 -6
  32. package/dist/chunk-LBYKEJUJ.cjs.map +1 -0
  33. package/dist/{chunk-VYOGXNQ3.js → chunk-M26GSDV3.js} +16 -8
  34. package/dist/chunk-M26GSDV3.js.map +1 -0
  35. package/dist/{chunk-IHZEFW4L.js → chunk-MX36AA26.js} +2 -2
  36. package/dist/{chunk-4R67INKT.js → chunk-NJP76IZ5.js} +389 -39
  37. package/dist/chunk-NJP76IZ5.js.map +1 -0
  38. package/dist/{chunk-YGBZABI4.js → chunk-PJ2K6B3V.js} +78 -67
  39. package/dist/chunk-PJ2K6B3V.js.map +1 -0
  40. package/dist/{chunk-VNFJPTU4.js → chunk-QMUM25RB.js} +2 -2
  41. package/dist/{chunk-VJHAUMCF.js → chunk-S5PJ7ZE2.js} +389 -39
  42. package/dist/chunk-S5PJ7ZE2.js.map +1 -0
  43. package/dist/{chunk-JCVIOLBF.js → chunk-TDYGL267.js} +11 -13
  44. package/dist/{chunk-JCVIOLBF.js.map → chunk-TDYGL267.js.map} +1 -1
  45. package/dist/{chunk-WB5LW52Z.js → chunk-UCDOIHGW.js} +2 -2
  46. package/dist/{chunk-HX4UUF7Y.cjs → chunk-VWUYVEFN.cjs} +1 -1
  47. package/dist/{chunk-HX4UUF7Y.cjs.map → chunk-VWUYVEFN.cjs.map} +1 -1
  48. package/dist/{chunk-NOAQRCV6.cjs → chunk-W33QEDLY.cjs} +730 -85
  49. package/dist/chunk-W33QEDLY.cjs.map +1 -0
  50. package/dist/{chunk-4RJ5D7MT.js → chunk-YINJO3PR.js} +2 -2
  51. package/dist/chunks-S2XR4JDI.js +10 -0
  52. package/dist/cli.js +44 -45
  53. package/dist/cli.js.map +1 -1
  54. package/dist/{formula-CPO2TZGB.cjs → formula-RGK6WGD2.cjs} +9 -9
  55. package/dist/{formula-CPO2TZGB.cjs.map → formula-RGK6WGD2.cjs.map} +1 -1
  56. package/dist/{formula-X44GV7TN.js → formula-USQK6NHN.js} +3 -3
  57. package/dist/{formula-NOIDZEBA.js → formula-WGBYDRVU.js} +4 -4
  58. package/dist/{image-ocr-SUGT64ZM.cjs → image-ocr-JPP6JRFU.cjs} +13 -13
  59. package/dist/{image-ocr-SUGT64ZM.cjs.map → image-ocr-JPP6JRFU.cjs.map} +1 -1
  60. package/dist/{image-ocr-R6W6A75P.js → image-ocr-SLYPOW7G.js} +6 -6
  61. package/dist/{image-ocr-72RAR4WR.js → image-ocr-WCKYPPXY.js} +8 -8
  62. package/dist/index.cjs +4333 -2500
  63. package/dist/index.cjs.map +1 -1
  64. package/dist/index.d.cts +12 -19
  65. package/dist/index.d.ts +12 -19
  66. package/dist/index.js +3816 -1983
  67. package/dist/index.js.map +1 -1
  68. package/dist/mcp.js +46 -35
  69. package/dist/mcp.js.map +1 -1
  70. package/dist/{model-bundle-57CLEBCO.js → model-bundle-BIS5HNXA.js} +5 -5
  71. package/dist/{models-7ELIFTD7.js → models-APDLDMGJ.js} +5 -5
  72. package/dist/{parser-4NKAYWAX.js → parser-4D2YTTIH.js} +494 -50
  73. package/dist/parser-4D2YTTIH.js.map +1 -0
  74. package/dist/{parser-HWFQRSUQ.js → parser-6ZWJPQC2.js} +494 -50
  75. package/dist/parser-6ZWJPQC2.js.map +1 -0
  76. package/dist/{parser-RANGXGBD.cjs → parser-Y5NX55GC.cjs} +543 -99
  77. package/dist/parser-Y5NX55GC.cjs.map +1 -0
  78. package/dist/pdf-ocr-E3IZ3EI5.cjs +14 -0
  79. package/dist/{pdf-ocr-VHSFACH7.cjs.map → pdf-ocr-E3IZ3EI5.cjs.map} +1 -1
  80. package/dist/pdf-ocr-FNXYMNM6.js +16 -0
  81. package/dist/pdf-ocr-WSYPOBBU.js +13 -0
  82. package/dist/{profile-io-V52PL5ZO.js → profile-io-VJUZYOJA.js} +3 -3
  83. package/dist/{rasterize-ZIGLJDOG.js → rasterize-6U5NWILD.js} +3 -3
  84. package/dist/{redact-TIQEQI3M.js → redact-3CY3KGVD.js} +2 -2
  85. package/dist/{redact-doc-KXZ3TZAG.js → redact-doc-H56QYJGQ.js} +98 -30
  86. package/dist/redact-doc-H56QYJGQ.js.map +1 -0
  87. package/dist/{render-U5PE6V2E.js → render-HNMDLMI2.js} +7 -7
  88. package/dist/seal-VXNEOHZV.js +10 -0
  89. package/dist/{setup-YRDM4ODP.js → setup-RZVYAXAV.js} +3 -3
  90. package/dist/visual-NSZP2FWZ.js +19 -0
  91. package/dist/{watch-5IOLBATT.js → watch-VA6GK56C.js} +46 -23
  92. package/dist/watch-VA6GK56C.js.map +1 -0
  93. package/package.json +2 -2
  94. package/dist/chunk-4R67INKT.js.map +0 -1
  95. package/dist/chunk-A275ZQLX.js.map +0 -1
  96. package/dist/chunk-CVEERPMP.js.map +0 -1
  97. package/dist/chunk-EBZUZC6F.cjs.map +0 -1
  98. package/dist/chunk-EMGF6EEV.cjs.map +0 -1
  99. package/dist/chunk-I4NNYWIR.js.map +0 -1
  100. package/dist/chunk-IH56ZISC.js +0 -620
  101. package/dist/chunk-IH56ZISC.js.map +0 -1
  102. package/dist/chunk-IW2CB755.cjs.map +0 -1
  103. package/dist/chunk-L5EH2NVO.js.map +0 -1
  104. package/dist/chunk-NOAQRCV6.cjs.map +0 -1
  105. package/dist/chunk-QGW7NMTX.js.map +0 -1
  106. package/dist/chunk-UVVEBI22.js.map +0 -1
  107. package/dist/chunk-VJHAUMCF.js.map +0 -1
  108. package/dist/chunk-VYOGXNQ3.js.map +0 -1
  109. package/dist/chunk-YGBZABI4.js.map +0 -1
  110. package/dist/chunks-I7TEMJXH.js +0 -10
  111. package/dist/parser-4NKAYWAX.js.map +0 -1
  112. package/dist/parser-HWFQRSUQ.js.map +0 -1
  113. package/dist/parser-RANGXGBD.cjs.map +0 -1
  114. package/dist/pdf-ocr-BNC34MNU.js +0 -13
  115. package/dist/pdf-ocr-QX2GB33Q.js +0 -16
  116. package/dist/pdf-ocr-VHSFACH7.cjs +0 -14
  117. package/dist/redact-doc-KXZ3TZAG.js.map +0 -1
  118. package/dist/seal-DNXJBILR.js +0 -10
  119. package/dist/visual-5XWMA4EV.js +0 -19
  120. package/dist/watch-5IOLBATT.js.map +0 -1
  121. /package/dist/{-7XBPXCXN.js.map → -WXTUDCBW.js.map} +0 -0
  122. /package/dist/{chunk-O2PGQNYE.js.map → chunk-B3NAP4FA.js.map} +0 -0
  123. /package/dist/{chunk-D6KQKMU3.js.map → chunk-H5XLUEZG.js.map} +0 -0
  124. /package/dist/{chunk-GTINVM5K.js.map → chunk-IMR5HSB5.js.map} +0 -0
  125. /package/dist/{chunk-FAZR34CA.js.map → chunk-KNZUG3SV.js.map} +0 -0
  126. /package/dist/{chunk-IHZEFW4L.js.map → chunk-MX36AA26.js.map} +0 -0
  127. /package/dist/{chunk-VNFJPTU4.js.map → chunk-QMUM25RB.js.map} +0 -0
  128. /package/dist/{chunk-WB5LW52Z.js.map → chunk-UCDOIHGW.js.map} +0 -0
  129. /package/dist/{chunk-4RJ5D7MT.js.map → chunk-YINJO3PR.js.map} +0 -0
  130. /package/dist/{chunks-I7TEMJXH.js.map → chunks-S2XR4JDI.js.map} +0 -0
  131. /package/dist/{formula-X44GV7TN.js.map → formula-USQK6NHN.js.map} +0 -0
  132. /package/dist/{formula-NOIDZEBA.js.map → formula-WGBYDRVU.js.map} +0 -0
  133. /package/dist/{image-ocr-R6W6A75P.js.map → image-ocr-SLYPOW7G.js.map} +0 -0
  134. /package/dist/{image-ocr-72RAR4WR.js.map → image-ocr-WCKYPPXY.js.map} +0 -0
  135. /package/dist/{model-bundle-57CLEBCO.js.map → model-bundle-BIS5HNXA.js.map} +0 -0
  136. /package/dist/{models-7ELIFTD7.js.map → models-APDLDMGJ.js.map} +0 -0
  137. /package/dist/{pdf-ocr-BNC34MNU.js.map → pdf-ocr-FNXYMNM6.js.map} +0 -0
  138. /package/dist/{pdf-ocr-QX2GB33Q.js.map → pdf-ocr-WSYPOBBU.js.map} +0 -0
  139. /package/dist/{profile-io-V52PL5ZO.js.map → profile-io-VJUZYOJA.js.map} +0 -0
  140. /package/dist/{rasterize-ZIGLJDOG.js.map → rasterize-6U5NWILD.js.map} +0 -0
  141. /package/dist/{redact-TIQEQI3M.js.map → redact-3CY3KGVD.js.map} +0 -0
  142. /package/dist/{render-U5PE6V2E.js.map → render-HNMDLMI2.js.map} +0 -0
  143. /package/dist/{seal-DNXJBILR.js.map → seal-VXNEOHZV.js.map} +0 -0
  144. /package/dist/{setup-YRDM4ODP.js.map → setup-RZVYAXAV.js.map} +0 -0
  145. /package/dist/{visual-5XWMA4EV.js.map → visual-NSZP2FWZ.js.map} +0 -0
package/README.md CHANGED
@@ -84,11 +84,34 @@ MCP 등록 대신 스킬(SKILL.md) 형태로 쓰려면:
84
84
  * **✏️ 양식 자동 채우기**: 공문서 양식 템플릿(신청서, 보고서)에 값을 넣으면 자동으로 빈칸을 채웁니다. 원본 서식(글꼴, 크기, 정렬)을 100% 보존합니다.
85
85
  * **👓 내장 OCR — API 키 없이 (v4.2)**: 스캔본·이미지 PDF와 PNG/JPG/WebP 이미지를 **로컬 CPU 추론**(PP-OCRv5 korean)으로 읽습니다. 외부 서비스도 API 키도 없이, 텍스트층이 깨진 페이지만 골라 OCR 하고, 래스터 괘선까지 찾아 스캔본에서도 표를 복원합니다.
86
86
  * **📑 RAG·인용 대응 (v4.1~4.8)**: 헤딩·개조식 위계를 breadcrumb으로 보존한 구조 청크(`--format chunks`)와, 조판 캐시로 복원한 **실제 쪽 번호** 기준 페이지별 마크다운(`pages`)을 냅니다 — 답변에 "몇 쪽" 각주를 붙일 수 있습니다.
87
- * **🕶️ 개인정보 마스킹 (v4.1)**: 주민·외국인등록번호·전화·이메일·카드·계좌·사업자등록번호·여권·운전면허를 탐지해 **원본 서식 그대로** 가린 HWPX/HWP를 냅니다 (`kordoc redact`). 본문·표·머리말/꼬리말·각주·글상자·필드·미리보기(텍스트·이미지)·문서 정보(제목·작성자)까지 가리고, 결과 파일을 다시 훑어 남은 개인정보가 있으면 실패(exit 2)로 알립니다. **PDF·DOCX·XLSX 등은 원본 파일을 고치지 않고 마스킹된 마크다운만** 냅니다 — PDF 자체의 가림(redaction)은 지원하지 않습니다. 이미지 속 글자·이름·주소는 탐지하지 못하는 자동 검출 보조 도구이므로 공개 전 사람 확인은 필수입니다.
87
+ * **🕶️ 개인정보 마스킹 (v4.1)**: 주민·외국인등록번호·전화·이메일·카드·계좌·사업자등록번호·여권·운전면허(v4.14.4 부터 opt-in 으로 이름·주소)를 탐지해 **원본 서식 그대로** 가린 HWPX/HWP를 냅니다 (`kordoc redact`). 본문·표·머리말/꼬리말·각주·글상자·필드·미리보기(텍스트·이미지)·문서 정보(제목·작성자)까지 가리고, 결과 파일을 다시 훑어 남은 개인정보가 있으면 실패(exit 2)로 알립니다. **PDF·DOCX·XLSX 등은 원본 파일을 고치지 않고 마스킹된 마크다운만** 냅니다 — PDF 자체의 가림(redaction)은 지원하지 않습니다. 이미지 속 글자와 문맥 없는 맨이름은 탐지하지 못하는 자동 검출 보조 도구이므로 공개 전 사람 확인은 필수입니다.
88
88
  * **🤖 AI 에이전트 연동 (MCP)**: `Claude Desktop`, `Cursor`, `Codex`와 같은 도구에서 직접 `kordoc`을 호출해 문서를 읽고 코딩할 수 있습니다.
89
89
 
90
90
  ---
91
91
 
92
+ ## v4.15.0 변경사항
93
+
94
+ 실문서 코퍼스를 보강하고 프로덕션 리뷰에서 확인한 파싱·보안·성능 문제를 고쳤습니다.
95
+
96
+ - **긴 스프레드시트**: XLSX·XLS의 1만 행 무경고 절단을 수정하고, 칸 예산을 초과하면 경고합니다. XLSX는 XML을 행 묶음으로 읽어 대형 시트 메모리를 줄이고, XLS는 희소 격자를 사용합니다. 동아시아 날짜와 DOCX 머리글·바닥글도 보완했습니다.
97
+ - **PDF 글**: 실제 낱말을 붙이던 균등배분 정리, 표 칸의 글자 조각, 날짜 빈칸, 넓은 줄간격의 문단 이음을 고쳤습니다.
98
+ - **보안**: HTML 표 칸의 원문을 이스케이프하고, 인쇄·렌더 PDF는 JavaScript를 끄고 `data:`·`about:` 외 요청을 차단합니다. webhook의 IPv6 SSRF 방어와 MCP 쓰기 경로 제한도 보강했습니다.
99
+ - **안정성과 속도**: CLI·MCP·parse-worker의 진단 메시지를 stderr로 보내 JSON 출력을 보호합니다. 확장자가 실제 형식과 다른 문서의 무손실 패치를 고치고, 문서 비교·여러 구간 치환의 반복 계산을 줄였습니다.
100
+ - **인명·주소 마스킹**: 회의록 발언자·기관 직함 앞 이름·결재란과 도로명 변형을 보강하고 오탐을 줄였습니다(opt-in).
101
+ - **디렉토리 감시**: `watch -d`가 하위 폴더 구조를 보존해 같은 파일명끼리 덮어쓰지 않습니다. [PR #82](https://github.com/chrisryugj/kordoc/pull/82), 기여: @ROTl24.
102
+ - **검증 코퍼스**: 정책브리핑 HWPX↔PDF 300쌍, DOCX↔LibreOffice PDF 36쌍과 XLS 정답지 트랙을 추가했습니다. 자세한 실측은 [CHANGELOG](CHANGELOG.md)를 참고하세요.
103
+
104
+ ## v4.14.4 변경사항
105
+
106
+ 읽기 품질을 한 번 더 점검했습니다. 원본 HWPX 를 정답으로 PDF 글을 재는 벤치를 새로 세워 띄어쓰기·읽기 순서까지 보고, PDF 표·OCR·개인정보 마스킹을 고쳤습니다.
107
+
108
+ - **📊 PDF 표**: 쪽을 넘는 표의 쪼개진 행과 반복 머리 행, 쪽을 넘는 한 칸, 표 위에 걸친 그림·글상자, 셀 간격 표를 바로잡았습니다. hwpx↔pdf 430쌍 1,784표 정확 일치 90.1% → 92.9%, 표 안의 표 63.7% → 72.0%. 텍스트층이 있는 417쌍만 보면 94.5%, 칸 글이 제자리에 있는 비율 0.768 → 0.903.
109
+ - **✍️ PDF 띄어쓰기·줄 이음**: 본문을 시각 줄이 아니라 문단으로 복원합니다. 한글이 글자 단위로 줄바꿈된 문서에서 "재 일학도의용군인"·"또 는" 처럼 낱말 중간에 공백이 들어가던 것을 조사·어미·문서 안 어휘로 판정해 붙입니다. 어절 F1 0.925 → 0.971.
110
+ - **🧮 한컴 밖에서 만든 PDF**: 예산서처럼 글자마다 떨어져 찍힌 숫자("2 0 , 7 7 5" → "20,775"), 행마다 끊어 그은 괘선, 빈칸 위에 따로 얹은 숫자를 바로잡았습니다. PDF 글자 커버리지 0.99569 → 0.99760.
111
+ - **🔎 글자를 곡선으로 그린 PDF**: 한글을 글꼴 대신 곡선으로 그린 쪽은 텍스트층에 한글이 없어 종전엔 경고 없이 한글이 빠졌습니다. 이런 쪽을 찾아(`ocrReason: "vector_text"`) OCR 을 켜면 읽고, 끄면 경고합니다. 표는 그 쪽의 실제 괘선으로 복원합니다.
112
+ - **👓 OCR**: 점선 괘선·색 칸 경계·목차 리더 점·숫자 앞 △ 를 바로잡았습니다. 글자 오류율 0.171 → 0.096(정답지인 텍스트층 수정분 포함), OCR 표 셀 F1 0.440 → 0.618.
113
+ - **🕶️ 개인정보 마스킹 인명·주소** (opt-in, `--rules …,name,address`): 역할어·호칭·라벨·표 머리글 문맥으로 이름을, 도로명·지번 문법으로 주소를 찾아 가립니다(주소는 시·군·구까지 남김). 외부 정답(473문장) 인명 354/411·주소 141/141, 실문서 표본 오탐 0. 공무원 결재란 이름은 정보공개 관행상 공개 대상이라 기본값에는 넣지 않았습니다.
114
+
92
115
  ## v4.14.3 변경사항
93
116
 
94
117
  읽기 품질을 전면 점검했습니다. 코퍼스를 넓히고(rhwp 표본 1,351파일·정책브리핑 hwpx+pdf 짝 200쌍) 포맷마다 정답지 벤치를 다시 세운 뒤 표·PDF·OCR·개인정보 마스킹을 고쳤고, 검색 색인처럼 글자만 필요한 호출자를 위한 두 가지를 더했습니다.
@@ -921,7 +944,7 @@ CLI 는 `kordoc 문서.pdf --format json --no-images`. 대량 변환은 `kordoc
921
944
  stdin 으로 한 줄씩 요청합니다 (한 줄 = 한 JSON).
922
945
 
923
946
  ```text
924
- 시작 {"ready":true,"version":"4.14.3","protocol":1}
947
+ 시작 {"ready":true,"version":"4.15.0","protocol":1}
925
948
  요청 {"id":1,"file":"문서.hwpx","images":false,"ocr":"off"}
926
949
  응답 {"id":1,"rss":183500800,"result":{ …--format json 과 같은 결과, 실패도 success:false 로… }}
927
950
  종료 {"cmd":"quit"} (또는 stdin 닫기)
@@ -977,7 +1000,7 @@ for (const p of r.pageQuality ?? []) {
977
1000
  }
978
1001
  ```
979
1002
 
980
- 신호 키: `textChars`, `hangulRatio`, `controlCharRatio`, `replacementCharRatio`, `puaRatio` / `needsOcr` (페이지·문서 단위) / `ocrReason` (`low_text` | `high_pua` | `high_control` | `high_replacement`).
1003
+ 신호 키: `textChars`, `hangulRatio`, `controlCharRatio`, `replacementCharRatio`, `puaRatio` / `needsOcr` (페이지·문서 단위) / `ocrReason` (`low_text` | `high_pua` | `high_control` | `high_replacement` | `garbled_hangul` | `vector_text`). `vector_text` 는 글자를 곡선으로 그려 텍스트층에 글이 없는 쪽입니다(v4.14.4).
981
1004
 
982
1005
  ## CLI
983
1006
 
@@ -1007,6 +1030,7 @@ npx kordoc lint 보고서.md # 공문서 표기법
1007
1030
  npx kordoc redact 민원서류.hwpx -o 마스킹.hwpx # 개인정보 탐지 + 서식 보존 마스킹 (머리말·각주·미리보기·문서 정보 포함, 잔존 재검사 — 남으면 exit 2)
1008
1031
  npx kordoc redact 민원서류.hwpx --mask-char '*' -o 마스킹.hwpx # 마스크 문자 지정 (기본 ●)
1009
1032
  npx kordoc redact 계약서.hwp --rules rrn,phone,crn --json --dry-run # 룰 선택(법인등록번호 crn·IP 는 opt-in) + 위치별 리포트만
1033
+ npx kordoc redact 민원서류.hwpx --rules rrn,phone,email,name,address -o 마스킹.hwpx # 이름·주소까지 (opt-in)
1010
1034
  npx kordoc redact 공문.pdf # PDF·DOCX 등은 원본을 고치지 않고 마스킹된 마크다운(.redacted.md)만 — PDF 가림 미지원
1011
1035
  npx kordoc profile 기관서식.hwpx # 표 서식 프로필(JSON) 추출 → generate --profile 로 재현
1012
1036
  npx kordoc render 결재문서.hwpx -o 미리보기.svg # 레이아웃 보존 SVG 렌더 (캐시 없는 문서는 자동 reflow 조판, --no-reflow로 끔)
@@ -1018,6 +1042,8 @@ npx kordoc watch ./수신함 -d ./변환결과 # 폴더 감시 모
1018
1042
  npx kordoc watch ./문서 --webhook https://api/hook # 웹훅 알림
1019
1043
  ```
1020
1044
 
1045
+ `watch -d` 는 감시 폴더 안의 하위 폴더 구조를 출력에도 그대로 둡니다: `수신함/팀/보고서.hwpx` → `변환결과/팀/보고서.md`(또는 `.json`). `수신함` 바로 아래 파일은 종전처럼 `변환결과` 바로 아래에 씁니다.
1046
+
1021
1047
  > `check-ocr-models` · `check-formula-models` 는 이름과 달리 **없거나 SHA 가 안 맞으면 내려받습니다**.
1022
1048
  > 상태만 보려면 `--status-only` 를 붙이세요 (수식 모델은 ~155MB).
1023
1049
  >
@@ -1124,7 +1150,7 @@ codex mcp add kordoc -- npx -y kordoc mcp
1124
1150
  | `generate_document` | 마크다운(표·수식·차트 포함) → HWPX 생성, 공문서 프리셋 (v3.5) |
1125
1151
  | `place_seal` | 도장/서명 이미지를 앵커 문구 위에 부유 배치 (v3.16) |
1126
1152
  | `render_document` | HWPX·HWP를 조판 그대로 PNG/JPEG 이미지(응답)·SVG/HTML/PDF 파일로 렌더 — 생성·수정 결과를 AI가 눈으로 검증 (v4.1, HWP·포맷 확장 v4.13.1) |
1127
- | `redact_document` | 개인정보(주민·외국인등록번호·전화·이메일·카드·계좌·사업자등록번호·여권·운전면허, opt-in 법인등록번호·IP) 탐지 + 서식 보존 마스킹 — HWPX/HWP는 머리말·각주·미리보기·문서 정보까지 가리고 잔존 재검사, 그 외 포맷은 마스킹된 마크다운만 (v4.1) |
1153
+ | `redact_document` | 개인정보(주민·외국인등록번호·전화·이메일·카드·계좌·사업자등록번호·여권·운전면허, opt-in 법인등록번호·IP·이름·주소) 탐지 + 서식 보존 마스킹 — HWPX/HWP는 머리말·각주·미리보기·문서 정보까지 가리고 잔존 재검사, 그 외 포맷은 마스킹된 마크다운만 (v4.1) |
1128
1154
  | `parse_chunks` | RAG용 구조 청크 JSON — 헤딩·개조식 위계 breadcrumb + 표 독립 청크 (v4.1) |
1129
1155
  | `crop_regions` | 렌더 영역(표·이미지·문단·도형)을 페이지 이미지에서 실배율로 잘라 저장 + regions.json (v4.13) |
1130
1156
  | `extract_tables` | 표 분류(데이터표/조직도류/불확실) + 페이지·bbox + 정책별 crop — 조직도는 이미지로, 데이터표는 구조로 (v4.13.1) |
@@ -51,22 +51,22 @@ import {
51
51
  unknownFontWarnings,
52
52
  usesGaejosikMunche,
53
53
  validateHwpx
54
- } from "./chunk-CVEERPMP.js";
54
+ } from "./chunk-DTM6FV74.js";
55
55
  import {
56
56
  applySplices,
57
57
  buildParagraphSplices,
58
58
  buildRangeSplices,
59
59
  placeSealHwpx,
60
60
  scanSectionXml
61
- } from "./chunk-JCVIOLBF.js";
61
+ } from "./chunk-TDYGL267.js";
62
62
  import {
63
63
  DEFAULT_REDACT_RULES,
64
64
  redactMarkdown,
65
65
  redactText
66
- } from "./chunk-IH56ZISC.js";
66
+ } from "./chunk-2FT2DHE6.js";
67
67
  import {
68
68
  blocksToChunks
69
- } from "./chunk-IHZEFW4L.js";
69
+ } from "./chunk-MX36AA26.js";
70
70
  import {
71
71
  SPACE_EM_FIXED,
72
72
  SPACE_EM_FONT,
@@ -91,20 +91,20 @@ import {
91
91
  renderSceneToHtml,
92
92
  simulateWrap,
93
93
  simulateWrapKeepWord
94
- } from "./chunk-YGBZABI4.js";
94
+ } from "./chunk-PJ2K6B3V.js";
95
95
  import "./chunk-7FCNOKOR.js";
96
- import "./chunk-NQCUAGLR.js";
96
+ import "./chunk-6BWU6SQX.js";
97
97
  import "./chunk-MOL7MDBG.js";
98
- import "./chunk-4RJ5D7MT.js";
98
+ import "./chunk-YINJO3PR.js";
99
99
  import {
100
100
  blocksToMarkdown,
101
101
  flattenLayoutTables,
102
102
  hasStructuredCellContent
103
- } from "./chunk-QGW7NMTX.js";
104
- import "./chunk-VNFJPTU4.js";
103
+ } from "./chunk-AKWMQ5XT.js";
104
+ import "./chunk-QMUM25RB.js";
105
105
  import {
106
106
  VERSION
107
- } from "./chunk-I4NNYWIR.js";
107
+ } from "./chunk-KO5S25RD.js";
108
108
  export {
109
109
  BUILTIN_TEMPLATES,
110
110
  DEFAULT_REDACT_RULES,
@@ -194,4 +194,4 @@ export {
194
194
  usesGaejosikMunche,
195
195
  validateHwpx
196
196
  };
197
- //# sourceMappingURL=-7XBPXCXN.js.map
197
+ //# sourceMappingURL=-WXTUDCBW.js.map