python-hwpx-automation 6.1.3__tar.gz → 6.3.1__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 (226) hide show
  1. {python_hwpx_automation-6.1.3/src/python_hwpx_automation.egg-info → python_hwpx_automation-6.3.1}/PKG-INFO +9 -8
  2. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.3.1}/README.md +7 -6
  3. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.3.1}/pyproject.toml +2 -2
  4. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.3.1}/src/hwpx_automation/handlers/content_edit.py +78 -0
  5. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.3.1}/src/hwpx_automation/hwpx_ops.py +54 -0
  6. python_hwpx_automation-6.3.1/src/hwpx_automation/identity.json +263 -0
  7. python_hwpx_automation-6.3.1/src/hwpx_automation/office/charting/__init__.py +162 -0
  8. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.3.1}/src/hwpx_automation/ops_services/content_layout.py +203 -0
  9. python_hwpx_automation-6.3.1/src/hwpx_automation/public-modules.json +207 -0
  10. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.3.1}/src/hwpx_automation/server.py +2 -0
  11. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.3.1}/src/hwpx_automation/tool_bindings.py +2 -0
  12. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.3.1}/src/hwpx_automation/tool_contract.py +11 -11
  13. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.3.1/src/python_hwpx_automation.egg-info}/PKG-INFO +9 -8
  14. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.3.1}/src/python_hwpx_automation.egg-info/SOURCES.txt +1 -0
  15. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.3.1}/src/python_hwpx_automation.egg-info/requires.txt +1 -1
  16. python_hwpx_automation-6.1.3/src/hwpx_automation/identity.json +0 -263
  17. python_hwpx_automation-6.1.3/src/hwpx_automation/public-modules.json +0 -206
  18. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.3.1}/LICENSE +0 -0
  19. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.3.1}/MANIFEST.in +0 -0
  20. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.3.1}/NOTICE +0 -0
  21. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.3.1}/setup.cfg +0 -0
  22. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.3.1}/src/hwpx_automation/__init__.py +0 -0
  23. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.3.1}/src/hwpx_automation/__init__.pyi +0 -0
  24. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.3.1}/src/hwpx_automation/__main__.py +0 -0
  25. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.3.1}/src/hwpx_automation/agent_document.py +0 -0
  26. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.3.1}/src/hwpx_automation/api.py +0 -0
  27. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.3.1}/src/hwpx_automation/blind_eval.py +0 -0
  28. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.3.1}/src/hwpx_automation/capabilities.py +0 -0
  29. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.3.1}/src/hwpx_automation/compat.py +0 -0
  30. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.3.1}/src/hwpx_automation/configuration.py +0 -0
  31. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.3.1}/src/hwpx_automation/core/__init__.py +0 -0
  32. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.3.1}/src/hwpx_automation/core/content.py +0 -0
  33. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.3.1}/src/hwpx_automation/core/context.py +0 -0
  34. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.3.1}/src/hwpx_automation/core/diff.py +0 -0
  35. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.3.1}/src/hwpx_automation/core/document.py +0 -0
  36. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.3.1}/src/hwpx_automation/core/formatting.py +0 -0
  37. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.3.1}/src/hwpx_automation/core/handles.py +0 -0
  38. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.3.1}/src/hwpx_automation/core/locations.py +0 -0
  39. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.3.1}/src/hwpx_automation/core/locator.py +0 -0
  40. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.3.1}/src/hwpx_automation/core/plan.py +0 -0
  41. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.3.1}/src/hwpx_automation/core/resources.py +0 -0
  42. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.3.1}/src/hwpx_automation/core/search.py +0 -0
  43. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.3.1}/src/hwpx_automation/core/transactions.py +0 -0
  44. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.3.1}/src/hwpx_automation/core/txn.py +0 -0
  45. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.3.1}/src/hwpx_automation/document_state.py +0 -0
  46. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.3.1}/src/hwpx_automation/errors.py +0 -0
  47. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.3.1}/src/hwpx_automation/execution_lock.py +0 -0
  48. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.3.1}/src/hwpx_automation/fastmcp_adapter.py +0 -0
  49. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.3.1}/src/hwpx_automation/form_fill.py +0 -0
  50. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.3.1}/src/hwpx_automation/form_output_models.py +0 -0
  51. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.3.1}/src/hwpx_automation/handlers/__init__.py +0 -0
  52. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.3.1}/src/hwpx_automation/handlers/_shared.py +0 -0
  53. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.3.1}/src/hwpx_automation/handlers/agent_document.py +0 -0
  54. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.3.1}/src/hwpx_automation/handlers/authoring.py +0 -0
  55. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.3.1}/src/hwpx_automation/handlers/form_fill.py +0 -0
  56. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.3.1}/src/hwpx_automation/handlers/layout_style.py +0 -0
  57. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.3.1}/src/hwpx_automation/handlers/quality_render.py +0 -0
  58. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.3.1}/src/hwpx_automation/handlers/read_export.py +0 -0
  59. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.3.1}/src/hwpx_automation/handlers/specialized.py +0 -0
  60. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.3.1}/src/hwpx_automation/handlers/tracked_changes.py +0 -0
  61. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.3.1}/src/hwpx_automation/handlers/workflow.py +0 -0
  62. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.3.1}/src/hwpx_automation/hwp_converter.py +0 -0
  63. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.3.1}/src/hwpx_automation/hwp_support.py +0 -0
  64. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.3.1}/src/hwpx_automation/identity.py +0 -0
  65. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.3.1}/src/hwpx_automation/ingest_adapters.py +0 -0
  66. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.3.1}/src/hwpx_automation/markdown_plan.py +0 -0
  67. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.3.1}/src/hwpx_automation/mcp_cli.py +0 -0
  68. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.3.1}/src/hwpx_automation/metadata/tools_meta.py +0 -0
  69. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.3.1}/src/hwpx_automation/mixed_form.py +0 -0
  70. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.3.1}/src/hwpx_automation/mutation_models.py +0 -0
  71. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.3.1}/src/hwpx_automation/network_policy.py +0 -0
  72. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.3.1}/src/hwpx_automation/office/__init__.py +0 -0
  73. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.3.1}/src/hwpx_automation/office/agent/__init__.py +0 -0
  74. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.3.1}/src/hwpx_automation/office/agent/_batch_verification.py +0 -0
  75. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.3.1}/src/hwpx_automation/office/agent/blueprint/__init__.py +0 -0
  76. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.3.1}/src/hwpx_automation/office/agent/blueprint/bundle.py +0 -0
  77. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.3.1}/src/hwpx_automation/office/agent/blueprint/catalog.py +0 -0
  78. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.3.1}/src/hwpx_automation/office/agent/blueprint/dump.py +0 -0
  79. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.3.1}/src/hwpx_automation/office/agent/blueprint/mapping.py +0 -0
  80. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.3.1}/src/hwpx_automation/office/agent/blueprint/model.py +0 -0
  81. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.3.1}/src/hwpx_automation/office/agent/blueprint/native.py +0 -0
  82. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.3.1}/src/hwpx_automation/office/agent/blueprint/replay.py +0 -0
  83. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.3.1}/src/hwpx_automation/office/agent/catalog.py +0 -0
  84. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.3.1}/src/hwpx_automation/office/agent/cli.py +0 -0
  85. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.3.1}/src/hwpx_automation/office/agent/commands.py +0 -0
  86. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.3.1}/src/hwpx_automation/office/agent/document.py +0 -0
  87. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.3.1}/src/hwpx_automation/office/agent/form_plan.py +0 -0
  88. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.3.1}/src/hwpx_automation/office/agent/model.py +0 -0
  89. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.3.1}/src/hwpx_automation/office/agent/path.py +0 -0
  90. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.3.1}/src/hwpx_automation/office/agent/query.py +0 -0
  91. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.3.1}/src/hwpx_automation/office/agent/story.py +0 -0
  92. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.3.1}/src/hwpx_automation/office/authoring/__init__.py +0 -0
  93. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.3.1}/src/hwpx_automation/office/authoring/advanced_generators.py +0 -0
  94. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.3.1}/src/hwpx_automation/office/authoring/builder/__init__.py +0 -0
  95. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.3.1}/src/hwpx_automation/office/authoring/builder/core.py +0 -0
  96. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.3.1}/src/hwpx_automation/office/authoring/builder/report.py +0 -0
  97. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.3.1}/src/hwpx_automation/office/authoring/design/__init__.py +0 -0
  98. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.3.1}/src/hwpx_automation/office/authoring/design/_support.py +0 -0
  99. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.3.1}/src/hwpx_automation/office/authoring/design/composer.py +0 -0
  100. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.3.1}/src/hwpx_automation/office/authoring/design/harvest.py +0 -0
  101. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.3.1}/src/hwpx_automation/office/authoring/design/plan.py +0 -0
  102. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.3.1}/src/hwpx_automation/office/authoring/design/profile.py +0 -0
  103. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.3.1}/src/hwpx_automation/office/authoring/design/profiles/application_form/fragments/body.xml +0 -0
  104. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.3.1}/src/hwpx_automation/office/authoring/design/profiles/application_form/fragments/heading.xml +0 -0
  105. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.3.1}/src/hwpx_automation/office/authoring/design/profiles/application_form/fragments/info_table.xml +0 -0
  106. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.3.1}/src/hwpx_automation/office/authoring/design/profiles/application_form/fragments/title.xml +0 -0
  107. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.3.1}/src/hwpx_automation/office/authoring/design/profiles/application_form/profile.json +0 -0
  108. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.3.1}/src/hwpx_automation/office/authoring/design/profiles/application_form/template.hwpx +0 -0
  109. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.3.1}/src/hwpx_automation/office/authoring/design/profiles/home_notice/fragments/body.xml +0 -0
  110. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.3.1}/src/hwpx_automation/office/authoring/design/profiles/home_notice/fragments/heading.xml +0 -0
  111. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.3.1}/src/hwpx_automation/office/authoring/design/profiles/home_notice/fragments/title.xml +0 -0
  112. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.3.1}/src/hwpx_automation/office/authoring/design/profiles/home_notice/profile.json +0 -0
  113. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.3.1}/src/hwpx_automation/office/authoring/design/profiles/home_notice/template.hwpx +0 -0
  114. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.3.1}/src/hwpx_automation/office/authoring/design/profiles/official_notice/fragments/body.xml +0 -0
  115. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.3.1}/src/hwpx_automation/office/authoring/design/profiles/official_notice/fragments/heading.xml +0 -0
  116. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.3.1}/src/hwpx_automation/office/authoring/design/profiles/official_notice/fragments/info_table.xml +0 -0
  117. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.3.1}/src/hwpx_automation/office/authoring/design/profiles/official_notice/fragments/title.xml +0 -0
  118. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.3.1}/src/hwpx_automation/office/authoring/design/profiles/official_notice/profile.json +0 -0
  119. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.3.1}/src/hwpx_automation/office/authoring/design/profiles/official_notice/template.hwpx +0 -0
  120. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.3.1}/src/hwpx_automation/office/authoring/design/profiles/report/fragments/body.xml +0 -0
  121. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.3.1}/src/hwpx_automation/office/authoring/design/profiles/report/fragments/heading.xml +0 -0
  122. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.3.1}/src/hwpx_automation/office/authoring/design/profiles/report/fragments/info_table.xml +0 -0
  123. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.3.1}/src/hwpx_automation/office/authoring/design/profiles/report/fragments/title.xml +0 -0
  124. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.3.1}/src/hwpx_automation/office/authoring/design/profiles/report/profile.json +0 -0
  125. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.3.1}/src/hwpx_automation/office/authoring/design/profiles/report/template.hwpx +0 -0
  126. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.3.1}/src/hwpx_automation/office/authoring/design/validator.py +0 -0
  127. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.3.1}/src/hwpx_automation/office/authoring/presets/__init__.py +0 -0
  128. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.3.1}/src/hwpx_automation/office/authoring/presets/proposal.py +0 -0
  129. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.3.1}/src/hwpx_automation/office/authoring/report_parser.py +0 -0
  130. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.3.1}/src/hwpx_automation/office/authoring/style_profile.py +0 -0
  131. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.3.1}/src/hwpx_automation/office/authoring/template_analyzer.py +0 -0
  132. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.3.1}/src/hwpx_automation/office/compliance/__init__.py +0 -0
  133. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.3.1}/src/hwpx_automation/office/compliance/official_lint.py +0 -0
  134. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.3.1}/src/hwpx_automation/office/compliance/pii.py +0 -0
  135. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.3.1}/src/hwpx_automation/office/document_ops/__init__.py +0 -0
  136. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.3.1}/src/hwpx_automation/office/document_ops/comparison.py +0 -0
  137. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.3.1}/src/hwpx_automation/office/document_ops/mail_merge.py +0 -0
  138. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.3.1}/src/hwpx_automation/office/document_ops/redline.py +0 -0
  139. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.3.1}/src/hwpx_automation/office/evalplan/__init__.py +0 -0
  140. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.3.1}/src/hwpx_automation/office/evalplan/runtime.py +0 -0
  141. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.3.1}/src/hwpx_automation/office/exam/__init__.py +0 -0
  142. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.3.1}/src/hwpx_automation/office/exam/compose.py +0 -0
  143. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.3.1}/src/hwpx_automation/office/exam/ir.py +0 -0
  144. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.3.1}/src/hwpx_automation/office/exam/measure.py +0 -0
  145. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.3.1}/src/hwpx_automation/office/exam/parser.py +0 -0
  146. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.3.1}/src/hwpx_automation/office/exam/profile.py +0 -0
  147. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.3.1}/src/hwpx_automation/office/form_fill/__init__.py +0 -0
  148. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.3.1}/src/hwpx_automation/office/form_fill/classification.py +0 -0
  149. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.3.1}/src/hwpx_automation/office/form_fill/fill_residue.py +0 -0
  150. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.3.1}/src/hwpx_automation/office/form_fill/fit/__init__.py +0 -0
  151. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.3.1}/src/hwpx_automation/office/form_fill/fit/apply.py +0 -0
  152. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.3.1}/src/hwpx_automation/office/form_fill/fit/engine.py +0 -0
  153. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.3.1}/src/hwpx_automation/office/form_fill/fit/measure.py +0 -0
  154. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.3.1}/src/hwpx_automation/office/form_fill/fit/policy.py +0 -0
  155. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.3.1}/src/hwpx_automation/office/form_fill/fit/report.py +0 -0
  156. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.3.1}/src/hwpx_automation/office/form_fill/fit/seal.py +0 -0
  157. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.3.1}/src/hwpx_automation/office/form_fill/fit/wordbox.py +0 -0
  158. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.3.1}/src/hwpx_automation/office/form_fill/guidance.py +0 -0
  159. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.3.1}/src/hwpx_automation/office/form_fill/quality.py +0 -0
  160. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.3.1}/src/hwpx_automation/office/form_fill/split_run.py +0 -0
  161. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.3.1}/src/hwpx_automation/office/form_fill/template_formfit.py +0 -0
  162. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.3.1}/src/hwpx_automation/office/house_style/__init__.py +0 -0
  163. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.3.1}/src/hwpx_automation/office/house_style/composition.py +0 -0
  164. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.3.1}/src/hwpx_automation/office/house_style/data/bank.json +0 -0
  165. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.3.1}/src/hwpx_automation/office/house_style/data/genres.json +0 -0
  166. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.3.1}/src/hwpx_automation/office/quality/__init__.py +0 -0
  167. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.3.1}/src/hwpx_automation/office/quality/page_guard.py +0 -0
  168. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.3.1}/src/hwpx_automation/office/rendering/__init__.py +0 -0
  169. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.3.1}/src/hwpx_automation/office/rendering/_hancom_open_rate.ps1 +0 -0
  170. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.3.1}/src/hwpx_automation/office/rendering/_refresh_hwpx_mac.applescript +0 -0
  171. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.3.1}/src/hwpx_automation/office/rendering/_render_hwpx.ps1 +0 -0
  172. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.3.1}/src/hwpx_automation/office/rendering/_render_hwpx_mac.applescript +0 -0
  173. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.3.1}/src/hwpx_automation/office/rendering/block_splits.py +0 -0
  174. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.3.1}/src/hwpx_automation/office/rendering/detectors.py +0 -0
  175. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.3.1}/src/hwpx_automation/office/rendering/diff.py +0 -0
  176. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.3.1}/src/hwpx_automation/office/rendering/fixture_corpus.py +0 -0
  177. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.3.1}/src/hwpx_automation/office/rendering/oracle.py +0 -0
  178. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.3.1}/src/hwpx_automation/office/rendering/page_qa.py +0 -0
  179. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.3.1}/src/hwpx_automation/office/rendering/qa_contracts.py +0 -0
  180. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.3.1}/src/hwpx_automation/office/rendering/qa_metrics.py +0 -0
  181. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.3.1}/src/hwpx_automation/office/rendering/worker.py +0 -0
  182. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.3.1}/src/hwpx_automation/office/utilities/__init__.py +0 -0
  183. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.3.1}/src/hwpx_automation/office/utilities/table_compute.py +0 -0
  184. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.3.1}/src/hwpx_automation/ops_services/__init__.py +0 -0
  185. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.3.1}/src/hwpx_automation/ops_services/_border_fill.py +0 -0
  186. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.3.1}/src/hwpx_automation/ops_services/composition.py +0 -0
  187. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.3.1}/src/hwpx_automation/ops_services/context.py +0 -0
  188. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.3.1}/src/hwpx_automation/ops_services/form_fields.py +0 -0
  189. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.3.1}/src/hwpx_automation/ops_services/media.py +0 -0
  190. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.3.1}/src/hwpx_automation/ops_services/memo_style.py +0 -0
  191. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.3.1}/src/hwpx_automation/ops_services/package_validation.py +0 -0
  192. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.3.1}/src/hwpx_automation/ops_services/planning.py +0 -0
  193. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.3.1}/src/hwpx_automation/ops_services/preview_export.py +0 -0
  194. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.3.1}/src/hwpx_automation/ops_services/read_query.py +0 -0
  195. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.3.1}/src/hwpx_automation/ops_services/save_policy.py +0 -0
  196. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.3.1}/src/hwpx_automation/ops_services/tables.py +0 -0
  197. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.3.1}/src/hwpx_automation/ops_services/transactions.py +0 -0
  198. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.3.1}/src/hwpx_automation/preview_output_models.py +0 -0
  199. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.3.1}/src/hwpx_automation/py.typed +0 -0
  200. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.3.1}/src/hwpx_automation/quality.py +0 -0
  201. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.3.1}/src/hwpx_automation/quality_generation.py +0 -0
  202. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.3.1}/src/hwpx_automation/runtime.py +0 -0
  203. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.3.1}/src/hwpx_automation/runtime_services.py +0 -0
  204. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.3.1}/src/hwpx_automation/storage.py +0 -0
  205. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.3.1}/src/hwpx_automation/upstream.py +0 -0
  206. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.3.1}/src/hwpx_automation/utils/__init__.py +0 -0
  207. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.3.1}/src/hwpx_automation/utils/helpers.py +0 -0
  208. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.3.1}/src/hwpx_automation/visual_qa.py +0 -0
  209. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.3.1}/src/hwpx_automation/workflow/__init__.py +0 -0
  210. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.3.1}/src/hwpx_automation/workflow/adapters.py +0 -0
  211. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.3.1}/src/hwpx_automation/workflow/dispatcher.py +0 -0
  212. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.3.1}/src/hwpx_automation/workflow/models.py +0 -0
  213. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.3.1}/src/hwpx_automation/workflow/policy.py +0 -0
  214. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.3.1}/src/hwpx_automation/workflow/render_contracts.py +0 -0
  215. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.3.1}/src/hwpx_automation/workflow/render_metrics.py +0 -0
  216. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.3.1}/src/hwpx_automation/workflow/render_queue.py +0 -0
  217. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.3.1}/src/hwpx_automation/workflow/render_security.py +0 -0
  218. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.3.1}/src/hwpx_automation/workflow/render_transport.py +0 -0
  219. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.3.1}/src/hwpx_automation/workflow/rendering.py +0 -0
  220. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.3.1}/src/hwpx_automation/workflow/service.py +0 -0
  221. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.3.1}/src/hwpx_automation/workflow/state_machine.py +0 -0
  222. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.3.1}/src/hwpx_automation/workflow/store.py +0 -0
  223. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.3.1}/src/hwpx_automation/workspace.py +0 -0
  224. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.3.1}/src/python_hwpx_automation.egg-info/dependency_links.txt +0 -0
  225. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.3.1}/src/python_hwpx_automation.egg-info/entry_points.txt +0 -0
  226. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.3.1}/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.1.3
