kordoc 4.8.1 → 4.9.1

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 (122) hide show
  1. package/README.md +14 -0
  2. package/dist/{-BPSOA7WX.js → -KIYHEVUW.js} +14 -8
  3. package/dist/{chunk-FZA5HW4K.cjs → chunk-2ULV2DX4.cjs} +4 -4
  4. package/dist/chunk-2ULV2DX4.cjs.map +1 -0
  5. package/dist/{chunk-I6Q5K2YF.js → chunk-3PY5YCJP.js} +2 -2
  6. package/dist/{chunk-D6NDAA72.cjs → chunk-4R73ASZF.cjs} +2 -2
  7. package/dist/chunk-4R73ASZF.cjs.map +1 -0
  8. package/dist/{chunk-C5IU7Q3W.js → chunk-55Q76S6S.js} +2 -2
  9. package/dist/{chunk-YCSXG6SY.js → chunk-5CAKNM2K.js} +2 -2
  10. package/dist/{chunk-DVEJRBFI.cjs → chunk-65TL66UD.cjs} +3 -3
  11. package/dist/chunk-65TL66UD.cjs.map +1 -0
  12. package/dist/{chunk-H25XAYE4.cjs → chunk-D7EMDOX7.cjs} +6 -6
  13. package/dist/chunk-D7EMDOX7.cjs.map +1 -0
  14. package/dist/chunk-DCZVOIEO.cjs.map +1 -1
  15. package/dist/{chunk-YOFMKKCA.js → chunk-GNRBCV4R.js} +3 -3
  16. package/dist/chunk-GS7T56RP.cjs.map +1 -1
  17. package/dist/{chunk-KTAWKNYX.js → chunk-GU4NCNCT.js} +2 -2
  18. package/dist/{chunk-I6EWYT3Y.js → chunk-HFZIYAQQ.js} +2 -2
  19. package/dist/{chunk-MYOGZQMD.js → chunk-HG7GXBVP.js} +2 -2
  20. package/dist/{chunk-XZEDL6B4.cjs → chunk-HOSNMNKU.cjs} +7 -7
  21. package/dist/chunk-HOSNMNKU.cjs.map +1 -0
  22. package/dist/{chunk-ETMMB6O2.js → chunk-INV3W43Y.js} +2 -2
  23. package/dist/{chunk-5EWPDL7S.js → chunk-JHXAQDXS.js} +288 -21
  24. package/dist/chunk-JHXAQDXS.js.map +1 -0
  25. package/dist/{chunk-DIB2I2HP.js → chunk-L27YEW3T.js} +3 -3
  26. package/dist/chunk-L5CDTOC3.cjs.map +1 -1
  27. package/dist/{chunk-N7HKWVGP.js → chunk-Q3IVAWOK.js} +3 -3
  28. package/dist/{chunk-A6EAUP2J.js → chunk-SFSB3FAL.js} +2 -2
  29. package/dist/{chunk-66BZATFV.js → chunk-SGTGSV4A.js} +2 -2
  30. package/dist/{chunk-Y4H75LKS.js → chunk-TC7EDYZD.js} +2 -2
  31. package/dist/{chunk-4CUEYYQF.js → chunk-TN6AALZG.js} +2 -2
  32. package/dist/{chunk-NJMWYRLY.js → chunk-UIQWUYOJ.js} +5 -4
  33. package/dist/{chunk-NJMWYRLY.js.map → chunk-UIQWUYOJ.js.map} +1 -1
  34. package/dist/{chunk-XGXKICRN.js → chunk-VGRIWMTQ.js} +2 -2
  35. package/dist/{chunk-6KFW772K.js → chunk-Z2SX4E7K.js} +2 -2
  36. package/dist/chunks-FB344JZT.js +10 -0
  37. package/dist/cli.js +47 -25
  38. package/dist/cli.js.map +1 -1
  39. package/dist/{formula-T4AIR2LX.js → formula-5DQQ4MFT.js} +4 -4
  40. package/dist/{formula-ODJ7GSUH.cjs → formula-I5D3UNLV.cjs} +9 -9
  41. package/dist/formula-I5D3UNLV.cjs.map +1 -0
  42. package/dist/{formula-7XQLPNSO.js → formula-S4O7SBN3.js} +3 -3
  43. package/dist/{image-ocr-WMTQ357I.cjs → image-ocr-BKUYR4WU.cjs} +11 -11
  44. package/dist/image-ocr-BKUYR4WU.cjs.map +1 -0
  45. package/dist/{image-ocr-TZU64JJF.js → image-ocr-LIH2E7WC.js} +5 -5
  46. package/dist/{image-ocr-EJLWGR3B.js → image-ocr-SQXFTNYR.js} +7 -7
  47. package/dist/index.cjs +457 -189
  48. package/dist/index.cjs.map +1 -1
  49. package/dist/index.d.cts +46 -1
  50. package/dist/index.d.ts +46 -1
  51. package/dist/index.js +286 -18
  52. package/dist/index.js.map +1 -1
  53. package/dist/mcp.js +19 -16
  54. package/dist/mcp.js.map +1 -1
  55. package/dist/{model-bundle-OT2OTSGH.js → model-bundle-4JMY5E37.js} +5 -5
  56. package/dist/{models-MUVFWN7M.js → models-D7X5YBWX.js} +5 -5
  57. package/dist/page-range-P7SDW6LR.cjs.map +1 -1
  58. package/dist/{parser-ERSNBILY.js → parser-GHRXWFJN.js} +6 -6
  59. package/dist/{parser-E6NQ666P.js → parser-MY7JJISJ.js} +6 -6
  60. package/dist/{parser-XVUFA35I.cjs → parser-ZLHOAZAA.cjs} +26 -26
  61. package/dist/parser-ZLHOAZAA.cjs.map +1 -0
  62. package/dist/pdf-ocr-FESGFQYN.cjs +14 -0
  63. package/dist/pdf-ocr-FESGFQYN.cjs.map +1 -0
  64. package/dist/pdf-ocr-IEAXGG3D.js +13 -0
  65. package/dist/pdf-ocr-Z6CHIYEM.js +16 -0
  66. package/dist/{profile-io-IRW6XCXH.js → profile-io-EAPI6M7O.js} +3 -3
  67. package/dist/{rasterize-BNF6QTLY.js → rasterize-UIDZAEWB.js} +2 -2
  68. package/dist/render-XL7ZVAHK.js +10 -0
  69. package/dist/seal-CY7EIWDJ.js +10 -0
  70. package/dist/{setup-BXOXVBU3.js → setup-UHX3HHWY.js} +3 -3
  71. package/dist/{watch-7PYYGQUJ.js → watch-23MV3PBX.js} +9 -9
  72. package/package.json +1 -1
  73. package/dist/chunk-5EWPDL7S.js.map +0 -1
  74. package/dist/chunk-D6NDAA72.cjs.map +0 -1
  75. package/dist/chunk-DVEJRBFI.cjs.map +0 -1
  76. package/dist/chunk-FZA5HW4K.cjs.map +0 -1
  77. package/dist/chunk-H25XAYE4.cjs.map +0 -1
  78. package/dist/chunk-XZEDL6B4.cjs.map +0 -1
  79. package/dist/chunks-HYXNV3WP.js +0 -10
  80. package/dist/formula-ODJ7GSUH.cjs.map +0 -1
  81. package/dist/image-ocr-WMTQ357I.cjs.map +0 -1
  82. package/dist/parser-XVUFA35I.cjs.map +0 -1
  83. package/dist/pdf-ocr-KG7X7WRC.js +0 -13
  84. package/dist/pdf-ocr-KMM24YFF.cjs +0 -14
  85. package/dist/pdf-ocr-KMM24YFF.cjs.map +0 -1
  86. package/dist/pdf-ocr-YTZL2UL4.js +0 -16
  87. package/dist/render-T7QXFTZA.js +0 -10
  88. package/dist/seal-ITE2NNNH.js +0 -10
  89. /package/dist/{-BPSOA7WX.js.map → -KIYHEVUW.js.map} +0 -0
  90. /package/dist/{chunk-I6Q5K2YF.js.map → chunk-3PY5YCJP.js.map} +0 -0
  91. /package/dist/{chunk-C5IU7Q3W.js.map → chunk-55Q76S6S.js.map} +0 -0
  92. /package/dist/{chunk-YCSXG6SY.js.map → chunk-5CAKNM2K.js.map} +0 -0
  93. /package/dist/{chunk-YOFMKKCA.js.map → chunk-GNRBCV4R.js.map} +0 -0
  94. /package/dist/{chunk-KTAWKNYX.js.map → chunk-GU4NCNCT.js.map} +0 -0
  95. /package/dist/{chunk-I6EWYT3Y.js.map → chunk-HFZIYAQQ.js.map} +0 -0
  96. /package/dist/{chunk-MYOGZQMD.js.map → chunk-HG7GXBVP.js.map} +0 -0
  97. /package/dist/{chunk-ETMMB6O2.js.map → chunk-INV3W43Y.js.map} +0 -0
  98. /package/dist/{chunk-DIB2I2HP.js.map → chunk-L27YEW3T.js.map} +0 -0
  99. /package/dist/{chunk-N7HKWVGP.js.map → chunk-Q3IVAWOK.js.map} +0 -0
  100. /package/dist/{chunk-A6EAUP2J.js.map → chunk-SFSB3FAL.js.map} +0 -0
  101. /package/dist/{chunk-66BZATFV.js.map → chunk-SGTGSV4A.js.map} +0 -0
  102. /package/dist/{chunk-Y4H75LKS.js.map → chunk-TC7EDYZD.js.map} +0 -0
  103. /package/dist/{chunk-4CUEYYQF.js.map → chunk-TN6AALZG.js.map} +0 -0
  104. /package/dist/{chunk-XGXKICRN.js.map → chunk-VGRIWMTQ.js.map} +0 -0
  105. /package/dist/{chunk-6KFW772K.js.map → chunk-Z2SX4E7K.js.map} +0 -0
  106. /package/dist/{chunks-HYXNV3WP.js.map → chunks-FB344JZT.js.map} +0 -0
  107. /package/dist/{formula-T4AIR2LX.js.map → formula-5DQQ4MFT.js.map} +0 -0
  108. /package/dist/{formula-7XQLPNSO.js.map → formula-S4O7SBN3.js.map} +0 -0
  109. /package/dist/{image-ocr-TZU64JJF.js.map → image-ocr-LIH2E7WC.js.map} +0 -0
  110. /package/dist/{image-ocr-EJLWGR3B.js.map → image-ocr-SQXFTNYR.js.map} +0 -0
  111. /package/dist/{model-bundle-OT2OTSGH.js.map → model-bundle-4JMY5E37.js.map} +0 -0
  112. /package/dist/{models-MUVFWN7M.js.map → models-D7X5YBWX.js.map} +0 -0
  113. /package/dist/{parser-ERSNBILY.js.map → parser-GHRXWFJN.js.map} +0 -0
  114. /package/dist/{parser-E6NQ666P.js.map → parser-MY7JJISJ.js.map} +0 -0
  115. /package/dist/{pdf-ocr-KG7X7WRC.js.map → pdf-ocr-IEAXGG3D.js.map} +0 -0
  116. /package/dist/{pdf-ocr-YTZL2UL4.js.map → pdf-ocr-Z6CHIYEM.js.map} +0 -0
  117. /package/dist/{profile-io-IRW6XCXH.js.map → profile-io-EAPI6M7O.js.map} +0 -0
  118. /package/dist/{rasterize-BNF6QTLY.js.map → rasterize-UIDZAEWB.js.map} +0 -0
  119. /package/dist/{render-T7QXFTZA.js.map → render-XL7ZVAHK.js.map} +0 -0
  120. /package/dist/{seal-ITE2NNNH.js.map → seal-CY7EIWDJ.js.map} +0 -0
  121. /package/dist/{setup-BXOXVBU3.js.map → setup-UHX3HHWY.js.map} +0 -0
  122. /package/dist/{watch-7PYYGQUJ.js.map → watch-23MV3PBX.js.map} +0 -0
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  blocksToMarkdown
4
- } from "./chunk-MYOGZQMD.js";
4
+ } from "./chunk-HG7GXBVP.js";
5
5
 
