python-hwpx-automation 7.0.2__tar.gz → 7.0.4__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 (227) hide show
  1. {python_hwpx_automation-7.0.2/src/python_hwpx_automation.egg-info → python_hwpx_automation-7.0.4}/PKG-INFO +10 -9
  2. {python_hwpx_automation-7.0.2 → python_hwpx_automation-7.0.4}/README.md +8 -7
  3. {python_hwpx_automation-7.0.2 → python_hwpx_automation-7.0.4}/pyproject.toml +2 -2
  4. {python_hwpx_automation-7.0.2 → python_hwpx_automation-7.0.4}/src/hwpx_automation/handlers/quality_render.py +55 -0
  5. {python_hwpx_automation-7.0.2 → python_hwpx_automation-7.0.4}/src/hwpx_automation/identity.json +9 -9
  6. {python_hwpx_automation-7.0.2 → python_hwpx_automation-7.0.4}/src/hwpx_automation/office/agent/commands.py +10 -2
  7. {python_hwpx_automation-7.0.2 → python_hwpx_automation-7.0.4}/src/hwpx_automation/office/authoring/__init__.py +1 -1
  8. {python_hwpx_automation-7.0.2 → python_hwpx_automation-7.0.4}/src/hwpx_automation/office/form_fill/fit/wordbox.py +8 -8
  9. {python_hwpx_automation-7.0.2 → python_hwpx_automation-7.0.4}/src/hwpx_automation/office/form_fill/quality.py +2 -2
  10. {python_hwpx_automation-7.0.2 → python_hwpx_automation-7.0.4}/src/hwpx_automation/office/rendering/diff.py +2 -2
  11. {python_hwpx_automation-7.0.2 → python_hwpx_automation-7.0.4}/src/hwpx_automation/office/rendering/worker.py +1 -1
  12. {python_hwpx_automation-7.0.2 → python_hwpx_automation-7.0.4}/src/hwpx_automation/tool_contract.py +2 -2
  13. {python_hwpx_automation-7.0.2 → python_hwpx_automation-7.0.4/src/python_hwpx_automation.egg-info}/PKG-INFO +10 -9
  14. {python_hwpx_automation-7.0.2 → python_hwpx_automation-7.0.4}/src/python_hwpx_automation.egg-info/requires.txt +1 -1
  15. {python_hwpx_automation-7.0.2 → python_hwpx_automation-7.0.4}/LICENSE +0 -0
  16. {python_hwpx_automation-7.0.2 → python_hwpx_automation-7.0.4}/MANIFEST.in +0 -0
  17. {python_hwpx_automation-7.0.2 → python_hwpx_automation-7.0.4}/NOTICE +0 -0
  18. {python_hwpx_automation-7.0.2 → python_hwpx_automation-7.0.4}/setup.cfg +0 -0
  19. {python_hwpx_automation-7.0.2 → python_hwpx_automation-7.0.4}/src/hwpx_automation/__init__.py +0 -0
  20. {python_hwpx_automation-7.0.2 → python_hwpx_automation-7.0.4}/src/hwpx_automation/__init__.pyi +0 -0
  21. {python_hwpx_automation-7.0.2 → python_hwpx_automation-7.0.4}/src/hwpx_automation/__main__.py +0 -0
  22. {python_hwpx_automation-7.0.2 → python_hwpx_automation-7.0.4}/src/hwpx_automation/agent_document.py +0 -0
  23. {python_hwpx_automation-7.0.2 → python_hwpx_automation-7.0.4}/src/hwpx_automation/api.py +0 -0
  24. {python_hwpx_automation-7.0.2 → python_hwpx_automation-7.0.4}/src/hwpx_automation/blind_eval.py +0 -0
  25. {python_hwpx_automation-7.0.2 → python_hwpx_automation-7.0.4}/src/hwpx_automation/capabilities.py +0 -0
  26. {python_hwpx_automation-7.0.2 → python_hwpx_automation-7.0.4}/src/hwpx_automation/compat.py +0 -0
  27. {python_hwpx_automation-7.0.2 → python_hwpx_automation-7.0.4}/src/hwpx_automation/configuration.py +0 -0
  28. {python_hwpx_automation-7.0.2 → python_hwpx_automation-7.0.4}/src/hwpx_automation/core/__init__.py +0 -0
  29. {python_hwpx_automation-7.0.2 → python_hwpx_automation-7.0.4}/src/hwpx_automation/core/content.py +0 -0
  30. {python_hwpx_automation-7.0.2 → python_hwpx_automation-7.0.4}/src/hwpx_automation/core/context.py +0 -0
  31. {python_hwpx_automation-7.0.2 → python_hwpx_automation-7.0.4}/src/hwpx_automation/core/diff.py +0 -0
  32. {python_hwpx_automation-7.0.2 → python_hwpx_automation-7.0.4}/src/hwpx_automation/core/document.py +0 -0
  33. {python_hwpx_automation-7.0.2 → python_hwpx_automation-7.0.4}/src/hwpx_automation/core/formatting.py +0 -0
  34. {python_hwpx_automation-7.0.2 → python_hwpx_automation-7.0.4}/src/hwpx_automation/core/handles.py +0 -0
  35. {python_hwpx_automation-7.0.2 → python_hwpx_automation-7.0.4}/src/hwpx_automation/core/locations.py +0 -0
  36. {python_hwpx_automation-7.0.2 → python_hwpx_automation-7.0.4}/src/hwpx_automation/core/locator.py +0 -0
  37. {python_hwpx_automation-7.0.2 → python_hwpx_automation-7.0.4}/src/hwpx_automation/core/plan.py +0 -0
  38. {python_hwpx_automation-7.0.2 → python_hwpx_automation-7.0.4}/src/hwpx_automation/core/resources.py +0 -0
  39. {python_hwpx_automation-7.0.2 → python_hwpx_automation-7.0.4}/src/hwpx_automation/core/search.py +0 -0
  40. {python_hwpx_automation-7.0.2 → python_hwpx_automation-7.0.4}/src/hwpx_automation/core/transactions.py +0 -0
  41. {python_hwpx_automation-7.0.2 → python_hwpx_automation-7.0.4}/src/hwpx_automation/core/txn.py +0 -0
  42. {python_hwpx_automation-7.0.2 → python_hwpx_automation-7.0.4}/src/hwpx_automation/document_state.py +0 -0
  43. {python_hwpx_automation-7.0.2 → python_hwpx_automation-7.0.4}/src/hwpx_automation/errors.py +0 -0
  44. {python_hwpx_automation-7.0.2 → python_hwpx_automation-7.0.4}/src/hwpx_automation/execution_lock.py +0 -0
  45. {python_hwpx_automation-7.0.2 → python_hwpx_automation-7.0.4}/src/hwpx_automation/fastmcp_adapter.py +0 -0
  46. {python_hwpx_automation-7.0.2 → python_hwpx_automation-7.0.4}/src/hwpx_automation/form_fill.py +0 -0
  47. {python_hwpx_automation-7.0.2 → python_hwpx_automation-7.0.4}/src/hwpx_automation/form_output_models.py +0 -0
  48. {python_hwpx_automation-7.0.2 → python_hwpx_automation-7.0.4}/src/hwpx_automation/handlers/__init__.py +0 -0
  49. {python_hwpx_automation-7.0.2 → python_hwpx_automation-7.0.4}/src/hwpx_automation/handlers/_shared.py +0 -0
  50. {python_hwpx_automation-7.0.2 → python_hwpx_automation-7.0.4}/src/hwpx_automation/handlers/agent_document.py +0 -0
  51. {python_hwpx_automation-7.0.2 → python_hwpx_automation-7.0.4}/src/hwpx_automation/handlers/authoring.py +0 -0
  52. {python_hwpx_automation-7.0.2 → python_hwpx_automation-7.0.4}/src/hwpx_automation/handlers/content_edit.py +0 -0
  53. {python_hwpx_automation-7.0.2 → python_hwpx_automation-7.0.4}/src/hwpx_automation/handlers/form_fill.py +0 -0
  54. {python_hwpx_automation-7.0.2 → python_hwpx_automation-7.0.4}/src/hwpx_automation/handlers/layout_style.py +0 -0
  55. {python_hwpx_automation-7.0.2 → python_hwpx_automation-7.0.4}/src/hwpx_automation/handlers/read_export.py +0 -0
  56. {python_hwpx_automation-7.0.2 → python_hwpx_automation-7.0.4}/src/hwpx_automation/handlers/specialized.py +0 -0
  57. {python_hwpx_automation-7.0.2 → python_hwpx_automation-7.0.4}/src/hwpx_automation/handlers/tracked_changes.py +0 -0
  58. {python_hwpx_automation-7.0.2 → python_hwpx_automation-7.0.4}/src/hwpx_automation/handlers/workflow.py +0 -0
  59. {python_hwpx_automation-7.0.2 → python_hwpx_automation-7.0.4}/src/hwpx_automation/hwp_converter.py +0 -0
  60. {python_hwpx_automation-7.0.2 → python_hwpx_automation-7.0.4}/src/hwpx_automation/hwp_support.py +0 -0
  61. {python_hwpx_automation-7.0.2 → python_hwpx_automation-7.0.4}/src/hwpx_automation/hwpx_ops.py +0 -0
  62. {python_hwpx_automation-7.0.2 → python_hwpx_automation-7.0.4}/src/hwpx_automation/identity.py +0 -0
  63. {python_hwpx_automation-7.0.2 → python_hwpx_automation-7.0.4}/src/hwpx_automation/ingest_adapters.py +0 -0
  64. {python_hwpx_automation-7.0.2 → python_hwpx_automation-7.0.4}/src/hwpx_automation/markdown_plan.py +0 -0
  65. {python_hwpx_automation-7.0.2 → python_hwpx_automation-7.0.4}/src/hwpx_automation/mcp_cli.py +0 -0
  66. {python_hwpx_automation-7.0.2 → python_hwpx_automation-7.0.4}/src/hwpx_automation/metadata/tools_meta.py +0 -0
  67. {python_hwpx_automation-7.0.2 → python_hwpx_automation-7.0.4}/src/hwpx_automation/mixed_form.py +0 -0
  68. {python_hwpx_automation-7.0.2 → python_hwpx_automation-7.0.4}/src/hwpx_automation/mutation_models.py +0 -0
  69. {python_hwpx_automation-7.0.2 → python_hwpx_automation-7.0.4}/src/hwpx_automation/network_policy.py +0 -0
  70. {python_hwpx_automation-7.0.2 → python_hwpx_automation-7.0.4}/src/hwpx_automation/office/__init__.py +0 -0
  71. {python_hwpx_automation-7.0.2 → python_hwpx_automation-7.0.4}/src/hwpx_automation/office/agent/__init__.py +0 -0
  72. {python_hwpx_automation-7.0.2 → python_hwpx_automation-7.0.4}/src/hwpx_automation/office/agent/_batch_verification.py +0 -0
  73. {python_hwpx_automation-7.0.2 → python_hwpx_automation-7.0.4}/src/hwpx_automation/office/agent/blueprint/__init__.py +0 -0
  74. {python_hwpx_automation-7.0.2 → python_hwpx_automation-7.0.4}/src/hwpx_automation/office/agent/blueprint/bundle.py +0 -0
  75. {python_hwpx_automation-7.0.2 → python_hwpx_automation-7.0.4}/src/hwpx_automation/office/agent/blueprint/catalog.py +0 -0
  76. {python_hwpx_automation-7.0.2 → python_hwpx_automation-7.0.4}/src/hwpx_automation/office/agent/blueprint/dump.py +0 -0
  77. {python_hwpx_automation-7.0.2 → python_hwpx_automation-7.0.4}/src/hwpx_automation/office/agent/blueprint/mapping.py +0 -0
  78. {python_hwpx_automation-7.0.2 → python_hwpx_automation-7.0.4}/src/hwpx_automation/office/agent/blueprint/model.py +0 -0
  79. {python_hwpx_automation-7.0.2 → python_hwpx_automation-7.0.4}/src/hwpx_automation/office/agent/blueprint/native.py +0 -0
  80. {python_hwpx_automation-7.0.2 → python_hwpx_automation-7.0.4}/src/hwpx_automation/office/agent/blueprint/replay.py +0 -0
  81. {python_hwpx_automation-7.0.2 → python_hwpx_automation-7.0.4}/src/hwpx_automation/office/agent/catalog.py +0 -0
  82. {python_hwpx_automation-7.0.2 → python_hwpx_automation-7.0.4}/src/hwpx_automation/office/agent/cli.py +0 -0
  83. {python_hwpx_automation-7.0.2 → python_hwpx_automation-7.0.4}/src/hwpx_automation/office/agent/document.py +0 -0
  84. {python_hwpx_automation-7.0.2 → python_hwpx_automation-7.0.4}/src/hwpx_automation/office/agent/form_plan.py +0 -0
  85. {python_hwpx_automation-7.0.2 → python_hwpx_automation-7.0.4}/src/hwpx_automation/office/agent/model.py +0 -0
  86. {python_hwpx_automation-7.0.2 → python_hwpx_automation-7.0.4}/src/hwpx_automation/office/agent/path.py +0 -0
  87. {python_hwpx_automation-7.0.2 → python_hwpx_automation-7.0.4}/src/hwpx_automation/office/agent/query.py +0 -0
  88. {python_hwpx_automation-7.0.2 → python_hwpx_automation-7.0.4}/src/hwpx_automation/office/agent/story.py +0 -0
  89. {python_hwpx_automation-7.0.2 → python_hwpx_automation-7.0.4}/src/hwpx_automation/office/authoring/advanced_generators.py +0 -0
  90. {python_hwpx_automation-7.0.2 → python_hwpx_automation-7.0.4}/src/hwpx_automation/office/authoring/builder/__init__.py +0 -0
  91. {python_hwpx_automation-7.0.2 → python_hwpx_automation-7.0.4}/src/hwpx_automation/office/authoring/builder/core.py +0 -0
  92. {python_hwpx_automation-7.0.2 → python_hwpx_automation-7.0.4}/src/hwpx_automation/office/authoring/builder/report.py +0 -0
  93. {python_hwpx_automation-7.0.2 → python_hwpx_automation-7.0.4}/src/hwpx_automation/office/authoring/design/__init__.py +0 -0
  94. {python_hwpx_automation-7.0.2 → python_hwpx_automation-7.0.4}/src/hwpx_automation/office/authoring/design/_support.py +0 -0
  95. {python_hwpx_automation-7.0.2 → python_hwpx_automation-7.0.4}/src/hwpx_automation/office/authoring/design/composer.py +0 -0
  96. {python_hwpx_automation-7.0.2 → python_hwpx_automation-7.0.4}/src/hwpx_automation/office/authoring/design/harvest.py +0 -0
  97. {python_hwpx_automation-7.0.2 → python_hwpx_automation-7.0.4}/src/hwpx_automation/office/authoring/design/plan.py +0 -0
  98. {python_hwpx_automation-7.0.2 → python_hwpx_automation-7.0.4}/src/hwpx_automation/office/authoring/design/profile.py +0 -0
  99. {python_hwpx_automation-7.0.2 → python_hwpx_automation-7.0.4}/src/hwpx_automation/office/authoring/design/profiles/application_form/fragments/body.xml +0 -0
  100. {python_hwpx_automation-7.0.2 → python_hwpx_automation-7.0.4}/src/hwpx_automation/office/authoring/design/profiles/application_form/fragments/heading.xml +0 -0
  101. {python_hwpx_automation-7.0.2 → python_hwpx_automation-7.0.4}/src/hwpx_automation/office/authoring/design/profiles/application_form/fragments/info_table.xml +0 -0
  102. {python_hwpx_automation-7.0.2 → python_hwpx_automation-7.0.4}/src/hwpx_automation/office/authoring/design/profiles/application_form/fragments/title.xml +0 -0
  103. {python_hwpx_automation-7.0.2 → python_hwpx_automation-7.0.4}/src/hwpx_automation/office/authoring/design/profiles/application_form/profile.json +0 -0
  104. {python_hwpx_automation-7.0.2 → python_hwpx_automation-7.0.4}/src/hwpx_automation/office/authoring/design/profiles/application_form/template.hwpx +0 -0
  105. {python_hwpx_automation-7.0.2 → python_hwpx_automation-7.0.4}/src/hwpx_automation/office/authoring/design/profiles/home_notice/fragments/body.xml +0 -0
  106. {python_hwpx_automation-7.0.2 → python_hwpx_automation-7.0.4}/src/hwpx_automation/office/authoring/design/profiles/home_notice/fragments/heading.xml +0 -0
  107. {python_hwpx_automation-7.0.2 → python_hwpx_automation-7.0.4}/src/hwpx_automation/office/authoring/design/profiles/home_notice/fragments/title.xml +0 -0
  108. {python_hwpx_automation-7.0.2 → python_hwpx_automation-7.0.4}/src/hwpx_automation/office/authoring/design/profiles/home_notice/profile.json +0 -0
  109. {python_hwpx_automation-7.0.2 → python_hwpx_automation-7.0.4}/src/hwpx_automation/office/authoring/design/profiles/home_notice/template.hwpx +0 -0
  110. {python_hwpx_automation-7.0.2 → python_hwpx_automation-7.0.4}/src/hwpx_automation/office/authoring/design/profiles/official_notice/fragments/body.xml +0 -0
  111. {python_hwpx_automation-7.0.2 → python_hwpx_automation-7.0.4}/src/hwpx_automation/office/authoring/design/profiles/official_notice/fragments/heading.xml +0 -0
  112. {python_hwpx_automation-7.0.2 → python_hwpx_automation-7.0.4}/src/hwpx_automation/office/authoring/design/profiles/official_notice/fragments/info_table.xml +0 -0
  113. {python_hwpx_automation-7.0.2 → python_hwpx_automation-7.0.4}/src/hwpx_automation/office/authoring/design/profiles/official_notice/fragments/title.xml +0 -0
  114. {python_hwpx_automation-7.0.2 → python_hwpx_automation-7.0.4}/src/hwpx_automation/office/authoring/design/profiles/official_notice/profile.json +0 -0
  115. {python_hwpx_automation-7.0.2 → python_hwpx_automation-7.0.4}/src/hwpx_automation/office/authoring/design/profiles/official_notice/template.hwpx +0 -0
  116. {python_hwpx_automation-7.0.2 → python_hwpx_automation-7.0.4}/src/hwpx_automation/office/authoring/design/profiles/report/fragments/body.xml +0 -0
  117. {python_hwpx_automation-7.0.2 → python_hwpx_automation-7.0.4}/src/hwpx_automation/office/authoring/design/profiles/report/fragments/heading.xml +0 -0
  118. {python_hwpx_automation-7.0.2 → python_hwpx_automation-7.0.4}/src/hwpx_automation/office/authoring/design/profiles/report/fragments/info_table.xml +0 -0
  119. {python_hwpx_automation-7.0.2 → python_hwpx_automation-7.0.4}/src/hwpx_automation/office/authoring/design/profiles/report/fragments/title.xml +0 -0
  120. {python_hwpx_automation-7.0.2 → python_hwpx_automation-7.0.4}/src/hwpx_automation/office/authoring/design/profiles/report/profile.json +0 -0
  121. {python_hwpx_automation-7.0.2 → python_hwpx_automation-7.0.4}/src/hwpx_automation/office/authoring/design/profiles/report/template.hwpx +0 -0
  122. {python_hwpx_automation-7.0.2 → python_hwpx_automation-7.0.4}/src/hwpx_automation/office/authoring/design/validator.py +0 -0
  123. {python_hwpx_automation-7.0.2 → python_hwpx_automation-7.0.4}/src/hwpx_automation/office/authoring/presets/__init__.py +0 -0
  124. {python_hwpx_automation-7.0.2 → python_hwpx_automation-7.0.4}/src/hwpx_automation/office/authoring/presets/proposal.py +0 -0
  125. {python_hwpx_automation-7.0.2 → python_hwpx_automation-7.0.4}/src/hwpx_automation/office/authoring/report_parser.py +0 -0
  126. {python_hwpx_automation-7.0.2 → python_hwpx_automation-7.0.4}/src/hwpx_automation/office/authoring/style_profile.py +0 -0
  127. {python_hwpx_automation-7.0.2 → python_hwpx_automation-7.0.4}/src/hwpx_automation/office/authoring/template_analyzer.py +0 -0
  128. {python_hwpx_automation-7.0.2 → python_hwpx_automation-7.0.4}/src/hwpx_automation/office/charting/__init__.py +0 -0
  129. {python_hwpx_automation-7.0.2 → python_hwpx_automation-7.0.4}/src/hwpx_automation/office/compliance/__init__.py +0 -0
  130. {python_hwpx_automation-7.0.2 → python_hwpx_automation-7.0.4}/src/hwpx_automation/office/compliance/official_lint.py +0 -0
  131. {python_hwpx_automation-7.0.2 → python_hwpx_automation-7.0.4}/src/hwpx_automation/office/compliance/pii.py +0 -0
  132. {python_hwpx_automation-7.0.2 → python_hwpx_automation-7.0.4}/src/hwpx_automation/office/document_ops/__init__.py +0 -0
  133. {python_hwpx_automation-7.0.2 → python_hwpx_automation-7.0.4}/src/hwpx_automation/office/document_ops/comparison.py +0 -0
  134. {python_hwpx_automation-7.0.2 → python_hwpx_automation-7.0.4}/src/hwpx_automation/office/document_ops/mail_merge.py +0 -0
  135. {python_hwpx_automation-7.0.2 → python_hwpx_automation-7.0.4}/src/hwpx_automation/office/document_ops/redline.py +0 -0
  136. {python_hwpx_automation-7.0.2 → python_hwpx_automation-7.0.4}/src/hwpx_automation/office/evalplan/__init__.py +0 -0
  137. {python_hwpx_automation-7.0.2 → python_hwpx_automation-7.0.4}/src/hwpx_automation/office/evalplan/runtime.py +0 -0
  138. {python_hwpx_automation-7.0.2 → python_hwpx_automation-7.0.4}/src/hwpx_automation/office/exam/__init__.py +0 -0
  139. {python_hwpx_automation-7.0.2 → python_hwpx_automation-7.0.4}/src/hwpx_automation/office/exam/compose.py +0 -0
  140. {python_hwpx_automation-7.0.2 → python_hwpx_automation-7.0.4}/src/hwpx_automation/office/exam/ir.py +0 -0
  141. {python_hwpx_automation-7.0.2 → python_hwpx_automation-7.0.4}/src/hwpx_automation/office/exam/measure.py +0 -0
  142. {python_hwpx_automation-7.0.2 → python_hwpx_automation-7.0.4}/src/hwpx_automation/office/exam/parser.py +0 -0
  143. {python_hwpx_automation-7.0.2 → python_hwpx_automation-7.0.4}/src/hwpx_automation/office/exam/profile.py +0 -0
  144. {python_hwpx_automation-7.0.2 → python_hwpx_automation-7.0.4}/src/hwpx_automation/office/form_fill/__init__.py +0 -0
  145. {python_hwpx_automation-7.0.2 → python_hwpx_automation-7.0.4}/src/hwpx_automation/office/form_fill/classification.py +0 -0
  146. {python_hwpx_automation-7.0.2 → python_hwpx_automation-7.0.4}/src/hwpx_automation/office/form_fill/fill_residue.py +0 -0
  147. {python_hwpx_automation-7.0.2 → python_hwpx_automation-7.0.4}/src/hwpx_automation/office/form_fill/fit/__init__.py +0 -0
  148. {python_hwpx_automation-7.0.2 → python_hwpx_automation-7.0.4}/src/hwpx_automation/office/form_fill/fit/apply.py +0 -0
  149. {python_hwpx_automation-7.0.2 → python_hwpx_automation-7.0.4}/src/hwpx_automation/office/form_fill/fit/engine.py +0 -0
  150. {python_hwpx_automation-7.0.2 → python_hwpx_automation-7.0.4}/src/hwpx_automation/office/form_fill/fit/measure.py +0 -0
  151. {python_hwpx_automation-7.0.2 → python_hwpx_automation-7.0.4}/src/hwpx_automation/office/form_fill/fit/policy.py +0 -0
  152. {python_hwpx_automation-7.0.2 → python_hwpx_automation-7.0.4}/src/hwpx_automation/office/form_fill/fit/report.py +0 -0
  153. {python_hwpx_automation-7.0.2 → python_hwpx_automation-7.0.4}/src/hwpx_automation/office/form_fill/fit/seal.py +0 -0
  154. {python_hwpx_automation-7.0.2 → python_hwpx_automation-7.0.4}/src/hwpx_automation/office/form_fill/guidance.py +0 -0
  155. {python_hwpx_automation-7.0.2 → python_hwpx_automation-7.0.4}/src/hwpx_automation/office/form_fill/split_run.py +0 -0
  156. {python_hwpx_automation-7.0.2 → python_hwpx_automation-7.0.4}/src/hwpx_automation/office/form_fill/template_formfit.py +0 -0
  157. {python_hwpx_automation-7.0.2 → python_hwpx_automation-7.0.4}/src/hwpx_automation/office/house_style/__init__.py +0 -0
  158. {python_hwpx_automation-7.0.2 → python_hwpx_automation-7.0.4}/src/hwpx_automation/office/house_style/composition.py +0 -0
  159. {python_hwpx_automation-7.0.2 → python_hwpx_automation-7.0.4}/src/hwpx_automation/office/house_style/data/bank.json +0 -0
  160. {python_hwpx_automation-7.0.2 → python_hwpx_automation-7.0.4}/src/hwpx_automation/office/house_style/data/genres.json +0 -0
  161. {python_hwpx_automation-7.0.2 → python_hwpx_automation-7.0.4}/src/hwpx_automation/office/house_style/gianmun.py +0 -0
  162. {python_hwpx_automation-7.0.2 → python_hwpx_automation-7.0.4}/src/hwpx_automation/office/house_style/org_chart.py +0 -0
  163. {python_hwpx_automation-7.0.2 → python_hwpx_automation-7.0.4}/src/hwpx_automation/office/quality/__init__.py +0 -0
  164. {python_hwpx_automation-7.0.2 → python_hwpx_automation-7.0.4}/src/hwpx_automation/office/quality/page_guard.py +0 -0
  165. {python_hwpx_automation-7.0.2 → python_hwpx_automation-7.0.4}/src/hwpx_automation/office/rendering/__init__.py +0 -0
  166. {python_hwpx_automation-7.0.2 → python_hwpx_automation-7.0.4}/src/hwpx_automation/office/rendering/_hancom_open_rate.ps1 +0 -0
  167. {python_hwpx_automation-7.0.2 → python_hwpx_automation-7.0.4}/src/hwpx_automation/office/rendering/_refresh_hwpx_mac.applescript +0 -0
  168. {python_hwpx_automation-7.0.2 → python_hwpx_automation-7.0.4}/src/hwpx_automation/office/rendering/_render_hwpx.ps1 +0 -0
  169. {python_hwpx_automation-7.0.2 → python_hwpx_automation-7.0.4}/src/hwpx_automation/office/rendering/_render_hwpx_mac.applescript +0 -0
  170. {python_hwpx_automation-7.0.2 → python_hwpx_automation-7.0.4}/src/hwpx_automation/office/rendering/block_splits.py +0 -0
  171. {python_hwpx_automation-7.0.2 → python_hwpx_automation-7.0.4}/src/hwpx_automation/office/rendering/detectors.py +0 -0
  172. {python_hwpx_automation-7.0.2 → python_hwpx_automation-7.0.4}/src/hwpx_automation/office/rendering/fixture_corpus.py +0 -0
  173. {python_hwpx_automation-7.0.2 → python_hwpx_automation-7.0.4}/src/hwpx_automation/office/rendering/oracle.py +0 -0
  174. {python_hwpx_automation-7.0.2 → python_hwpx_automation-7.0.4}/src/hwpx_automation/office/rendering/page_qa.py +0 -0
  175. {python_hwpx_automation-7.0.2 → python_hwpx_automation-7.0.4}/src/hwpx_automation/office/rendering/qa_contracts.py +0 -0
  176. {python_hwpx_automation-7.0.2 → python_hwpx_automation-7.0.4}/src/hwpx_automation/office/rendering/qa_metrics.py +0 -0
  177. {python_hwpx_automation-7.0.2 → python_hwpx_automation-7.0.4}/src/hwpx_automation/office/utilities/__init__.py +0 -0
  178. {python_hwpx_automation-7.0.2 → python_hwpx_automation-7.0.4}/src/hwpx_automation/office/utilities/table_compute.py +0 -0
  179. {python_hwpx_automation-7.0.2 → python_hwpx_automation-7.0.4}/src/hwpx_automation/ops_services/__init__.py +0 -0
  180. {python_hwpx_automation-7.0.2 → python_hwpx_automation-7.0.4}/src/hwpx_automation/ops_services/_border_fill.py +0 -0
  181. {python_hwpx_automation-7.0.2 → python_hwpx_automation-7.0.4}/src/hwpx_automation/ops_services/composition.py +0 -0
  182. {python_hwpx_automation-7.0.2 → python_hwpx_automation-7.0.4}/src/hwpx_automation/ops_services/content_layout.py +0 -0
  183. {python_hwpx_automation-7.0.2 → python_hwpx_automation-7.0.4}/src/hwpx_automation/ops_services/context.py +0 -0
  184. {python_hwpx_automation-7.0.2 → python_hwpx_automation-7.0.4}/src/hwpx_automation/ops_services/form_fields.py +0 -0
  185. {python_hwpx_automation-7.0.2 → python_hwpx_automation-7.0.4}/src/hwpx_automation/ops_services/media.py +0 -0
  186. {python_hwpx_automation-7.0.2 → python_hwpx_automation-7.0.4}/src/hwpx_automation/ops_services/memo_style.py +0 -0
  187. {python_hwpx_automation-7.0.2 → python_hwpx_automation-7.0.4}/src/hwpx_automation/ops_services/package_validation.py +0 -0
  188. {python_hwpx_automation-7.0.2 → python_hwpx_automation-7.0.4}/src/hwpx_automation/ops_services/planning.py +0 -0
  189. {python_hwpx_automation-7.0.2 → python_hwpx_automation-7.0.4}/src/hwpx_automation/ops_services/preview_export.py +0 -0
  190. {python_hwpx_automation-7.0.2 → python_hwpx_automation-7.0.4}/src/hwpx_automation/ops_services/read_query.py +0 -0
  191. {python_hwpx_automation-7.0.2 → python_hwpx_automation-7.0.4}/src/hwpx_automation/ops_services/save_policy.py +0 -0
  192. {python_hwpx_automation-7.0.2 → python_hwpx_automation-7.0.4}/src/hwpx_automation/ops_services/tables.py +0 -0
  193. {python_hwpx_automation-7.0.2 → python_hwpx_automation-7.0.4}/src/hwpx_automation/ops_services/transactions.py +0 -0
  194. {python_hwpx_automation-7.0.2 → python_hwpx_automation-7.0.4}/src/hwpx_automation/preview_output_models.py +0 -0
  195. {python_hwpx_automation-7.0.2 → python_hwpx_automation-7.0.4}/src/hwpx_automation/public-modules.json +0 -0
  196. {python_hwpx_automation-7.0.2 → python_hwpx_automation-7.0.4}/src/hwpx_automation/py.typed +0 -0
  197. {python_hwpx_automation-7.0.2 → python_hwpx_automation-7.0.4}/src/hwpx_automation/quality.py +0 -0
  198. {python_hwpx_automation-7.0.2 → python_hwpx_automation-7.0.4}/src/hwpx_automation/quality_generation.py +0 -0
  199. {python_hwpx_automation-7.0.2 → python_hwpx_automation-7.0.4}/src/hwpx_automation/resources.py +0 -0
  200. {python_hwpx_automation-7.0.2 → python_hwpx_automation-7.0.4}/src/hwpx_automation/runtime.py +0 -0
  201. {python_hwpx_automation-7.0.2 → python_hwpx_automation-7.0.4}/src/hwpx_automation/runtime_services.py +0 -0
  202. {python_hwpx_automation-7.0.2 → python_hwpx_automation-7.0.4}/src/hwpx_automation/server.py +0 -0
  203. {python_hwpx_automation-7.0.2 → python_hwpx_automation-7.0.4}/src/hwpx_automation/storage.py +0 -0
  204. {python_hwpx_automation-7.0.2 → python_hwpx_automation-7.0.4}/src/hwpx_automation/tool_bindings.py +0 -0
  205. {python_hwpx_automation-7.0.2 → python_hwpx_automation-7.0.4}/src/hwpx_automation/upstream.py +0 -0
  206. {python_hwpx_automation-7.0.2 → python_hwpx_automation-7.0.4}/src/hwpx_automation/utils/__init__.py +0 -0
  207. {python_hwpx_automation-7.0.2 → python_hwpx_automation-7.0.4}/src/hwpx_automation/utils/helpers.py +0 -0
  208. {python_hwpx_automation-7.0.2 → python_hwpx_automation-7.0.4}/src/hwpx_automation/visual_qa.py +0 -0
  209. {python_hwpx_automation-7.0.2 → python_hwpx_automation-7.0.4}/src/hwpx_automation/workflow/__init__.py +0 -0
  210. {python_hwpx_automation-7.0.2 → python_hwpx_automation-7.0.4}/src/hwpx_automation/workflow/adapters.py +0 -0
  211. {python_hwpx_automation-7.0.2 → python_hwpx_automation-7.0.4}/src/hwpx_automation/workflow/dispatcher.py +0 -0
  212. {python_hwpx_automation-7.0.2 → python_hwpx_automation-7.0.4}/src/hwpx_automation/workflow/models.py +0 -0
  213. {python_hwpx_automation-7.0.2 → python_hwpx_automation-7.0.4}/src/hwpx_automation/workflow/policy.py +0 -0
  214. {python_hwpx_automation-7.0.2 → python_hwpx_automation-7.0.4}/src/hwpx_automation/workflow/render_contracts.py +0 -0
  215. {python_hwpx_automation-7.0.2 → python_hwpx_automation-7.0.4}/src/hwpx_automation/workflow/render_metrics.py +0 -0
  216. {python_hwpx_automation-7.0.2 → python_hwpx_automation-7.0.4}/src/hwpx_automation/workflow/render_queue.py +0 -0
  217. {python_hwpx_automation-7.0.2 → python_hwpx_automation-7.0.4}/src/hwpx_automation/workflow/render_security.py +0 -0
  218. {python_hwpx_automation-7.0.2 → python_hwpx_automation-7.0.4}/src/hwpx_automation/workflow/render_transport.py +0 -0
  219. {python_hwpx_automation-7.0.2 → python_hwpx_automation-7.0.4}/src/hwpx_automation/workflow/rendering.py +0 -0
  220. {python_hwpx_automation-7.0.2 → python_hwpx_automation-7.0.4}/src/hwpx_automation/workflow/service.py +0 -0
  221. {python_hwpx_automation-7.0.2 → python_hwpx_automation-7.0.4}/src/hwpx_automation/workflow/state_machine.py +0 -0
  222. {python_hwpx_automation-7.0.2 → python_hwpx_automation-7.0.4}/src/hwpx_automation/workflow/store.py +0 -0
  223. {python_hwpx_automation-7.0.2 → python_hwpx_automation-7.0.4}/src/hwpx_automation/workspace.py +0 -0
  224. {python_hwpx_automation-7.0.2 → python_hwpx_automation-7.0.4}/src/python_hwpx_automation.egg-info/SOURCES.txt +0 -0
  225. {python_hwpx_automation-7.0.2 → python_hwpx_automation-7.0.4}/src/python_hwpx_automation.egg-info/dependency_links.txt +0 -0
  226. {python_hwpx_automation-7.0.2 → python_hwpx_automation-7.0.4}/src/python_hwpx_automation.egg-info/entry_points.txt +0 -0
  227. {python_hwpx_automation-7.0.2 → python_hwpx_automation-7.0.4}/src/python_hwpx_automation.egg-info/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: python-hwpx-automation
