python-hwpx-automation 6.4.2__tar.gz → 6.6.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-6.4.2/src/python_hwpx_automation.egg-info → python_hwpx_automation-6.6.4}/PKG-INFO +13 -11
  2. {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/README.md +11 -9
  3. {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/pyproject.toml +2 -2
  4. {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/capabilities.py +56 -1
  5. {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/fastmcp_adapter.py +26 -0
  6. {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/handlers/form_fill.py +26 -0
  7. {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/handlers/quality_render.py +11 -0
  8. {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/handlers/specialized.py +90 -1
  9. {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/hwpx_ops.py +8 -0
  10. python_hwpx_automation-6.6.4/src/hwpx_automation/identity.json +263 -0
  11. {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/office/agent/blueprint/dump.py +7 -0
  12. {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/office/agent/blueprint/native.py +19 -4
  13. {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/office/agent/commands.py +52 -17
  14. {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/office/agent/document.py +57 -15
  15. {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/office/authoring/__init__.py +18 -2
  16. {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/office/authoring/builder/core.py +56 -0
  17. {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/office/house_style/composition.py +9 -11
  18. python_hwpx_automation-6.6.4/src/hwpx_automation/office/house_style/org_chart.py +273 -0
  19. {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/ops_services/form_fields.py +26 -0
  20. {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/public-modules.json +6 -4
  21. python_hwpx_automation-6.6.4/src/hwpx_automation/resources.py +139 -0
  22. {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/runtime.py +3 -0
  23. {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/server.py +4 -0
  24. {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/tool_bindings.py +4 -0
  25. {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/tool_contract.py +19 -14
  26. {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4/src/python_hwpx_automation.egg-info}/PKG-INFO +13 -11
  27. {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/python_hwpx_automation.egg-info/SOURCES.txt +2 -0
  28. {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/python_hwpx_automation.egg-info/requires.txt +1 -1
  29. python_hwpx_automation-6.4.2/src/hwpx_automation/identity.json +0 -263
  30. {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/LICENSE +0 -0
  31. {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/MANIFEST.in +0 -0
  32. {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/NOTICE +0 -0
  33. {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/setup.cfg +0 -0
  34. {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/__init__.py +0 -0
  35. {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/__init__.pyi +0 -0
  36. {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/__main__.py +0 -0
  37. {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/agent_document.py +0 -0
  38. {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/api.py +0 -0
  39. {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/blind_eval.py +0 -0
  40. {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/compat.py +0 -0
  41. {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/configuration.py +0 -0
  42. {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/core/__init__.py +0 -0
  43. {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/core/content.py +0 -0
  44. {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/core/context.py +0 -0
  45. {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/core/diff.py +0 -0
  46. {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/core/document.py +0 -0
  47. {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/core/formatting.py +0 -0
  48. {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/core/handles.py +0 -0
  49. {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/core/locations.py +0 -0
  50. {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/core/locator.py +0 -0
  51. {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/core/plan.py +0 -0
  52. {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/core/resources.py +0 -0
  53. {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/core/search.py +0 -0
  54. {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/core/transactions.py +0 -0
  55. {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/core/txn.py +0 -0
  56. {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/document_state.py +0 -0
  57. {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/errors.py +0 -0
  58. {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/execution_lock.py +0 -0
  59. {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/form_fill.py +0 -0
  60. {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/form_output_models.py +0 -0
  61. {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/handlers/__init__.py +0 -0
  62. {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/handlers/_shared.py +0 -0
  63. {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/handlers/agent_document.py +0 -0
  64. {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/handlers/authoring.py +0 -0
  65. {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/handlers/content_edit.py +0 -0
  66. {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/handlers/layout_style.py +0 -0
  67. {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/handlers/read_export.py +0 -0
  68. {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/handlers/tracked_changes.py +0 -0
  69. {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/handlers/workflow.py +0 -0
  70. {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/hwp_converter.py +0 -0
  71. {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/hwp_support.py +0 -0
  72. {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/identity.py +0 -0
  73. {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/ingest_adapters.py +0 -0
  74. {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/markdown_plan.py +0 -0
  75. {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/mcp_cli.py +0 -0
  76. {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/metadata/tools_meta.py +0 -0
  77. {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/mixed_form.py +0 -0
  78. {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/mutation_models.py +0 -0
  79. {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/network_policy.py +0 -0
  80. {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/office/__init__.py +0 -0
  81. {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/office/agent/__init__.py +0 -0
  82. {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/office/agent/_batch_verification.py +0 -0
  83. {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/office/agent/blueprint/__init__.py +0 -0
  84. {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/office/agent/blueprint/bundle.py +0 -0
  85. {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/office/agent/blueprint/catalog.py +0 -0
  86. {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/office/agent/blueprint/mapping.py +0 -0
  87. {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/office/agent/blueprint/model.py +0 -0
  88. {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/office/agent/blueprint/replay.py +0 -0
  89. {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/office/agent/catalog.py +0 -0
  90. {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/office/agent/cli.py +0 -0
  91. {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/office/agent/form_plan.py +0 -0
  92. {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/office/agent/model.py +0 -0
  93. {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/office/agent/path.py +0 -0
  94. {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/office/agent/query.py +0 -0
  95. {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/office/agent/story.py +0 -0
  96. {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/office/authoring/advanced_generators.py +0 -0
  97. {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/office/authoring/builder/__init__.py +0 -0
  98. {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/office/authoring/builder/report.py +0 -0
  99. {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/office/authoring/design/__init__.py +0 -0
  100. {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/office/authoring/design/_support.py +0 -0
  101. {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/office/authoring/design/composer.py +0 -0
  102. {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/office/authoring/design/harvest.py +0 -0
  103. {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/office/authoring/design/plan.py +0 -0
  104. {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/office/authoring/design/profile.py +0 -0
  105. {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/office/authoring/design/profiles/application_form/fragments/body.xml +0 -0
  106. {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/office/authoring/design/profiles/application_form/fragments/heading.xml +0 -0
  107. {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/office/authoring/design/profiles/application_form/fragments/info_table.xml +0 -0
  108. {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/office/authoring/design/profiles/application_form/fragments/title.xml +0 -0
  109. {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/office/authoring/design/profiles/application_form/profile.json +0 -0
  110. {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/office/authoring/design/profiles/application_form/template.hwpx +0 -0
  111. {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/office/authoring/design/profiles/home_notice/fragments/body.xml +0 -0
  112. {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/office/authoring/design/profiles/home_notice/fragments/heading.xml +0 -0
  113. {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/office/authoring/design/profiles/home_notice/fragments/title.xml +0 -0
  114. {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/office/authoring/design/profiles/home_notice/profile.json +0 -0
  115. {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/office/authoring/design/profiles/home_notice/template.hwpx +0 -0
  116. {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/office/authoring/design/profiles/official_notice/fragments/body.xml +0 -0
  117. {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/office/authoring/design/profiles/official_notice/fragments/heading.xml +0 -0
  118. {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/office/authoring/design/profiles/official_notice/fragments/info_table.xml +0 -0
  119. {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/office/authoring/design/profiles/official_notice/fragments/title.xml +0 -0
  120. {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/office/authoring/design/profiles/official_notice/profile.json +0 -0
  121. {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/office/authoring/design/profiles/official_notice/template.hwpx +0 -0
  122. {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/office/authoring/design/profiles/report/fragments/body.xml +0 -0
  123. {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/office/authoring/design/profiles/report/fragments/heading.xml +0 -0
  124. {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/office/authoring/design/profiles/report/fragments/info_table.xml +0 -0
  125. {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/office/authoring/design/profiles/report/fragments/title.xml +0 -0
  126. {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/office/authoring/design/profiles/report/profile.json +0 -0
  127. {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/office/authoring/design/profiles/report/template.hwpx +0 -0
  128. {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/office/authoring/design/validator.py +0 -0
  129. {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/office/authoring/presets/__init__.py +0 -0
  130. {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/office/authoring/presets/proposal.py +0 -0
  131. {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/office/authoring/report_parser.py +0 -0
  132. {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/office/authoring/style_profile.py +0 -0
  133. {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/office/authoring/template_analyzer.py +0 -0
  134. {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/office/charting/__init__.py +0 -0
  135. {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/office/compliance/__init__.py +0 -0
  136. {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/office/compliance/official_lint.py +0 -0
  137. {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/office/compliance/pii.py +0 -0
  138. {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/office/document_ops/__init__.py +0 -0
  139. {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/office/document_ops/comparison.py +0 -0
  140. {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/office/document_ops/mail_merge.py +0 -0
  141. {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/office/document_ops/redline.py +0 -0
  142. {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/office/evalplan/__init__.py +0 -0
  143. {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/office/evalplan/runtime.py +0 -0
  144. {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/office/exam/__init__.py +0 -0
  145. {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/office/exam/compose.py +0 -0
  146. {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/office/exam/ir.py +0 -0
  147. {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/office/exam/measure.py +0 -0
  148. {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/office/exam/parser.py +0 -0
  149. {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/office/exam/profile.py +0 -0
  150. {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/office/form_fill/__init__.py +0 -0
  151. {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/office/form_fill/classification.py +0 -0
  152. {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/office/form_fill/fill_residue.py +0 -0
  153. {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/office/form_fill/fit/__init__.py +0 -0
  154. {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/office/form_fill/fit/apply.py +0 -0
  155. {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/office/form_fill/fit/engine.py +0 -0
  156. {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/office/form_fill/fit/measure.py +0 -0
  157. {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/office/form_fill/fit/policy.py +0 -0
  158. {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/office/form_fill/fit/report.py +0 -0
  159. {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/office/form_fill/fit/seal.py +0 -0
  160. {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/office/form_fill/fit/wordbox.py +0 -0
  161. {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/office/form_fill/guidance.py +0 -0
  162. {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/office/form_fill/quality.py +0 -0
  163. {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/office/form_fill/split_run.py +0 -0
  164. {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/office/form_fill/template_formfit.py +0 -0
  165. {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/office/house_style/__init__.py +0 -0
  166. {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/office/house_style/data/bank.json +0 -0
  167. {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/office/house_style/data/genres.json +0 -0
  168. {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/office/quality/__init__.py +0 -0
  169. {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/office/quality/page_guard.py +0 -0
  170. {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/office/rendering/__init__.py +0 -0
  171. {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/office/rendering/_hancom_open_rate.ps1 +0 -0
  172. {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/office/rendering/_refresh_hwpx_mac.applescript +0 -0
  173. {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/office/rendering/_render_hwpx.ps1 +0 -0
  174. {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/office/rendering/_render_hwpx_mac.applescript +0 -0
  175. {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/office/rendering/block_splits.py +0 -0
  176. {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/office/rendering/detectors.py +0 -0
  177. {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/office/rendering/diff.py +0 -0
  178. {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/office/rendering/fixture_corpus.py +0 -0
  179. {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/office/rendering/oracle.py +0 -0
  180. {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/office/rendering/page_qa.py +0 -0
  181. {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/office/rendering/qa_contracts.py +0 -0
  182. {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/office/rendering/qa_metrics.py +0 -0
  183. {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/office/rendering/worker.py +0 -0
  184. {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/office/utilities/__init__.py +0 -0
  185. {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/office/utilities/table_compute.py +0 -0
  186. {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/ops_services/__init__.py +0 -0
  187. {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/ops_services/_border_fill.py +0 -0
  188. {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/ops_services/composition.py +0 -0
  189. {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/ops_services/content_layout.py +0 -0
  190. {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/ops_services/context.py +0 -0
  191. {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/ops_services/media.py +0 -0
  192. {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/ops_services/memo_style.py +0 -0
  193. {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/ops_services/package_validation.py +0 -0
  194. {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/ops_services/planning.py +0 -0
  195. {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/ops_services/preview_export.py +0 -0
  196. {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/ops_services/read_query.py +0 -0
  197. {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/ops_services/save_policy.py +0 -0
  198. {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/ops_services/tables.py +0 -0
  199. {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/ops_services/transactions.py +0 -0
  200. {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/preview_output_models.py +0 -0
  201. {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/py.typed +0 -0
  202. {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/quality.py +0 -0
  203. {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/quality_generation.py +0 -0
  204. {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/runtime_services.py +0 -0
  205. {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/storage.py +0 -0
  206. {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/upstream.py +0 -0
  207. {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/utils/__init__.py +0 -0
  208. {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/utils/helpers.py +0 -0
  209. {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/visual_qa.py +0 -0
  210. {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/workflow/__init__.py +0 -0
  211. {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/workflow/adapters.py +0 -0
  212. {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/workflow/dispatcher.py +0 -0
  213. {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/workflow/models.py +0 -0
  214. {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/workflow/policy.py +0 -0
  215. {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/workflow/render_contracts.py +0 -0
  216. {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/workflow/render_metrics.py +0 -0
  217. {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/workflow/render_queue.py +0 -0
  218. {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/workflow/render_security.py +0 -0
  219. {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/workflow/render_transport.py +0 -0
  220. {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/workflow/rendering.py +0 -0
  221. {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/workflow/service.py +0 -0
  222. {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/workflow/state_machine.py +0 -0
  223. {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/workflow/store.py +0 -0
  224. {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/workspace.py +0 -0
  225. {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/python_hwpx_automation.egg-info/dependency_links.txt +0 -0
  226. {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/python_hwpx_automation.egg-info/entry_points.txt +0 -0
  227. {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.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: 6.4.2
3
+ Version: 6.6.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<6,>=5.4.0
23
+ Requires-Dist: python-hwpx<6,>=5.6.0
24
24
  Requires-Dist: pydantic<3,>=2.11
25
25
  Requires-Dist: cryptography>=42.0
26
26
  Requires-Dist: anyio>=4.0
@@ -74,15 +74,17 @@ Dynamic: license-file
74
74
 
75
75
  <!-- release-state: release-approved -->
76
76
  > [!NOTE]
77
- > 이 저장소의 main은 아직 공개되지 않은 6.4.2 후보 release-approved 상태(표 테두리·음영
78
- > `format_table` 확장, 수리된 core 5.4.0 기본값, 계약 `dbdbdfaac26148b7`,
79
- > 130 도구)입니다. 현재 공개 트레인은
80
- > `python-hwpx 5.3.0 → python-hwpx-automation 6.3.1 → hwpx-plugin 1.3.0`
81
- > (계약 `236f8ea855c875fe`, 2026-07-31 released)입니다. 공개 트레인은
82
- > core·automation PyPI와 plugin GitHub
83
- > Release·marketplace·실제 marketplace 설치까지 확인한 승격했으며, 기존
84
- > 5.x 설치는 별도 발행된 `hwpx-mcp-server 5.1.1`이 보호합니다. 절차와 상태
85
- > 머신: [릴리스 runbook](docs/release-runbook.md)
77
+ > 이 소스 트리는 **아직 공개되지 않은 6.6.4 후보**입니다(에이전트 계약 표면:
78
+ > `run_edit_plan` 선언적 편집 계획 실행기 + MCP resources +
79
+ > `describe_capabilities` 확장, 134 도구, core 바닥 5.6.0). 현재 공개
80
+ > 트레인은 여전히 `python-hwpx 5.5.0 → python-hwpx-automation 6.5.1 → hwpx-plugin 1.5.0`
81
+ > (계약 `f61d2c60c0aa0413`)이며, 후보는 core·automation
82
+ > PyPI와 plugin GitHub
83
+ > Release·marketplace·실제 marketplace 설치까지 확인한 뒤에만 승격합니다.
84
+ > 기존 5.x 설치는 별도 발행된 `hwpx-mcp-server 5.1.1`이 보호합니다. 절차와
85
+ > 상태 머신: [릴리스 runbook](docs/release-runbook.md)
86
+ > 현재 상태는 release-approved입니다 — 원격 진실(3스택·marketplace 설치) 관찰 전까지
87
+ > currentPublic은 그대로입니다.
86
88
 
87
89
  [python-hwpx](https://github.com/airmang/python-hwpx) 엔진 위에서 문서 저작·
88
90
  양식 채움·시험지 조판·안전한 에이전트 워크플로를 제공하는 응용 계층입니다.
@@ -14,15 +14,17 @@
14
14
 
15
15
  <!-- release-state: release-approved -->
16
16
  > [!NOTE]
17
- > 이 저장소의 main은 아직 공개되지 않은 6.4.2 후보 release-approved 상태(표 테두리·음영
18
- > `format_table` 확장, 수리된 core 5.4.0 기본값, 계약 `dbdbdfaac26148b7`,
19
- > 130 도구)입니다. 현재 공개 트레인은
20
- > `python-hwpx 5.3.0 → python-hwpx-automation 6.3.1 → hwpx-plugin 1.3.0`
21
- > (계약 `236f8ea855c875fe`, 2026-07-31 released)입니다. 공개 트레인은
22
- > core·automation PyPI와 plugin GitHub
23
- > Release·marketplace·실제 marketplace 설치까지 확인한 승격했으며, 기존
24
- > 5.x 설치는 별도 발행된 `hwpx-mcp-server 5.1.1`이 보호합니다. 절차와 상태
25
- > 머신: [릴리스 runbook](docs/release-runbook.md)
17
+ > 이 소스 트리는 **아직 공개되지 않은 6.6.4 후보**입니다(에이전트 계약 표면:
18
+ > `run_edit_plan` 선언적 편집 계획 실행기 + MCP resources +
19
+ > `describe_capabilities` 확장, 134 도구, core 바닥 5.6.0). 현재 공개
20
+ > 트레인은 여전히 `python-hwpx 5.5.0 → python-hwpx-automation 6.5.1 → hwpx-plugin 1.5.0`
21
+ > (계약 `f61d2c60c0aa0413`)이며, 후보는 core·automation
22
+ > PyPI와 plugin GitHub
23
+ > Release·marketplace·실제 marketplace 설치까지 확인한 뒤에만 승격합니다.
24
+ > 기존 5.x 설치는 별도 발행된 `hwpx-mcp-server 5.1.1`이 보호합니다. 절차와
25
+ > 상태 머신: [릴리스 runbook](docs/release-runbook.md)
26
+ > 현재 상태는 release-approved입니다 — 원격 진실(3스택·marketplace 설치) 관찰 전까지
27
+ > currentPublic은 그대로입니다.
26
28
 
27
29
  [python-hwpx](https://github.com/airmang/python-hwpx) 엔진 위에서 문서 저작·
28
30
  양식 채움·시험지 조판·안전한 에이전트 워크플로를 제공하는 응용 계층입니다.
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "python-hwpx-automation"
7
- version = "6.4.2"
7
+ version = "6.6.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" }]
@@ -29,7 +29,7 @@ dependencies = [
29
29
  # the bounded major here is what makes "no valid install has two declarers"
30
30
  # true rather than hopeful, and prevents the next core major from silently
31
31
  # breaking an already-published automation line.
32
- "python-hwpx>=5.4.0,<6", # HWPX object model, OXML/OPC, format-native primitives
32
+ "python-hwpx>=5.6.0,<6", # HWPX object model, OXML/OPC, format-native primitives
33
33
 
34
34
  "pydantic>=2.11,<3",
35
35
  "cryptography>=42.0",
@@ -107,4 +107,59 @@ def tool_domain(name: str) -> str | None:
107
107
  return None
108
108
 
109
109
 
110
- __all__ = ["DOMAINS", "build_capability_report", "coverage_against", "tool_domain"]
110
+ def core_self_description() -> dict[str, Any]:
111
+ """설치된 core의 `hwpx.capabilities/v1` 자기서술 — 없으면 정직 degrade.
112
+
113
+ core 5.6+가 제공한다. 구버전 core 위에서는 없다는 사실 자체를 보고하지,
114
+ 자기서술을 지어내지 않는다.
115
+ """
116
+
117
+ try:
118
+ from hwpx.experimental import describe_capabilities as core_caps
119
+ except ImportError:
120
+ return {
121
+ "available": False,
122
+ "reason": (
123
+ "installed python-hwpx does not expose hwpx.capabilities "
124
+ "(needs >= 5.6.0)"
125
+ ),
126
+ }
127
+ report = dict(core_caps())
128
+ report["available"] = True
129
+ return report
130
+
131
+
132
+ def render_oracle_availability() -> dict[str, Any]:
133
+ """실한컴 렌더 오라클 가용성 — **무실행 프로브만**(세션·렌더 발사 없음).
134
+
135
+ resolve_oracle 캐스케이드(Windows COM → Mac GUI → Null; STRUCTURAL_ONLY는
136
+ Null 단락)와 imaging/pymupdf 프로브를 그대로 보고한다. available=False는
137
+ 결함이 아니라 이 환경의 사실이며, 그때 render 게이트는 renderChecked=false
138
+ 로 정직하게 degrade한다.
139
+ """
140
+
141
+ from .office.rendering import detectors, diff
142
+ from .office.rendering.oracle import resolve_oracle
143
+
144
+ oracle = resolve_oracle()
145
+ try:
146
+ available = bool(oracle.available())
147
+ except Exception:
148
+ available = False
149
+ return {
150
+ "oracle": type(oracle).__name__,
151
+ "available": available,
152
+ "imaging": bool(detectors.imaging_available()),
153
+ "pymupdf": bool(diff.pymupdf_available()),
154
+ "note": "probe-only — 어떤 렌더 세션도 시작하지 않는다",
155
+ }
156
+
157
+
158
+ __all__ = [
159
+ "DOMAINS",
160
+ "build_capability_report",
161
+ "core_self_description",
162
+ "coverage_against",
163
+ "render_oracle_availability",
164
+ "tool_domain",
165
+ ]
@@ -616,6 +616,32 @@ def register_canonical_tool(
616
616
  return _register(mcp, name=name, func=func, description=description, meta=meta)
617
617
 
618
618
 
619
+ def register_canonical_resource(
620
+ mcp: Any,
621
+ *,
622
+ uri: str,
623
+ name: str,
624
+ description: str,
625
+ mime_type: str,
626
+ func: Callable[[], str],
627
+ ) -> None:
628
+ """Register one canonical read-only resource through the public SDK hook.
629
+
630
+ 이 어댑터가 유일한 FastMCP 호환 seam이라는 계약(모듈 docstring)은 리소스
631
+ 표면에도 그대로 적용된다 — 다른 모듈은 이 함수를 부르지, SDK의
632
+ ``resource`` 데코레이터를 직접 만지지 않는다.
633
+ """
634
+
635
+ try:
636
+ mcp.resource(uri, name=name, description=description, mime_type=mime_type)(
637
+ func
638
+ )
639
+ except Exception as exc: # pragma: no cover - SDK 계약 위반은 등록 시점 하드 실패
640
+ raise FastMcpAdapterError(
641
+ f"failed to register canonical resource {uri!r}: {exc}"
642
+ ) from exc
643
+
644
+
619
645
  def snapshot_runtime_tools(mcp: Any) -> Mapping[str, FastMcpToolSnapshot]:
620
646
  """Return an insertion-ordered, read-only snapshot of the live registry."""
621
647
 
@@ -136,6 +136,32 @@ def apply_template_formfit(
136
136
  )
137
137
 
138
138
 
139
+ def run_edit_plan(
140
+ plan: dict,
141
+ dry_run: bool = False,
142
+ ) -> dict:
143
+ """선언적 편집 계획(hwpx.edit-plan/v1)을 all-or-nothing으로 실행합니다.
144
+
145
+ plan.steps는 기존 바이트-스플라이스 op 이름 그대로(fill_cells·
146
+ apply_table_ops·apply_body_ops·paragraph_patch·recolor_runs_by_color·
147
+ strip_runs_by_color·strip_trailing_table_captions)를 지시합니다. 실행은
148
+ 정적 선검증→전 체인 인메모리→최종 open-safety 검증→단 1회 원자 쓰기 —
149
+ 중간 step 실패 시 output·source는 바이트 불변이고 ok=false 리포트
150
+ (failedStepId·step error)가 돌아옵니다. dry_run=true는 동일 체인을 전부
151
+ 실행하되 쓰기만 생략합니다(미리보기=실행 정의상 동일). 반환은
152
+ hwpx.plan-report/v1(step별+원본→최종 mutation-report/v1 실측 사영 포함).
153
+ 스키마는 hwpx://schemas/edit-plan-v1 리소스로 구독 가능합니다."""
154
+
155
+ resolved = dict(plan) if plan else {}
156
+ for key in ("source", "output", "journalPath"):
157
+ value = resolved.get(key)
158
+ if isinstance(value, str) and value:
159
+ resolved[key] = resolve_path(value)
160
+ if not dry_run:
161
+ quality_contract.assert_write_capability()
162
+ return RUNTIME_SERVICES.ops.run_edit_plan(resolved, dry_run=dry_run)
163
+
164
+
139
165
  def apply_table_ops(
140
166
  filename: str,
141
167
  ops: list[TableOperation],
@@ -258,6 +258,17 @@ def describe_capabilities(domain: str | None = None) -> dict:
258
258
  advanced=advanced,
259
259
  registry_validation=validation,
260
260
  )
261
+ # additive(6.6): core 자기서술·오라클 가용성·리소스 카탈로그를 합성한다 —
262
+ # 자기서술 도구를 둘로 쪼개지 않는다(진실 이원화 방지).
263
+ from ..capabilities import core_self_description, render_oracle_availability
264
+ from ..resources import CANONICAL_RESOURCES
265
+
266
+ report["core"] = core_self_description()
267
+ report["renderOracle"] = render_oracle_availability()
268
+ report["resources"] = [
269
+ {"uri": spec.uri, "name": spec.name, "mimeType": spec.mime_type}
270
+ for spec in CANONICAL_RESOURCES
271
+ ]
261
272
  return report
262
273
 
263
274
 
@@ -7,7 +7,7 @@ import os
7
7
  import re
8
8
  import tempfile
9
9
  from pathlib import Path
10
- from typing import Any
10
+ from typing import Any, Literal, cast
11
11
 
12
12
  from ..core.content import (
13
13
  collect_full_text,
@@ -23,6 +23,11 @@ from ..office.authoring.advanced_generators import (
23
23
  build_organization_chart as build_hwpx_organization_chart,
24
24
  )
25
25
  from ..office.compliance import DEFAULT_POLICY, detect_pii, mask_value
26
+ from ..office.house_style import load_bank, load_genres
27
+ from ..office.house_style.composition import (
28
+ compose_section_chip as compose_house_section_chip,
29
+ )
30
+ from ..office.house_style.org_chart import lower_boxed_org_chart
26
31
  from ..office.document_ops import (
27
32
  build_mail_merge as build_hwpx_mail_merge,
28
33
  )
@@ -217,6 +222,90 @@ def build_organization_chart(
217
222
  }
218
223
 
219
224
 
225
+ def add_boxed_org_chart(
226
+ filename: str,
227
+ hierarchy: dict,
228
+ accent_color: str = None,
229
+ dry_run: bool = False,
230
+ expected_revision: str = None,
231
+ ) -> dict:
232
+ """계층 트리를 실물 관례의 박스 조직도(표 캔버스+병합 박스+셀 테두리
233
+ 커넥터)로 문서 끝에 그립니다. 각 노드는 {"label", "sublabel"?,
234
+ "children"?[]} 매핑이며 깊이 4·박스 40 초과는 typed 거부.
235
+ accent_color는 루트 박스 배경색. dry_run=True이면 저장하지 않습니다."""
236
+ path = resolve_path(filename)
237
+ guard = _revision_guard(path, expected_revision)
238
+ if guard is not None:
239
+ return guard
240
+ doc = open_doc(path)
241
+ summary = lower_boxed_org_chart(doc, hierarchy or {}, accent_color=accent_color)
242
+ result = {"orgChart": summary}
243
+ if dry_run:
244
+ return _with_dry_run_verification(result, doc, path)
245
+ verification = _save_doc_verification(doc, path)
246
+ return _with_save_verification(result, verification)
247
+
248
+
249
+ def compose_section_chip(
250
+ number: str,
251
+ title: str,
252
+ style: str = "box",
253
+ accent_color: str = None,
254
+ ) -> dict:
255
+ """운영계획 장르의 섹션 구분자(섹션칩)를 범용 document_plan block으로
256
+ 합성합니다. style="box"(1×3 accent 칩) 또는 "inline"(번호 제목 헤딩).
257
+ 파일은 쓰지 않습니다 — 반환 block을 document_plan에 끼워 넣으십시오."""
258
+ if style not in ("box", "inline"):
259
+ raise ValueError('style must be "box" or "inline"')
260
+ chip_style = cast('Literal["box", "inline"]', style)
261
+ block = compose_house_section_chip(
262
+ number, title, style=chip_style, accent_color=accent_color
263
+ )
264
+ result: dict = {"block": block, "next_tool": "validate_document_plan"}
265
+ if style == "box" and accent_color:
266
+ result["styling"] = {
267
+ "accentColor": accent_color,
268
+ "how": (
269
+ "문서 생성 후 이 칩 표의 번호 셀에 "
270
+ "format_table(fill_color=accentColor, row=0, col=0)을 적용"
271
+ ),
272
+ }
273
+ return result
274
+
275
+
276
+ def get_genre_grammar(genre: str) -> dict:
277
+ """장르 구조 문법·타이포 역할(하우스 스타일 뱅크)을 반환하는 read-only
278
+ 조회입니다. 스킬이 per-문서 인스턴스화(번호 체계·칩 렌더·블록 선택·색)
279
+ 판단에 사용합니다. 미보유 장르는 사용 가능 목록과 함께 typed 거부."""
280
+ catalog = load_genres()
281
+ genres = catalog.genres if hasattr(catalog, "genres") else {}
282
+ if genre not in genres:
283
+ raise ValueError(
284
+ f"unknown genre {genre!r}; available: {sorted(genres)}"
285
+ )
286
+ bank = load_bank()
287
+ entry = genres[genre]
288
+ payload = entry if isinstance(entry, dict) else entry.model_dump()
289
+ inherits = None
290
+ typography = payload.get("typography") if isinstance(payload, dict) else None
291
+ if isinstance(typography, dict):
292
+ inherits = typography.get("inherits")
293
+ profiles = bank.profiles if hasattr(bank, "profiles") else {}
294
+ inherited_profile = None
295
+ if inherits and inherits in profiles:
296
+ base = profiles[inherits]
297
+ inherited_profile = base if isinstance(base, dict) else base.model_dump()
298
+ return {
299
+ "genre": genre,
300
+ "grammar": payload,
301
+ "inheritedProfile": {"name": inherits, "profile": inherited_profile}
302
+ if inherited_profile
303
+ else None,
304
+ "sectionChipTool": "compose_section_chip",
305
+ "orgChartTool": "add_boxed_org_chart",
306
+ }
307
+
308
+
220
309
  def scan_personal_info(filename: str | None = None, text: str | None = None) -> dict:
221
310
  """문서/텍스트의 개인정보(PII)를 탐지하는 read-only 감사 (원본값 미노출).
222
311
 
@@ -939,6 +939,14 @@ class HwpxOps:
939
939
  publication_sink=publication_sink,
940
940
  )
941
941
 
942
+ def run_edit_plan(
943
+ self,
944
+ plan: Dict[str, Any],
945
+ *,
946
+ dry_run: bool = False,
947
+ ) -> Dict[str, Any]:
948
+ return self._services.form_fields.run_edit_plan(plan, dry_run=dry_run)
949
+
942
950
  def apply_table_ops(
943
951
  self,
944
952
  path: str,
@@ -0,0 +1,263 @@
1
+ {
2
+ "schemaVersion": "python-hwpx-automation.identity/v1",
3
+ "product": "python-hwpx-automation",
4
+ "releaseMajor": 6,
5
+ "releaseState": {
6
+ "status": "release-approved",
7
+ "candidate": {
8
+ "pythonHwpx": "5.6.0",
9
+ "canonicalDistribution": "python-hwpx-automation",
10
+ "canonicalAutomation": "6.6.4",
11
+ "compatibilityDistribution": "hwpx-mcp-server",
12
+ "compatibility": "6.6.4",
13
+ "plugin": "1.6.0",
14
+ "contractHash": "19898dba41495c47"
15
+ },
16
+ "currentPublic": {
17
+ "pythonHwpx": "5.5.0",
18
+ "primaryDistribution": "python-hwpx-automation",
19
+ "primaryApplication": "6.5.1",
20
+ "plugin": "1.5.0",
21
+ "contractHash": "f61d2c60c0aa0413"
22
+ },
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
+ },
25
+ "identifiers": [
26
+ {
27
+ "surface": "repository",
28
+ "value": "airmang/python-hwpx-automation",
29
+ "classification": "canonical"
30
+ },
31
+ {
32
+ "surface": "distribution",
33
+ "value": "python-hwpx-automation",
34
+ "classification": "canonical"
35
+ },
36
+ {
37
+ "surface": "import-namespace",
38
+ "value": "hwpx_automation",
39
+ "classification": "canonical"
40
+ },
41
+ {
42
+ "surface": "task-console",
43
+ "value": "hwpx",
44
+ "classification": "canonical"
45
+ },
46
+ {
47
+ "surface": "mcp-console",
48
+ "value": "hwpx-automation-mcp",
49
+ "classification": "canonical"
50
+ },
51
+ {
52
+ "surface": "fastmcp-server-info-name",
53
+ "value": "python-hwpx-automation",
54
+ "classification": "canonical"
55
+ },
56
+ {
57
+ "surface": "host-config-key",
58
+ "value": "hwpx",
59
+ "classification": "host-local-alias"
60
+ },
61
+ {
62
+ "surface": "environment-prefix",
63
+ "value": "HWPX_AUTOMATION_",
64
+ "classification": "canonical"
65
+ },
66
+ {
67
+ "surface": "distribution",
68
+ "value": "hwpx-mcp-server",
69
+ "classification": "compatibility"
70
+ },
71
+ {
72
+ "surface": "import-namespace",
73
+ "value": "hwpx_mcp_server",
74
+ "classification": "compatibility"
75
+ },
76
+ {
77
+ "surface": "mcp-console",
78
+ "value": "hwpx-mcp-server",
79
+ "classification": "compatibility"
80
+ },
81
+ {
82
+ "surface": "environment-prefix",
83
+ "value": "HWPX_MCP_",
84
+ "classification": "compatibility"
85
+ },
86
+ {
87
+ "surface": "capability-version-field",
88
+ "value": "versions.automation",
89
+ "classification": "canonical"
90
+ },
91
+ {
92
+ "surface": "capability-version-field",
93
+ "value": "versions.mcp",
94
+ "classification": "compatibility-preserved"
95
+ },
96
+ {
97
+ "surface": "capability-floor-field",
98
+ "value": "minAutomationVersion",
99
+ "classification": "canonical"
100
+ },
101
+ {
102
+ "surface": "capability-floor-field",
103
+ "value": "minMcpVersion",
104
+ "classification": "compatibility-preserved"
105
+ },
106
+ {
107
+ "surface": "contract-floor-constant",
108
+ "value": "MIN_AUTOMATION_VERSION",
109
+ "classification": "canonical"
110
+ },
111
+ {
112
+ "surface": "contract-floor-constant",
113
+ "value": "MIN_MCP_VERSION",
114
+ "classification": "compatibility-preserved"
115
+ },
116
+ {
117
+ "surface": "protocol-error-schema",
118
+ "value": "hwpx.mcp-error/v1",
119
+ "classification": "compatibility-preserved"
120
+ },
121
+ {
122
+ "surface": "frozen-receipt-schema",
123
+ "value": "hwpx-mcp.authoring-runtime-owner/v1",
124
+ "classification": "compatibility-preserved"
125
+ },
126
+ {
127
+ "surface": "frozen-receipt-schema",
128
+ "value": "hwpx-mcp.compliance-quality-utilities-owner/v1",
129
+ "classification": "compatibility-preserved"
130
+ },
131
+ {
132
+ "surface": "frozen-receipt-schema",
133
+ "value": "hwpx-mcp.document-operations-owner/v1",
134
+ "classification": "compatibility-preserved"
135
+ },
136
+ {
137
+ "surface": "frozen-receipt-schema",
138
+ "value": "hwpx-mcp.evalplan-runtime-owner/v1",
139
+ "classification": "compatibility-preserved"
140
+ },
141
+ {
142
+ "surface": "frozen-receipt-schema",
143
+ "value": "hwpx-mcp.exam-runtime-owner/v1",
144
+ "classification": "compatibility-preserved"
145
+ },
146
+ {
147
+ "surface": "frozen-receipt-schema",
148
+ "value": "hwpx-mcp.form-fill-runtime-owner/v1",
149
+ "classification": "compatibility-preserved"
150
+ },
151
+ {
152
+ "surface": "frozen-receipt-schema",
153
+ "value": "hwpx-mcp.form-fill-runtime-parity/v1",
154
+ "classification": "compatibility-preserved"
155
+ },
156
+ {
157
+ "surface": "frozen-receipt-schema",
158
+ "value": "hwpx-mcp.visual-runtime-owner/v1",
159
+ "classification": "compatibility-preserved"
160
+ },
161
+ {
162
+ "surface": "frozen-parity-receipt-field",
163
+ "value": "mcpRuntimeMembers",
164
+ "classification": "compatibility-preserved"
165
+ },
166
+ {
167
+ "surface": "workflow-state-environment",
168
+ "value": "HWPX_AUTOMATION_WORKFLOW_STORE",
169
+ "classification": "canonical"
170
+ },
171
+ {
172
+ "surface": "workflow-state-environment",
173
+ "value": "HWPX_WORKFLOW_STORE",
174
+ "classification": "compatibility-preserved"
175
+ },
176
+ {
177
+ "surface": "workflow-state-path",
178
+ "value": "${XDG_STATE_HOME:-~/.local/state}/hwpx-mcp-server/workflows.sqlite3",
179
+ "classification": "compatibility-preserved"
180
+ },
181
+ {
182
+ "surface": "render-queue-principal",
183
+ "value": "hwpx-mcp-server",
184
+ "classification": "compatibility-preserved"
185
+ },
186
+ {
187
+ "surface": "render-integration-environment",
188
+ "value": "HWPX_RENDER_QUEUE_ROOT",
189
+ "classification": "integration-preserved"
190
+ },
191
+ {
192
+ "surface": "render-integration-environment",
193
+ "value": "HWPX_RENDER_QUEUE_URL",
194
+ "classification": "integration-preserved"
195
+ },
196
+ {
197
+ "surface": "render-integration-environment",
198
+ "value": "HWPX_RENDER_QUEUE_SECRET",
199
+ "classification": "integration-preserved"
200
+ },
201
+ {
202
+ "surface": "render-integration-environment",
203
+ "value": "HWPX_RENDER_TRANSPORT_AUTH",
204
+ "classification": "integration-preserved"
205
+ },
206
+ {
207
+ "surface": "render-integration-environment",
208
+ "value": "HWPX_RENDER_CA_FILE",
209
+ "classification": "integration-preserved"
210
+ },
211
+ {
212
+ "surface": "render-integration-environment",
213
+ "value": "HWPX_RENDER_CLIENT_CERT_FILE",
214
+ "classification": "integration-preserved"
215
+ },
216
+ {
217
+ "surface": "render-integration-environment",
218
+ "value": "HWPX_RENDER_CLIENT_KEY_FILE",
219
+ "classification": "integration-preserved"
220
+ },
221
+ {
222
+ "surface": "workflow-security-environment",
223
+ "value": "HWPX_WORKFLOW_ENCRYPTION_KEY",
224
+ "classification": "capability-preserved"
225
+ },
226
+ {
227
+ "surface": "oracle-capability-environment",
228
+ "value": "HWPX_ORACLE_STRUCTURAL_ONLY",
229
+ "classification": "capability-preserved"
230
+ },
231
+ {
232
+ "surface": "oracle-capability-environment",
233
+ "value": "HWPX_ORACLE_BUDGET_SECONDS",
234
+ "classification": "capability-preserved"
235
+ },
236
+ {
237
+ "surface": "plugin-integration-environment",
238
+ "value": "HWPX_SKILL_VERSION",
239
+ "classification": "integration-preserved"
240
+ },
241
+ {
242
+ "surface": "plugin-integration-environment",
243
+ "value": "HWPX_PLUGIN_ROOT",
244
+ "classification": "integration-preserved"
245
+ }
246
+ ],
247
+ "compatibilityPolicy": {
248
+ "supportedThroughMajor": 6,
249
+ "removalNotBeforeMajor": 7,
250
+ "minimumPublicNoticeDays": 90,
251
+ "requiresObservedUsageWindow": true,
252
+ "requiresSeparateOwnerApproval": true,
253
+ "statePathMigrationInMajor6": false
254
+ },
255
+ "notes": {
256
+ "hostConfigKey": "The key is a host-local alias, not the MCP protocol identity.",
257
+ "environmentPrecedence": "HWPX_AUTOMATION_* wins; HWPX_MCP_* remains a 6.x fallback.",
258
+ "preservedWireIdentifiers": "The public hwpx.mcp-error/v1 schema, versions.mcp/minMcpVersion/MIN_MCP_VERSION aliases, frozen hwpx-mcp.* architecture receipt IDs, and mcpRuntimeMembers parity-receipt field remain exact in 6.x. They are compatibility identifiers, not statements that MCP owns the automation product.",
259
+ "preservedIntegrationEnvironment": "Product-neutral HWPX_RENDER_*, HWPX_WORKFLOW_ENCRYPTION_KEY, HWPX_ORACLE_*, HWPX_SKILL_VERSION, and HWPX_PLUGIN_ROOT names do not encode the former MCP product identity. They remain unchanged and are not aliases in the HWPX_AUTOMATION_ transition.",
260
+ "statePath": "HWPX_AUTOMATION_WORKFLOW_STORE wins over the prior HWPX_WORKFLOW_STORE override; the existing hwpx-mcp-server on-disk default remains in 6.x to avoid silent workflow loss.",
261
+ "renderQueuePrincipal": "The signed queue principal remains hwpx-mcp-server in 6.x so queued work and worker authorization do not split during the rename."
262
+ }
263
+ }
@@ -276,6 +276,13 @@ def _host_run_path(record: NodeRecord, selected: Mapping[str, NodeRecord]) -> st
276
276
  run_element = candidate.native.element
277
277
  if parent is run_element or (element is not None and any(child is element for child in run_element)):
278
278
  return candidate.path
279
+ # core 5.5.0+: notes are ctrl-wrapped inside the run (the real-Hancom
280
+ # contract) — the run hosts the wrapper, one hop above the note.
281
+ if element is not None and any(
282
+ child.tag.endswith("}ctrl") and any(grand is element for grand in child)
283
+ for child in run_element
284
+ ):
285
+ return candidate.path
279
286
  return None
280
287
 
281
288