6
6
  // src/chunks.ts
7
7
  var LIST_MARKER_RE = /^(?:[□■◇◆○◎●◦ㅇ•▪▸▶※-]|\d{1,3}[.)]|[가나다라마바사아자차카타파하][.)]|\([가나다라마바사아자차카타파하0-9]{1,3}\)|[①-⑳㉮-㉻㈎-㈛])\s/;
@@ -79,4 +79,4 @@ function blocksToChunks(blocks, options) {
79
79
  export {
80
80
  blocksToChunks
81
81
  };
82
- //# sourceMappingURL=chunk-XGXKICRN.js.map
82
+ //# sourceMappingURL=chunk-VGRIWMTQ.js.map
@@ -7,7 +7,7 @@ import {
7
7
  import {
8
8
  safeMax,
9
9
  safeMin
10
- } from "./chunk-I6Q5K2YF.js";
10
+ } from "./chunk-3PY5YCJP.js";
11
11
 
12
12
  // src/pdf/image-regions.ts
13
13
  import { OPS } from "pdfjs-dist/legacy/build/pdf.mjs";
@@ -3687,4 +3687,4 @@ export {
3687
3687
  extractPageBlocksWithLines,
3688
3688
  mergeCrossPageTables
3689
3689
  };
3690
- //# sourceMappingURL=chunk-6KFW772K.js.map
3690
+ //# sourceMappingURL=chunk-Z2SX4E7K.js.map
@@ -0,0 +1,10 @@
1
+ #!/usr/bin/env node
2
+ import {
3
+ blocksToChunks
4
+ } from "./chunk-VGRIWMTQ.js";
5
+ import "./chunk-HG7GXBVP.js";
6
+ import "./chunk-3PY5YCJP.js";
7
+ export {
8
+ blocksToChunks
9
+ };
10
+ //# sourceMappingURL=chunks-FB344JZT.js.map
package/dist/cli.js CHANGED
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  parseFormatProfileJson
4
- } from "./chunk-YCSXG6SY.js";
4
+ } from "./chunk-5CAKNM2K.js";
5
5
  import {
6
6
  BODY_FONTS,
7
7
  BULLET2_CHARS,
@@ -22,29 +22,32 @@ import {
22
22
  hwpxToProfile,
23
23
  incompatibleGongmunWarnings,
24
24
  lintGongmunText,
25
+ lintMuncheText,
25
26
  markdownToHwpx,
27
+ muncheLintWarnings,
26
28
  parse,
27
29
  readBuiltinTemplate,
28
30
  resolveBuiltinTemplate,
29
- unknownFontWarnings
30
- } from "./chunk-5EWPDL7S.js";
31
+ unknownFontWarnings,
32
+ usesGaejosikMunche
33
+ } from "./chunk-JHXAQDXS.js";
31
34
  import "./chunk-7FCNOKOR.js";