3
+ Version: 6.3.1
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.1.0
23
+ Requires-Dist: python-hwpx<6,>=5.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,11 +74,12 @@ Dynamic: license-file
74
74
 
75
75
  <!-- release-state: release-approved -->
76
76
  > [!NOTE]
77
- > 이 소스 트리는 아직 공개되지 않은 6.1.3 후보입니다(누름틀 필드 저작
78
- > `add_form_field`, 계약 `ac1a422376b5ac84`, 128 도구). 현재 공개 트레인은
79
- > `python-hwpx 5.0.2 → python-hwpx-automation 6.0.4 → hwpx-plugin 1.0.1`
80
- > (계약 `0ce938371f0b55a6`)입니다. core·automation PyPI와 plugin GitHub
81
- > Release·marketplace·실제 marketplace 설치까지 확인한 뒤 승격하며, 기존
77
+ > 이 저장소의 main은 아직 공개되지 않은 6.3.1 후보 — release-approved 상태(네이티브 차트 생성
78
+ > `add_chart`, 계약 `236f8ea855c875fe`, 130 도구)입니다. 현재 공개 트레인은
79
+ > `python-hwpx 5.2.0 → python-hwpx-automation 6.2.1 → hwpx-plugin 1.2.0`
80
+ > (계약 `342cf672f29cd183`, 2026-07-31 released)입니다. 공개 트레인은
81
+ > core·automation PyPI와 plugin GitHub
82
+ > Release·marketplace·실제 marketplace 설치까지 확인한 뒤 승격했으며, 기존
82
83
  > 5.x 설치는 별도 발행된 `hwpx-mcp-server 5.1.1`이 보호합니다. 절차와 상태