3
- Version: 7.0.2
3
+ Version: 7.0.4
4
4
  Summary: Task-oriented HWPX document automation for Python, with an optional MCP adapter.
5
5
  Author: Kohkyuhyun
6
6
  License-Expression: Apache-2.0
@@ -20,7 +20,7 @@ Requires-Python: >=3.10
20
20
  Description-Content-Type: text/markdown
21
21
  License-File: LICENSE
22
22
  License-File: NOTICE
23
- Requires-Dist: python-hwpx<7,>=6.0.2
23
+ Requires-Dist: python-hwpx<7,>=6.3.0
24
24
  Requires-Dist: pydantic<3,>=2.11
25
25
  Requires-Dist: cryptography>=42.0
26
26
  Requires-Dist: anyio>=4.0
@@ -74,12 +74,13 @@ Dynamic: license-file
74
74
 
75
75
  <!-- release-state: release-approved -->
76
76
  > [!NOTE]
77
- > 공개 트레인: `python-hwpx 6.1.0 → python-hwpx-automation 7.0.1
78
- > hwpx-plugin 2.0.0`. automation 7.0.2 패치(Windows 저장 수리 #98,
79
- > 업로드 경로 안내 #75)가 release-approved 상태이며, 원격
80
- > 진실(core·automation PyPI와 plugin GitHub
81
- > Release·marketplace·실제 marketplace 설치) 관찰 전까지 공개 좌표를
82
- > 승격하지 않습니다 [릴리스 runbook](docs/release-runbook.md)
77
+ > 아직 공개되지 않은 7.0.4 후보입니다.
78
+ > 후보 조합: `python-hwpx 6.3.0 → python-hwpx-automation 7.0.4 hwpx-plugin 2.1.0`.
79
+ > 공개 트레인: `python-hwpx 6.3.0 → python-hwpx-automation 7.0.3 → hwpx-plugin 2.0.3`.
80
+ > 계약은 `8c278ebd5becba08`이며 도구 표면과 최소 호환 버전은 유지합니다.
81
+ > 공개 좌표는 core·automation PyPI와 plugin GitHub
82
+ > Release·marketplace·실제 marketplace 설치 관찰 후에만 승격합니다.
83
+ > [릴리스 runbook](docs/release-runbook.md)
83
84
 
84
85
  [python-hwpx](https://github.com/airmang/python-hwpx) 엔진 위에서 문서 저작·
85
86
  양식 채움·시험지 조판·안전한 에이전트 워크플로를 제공하는 응용 계층입니다.
@@ -133,7 +134,7 @@ Gemini CLI는 `~/.gemini/settings.json`, Cursor·Windsurf는 각 에디터의 MC
133
134
  "command": "uvx",
134
135
  "args": [
135
136
  "--from",
136
- "python-hwpx-automation[mcp]==6.1.3",
137
+ "python-hwpx-automation[mcp]==7.0.3",
137
138
  "hwpx-automation-mcp"
138
139
  ],
139
140
  "env": {
@@ -14,12 +14,13 @@
14
14
 
15
15
  <!-- release-state: release-approved -->
16
16
  > [!NOTE]
17
- > 공개 트레인: `python-hwpx 6.1.0 → python-hwpx-automation 7.0.1
18
- > hwpx-plugin 2.0.0`. automation 7.0.2 패치(Windows 저장 수리 #98,
19
- > 업로드 경로 안내 #75)가 release-approved 상태이며, 원격
20
- > 진실(core·automation PyPI와 plugin GitHub
21
- > Release·marketplace·실제 marketplace 설치) 관찰 전까지 공개 좌표를
22
- > 승격하지 않습니다 [릴리스 runbook](docs/release-runbook.md)
17
+ > 아직 공개되지 않은 7.0.4 후보입니다.
18
+ > 후보 조합: `python-hwpx 6.3.0 → python-hwpx-automation 7.0.4 hwpx-plugin 2.1.0`.
19
+ > 공개 트레인: `python-hwpx 6.3.0 → python-hwpx-automation 7.0.3 → hwpx-plugin 2.0.3`.
20
+ > 계약은 `8c278ebd5becba08`이며 도구 표면과 최소 호환 버전은 유지합니다.
21
+ > 공개 좌표는 core·automation PyPI와 plugin GitHub
22
+ > Release·marketplace·실제 marketplace 설치 관찰 후에만 승격합니다.
23
+ > [릴리스 runbook](docs/release-runbook.md)
23
24
 
24
25
  [python-hwpx](https://github.com/airmang/python-hwpx) 엔진 위에서 문서 저작·
25
26
  양식 채움·시험지 조판·안전한 에이전트 워크플로를 제공하는 응용 계층입니다.
@@ -73,7 +74,7 @@ Gemini CLI는 `~/.gemini/settings.json`, Cursor·Windsurf는 각 에디터의 MC
73
74
  "command": "uvx",
74
75
  "args": [
75
76
  "--from",
76
- "python-hwpx-automation[mcp]==6.1.3",
77
+ "python-hwpx-automation[mcp]==7.0.3",
77
78
  "hwpx-automation-mcp"
78
79
  ],
79
80
  "env": {
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "python-hwpx-automation"
7
- version = "7.0.2"
7
+ version = "7.0.4"
8
8
  description = "Task-oriented HWPX document automation for Python, with an optional MCP adapter."
9
9
  readme = "README.md"
10
10
  authors = [{ name = "Kohkyuhyun" }]
@@ -31,7 +31,7 @@ dependencies = [
31
31
  # breaking an already-published automation line. WP-F (engine surface 6.0):
32
32
  # this line adapted to the new namespace surface (design §9 WP-F) — the dev0
33
33
  # pre-release qualifier tracks core's own not-yet-tagged 6.0 identity.
34
- "python-hwpx>=6.0.2,<7", # HWPX object model, OXML/OPC, format-native primitives
34
+ "python-hwpx>=6.3.0,<7", # HWPX object model, OXML/OPC, format-native primitives
35
35
 
36
36
  "pydantic>=2.11,<3",
37
37
  "cryptography>=42.0",
@@ -272,6 +272,60 @@ def describe_capabilities(domain: str | None = None) -> dict:
272
272
  return report
273
273
 
274
274
 
275
+ _STACK_UPDATE_STATE_SCHEMA = "hwpx.stack-update-state.v1"
276
+
277
+
278
+ def _stack_update_block() -> dict[str, Any]:
279
+ """Launcher-managed runtime update state (hwpx-plugins Feature 066).
280
+
281
+ The bundled launcher writes update-state.json and passes its path as
282
+ HWPX_STACK_UPDATE_STATE. Without it the runtime is not launcher-managed
283
+ (pip install, editable checkout, plain uvx) and the block says so; it
284
+ never guesses.
285
+ """
286
+ path = os.environ.get("HWPX_STACK_UPDATE_STATE")
287
+ if not path:
288
+ return {"available": False, "reason": "NOT_MANAGED"}
289
+ try:
290
+ with open(path, encoding="utf-8") as handle:
291
+ state = json.load(handle)
292
+ except FileNotFoundError:
293
+ return {"available": False, "reason": "STATE_MISSING", "path": path}
294
+ except (OSError, UnicodeDecodeError, json.JSONDecodeError) as exc:
295
+ return {"available": False, "reason": "STATE_UNREADABLE", "path": path, "detail": str(exc)}
296
+ if not isinstance(state, dict) or state.get("schemaVersion") != _STACK_UPDATE_STATE_SCHEMA:
297
+ return {"available": False, "reason": "STATE_SCHEMA_UNKNOWN", "path": path}
298
+ runtime = state.get("runtime")
299
+ if not isinstance(runtime, dict):
300
+ return {"available": False, "reason": "STATE_INVALID", "path": path}
301
+ installed = runtime.get("installed")
302
+ if (
303
+ not isinstance(installed, dict)
304
+ or set(installed) != {"python-hwpx", "python-hwpx-automation"}
305
+ or not all(isinstance(value, str) and value for value in installed.values())
306
+ ):
307
+ return {"available": False, "reason": "STATE_INVALID", "path": path}
308
+ running = {
309
+ "python-hwpx": _package_version("python-hwpx"),
310
+ "python-hwpx-automation": _package_version("python-hwpx-automation"),
311
+ }
312
+ runtime = {
313
+ **runtime,
314
+ "running": running,
315
+ "restartRequired": runtime["installed"] != running,
316
+ }
317
+ return {
318
+ "available": True,
319
+ "path": path,
320
+ "checkedAt": state.get("checkedAt"),
321
+ "autoUpdate": state.get("autoUpdate"),
322
+ "channel": state.get("channel"),
323
+ "runtime": runtime,
324
+ "pluginBundle": state.get("pluginBundle"),
325
+ "lastError": state.get("lastError"),
326
+ }
327
+
328
+
275
329
  def mcp_server_health() -> dict:
276
330
  """MCP 서버 transport와 timeout/keepalive 점검 정보를 반환합니다."""
277
331
  transport = env_value("TRANSPORT", "stdio")
@@ -386,6 +440,7 @@ def mcp_server_health() -> dict:
386
440
  ),
387
441
  },
388
442
  "capability": _capability_block(skew_detected, surface_details),
443
+ "stackUpdate": _stack_update_block(),
389
444
  "unitPolicy": {
390
445
  "status": "audited",
391
446
  "fontSize": "points",
@@ -5,20 +5,20 @@
5
5
  "releaseState": {
6
6
  "status": "release-approved",
7
7
  "candidate": {
8
- "pythonHwpx": "6.1.0",
8
+ "pythonHwpx": "6.3.0",
9
9
  "canonicalDistribution": "python-hwpx-automation",
10
- "canonicalAutomation": "7.0.2",
10
+ "canonicalAutomation": "7.0.4",
11
11
  "compatibilityDistribution": "hwpx-mcp-server",
12
- "compatibility": "7.0.2",
13
- "plugin": "2.0.0",
14
- "contractHash": "34a91560759dc47a"
12
+ "compatibility": "7.0.4",
13
+ "plugin": "2.1.0",
14
+ "contractHash": "8c278ebd5becba08"
15
15
  },
16
16
  "currentPublic": {
17
- "pythonHwpx": "6.1.0",
17
+ "pythonHwpx": "6.3.0",
18
18
  "primaryDistribution": "python-hwpx-automation",
19
- "primaryApplication": "7.0.1",
20
- "plugin": "2.0.0",
21
- "contractHash": "34a91560759dc47a"
19
+ "primaryApplication": "7.0.3",
20
+ "plugin": "2.0.3",
21
+ "contractHash": "8c278ebd5becba08"
22
22
  },
23
23
  "promotionGate": "Three states are mandatory: unreleased-candidate while auditing; release-approved only after separate owner approval and while currentPublic still names the previously observed coherent stack; released only in a follow-up commit after remote truth is observed for core, canonical automation, the compatibility distribution, the plugin GitHub release, the marketplace entry, and a real marketplace install. The automation tag workflow publishes only release-approved, leaves currentPublic unchanged, and hands an attached receipt to plugin publication."
24
24
  },
@@ -1024,7 +1024,11 @@ def _identity_attribute_names(local: str, node: Any) -> tuple[str, ...]:
1024
1024
  if local in {"p", "tbl", "pic", "memo", "fieldBegin", *_SHAPE_KINDS}:
1025
1025
  return tuple(name for name in ("id", "instid", "instId") if node.get(name) is not None)
1026
1026
  if local in {"footNote", "endNote"}:
1027
- return tuple(name for name in ("instId", "id") if node.get(name) is not None)
1027
+ # 정본 속성명은 실한컴이 쓰는 소문자 "instid"; "instId" 과거 코어
1028
+ # 저작이 방출한 카멜케이스 산출물 호환(재발급 대상 유지). #101
1029
+ return tuple(
1030
+ name for name in ("instid", "instId", "id") if node.get(name) is not None
1031
+ )
1028
1032
  return ()
1029
1033
 
1030
1034
 
@@ -1036,7 +1040,11 @@ def _refresh_one_identity(
1036
1040
  field_ids: dict[str, str],
1037
1041
  ) -> None:
1038
1042
  names = _identity_attribute_names(local, node)
1039
- paired_identity = allocate() if len(names) > 1 and local in {"pic", *_SHAPE_KINDS} else None
1043
+ # 요소에 실린 여러 식별 속성(id+instid, 또는 instid/instId 별칭 쌍)은
1044
+ # 같은 정체성이다 — 하나의 새 값을 페어로 재발급한다. 노트(footNote/endNote)
1045
+ # 는 정본 instid와 과거 산출물 instId가 공존할 수 있어 #101에서 편입.
1046
+ paired_kinds = {"pic", "footNote", "endNote", *_SHAPE_KINDS}
1047
+ paired_identity = allocate() if len(names) > 1 and local in paired_kinds else None
1040
1048
  for name in names:
1041
1049
  old = str(node.get(name))
1042
1050
  new = paired_identity or allocate()
@@ -1292,7 +1292,7 @@ def inspect_document_authoring_quality(
1292
1292
  _rendered = _mac.render_pdf(str(_hwpx), str(_pdf))
1293
1293
  if _rendered and Path(_rendered).exists():
1294
1294
  try:
1295
- import fitz as _fitz
1295
+ import pymupdf as _fitz
1296
1296
 
1297
1297
  _doc = _fitz.open(_rendered)
1298
1298
  _has_text = any(
@@ -185,7 +185,7 @@ def fitz_available() -> bool:
185
185
  """True when PyMuPDF (``fitz``) can be imported (the extraction backend)."""
186
186
 
187
187
  try: # pragma: no cover - trivial import probe
188
- import fitz # noqa: F401
188
+ import pymupdf as fitz # noqa: F401
189
189
  except Exception:
190
190
  return False
191
191
  return True
@@ -205,7 +205,7 @@ def extract_word_boxes(pdf_path: str, *, page: int | None = None) -> list[WordBo
205
205
 
206
206
  if not fitz_available():
207
207
  raise OracleUnavailable("PyMuPDF (fitz) is not installed")
208
- import fitz
208
+ import pymupdf as fitz
209
209
 
210
210
  boxes: list[WordBox] = []
211
211
  try:
@@ -255,7 +255,7 @@ def extract_glyph_boxes(pdf_path: str, *, page: int | None = None) -> list[WordB
255
255
 
256
256
  if not fitz_available():
257
257
  raise OracleUnavailable("PyMuPDF (fitz) is not installed")
258
- import fitz
258
+ import pymupdf as fitz
259
259
 
260
260
  boxes: list[WordBox] = []
261
261
  try:
@@ -709,7 +709,7 @@ def render_glyph_boxes(
709
709
  if not pdf or not os.path.exists(pdf) or os.path.getsize(pdf) == 0:
710
710
  raise OracleUnavailable("Hancom render produced no PDF")
711
711
  boxes = extract_glyph_boxes(pdf, page=page)
712
- import fitz
712
+ import pymupdf as fitz
713
713
 
714
714
  with fitz.open(pdf) as doc:
715
715
  if len(doc) == 0: # a 0-page render is a failed render, not a clean pass
@@ -742,7 +742,7 @@ def extract_cell_clips(pdf_path: str, *, page: int | None = None) -> list[Rect]:
742
742
 
743
743
  if not fitz_available():
744
744
  raise OracleUnavailable("PyMuPDF (fitz) is not installed")
745
- import fitz
745
+ import pymupdf as fitz
746
746
 
747
747
  clips: list[Rect] = []
748
748
  try:
@@ -785,7 +785,7 @@ def extract_image_boxes(pdf_path: str, *, page: int | None = None) -> list[Rect]
785
785
 
786
786
  if not fitz_available():
787
787
  raise OracleUnavailable("PyMuPDF (fitz) is not installed")
788
- import fitz
788
+ import pymupdf as fitz
789
789
 
790
790
  boxes: list[Rect] = []
791
791
  try:
@@ -843,7 +843,7 @@ def render_form_geometry(
843
843
  raise OracleUnavailable("Hancom render produced no PDF")
844
844
  glyphs = extract_glyph_boxes(rendered, page=page)
845
845
  clips = extract_cell_clips(rendered, page=page)
846
- import fitz
846
+ import pymupdf as fitz
847
847
 
848
848
  with fitz.open(rendered) as doc:
849
849
  if len(doc) == 0:
@@ -957,7 +957,7 @@ def extract_layout_signature(pdf_path: str) -> LayoutSignature:
957
957
 
958
958
  if not fitz_available():
959
959
  raise OracleUnavailable("PyMuPDF (fitz) is not installed")
960
- import fitz
960
+ import pymupdf as fitz
961
961
 
962
962
  try:
963
963
  doc = fitz.open(pdf_path)
@@ -180,7 +180,7 @@ def detect_overflow_crossings(
180
180
  PyMuPDF; raises ``RuntimeError`` if unavailable (caller degrades to unverified).
181
181
  """
182
182
  try:
183
- import fitz
183
+ import pymupdf as fitz
184
184
  except Exception as exc: # pragma: no cover - env probe
185
185
  raise RuntimeError(f"PyMuPDF unavailable: {exc}") from exc
186
186
 
@@ -266,7 +266,7 @@ def score_render(
266
266
  [f"render imaging deps unavailable: {exc}"],
267
267
  )
268
268
 
269
- import fitz # already importable if we got here
269
+ import pymupdf as fitz # already importable if we got here
270
270
 
271
271
  doc = fitz.open(pdf)
272
272
  pages = doc.page_count
@@ -27,7 +27,7 @@ _TALL_BAND_REL = 1.0
27
27
 
28
28
  def pymupdf_available() -> bool:
29
29
  try: # pragma: no cover - trivial import probe
30
- import fitz # noqa: F401
30
+ import pymupdf as fitz # noqa: F401
31
31
  except Exception:
32
32
  return False
33
33
  return True
@@ -36,7 +36,7 @@ def pymupdf_available() -> bool:
36
36
  def render_pdf_to_images(pdf_path: str | Path, dpi: int = 150) -> list["Image.Image"]:
37
37
  """Rasterize every page of ``pdf_path`` to a list of RGB ``PIL.Image``."""
38
38
 
39
- import fitz # pymupdf
39
+ import pymupdf as fitz # pymupdf
40
40
  from PIL import Image
41
41
 
42
42
  pages: list[Image.Image] = []
@@ -255,7 +255,7 @@ class SerializedHancomWorker:
255
255
  @staticmethod
256
256
  def _rasterize(pdf: Path, destination: Path, dpi: int) -> list[Path]:
257
257
  try:
258
- import fitz
258
+ import pymupdf as fitz
259
259
  except ImportError as exc:
260
260
  raise RuntimeError("PyMuPDF is required for page PNG output") from exc
261
261
  document = fitz.open(pdf)
@@ -20,7 +20,7 @@ from dataclasses import dataclass
20
20
  from enum import Enum
21
21
  from typing import Any, Callable, Mapping
22
22
 
23
- MIN_PYTHON_HWPX = "6.0.2"
23
+ MIN_PYTHON_HWPX = "6.3.0"
24
24
  # The 5.0 train: core drops the workflow surfaces and the `hwpx` console name,
25
25
  # this package picks the name up, and the plugin pins both. The three move
26
26
  # together — a mixed set is what "no valid install has two declarers" rules out.
@@ -33,7 +33,7 @@ MIN_SKILL_VERSION = "2.0.0"
33
33
  # recomputes and verifies the bound callable/schema contract through
34
34
  # ``contract_hash()``; this constant prevents those services from importing the
35
35
  # runtime composer merely to stamp the approved release receipt.
36
- RELEASED_CONTRACT_HASH = "34a91560759dc47a"
36
+ RELEASED_CONTRACT_HASH = "8c278ebd5becba08"
37
37
 
38
38
 
39
39
  def describe_callables(entries: Any) -> Any:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: python-hwpx-automation
3
- Version: 7.0.2
3
+ Version: 7.0.4
4
4
  Summary: Task-oriented HWPX document automation for Python, with an optional MCP adapter.
5
5
  Author: Kohkyuhyun
6
6
  License-Expression: Apache-2.0
@@ -20,7 +20,7 @@ Requires-Python: >=3.10
20
20
  Description-Content-Type: text/markdown
21
21
  License-File: LICENSE
22
22
  License-File: NOTICE
23
- Requires-Dist: python-hwpx<7,>=6.0.2
23
+ Requires-Dist: python-hwpx<7,>=6.3.0
24
24
  Requires-Dist: pydantic<3,>=2.11
25
25
  Requires-Dist: cryptography>=42.0
26
26
  Requires-Dist: anyio>=4.0
@@ -74,12 +74,13 @@ Dynamic: license-file
74
74
 
75
75
  <!-- release-state: release-approved -->
76
76
  > [!NOTE]
77
- > 공개 트레인: `python-hwpx 6.1.0 → python-hwpx-automation 7.0.1
78
- > hwpx-plugin 2.0.0`. automation 7.0.2 패치(Windows 저장 수리 #98,
79
- > 업로드 경로 안내 #75)가 release-approved 상태이며, 원격
80
- > 진실(core·automation PyPI와 plugin GitHub
81
- > Release·marketplace·실제 marketplace 설치) 관찰 전까지 공개 좌표를
82
- > 승격하지 않습니다 [릴리스 runbook](docs/release-runbook.md)
77
+ > 아직 공개되지 않은 7.0.4 후보입니다.
78
+ > 후보 조합: `python-hwpx 6.3.0 → python-hwpx-automation 7.0.4 hwpx-plugin 2.1.0`.
79
+ > 공개 트레인: `python-hwpx 6.3.0 → python-hwpx-automation 7.0.3 → hwpx-plugin 2.0.3`.
80
+ > 계약은 `8c278ebd5becba08`이며 도구 표면과 최소 호환 버전은 유지합니다.
81
+ > 공개 좌표는 core·automation PyPI와 plugin GitHub
82
+ > Release·marketplace·실제 marketplace 설치 관찰 후에만 승격합니다.
83
+ > [릴리스 runbook](docs/release-runbook.md)
83
84
 
84
85
  [python-hwpx](https://github.com/airmang/python-hwpx) 엔진 위에서 문서 저작·
85
86
  양식 채움·시험지 조판·안전한 에이전트 워크플로를 제공하는 응용 계층입니다.
@@ -133,7 +134,7 @@ Gemini CLI는 `~/.gemini/settings.json`, Cursor·Windsurf는 각 에디터의 MC
133
134
  "command": "uvx",
134
135
  "args": [
135
136
  "--from",
136
- "python-hwpx-automation[mcp]==6.1.3",
137
+ "python-hwpx-automation[mcp]==7.0.3",
137
138
  "hwpx-automation-mcp"
138
139
  ],
139
140
  "env": {
@@ -1,4 +1,4 @@
1
- python-hwpx<7,>=6.0.2
1
+ python-hwpx<7,>=6.3.0
2
2
  pydantic<3,>=2.11
3
3
  cryptography>=42.0
4
4
  anyio>=4.0