32
35
  import "./chunk-XINP35F4.js";
33
36
  import "./chunk-MOL7MDBG.js";
34
- import "./chunk-N7HKWVGP.js";
37
+ import "./chunk-Q3IVAWOK.js";
35
38
  import "./chunk-DZIXKL7E.js";
36
- import "./chunk-XGXKICRN.js";
39
+ import "./chunk-VGRIWMTQ.js";
37
40
  import {
38
41
  blocksToMarkdown
39
- } from "./chunk-MYOGZQMD.js";
40
- import "./chunk-NJMWYRLY.js";
41
- import "./chunk-Y4H75LKS.js";
42
+ } from "./chunk-HG7GXBVP.js";
43
+ import "./chunk-UIQWUYOJ.js";
44
+ import "./chunk-TC7EDYZD.js";
42
45
  import {
43
46
  VERSION,
44
47
  classifyError,
45
48
  sanitizeError,
46
49
  toArrayBuffer
47
- } from "./chunk-I6Q5K2YF.js";
50
+ } from "./chunk-3PY5YCJP.js";
48
51
 
49
52
  // src/cli.ts
50
53
  import { readFileSync, writeFileSync, mkdirSync, statSync } from "fs";
@@ -141,7 +144,7 @@ program.name("kordoc").description("\uBAA8\uB450 \uD30C\uC2F1\uD574\uBC84\uB9AC\
141
144
  `);
142
145
  }
143
146
  } else if (opts.format === "chunks") {
144
- const { blocksToChunks } = await import("./chunks-HYXNV3WP.js");
147
+ const { blocksToChunks } = await import("./chunks-FB344JZT.js");
145
148
  output = JSON.stringify(blocksToChunks(result.blocks), null, 2);
146
149
  } else {
147
150
  output = markdown;
@@ -196,7 +199,7 @@ program.command("watch <dir>").description("\uB514\uB809\uD1A0\uB9AC \uAC10\uC2D
196
199
  if (command.getOptionValueSource("format") === "default" && program.getOptionValueSource("format") === "cli") {
197
200
  opts.format = rootOpts.format;
198
201
  }
199
- const { watchDirectory } = await import("./watch-7PYYGQUJ.js");
202
+ const { watchDirectory } = await import("./watch-23MV3PBX.js");
200
203
  await watchDirectory({
201
204
  dir,
202
205
  outDir: opts.outDir,
@@ -418,7 +421,7 @@ program.command("fill [file]").description("\uC11C\uC2DD \uBB38\uC11C\uC758 \uBE
418
421
  });
419
422
  program.command("seal <file>").description('\uB3C4\uC7A5/\uC11C\uBA85 \uC774\uBBF8\uC9C0\uB97C \uC575\uCEE4 \uBB38\uAD6C \uC704\uC5D0 \uBD80\uC720 \uBC30\uCE58 (\uD45C/\uD398\uC774\uC9C0 \uBD88\uD655\uC7A5) \u2014 kordoc seal \uC2E0\uCCAD\uC11C.hwpx --image \uB3C4\uC7A5.png --anchor "(\uC778)" -o \uACB0\uACFC.hwpx').requiredOption("--image <path>", "\uB3C4\uC7A5/\uC11C\uBA85 \uC774\uBBF8\uC9C0 (\uD22C\uBA85 \uBC30\uACBD PNG \uAD8C\uC7A5)").option("--anchor <text>", "\uC575\uCEE4 \uBB38\uAD6C", "(\uC778)").option("-n, --occurrence <num>", "\uAC19\uC740 \uC575\uCEE4\uAC00 \uC5EC\uB7FF\uC77C \uB54C 0-based \uC120\uD0DD", "0").option("--size-mm <num>", "\uB3C4\uC7A5 \uD55C \uBCC0 \uD06C\uAE30 mm (\uAE30\uBCF8: \uC904\uB192\uC774\xD71.6, 7~18 \uD074\uB7A8\uD504)").option("--mode <mode>", "overlap(\uBB38\uAD6C \uC704 \uACB9\uCE68) | right(\uC624\uB978\uCABD \uC606) | auto", "auto").option("--dx <mm>", "x \uBBF8\uC138\uC870\uC815 mm", "0").option("--dy <mm>", "y \uBBF8\uC138\uC870\uC815 mm", "0").option("-o, --output <path>", "\uCD9C\uB825 \uACBD\uB85C (\uAE30\uBCF8: <\uC785\uB825>.sealed.hwpx)").option("--silent", "\uC9C4\uD589 \uBA54\uC2DC\uC9C0 \uC228\uAE30\uAE30").action(async (file, opts) => {
420
423
  try {
421
- const { placeSealHwpx, detectFormat: detectFormat2 } = await import("./-BPSOA7WX.js");
424
+ const { placeSealHwpx, detectFormat: detectFormat2 } = await import("./-KIYHEVUW.js");
422
425
  const rootOpts = program.opts();
423
426
  const output = opts.output ?? rootOpts.output;
424
427
  const silent = opts.silent ?? rootOpts.silent;
@@ -496,7 +499,7 @@ program.command("seal <file>").description('\uB3C4\uC7A5/\uC11C\uBA85 \uC774\uBB
496
499
  });
497
500
  program.command("patch <original> <edited>").description("\uC11C\uC2DD \uBCF4\uC874 \uB77C\uC6B4\uB4DC\uD2B8\uB9BD \uD328\uCE58 \u2014 \uD3B8\uC9D1\uB41C \uB9C8\uD06C\uB2E4\uC6B4\uC744 \uC6D0\uBCF8 HWPX/HWP\uC5D0 in-place \uBC18\uC601 (kordoc patch \uC6D0\uBCF8.hwpx \uD3B8\uC9D1.md -o \uCD9C\uB825.hwpx). \uBBF8\uC801\uC6A9(skip) \uD3B8\uC9D1\uC774 \uC788\uC73C\uBA74 exit 2").option("-o, --output <path>", "\uCD9C\uB825 \uACBD\uB85C (\uAE30\uBCF8: <\uC6D0\uBCF8>.patched.hwpx|.hwp)").option("--no-verify", "\uD328\uCE58 \uD6C4 \uC7AC\uD30C\uC2F1 \uC790\uB3D9 \uAC80\uC99D \uC0DD\uB7B5").option("--silent", "\uC9C4\uD589 \uBA54\uC2DC\uC9C0 \uC228\uAE30\uAE30").action(async (original, edited, opts) => {
498
501
  try {
499
- const { patchHwpx, patchHwp, detectFormat: detectFormat2 } = await import("./-BPSOA7WX.js");
502
+ const { patchHwpx, patchHwp, detectFormat: detectFormat2 } = await import("./-KIYHEVUW.js");
500
503
  const rootOpts = program.opts();
501
504
  const output = opts.output ?? rootOpts.output;
502
505
  const silent = opts.silent ?? rootOpts.silent;
@@ -537,7 +540,7 @@ program.command("patch <original> <edited>").description("\uC11C\uC2DD \uBCF4\uC
537
540
  });
538
541
  program.command("validate <file>").description("HWPX \uAD6C\uC870 \uAC80\uC99D \u2014 ZIP\xB7mimetype\xB7\uD544\uC218 \uD30C\uC77C\xB7XML \uC6F0\uD3FC\uB4DC\xB7secCnt\xB7manifest \uCC38\uC870 (\uD55C\uCEF4\uB3C5\uC2A4 \uAC70\uBD80 \uC694\uC778 \uC0AC\uC804 \uCC28\uB2E8)").option("--json", "\uACB0\uACFC\uB97C JSON\uC73C\uB85C stdout\uC5D0 \uCD9C\uB825").action(async (file, opts) => {
539
542
  try {
540
- const { validateHwpx } = await import("./-BPSOA7WX.js");
543
+ const { validateHwpx } = await import("./-KIYHEVUW.js");
541
544
  const buf = new Uint8Array(readFileSync(resolve(file)));
542
545
  const result = await validateHwpx(buf);
543
546
  if (opts.json) {
@@ -652,6 +655,10 @@ program.command("generate <markdown>").alias("gen").description("\uB9C8\uD06C\uB
652
655
  }
653
656
  if (gongmun && !silent) {
654
657
  for (const w of gongmunLintWarnings(md, 5)) process.stderr.write(`[kordoc] \u26A0 ${w}
658
+ `);
659
+ }
660
+ if (gongmun && !silent && usesGaejosikMunche(gongmun.preset)) {
661
+ for (const w of muncheLintWarnings(md, 5)) process.stderr.write(`[kordoc] \u26A0 ${w}
655
662
  `);
656
663
  }
657
664
  let profile;
@@ -728,7 +735,7 @@ program.command("profile <file>").description("HWPX \uD45C \uC11C\uC2DD \uD504\u
728
735
  process.exit(1);
729
736
  }
730
737
  });
731
- program.command("lint <file>").description("\uACF5\uBB38\uC11C \uD45C\uAE30\uBC95 \uAC80\uC218 \u2014 \uB0A0\uC9DC\xB7\uC2DC\uAC04\xB7\uAE08\uC561\xB7\uBD99\uC784 \uB4F1 \uD589\uC815\uC5C5\uBB34\uC6B4\uC601 \uD3B8\uB78C \uD45C\uAE30\uBC95 (md/txt, '-'=stdin). error \uC788\uC73C\uBA74 exit 1").option("--json", "JSON \uCD9C\uB825").action((file, opts) => {
738
+ program.command("lint <file>").description("\uACF5\uBB38\uC11C \uD45C\uAE30\uBC95 \uAC80\uC218 \u2014 \uB0A0\uC9DC\xB7\uC2DC\uAC04\xB7\uAE08\uC561\xB7\uBD99\uC784 \uB4F1 \uD589\uC815\uC5C5\uBB34\uC6B4\uC601 \uD3B8\uB78C \uD45C\uAE30\uBC95 (md/txt, '-'=stdin). error \uC788\uC73C\uBA74 exit 1").option("--json", "JSON \uCD9C\uB825").option("--munche", "\uAC1C\uC870\uC2DD \uBB38\uCCB4 \uAC80\uC218 \uBCD1\uD589 \u2014 \uC11C\uC220\uD615 \uC885\uACB0\xB7\uB2F9\uC704\xB7\uC218\uC0AC\xB7\uD56D\uBAA9 \uAE38\uC774 (\uBCF4\uACE0\uC11C\xB7\uACC4\uD68D\uC11C \uC6D0\uACE0\uC6A9)").action((file, opts) => {
732
739
  try {
733
740
  const raw = file === "-" ? readFileSync(0) : readFileSync(resolve(file));
734
741
  const kind = detectFormat(
@@ -744,16 +751,31 @@ program.command("lint <file>").description("\uACF5\uBB38\uC11C \uD45C\uAE30\uBC9
744
751
  }
745
752
  const text = raw.toString("utf-8");
746
753
  const findings = lintGongmunText(text);
747
- const errors = findings.filter((f) => f.severity === "error").length;
754
+ const munche = opts.munche ? lintMuncheText(text) : [];
755
+ const errors = findings.filter((f) => f.severity === "error").length + munche.filter((f) => f.severity === "error").length;
748
756
  if (opts.json) {
749
- process.stdout.write(JSON.stringify({ findings, summary: { total: findings.length, errors, ok: errors === 0 } }, null, 2) + "\n");
757
+ const total = findings.length + munche.length;
758
+ process.stdout.write(JSON.stringify(
759
+ { findings, ...opts.munche ? { munche } : {}, summary: { total, errors, ok: errors === 0 } },
760
+ null,
761
+ 2
762
+ ) + "\n");
750
763
  } else {
751
- process.stderr.write(`[kordoc] \uD45C\uAE30\uBC95 \uAC80\uC218: \uC704\uBC18 ${findings.length}\uAC74 (error ${errors}, warning ${findings.length - errors})
764
+ process.stderr.write(`[kordoc] \uD45C\uAE30\uBC95 \uAC80\uC218: \uC704\uBC18 ${findings.length}\uAC74 (error ${findings.filter((f) => f.severity === "error").length}, warning ${findings.filter((f) => f.severity !== "error").length})
752
765
  `);
753
766
  for (const f of findings) {
754
767
  process.stderr.write(` L${f.line} [${f.severity}] ${f.rule}: "${f.match}" \u2014 ${f.message}${f.suggest ? ` \u2192 ${f.suggest}` : ""}
755
768
  `);
756
769
  }
770
+ if (opts.munche) {
771
+ const me = munche.filter((f) => f.severity === "error").length;
772
+ process.stderr.write(`[kordoc] \uBB38\uCCB4 \uAC80\uC218: \uC704\uBC18 ${munche.length}\uAC74 (error ${me}, warning ${munche.length - me})
773
+ `);
774
+ for (const f of munche) {
775
+ process.stderr.write(` L${f.line} [${f.severity}] ${f.rule}: "${f.match}" \u2014 ${f.message}${f.suggest ? ` \u2192 ${f.suggest}` : ""}
776
+ `);
777
+ }
778
+ }
757
779
  }