83
84
  > 머신: [릴리스 runbook](docs/release-runbook.md)
84
85
 
@@ -134,7 +135,7 @@ Gemini CLI는 `~/.gemini/settings.json`, Cursor·Windsurf는 각 에디터의 MC
134
135
  "command": "uvx",
135
136
  "args": [
136
137
  "--from",
137
- "python-hwpx-automation[mcp]==6.0.4",
138
+ "python-hwpx-automation[mcp]==6.1.3",
138
139
  "hwpx-automation-mcp"
139
140
  ],
140
141
  "env": {
@@ -14,11 +14,12 @@
14
14
 
15
15
  <!-- release-state: release-approved -->
16
16
  > [!NOTE]
17
- > 이 소스 트리는 아직 공개되지 않은 6.1.3 후보입니다(누름틀 필드 저작
18
- > `add_form_field`, 계약 `ac1a422376b5ac84`, 128 도구). 현재 공개 트레인은
19
- > `python-hwpx 5.0.2 → python-hwpx-automation 6.0.4 → hwpx-plugin 1.0.1`
20
- > (계약 `0ce938371f0b55a6`)입니다. core·automation PyPI와 plugin GitHub
21
- > Release·marketplace·실제 marketplace 설치까지 확인한 뒤 승격하며, 기존
17
+ > 이 저장소의 main은 아직 공개되지 않은 6.3.1 후보 — release-approved 상태(네이티브 차트 생성
18
+ > `add_chart`, 계약 `236f8ea855c875fe`, 130 도구)입니다. 현재 공개 트레인은
19
+ > `python-hwpx 5.2.0 → python-hwpx-automation 6.2.1 → hwpx-plugin 1.2.0`
20
+ > (계약 `342cf672f29cd183`, 2026-07-31 released)입니다. 공개 트레인은
21
+ > core·automation PyPI와 plugin GitHub
22
+ > Release·marketplace·실제 marketplace 설치까지 확인한 뒤 승격했으며, 기존
22
23
  > 5.x 설치는 별도 발행된 `hwpx-mcp-server 5.1.1`이 보호합니다. 절차와 상태
23
24
  > 머신: [릴리스 runbook](docs/release-runbook.md)
24
25
 
@@ -74,7 +75,7 @@ Gemini CLI는 `~/.gemini/settings.json`, Cursor·Windsurf는 각 에디터의 MC
74
75
  "command": "uvx",
75
76
  "args": [
76
77
  "--from",
77
- "python-hwpx-automation[mcp]==6.0.4",
78
+ "python-hwpx-automation[mcp]==6.1.3",
78
79
  "hwpx-automation-mcp"
79
80
  ],
80
81
  "env": {
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "python-hwpx-automation"
7
- version = "6.1.3"
7
+ version = "6.3.1"
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.1.0,<6", # HWPX object model, OXML/OPC, format-native primitives
32
+ "python-hwpx>=5.3.0,<6", # HWPX object model, OXML/OPC, format-native primitives
33
33
 
34
34
  "pydantic>=2.11,<3",
35
35
  "cryptography>=42.0",
@@ -42,6 +42,7 @@ from ._shared import (
42
42
  _normalize_fill_mappings,
43
43
  _revision_guard,
44
44
  _save_doc_verification,
45
+ _with_document_state,
45
46
  _with_dry_run_verification,
46
47
  _with_save_verification,
47
48
  )
@@ -679,6 +680,81 @@ def add_page_break(
679
680
  return _with_save_verification({"success": True}, verification)
680
681
 
681
682
 
683
+ def add_chart(
684
+ filename: str,
685
+ chart_type: str,
686
+ categories: list,
687
+ series: list,
688
+ title: str = None,
689
+ paragraph_index: int = None,
690
+ table_index: int = None,
691
+ row: int = None,
692
+ col: int = None,
693
+ treat_as_char: bool = False,
694
+ dry_run: bool = False,
695
+ expected_revision: str = None,
696
+ ) -> dict:
697
+ """네이티브 차트(<hp:chart>+ECMA-376 chartML part)를 삽입합니다. 렌더 검증된
698
+ MVP 3종(bar·line·pie)만 지원 — 밖이면 CHART_UNSUPPORTED로 typed 거부(무음
699
+ 근사 없음). series=[{"name": str, "values": [number,...]}], values 길이는
700
+ categories와 일치해야 합니다. 실한컴은 chartML만으로 차트를 그립니다(OLE
701
+ 폴백·사전렌더 이미지 불요). 배치: 기본=문서 끝 새 문단(float),
702
+ paragraph_index=기존 문단, tableIndex+row+col=표 셀, treat_as_char=인라인."""
703
+ path = resolve_path(filename)
704
+ guard = _revision_guard(path, expected_revision)
705
+ if guard is not None:
706
+ return guard
707
+ result = RUNTIME_SERVICES.ops.add_chart(
708
+ path,
709
+ chart_type=chart_type,
710
+ categories=categories,
711
+ series=series,
712
+ title=title,
713
+ paragraph_index=paragraph_index,
714
+ table_index=table_index,
715
+ row=row,
716
+ col=col,
717
+ treat_as_char=treat_as_char,
718
+ dry_run=dry_run,
719
+ )
720
+ return _with_document_state(result, path)
721
+
722
+
723
+ def add_equation(
724
+ filename: str,
725
+ latex: str = None,
726
+ script: str = None,
727
+ paragraph_index: int = None,
728
+ table_index: int = None,
729
+ row: int = None,
730
+ col: int = None,
731
+ base_unit: int = 1100,
732
+ dry_run: bool = False,
733
+ expected_revision: str = None,
734
+ ) -> dict:
735
+ """네이티브 수식(<hp:equation>)을 삽입합니다. latex(권장) 또는 EqEdit script 중
736
+ 하나만 지정 — LaTeX는 렌더 검증된 토큰셋만 EqEdit로 변환하고, 밖이면
737
+ EQUATION_LATEX_UNSUPPORTED로 거부합니다(무음 근사 없음). 산출 수식은 실한컴이
738
+ 조판하고 기존 리더(eqedit_to_latex)가 되읽습니다(응답 readerLatex).
739
+ 배치: 기본=문서 끝 새 문단, paragraph_index=기존 문단, tableIndex+row+col=표 셀."""
740
+ path = resolve_path(filename)
741
+ guard = _revision_guard(path, expected_revision)
742
+ if guard is not None:
743
+ return guard
744
+ result = RUNTIME_SERVICES.ops.add_equation(
745
+ path,
746
+ latex=latex,
747
+ script=script,
748
+ paragraph_index=paragraph_index,
749
+ table_index=table_index,
750
+ row=row,
751
+ col=col,
752
+ base_unit=base_unit,
753
+ dry_run=dry_run,
754
+ )
755
+ return _with_document_state(result, path)
756
+
757
+
682
758
  def insert_picture(
683
759
  filename: str,
684
760
  image_base64: str,
@@ -1060,6 +1136,8 @@ __all__ = [
1060
1136
  "insert_paragraph",
1061
1137
  "delete_paragraph",
1062
1138
  "add_page_break",
1139
+ "add_equation",
1140
+ "add_chart",
1063
1141
  "apply_edits",
1064
1142
  "undo_last_edit",
1065
1143
  "replace_by_anchor",
@@ -517,6 +517,60 @@ class HwpxOps:
517
517
  path, text, section_index=section_index, run_style=run_style
518
518
  )
519
519
 
520
+ def add_chart(
521
+ self,
522
+ path: str,
523
+ *,
524
+ chart_type: str,
525
+ categories: list[str],
526
+ series: list[dict],
527
+ title: Optional[str] = None,
528
+ paragraph_index: Optional[int] = None,
529
+ table_index: Optional[int] = None,
530
+ row: Optional[int] = None,
531
+ col: Optional[int] = None,
532
+ treat_as_char: bool = False,
533
+ dry_run: bool = False,
534
+ ) -> Dict[str, Any]:
535
+ return self._services.content_layout.add_chart(
536
+ path,
537
+ chart_type=chart_type,
538
+ categories=categories,
539
+ series=series,
540
+ title=title,
541
+ paragraph_index=paragraph_index,
542
+ table_index=table_index,
543
+ row=row,
544
+ col=col,
545
+ treat_as_char=treat_as_char,
546
+ dry_run=dry_run,
547
+ )
548
+
549
+ def add_equation(
550
+ self,
551
+ path: str,
552
+ *,
553
+ latex: Optional[str] = None,
554
+ script: Optional[str] = None,
555
+ paragraph_index: Optional[int] = None,
556
+ table_index: Optional[int] = None,
557
+ row: Optional[int] = None,
558
+ col: Optional[int] = None,
559
+ base_unit: int = 1100,
560
+ dry_run: bool = False,
561
+ ) -> Dict[str, Any]:
562
+ return self._services.content_layout.add_equation(
563
+ path,
564
+ latex=latex,
565
+ script=script,
566
+ paragraph_index=paragraph_index,
567
+ table_index=table_index,
568
+ row=row,
569
+ col=col,
570
+ base_unit=base_unit,
571
+ dry_run=dry_run,
572
+ )
573
+
520
574
  def insert_paragraphs_bulk(
521
575
  self,
522
576
  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.3.0",
9
+ "canonicalDistribution": "python-hwpx-automation",
10
+ "canonicalAutomation": "6.3.1",
11
+ "compatibilityDistribution": "hwpx-mcp-server",
12
+ "compatibility": "6.3.1",
13
+ "plugin": "1.3.0",
14
+ "contractHash": "236f8ea855c875fe"
15
+ },
16
+ "currentPublic": {
17
+ "pythonHwpx": "5.2.0",
18
+ "primaryDistribution": "python-hwpx-automation",
19
+ "primaryApplication": "6.2.1",
20
+ "plugin": "1.2.0",
21
+ "contractHash": "342cf672f29cd183"
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
+ }
@@ -0,0 +1,162 @@
1
+ # SPDX-License-Identifier: Apache-2.0
2
+ """Deterministic data → ECMA-376 chartML generator (MVP: bar, line, pie).
3
+
4
+ The grammar mirrors the render-verified probes in
5
+ specs/055-chart-authoring/evidence/p0 (workspace): a ``c:chartSpace``
6
+ skeleton, per-series ``c:ser`` with string/number caches, and the
7
+ type-specific plot element (``c:barChart`` / ``c:lineChart`` + axis pair /
8
+ ``c:pieChart``). Anything outside the verified set is refused with a typed
9
+ error — no silent approximation. Real Hancom draws the output from the
10
+ chartML alone (no OLE fallback, no pre-rendered image).
11
+ """
12
+
13
+ from __future__ import annotations
14
+
15
+ from dataclasses import dataclass
16
+ from typing import Sequence
17
+ from xml.sax.saxutils import escape
18
+
19
+ CHART_TYPES = ("bar", "line", "pie")
20
+
21
+ _CAT_AX_ID = "111111111"
22
+ _VAL_AX_ID = "222222222"
23
+
24
+ _HEAD = (
25
+ '<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>'
26
+ '<c:chartSpace xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships"'
27
+ ' xmlns:a="http://schemas.openxmlformats.org/drawingml/2006/main"'
28
+ ' xmlns:c="http://schemas.openxmlformats.org/drawingml/2006/chart">'
29
+ '<c:date1904 val="0"/><c:roundedCorners val="0"/><c:chart>'
30
+ )
31
+
32
+
33
+ class UnsupportedChartError(ValueError):
34
+ """Raised for chart types or shapes outside the render-verified MVP set."""
35
+
36
+
37
+ @dataclass(frozen=True)
38
+ class ChartSeries:
39
+ """One data series: a display name and one value per category."""
40
+
41
+ name: str
42
+ values: tuple[float, ...]
43
+
44
+
45
+ def _series(index: int, name: str, categories: Sequence[str],
46
+ values: Sequence[float], extra: str = "") -> str:
47
+ cats = "".join(
48
+ f'<c:pt idx="{i}"><c:v>{escape(str(c))}</c:v></c:pt>'
49
+ for i, c in enumerate(categories)
50
+ )
51
+ vals = "".join(
52
+ f'<c:pt idx="{i}"><c:v>{v:g}</c:v></c:pt>' for i, v in enumerate(values)
53
+ )
54
+ column = chr(ord("B") + index)
55
+ return (
56
+ f'<c:ser><c:idx val="{index}"/><c:order val="{index}"/>'
57
+ f"<c:tx><c:strRef><c:f>Sheet1!${column}$1</c:f>"
58
+ f'<c:strCache><c:ptCount val="1"/><c:pt idx="0"><c:v>{escape(name)}</c:v></c:pt>'
59
+ f"</c:strCache></c:strRef></c:tx>{extra}"
60
+ f"<c:cat><c:strRef><c:f>Sheet1!$A$2:$A${len(categories) + 1}</c:f>"
61
+ f'<c:strCache><c:ptCount val="{len(categories)}"/>{cats}</c:strCache></c:strRef></c:cat>'
62
+ f"<c:val><c:numRef><c:f>Sheet1!${column}$2:${column}${len(values) + 1}</c:f>"
63
+ f"<c:numCache><c:formatCode>General</c:formatCode>"
64
+ f'<c:ptCount val="{len(values)}"/>{vals}</c:numCache></c:numRef></c:val></c:ser>'
65
+ )
66
+
67
+
68
+ def _axes() -> str:
69
+ return (
70
+ f'<c:catAx><c:axId val="{_CAT_AX_ID}"/>'
71
+ '<c:scaling><c:orientation val="minMax"/></c:scaling><c:delete val="0"/>'
72
+ f'<c:axPos val="b"/><c:crossAx val="{_VAL_AX_ID}"/></c:catAx>'
73
+ f'<c:valAx><c:axId val="{_VAL_AX_ID}"/>'
74
+ '<c:scaling><c:orientation val="minMax"/></c:scaling><c:delete val="0"/>'
75
+ f'<c:axPos val="l"/><c:crossAx val="{_CAT_AX_ID}"/></c:valAx>'
76
+ )
77
+
78
+
79
+ def build_chart_ml(
80
+ chart_type: str,
81
+ categories: Sequence[str],
82
+ series: Sequence[ChartSeries],
83
+ *,
84
+ title: str | None = None,
85
+ ) -> str:
86
+ """Build chartML for one of the render-verified MVP chart types.
87
+
88
+ Raises:
89
+ UnsupportedChartError: unknown chart type, empty/mismatched data, or
90
+ a shape outside the verified set (e.g. multi-series pie).
91
+ """
92
+
93
+ if chart_type not in CHART_TYPES:
94
+ raise UnsupportedChartError(
95
+ f"unsupported chart type {chart_type!r}; render-verified types: "
96
+ + ", ".join(CHART_TYPES)
97
+ )
98
+ if not categories:
99
+ raise UnsupportedChartError("categories must be non-empty")
100
+ if not series:
101
+ raise UnsupportedChartError("series must be non-empty")
102
+ if chart_type == "pie" and len(series) != 1:
103
+ raise UnsupportedChartError("a pie chart takes exactly one series")
104
+ if len(series) > 25:
105
+ raise UnsupportedChartError("at most 25 series are supported")
106
+ for item in series:
107
+ if not item.name.strip():
108
+ raise UnsupportedChartError("every series needs a non-empty name")
109
+ if len(item.values) != len(categories):
110
+ raise UnsupportedChartError(
111
+ f"series {item.name!r} has {len(item.values)} values for "
112
+ f"{len(categories)} categories"
113
+ )
114
+
115
+ parts: list[str] = [_HEAD]
116
+ if title is not None and title.strip():
117
+ parts.append(
118
+ "<c:title><c:tx><c:rich><a:bodyPr/><a:p><a:r><a:t>"
119
+ + escape(title)
120
+ + "</a:t></a:r></a:p></c:rich></c:tx><c:overlay val=\"0\"/></c:title>"
121
+ '<c:autoTitleDeleted val="0"/>'
122
+ )
123
+ parts.append("<c:plotArea><c:layout/>")
124
+
125
+ if chart_type == "bar":
126
+ parts.append('<c:barChart><c:barDir val="col"/><c:grouping val="clustered"/><c:varyColors val="0"/>')
127
+ for index, item in enumerate(series):
128
+ parts.append(_series(index, item.name, categories, item.values))
129
+ parts.append(
130
+ f'<c:axId val="{_CAT_AX_ID}"/><c:axId val="{_VAL_AX_ID}"/></c:barChart>'
131
+ )
132
+ parts.append(_axes())
133
+ elif chart_type == "line":
134
+ parts.append('<c:lineChart><c:grouping val="standard"/><c:varyColors val="0"/>')
135
+ for index, item in enumerate(series):
136
+ parts.append(
137
+ _series(
138
+ index, item.name, categories, item.values,
139
+ '<c:marker><c:symbol val="circle"/><c:size val="5"/></c:marker>',
140
+ )
141
+ )
142
+ parts.append(
143
+ '<c:marker val="1"/>'
144
+ f'<c:axId val="{_CAT_AX_ID}"/><c:axId val="{_VAL_AX_ID}"/></c:lineChart>'
145
+ )
146
+ parts.append(_axes())
147
+ else: # pie
148
+ parts.append('<c:pieChart><c:varyColors val="1"/>')
149
+ parts.append(_series(0, series[0].name, categories, series[0].values))
150
+ parts.append('<c:firstSliceAng val="0"/></c:pieChart>')
151
+
152
+ parts.append("</c:plotArea>")
153
+ parts.append('<c:plotVisOnly val="1"/></c:chart></c:chartSpace>')
154
+ return "".join(parts)
155
+
156
+
157
+ __all__ = [
158
+ "CHART_TYPES",
159
+ "ChartSeries",
160
+ "UnsupportedChartError",
161
+ "build_chart_ml",
162
+ ]