758
780
  process.exit(errors > 0 ? 1 : 0);
759
781
  } catch (err) {
@@ -763,7 +785,7 @@ program.command("lint <file>").description("\uACF5\uBB38\uC11C \uD45C\uAE30\uBC9
763
785
  }
764
786
  });
765
787
  program.command("redact <files...>").description("\uAC1C\uC778\uC815\uBCF4 \uC11C\uC2DD \uBCF4\uC874 \uB9C8\uC2A4\uD0B9 \u2014 \uC8FC\uBBFC\uBC88\uD638\xB7\uC804\uD654\xB7\uC774\uBA54\uC77C\xB7\uCE74\uB4DC\xB7\uACC4\uC88C\uB97C \uD0D0\uC9C0\uD574 HWPX/HWP\uB294 \uC6D0\uBCF8 \uC11C\uC2DD \uADF8\uB300\uB85C patch, \uADF8 \uC678 \uD3EC\uB9F7\uC740 \uB9C8\uC2A4\uD0B9\uB41C \uB9C8\uD06C\uB2E4\uC6B4 \uCD9C\uB825. \uC790\uB3D9 \uAC80\uCD9C \uBCF4\uC870 \uB3C4\uAD6C\uC774\uBBC0\uB85C \uACB0\uACFC\uB294 \uBC18\uB4DC\uC2DC \uC0AC\uB78C\uC774 \uCD5C\uC885 \uD655\uC778\uD558\uC138\uC694 (\uC774\uBBF8\uC9C0 \uC548 \uD14D\uC2A4\uD2B8\uB294 \uD0D0\uC9C0 \uBD88\uAC00)").option("--rules <csv>", "\uC801\uC6A9 \uB8F0 (\uAE30\uBCF8: rrn,phone,email,card,account \u2014 passport,driver\uB294 opt-in)").option("--mask-char <ch>", "\uB9C8\uC2A4\uD06C \uBB38\uC790 1\uAE00\uC790 (\uAE30\uBCF8: \u25CF)").option("-o, --output <path>", "\uCD9C\uB825 \uACBD\uB85C (\uB2E8\uC77C \uD30C\uC77C \uC2DC)").option("-d, --out-dir <dir>", "\uCD9C\uB825 \uB514\uB809\uD1A0\uB9AC (\uB2E4\uC911 \uD30C\uC77C \uC2DC)").option("--dry-run", "\uD0D0\uC9C0 \uB9AC\uD3EC\uD2B8\uB9CC \uCD9C\uB825, \uD30C\uC77C \uBBF8\uC0DD\uC131").option("--json", "\uB9AC\uD3EC\uD2B8\uB97C JSON\uC73C\uB85C stdout \uCD9C\uB825").option("--silent", "\uC9C4\uD589 \uBA54\uC2DC\uC9C0 \uC228\uAE30\uAE30").action(async (files, opts) => {
766
- const { redactMarkdown, DEFAULT_REDACT_RULES, patchHwpx, patchHwp } = await import("./-BPSOA7WX.js");
788
+ const { redactMarkdown, DEFAULT_REDACT_RULES, patchHwpx, patchHwp } = await import("./-KIYHEVUW.js");
767
789
  const rootOpts = program.opts();
768
790
  const output = opts.output ?? rootOpts.output;
769
791
  const silent = opts.silent ?? rootOpts.silent;
@@ -852,7 +874,7 @@ program.command("render <file>").description("\uB808\uC774\uC544\uC6C3 \uBCF4\uC
852
874
  const rootOpts = program.opts();
853
875
  const output = opts.output ?? rootOpts.output;
854
876
  const silent = opts.silent ?? rootOpts.silent;
855
- const { renderHwpxToSvg } = await import("./render-T7QXFTZA.js");
877
+ const { renderHwpxToSvg } = await import("./render-XL7ZVAHK.js");
856
878
  const absPath = resolve(file);
857
879
  const buffer = readFileSync(absPath);
858
880
  const highlights = opts.highlight ? String(opts.highlight).split(",") : void 0;
@@ -874,7 +896,7 @@ program.command("render <file>").description("\uB808\uC774\uC544\uC6C3 \uBCF4\uC
874
896
  });
875
897
  program.command("render-worker").description("persistent \uB80C\uB354 \uC6CC\uCEE4 \u2014 stdin NDJSON \uC694\uCCAD \u2192 \uC870\uD310 SVG \uD30C\uC77C \uCD9C\uB825 (\uD504\uB85C\uC138\uC2A4 \uC720\uC9C0, \uCF5C\uB4DC\uC2A4\uD0C0\uD2B8 \uC81C\uAC70)").action(async () => {
876
898
  const { createInterface } = await import("readline");
877
- const { renderHwpxToSvg } = await import("./render-T7QXFTZA.js");
899
+ const { renderHwpxToSvg } = await import("./render-XL7ZVAHK.js");
878
900
  const rl = createInterface({ input: process.stdin });
879
901
  const write = (o) => void process.stdout.write(JSON.stringify(o) + "\n");
880
902
  write({ ready: true, version: VERSION });
@@ -919,12 +941,12 @@ program.command("mcp").description("MCP \uC11C\uBC84 \uC2E4\uD589 (Claude / Curs
919
941
  await startMcpServer();
920
942
  });
921
943
  program.command("setup").description("\uB300\uD654\uD615 \uC124\uCE58 \uB9C8\uBC95\uC0AC \u2014 AI \uD074\uB77C\uC774\uC5B8\uD2B8 \uC790\uB3D9 \uB4F1\uB85D (Mac/Win/Linux)").action(async () => {
922
- const { runSetup } = await import("./setup-BXOXVBU3.js");
944
+ const { runSetup } = await import("./setup-UHX3HHWY.js");
923
945
  await runSetup();
924
946
  });
925
947
  program.command("check-formula-models").description("PDF \uC218\uC2DD OCR \uBAA8\uB378(MFD + MFR + tokenizer, ~155MB) \uC0C1\uD0DC \uD655\uC778 \u2014 \uC5C6\uAC70\uB098 SHA \uBD88\uC77C\uCE58\uBA74 \uB2E4\uC6B4\uB85C\uB4DC").option("--status-only", "\uC0C1\uD0DC\uB9CC JSON \uC73C\uB85C \uCD9C\uB825 (\uB2E4\uC6B4\uB85C\uB4DC \uC548 \uD568)").action(async (opts) => {
926
948
  try {
927
- const { getFormulaModelStatus, ensureFormulaModels, getFormulaModelsDir } = await import("./formula-T4AIR2LX.js");
949
+ const { getFormulaModelStatus, ensureFormulaModels, getFormulaModelsDir } = await import("./formula-5DQQ4MFT.js");
928
950
  const dir = getFormulaModelsDir();
929
951
  if (opts.statusOnly) {
930
952
  const status = await getFormulaModelStatus();
@@ -978,7 +1000,7 @@ program.command("check-formula-models").description("PDF \uC218\uC2DD OCR \uBAA8
978
1000
  });
979
1001
  program.command("check-ocr-models").description("\uD14D\uC2A4\uD2B8 OCR \uBAA8\uB378(PP-OCRv5 korean det+rec, ~18MB) \uC0C1\uD0DC \uD655\uC778 \u2014 \uC5C6\uAC70\uB098 SHA \uBD88\uC77C\uCE58\uBA74 \uB2E4\uC6B4\uB85C\uB4DC").option("--status-only", "\uC0C1\uD0DC\uB9CC JSON \uC73C\uB85C \uCD9C\uB825 (\uB2E4\uC6B4\uB85C\uB4DC \uC548 \uD568)").action(async (opts) => {
980
1002
  try {
981
- const { getOcrModelStatus, ensureOcrModels, getOcrModelsDir } = await import("./models-MUVFWN7M.js");
1003
+ const { getOcrModelStatus, ensureOcrModels, getOcrModelsDir } = await import("./models-D7X5YBWX.js");
982
1004
  const dir = getOcrModelsDir();
983
1005
  if (opts.statusOnly) {
984
1006
  const status = await getOcrModelStatus();
@@ -1032,7 +1054,7 @@ program.command("check-ocr-models").description("\uD14D\uC2A4\uD2B8 OCR \uBAA8\u
1032
1054
  });
1033
1055
  program.command("models").description("OCR/\uC218\uC2DD \uBAA8\uB378 \uC624\uD504\uB77C\uC778 \uC0AC\uC774\uB4DC\uB85C\uB4DC \u2014 \uD3D0\uC1C4\uB9DD \uBC18\uC785\uC6A9 \uB0B4\uBCF4\uB0B4\uAE30/\uAC00\uC838\uC624\uAE30 (SHA-256 \uAC80\uC99D)").option("--status", "\uCE90\uC2DC\uC5D0 \uC124\uCE58\uB41C \uBAA8\uB378 \uC0C1\uD0DC\uB97C JSON \uC73C\uB85C \uCD9C\uB825").option("--export <dir>", "\uB85C\uCEEC \uCE90\uC2DC \u2192 \uBC88\uB4E4 \uB514\uB809\uD1A0\uB9AC\uB85C \uB0B4\uBCF4\uB0B4\uAE30 (\uC628\uB77C\uC778 PC\uC5D0\uC11C \uC2E4\uD589)").option("--import <dir>", "\uBC88\uB4E4 \uB514\uB809\uD1A0\uB9AC \u2192 \uB85C\uCEEC \uCE90\uC2DC\uB85C \uC124\uCE58 (\uB0B4\uBD80\uB9DD PC\uC5D0\uC11C \uC2E4\uD589)").action(async (opts) => {
1034
1056
  try {
1035
- const { exportModels, importModels, modelCacheStatus } = await import("./model-bundle-OT2OTSGH.js");
1057
+ const { exportModels, importModels, modelCacheStatus } = await import("./model-bundle-4JMY5E37.js");
1036
1058
  if (opts.status) {
1037
1059
  process.stdout.write(JSON.stringify(await modelCacheStatus(), null, 2) + "\n");
1038
1060
  return;