python-hwpx-automation 7.2.0__tar.gz → 7.3.2__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.
- {python_hwpx_automation-7.2.0/src/python_hwpx_automation.egg-info → python_hwpx_automation-7.3.2}/PKG-INFO +25 -14
- {python_hwpx_automation-7.2.0 → python_hwpx_automation-7.3.2}/README.md +24 -13
- {python_hwpx_automation-7.2.0 → python_hwpx_automation-7.3.2}/pyproject.toml +1 -1
- {python_hwpx_automation-7.2.0 → python_hwpx_automation-7.3.2}/src/hwpx_automation/form_fill.py +7 -2
- {python_hwpx_automation-7.2.0 → python_hwpx_automation-7.3.2}/src/hwpx_automation/identity.json +12 -12
- {python_hwpx_automation-7.2.0 → python_hwpx_automation-7.3.2}/src/hwpx_automation/office/agent/blueprint/native.py +12 -4
- {python_hwpx_automation-7.2.0 → python_hwpx_automation-7.3.2}/src/hwpx_automation/office/agent/blueprint/replay.py +4 -1
- {python_hwpx_automation-7.2.0 → python_hwpx_automation-7.3.2}/src/hwpx_automation/office/agent/cli.py +9 -1
- {python_hwpx_automation-7.2.0 → python_hwpx_automation-7.3.2}/src/hwpx_automation/office/agent/commands.py +13 -1
- {python_hwpx_automation-7.2.0 → python_hwpx_automation-7.3.2}/src/hwpx_automation/office/agent/document.py +12 -3
- {python_hwpx_automation-7.2.0 → python_hwpx_automation-7.3.2}/src/hwpx_automation/office/authoring/__init__.py +8 -1
- {python_hwpx_automation-7.2.0 → python_hwpx_automation-7.3.2}/src/hwpx_automation/office/authoring/builder/core.py +153 -11
- {python_hwpx_automation-7.2.0 → python_hwpx_automation-7.3.2}/src/hwpx_automation/office/authoring/builder/report.py +5 -0
- {python_hwpx_automation-7.2.0 → python_hwpx_automation-7.3.2}/src/hwpx_automation/office/authoring/report_parser.py +19 -7
- {python_hwpx_automation-7.2.0 → python_hwpx_automation-7.3.2}/src/hwpx_automation/office/authoring/template_analyzer.py +6 -1
- python_hwpx_automation-7.3.2/src/hwpx_automation/office/rendering/__main__.py +7 -0
- {python_hwpx_automation-7.2.0 → python_hwpx_automation-7.3.2}/src/hwpx_automation/office/rendering/_hancom_open_rate.ps1 +27 -5
- {python_hwpx_automation-7.2.0 → python_hwpx_automation-7.3.2}/src/hwpx_automation/office/rendering/_refresh_hwpx_mac.applescript +4 -1
- python_hwpx_automation-7.3.2/src/hwpx_automation/office/rendering/_render_hwpx.ps1 +148 -0
- {python_hwpx_automation-7.2.0 → python_hwpx_automation-7.3.2}/src/hwpx_automation/office/rendering/_render_hwpx_mac.applescript +197 -12
- python_hwpx_automation-7.3.2/src/hwpx_automation/office/rendering/cli.py +408 -0
- {python_hwpx_automation-7.2.0 → python_hwpx_automation-7.3.2}/src/hwpx_automation/office/rendering/mac_session.py +19 -1
- {python_hwpx_automation-7.2.0 → python_hwpx_automation-7.3.2}/src/hwpx_automation/office/rendering/oracle.py +238 -42
- {python_hwpx_automation-7.2.0 → python_hwpx_automation-7.3.2}/src/hwpx_automation/office/rendering/worker.py +5 -0
- {python_hwpx_automation-7.2.0 → python_hwpx_automation-7.3.2}/src/hwpx_automation/ops_services/package_validation.py +3 -5
- {python_hwpx_automation-7.2.0 → python_hwpx_automation-7.3.2}/src/hwpx_automation/public-modules.json +6 -4
- {python_hwpx_automation-7.2.0 → python_hwpx_automation-7.3.2/src/python_hwpx_automation.egg-info}/PKG-INFO +25 -14
- {python_hwpx_automation-7.2.0 → python_hwpx_automation-7.3.2}/src/python_hwpx_automation.egg-info/SOURCES.txt +2 -0
- python_hwpx_automation-7.2.0/src/hwpx_automation/office/rendering/_render_hwpx.ps1 +0 -72
- {python_hwpx_automation-7.2.0 → python_hwpx_automation-7.3.2}/LICENSE +0 -0
- {python_hwpx_automation-7.2.0 → python_hwpx_automation-7.3.2}/MANIFEST.in +0 -0
- {python_hwpx_automation-7.2.0 → python_hwpx_automation-7.3.2}/NOTICE +0 -0
- {python_hwpx_automation-7.2.0 → python_hwpx_automation-7.3.2}/setup.cfg +0 -0
- {python_hwpx_automation-7.2.0 → python_hwpx_automation-7.3.2}/src/hwpx_automation/__init__.py +0 -0
- {python_hwpx_automation-7.2.0 → python_hwpx_automation-7.3.2}/src/hwpx_automation/__init__.pyi +0 -0
- {python_hwpx_automation-7.2.0 → python_hwpx_automation-7.3.2}/src/hwpx_automation/__main__.py +0 -0
- {python_hwpx_automation-7.2.0 → python_hwpx_automation-7.3.2}/src/hwpx_automation/agent_document.py +0 -0
- {python_hwpx_automation-7.2.0 → python_hwpx_automation-7.3.2}/src/hwpx_automation/api.py +0 -0
- {python_hwpx_automation-7.2.0 → python_hwpx_automation-7.3.2}/src/hwpx_automation/blind_eval.py +0 -0
- {python_hwpx_automation-7.2.0 → python_hwpx_automation-7.3.2}/src/hwpx_automation/capabilities.py +0 -0
- {python_hwpx_automation-7.2.0 → python_hwpx_automation-7.3.2}/src/hwpx_automation/compat.py +0 -0
- {python_hwpx_automation-7.2.0 → python_hwpx_automation-7.3.2}/src/hwpx_automation/configuration.py +0 -0
- {python_hwpx_automation-7.2.0 → python_hwpx_automation-7.3.2}/src/hwpx_automation/core/__init__.py +0 -0
- {python_hwpx_automation-7.2.0 → python_hwpx_automation-7.3.2}/src/hwpx_automation/core/content.py +0 -0
- {python_hwpx_automation-7.2.0 → python_hwpx_automation-7.3.2}/src/hwpx_automation/core/context.py +0 -0
- {python_hwpx_automation-7.2.0 → python_hwpx_automation-7.3.2}/src/hwpx_automation/core/diff.py +0 -0
- {python_hwpx_automation-7.2.0 → python_hwpx_automation-7.3.2}/src/hwpx_automation/core/document.py +0 -0
- {python_hwpx_automation-7.2.0 → python_hwpx_automation-7.3.2}/src/hwpx_automation/core/formatting.py +0 -0
- {python_hwpx_automation-7.2.0 → python_hwpx_automation-7.3.2}/src/hwpx_automation/core/handles.py +0 -0
- {python_hwpx_automation-7.2.0 → python_hwpx_automation-7.3.2}/src/hwpx_automation/core/locations.py +0 -0
- {python_hwpx_automation-7.2.0 → python_hwpx_automation-7.3.2}/src/hwpx_automation/core/locator.py +0 -0
- {python_hwpx_automation-7.2.0 → python_hwpx_automation-7.3.2}/src/hwpx_automation/core/plan.py +0 -0
- {python_hwpx_automation-7.2.0 → python_hwpx_automation-7.3.2}/src/hwpx_automation/core/resources.py +0 -0
- {python_hwpx_automation-7.2.0 → python_hwpx_automation-7.3.2}/src/hwpx_automation/core/search.py +0 -0
- {python_hwpx_automation-7.2.0 → python_hwpx_automation-7.3.2}/src/hwpx_automation/core/transactions.py +0 -0
- {python_hwpx_automation-7.2.0 → python_hwpx_automation-7.3.2}/src/hwpx_automation/core/txn.py +0 -0
- {python_hwpx_automation-7.2.0 → python_hwpx_automation-7.3.2}/src/hwpx_automation/document_state.py +0 -0
- {python_hwpx_automation-7.2.0 → python_hwpx_automation-7.3.2}/src/hwpx_automation/errors.py +0 -0
- {python_hwpx_automation-7.2.0 → python_hwpx_automation-7.3.2}/src/hwpx_automation/execution_lock.py +0 -0
- {python_hwpx_automation-7.2.0 → python_hwpx_automation-7.3.2}/src/hwpx_automation/fastmcp_adapter.py +0 -0
- {python_hwpx_automation-7.2.0 → python_hwpx_automation-7.3.2}/src/hwpx_automation/form_output_models.py +0 -0
- {python_hwpx_automation-7.2.0 → python_hwpx_automation-7.3.2}/src/hwpx_automation/handlers/__init__.py +0 -0
- {python_hwpx_automation-7.2.0 → python_hwpx_automation-7.3.2}/src/hwpx_automation/handlers/_shared.py +0 -0
- {python_hwpx_automation-7.2.0 → python_hwpx_automation-7.3.2}/src/hwpx_automation/handlers/agent_document.py +0 -0
- {python_hwpx_automation-7.2.0 → python_hwpx_automation-7.3.2}/src/hwpx_automation/handlers/authoring.py +0 -0
- {python_hwpx_automation-7.2.0 → python_hwpx_automation-7.3.2}/src/hwpx_automation/handlers/content_edit.py +0 -0
- {python_hwpx_automation-7.2.0 → python_hwpx_automation-7.3.2}/src/hwpx_automation/handlers/form_fill.py +0 -0
- {python_hwpx_automation-7.2.0 → python_hwpx_automation-7.3.2}/src/hwpx_automation/handlers/layout_style.py +0 -0
- {python_hwpx_automation-7.2.0 → python_hwpx_automation-7.3.2}/src/hwpx_automation/handlers/quality_render.py +0 -0
- {python_hwpx_automation-7.2.0 → python_hwpx_automation-7.3.2}/src/hwpx_automation/handlers/read_export.py +0 -0
- {python_hwpx_automation-7.2.0 → python_hwpx_automation-7.3.2}/src/hwpx_automation/handlers/specialized.py +0 -0
- {python_hwpx_automation-7.2.0 → python_hwpx_automation-7.3.2}/src/hwpx_automation/handlers/tracked_changes.py +0 -0
- {python_hwpx_automation-7.2.0 → python_hwpx_automation-7.3.2}/src/hwpx_automation/handlers/workflow.py +0 -0
- {python_hwpx_automation-7.2.0 → python_hwpx_automation-7.3.2}/src/hwpx_automation/hwp_converter.py +0 -0
- {python_hwpx_automation-7.2.0 → python_hwpx_automation-7.3.2}/src/hwpx_automation/hwp_support.py +0 -0
- {python_hwpx_automation-7.2.0 → python_hwpx_automation-7.3.2}/src/hwpx_automation/hwpx_ops.py +0 -0
- {python_hwpx_automation-7.2.0 → python_hwpx_automation-7.3.2}/src/hwpx_automation/identity.py +0 -0
- {python_hwpx_automation-7.2.0 → python_hwpx_automation-7.3.2}/src/hwpx_automation/ingest_adapters.py +0 -0
- {python_hwpx_automation-7.2.0 → python_hwpx_automation-7.3.2}/src/hwpx_automation/markdown_plan.py +0 -0
- {python_hwpx_automation-7.2.0 → python_hwpx_automation-7.3.2}/src/hwpx_automation/mcp_cli.py +0 -0
- {python_hwpx_automation-7.2.0 → python_hwpx_automation-7.3.2}/src/hwpx_automation/metadata/tools_meta.py +0 -0
- {python_hwpx_automation-7.2.0 → python_hwpx_automation-7.3.2}/src/hwpx_automation/mixed_form.py +0 -0
- {python_hwpx_automation-7.2.0 → python_hwpx_automation-7.3.2}/src/hwpx_automation/mutation_models.py +0 -0
- {python_hwpx_automation-7.2.0 → python_hwpx_automation-7.3.2}/src/hwpx_automation/network_policy.py +0 -0
- {python_hwpx_automation-7.2.0 → python_hwpx_automation-7.3.2}/src/hwpx_automation/office/__init__.py +0 -0
- {python_hwpx_automation-7.2.0 → python_hwpx_automation-7.3.2}/src/hwpx_automation/office/agent/__init__.py +0 -0
- {python_hwpx_automation-7.2.0 → python_hwpx_automation-7.3.2}/src/hwpx_automation/office/agent/_batch_publication.py +0 -0
- {python_hwpx_automation-7.2.0 → python_hwpx_automation-7.3.2}/src/hwpx_automation/office/agent/_batch_verification.py +0 -0
- {python_hwpx_automation-7.2.0 → python_hwpx_automation-7.3.2}/src/hwpx_automation/office/agent/_text_scope.py +0 -0
- {python_hwpx_automation-7.2.0 → python_hwpx_automation-7.3.2}/src/hwpx_automation/office/agent/blueprint/__init__.py +0 -0
- {python_hwpx_automation-7.2.0 → python_hwpx_automation-7.3.2}/src/hwpx_automation/office/agent/blueprint/bundle.py +0 -0
- {python_hwpx_automation-7.2.0 → python_hwpx_automation-7.3.2}/src/hwpx_automation/office/agent/blueprint/catalog.py +0 -0
- {python_hwpx_automation-7.2.0 → python_hwpx_automation-7.3.2}/src/hwpx_automation/office/agent/blueprint/dump.py +0 -0
- {python_hwpx_automation-7.2.0 → python_hwpx_automation-7.3.2}/src/hwpx_automation/office/agent/blueprint/mapping.py +0 -0
- {python_hwpx_automation-7.2.0 → python_hwpx_automation-7.3.2}/src/hwpx_automation/office/agent/blueprint/model.py +0 -0
- {python_hwpx_automation-7.2.0 → python_hwpx_automation-7.3.2}/src/hwpx_automation/office/agent/catalog.py +0 -0
- {python_hwpx_automation-7.2.0 → python_hwpx_automation-7.3.2}/src/hwpx_automation/office/agent/form_plan.py +0 -0
- {python_hwpx_automation-7.2.0 → python_hwpx_automation-7.3.2}/src/hwpx_automation/office/agent/model.py +0 -0
- {python_hwpx_automation-7.2.0 → python_hwpx_automation-7.3.2}/src/hwpx_automation/office/agent/path.py +0 -0
- {python_hwpx_automation-7.2.0 → python_hwpx_automation-7.3.2}/src/hwpx_automation/office/agent/query.py +0 -0
- {python_hwpx_automation-7.2.0 → python_hwpx_automation-7.3.2}/src/hwpx_automation/office/agent/story.py +0 -0
- {python_hwpx_automation-7.2.0 → python_hwpx_automation-7.3.2}/src/hwpx_automation/office/authoring/advanced_generators.py +0 -0
- {python_hwpx_automation-7.2.0 → python_hwpx_automation-7.3.2}/src/hwpx_automation/office/authoring/builder/__init__.py +0 -0
- {python_hwpx_automation-7.2.0 → python_hwpx_automation-7.3.2}/src/hwpx_automation/office/authoring/design/__init__.py +0 -0
- {python_hwpx_automation-7.2.0 → python_hwpx_automation-7.3.2}/src/hwpx_automation/office/authoring/design/_support.py +0 -0
- {python_hwpx_automation-7.2.0 → python_hwpx_automation-7.3.2}/src/hwpx_automation/office/authoring/design/composer.py +0 -0
- {python_hwpx_automation-7.2.0 → python_hwpx_automation-7.3.2}/src/hwpx_automation/office/authoring/design/harvest.py +0 -0
- {python_hwpx_automation-7.2.0 → python_hwpx_automation-7.3.2}/src/hwpx_automation/office/authoring/design/plan.py +0 -0
- {python_hwpx_automation-7.2.0 → python_hwpx_automation-7.3.2}/src/hwpx_automation/office/authoring/design/profile.py +0 -0
- {python_hwpx_automation-7.2.0 → python_hwpx_automation-7.3.2}/src/hwpx_automation/office/authoring/design/profiles/application_form/fragments/body.xml +0 -0
- {python_hwpx_automation-7.2.0 → python_hwpx_automation-7.3.2}/src/hwpx_automation/office/authoring/design/profiles/application_form/fragments/heading.xml +0 -0
- {python_hwpx_automation-7.2.0 → python_hwpx_automation-7.3.2}/src/hwpx_automation/office/authoring/design/profiles/application_form/fragments/info_table.xml +0 -0
- {python_hwpx_automation-7.2.0 → python_hwpx_automation-7.3.2}/src/hwpx_automation/office/authoring/design/profiles/application_form/fragments/title.xml +0 -0
- {python_hwpx_automation-7.2.0 → python_hwpx_automation-7.3.2}/src/hwpx_automation/office/authoring/design/profiles/application_form/profile.json +0 -0
- {python_hwpx_automation-7.2.0 → python_hwpx_automation-7.3.2}/src/hwpx_automation/office/authoring/design/profiles/application_form/template.hwpx +0 -0
- {python_hwpx_automation-7.2.0 → python_hwpx_automation-7.3.2}/src/hwpx_automation/office/authoring/design/profiles/home_notice/fragments/body.xml +0 -0
- {python_hwpx_automation-7.2.0 → python_hwpx_automation-7.3.2}/src/hwpx_automation/office/authoring/design/profiles/home_notice/fragments/heading.xml +0 -0
- {python_hwpx_automation-7.2.0 → python_hwpx_automation-7.3.2}/src/hwpx_automation/office/authoring/design/profiles/home_notice/fragments/title.xml +0 -0
- {python_hwpx_automation-7.2.0 → python_hwpx_automation-7.3.2}/src/hwpx_automation/office/authoring/design/profiles/home_notice/profile.json +0 -0
- {python_hwpx_automation-7.2.0 → python_hwpx_automation-7.3.2}/src/hwpx_automation/office/authoring/design/profiles/home_notice/template.hwpx +0 -0
- {python_hwpx_automation-7.2.0 → python_hwpx_automation-7.3.2}/src/hwpx_automation/office/authoring/design/profiles/official_notice/fragments/body.xml +0 -0
- {python_hwpx_automation-7.2.0 → python_hwpx_automation-7.3.2}/src/hwpx_automation/office/authoring/design/profiles/official_notice/fragments/heading.xml +0 -0
- {python_hwpx_automation-7.2.0 → python_hwpx_automation-7.3.2}/src/hwpx_automation/office/authoring/design/profiles/official_notice/fragments/info_table.xml +0 -0
- {python_hwpx_automation-7.2.0 → python_hwpx_automation-7.3.2}/src/hwpx_automation/office/authoring/design/profiles/official_notice/fragments/title.xml +0 -0
- {python_hwpx_automation-7.2.0 → python_hwpx_automation-7.3.2}/src/hwpx_automation/office/authoring/design/profiles/official_notice/profile.json +0 -0
- {python_hwpx_automation-7.2.0 → python_hwpx_automation-7.3.2}/src/hwpx_automation/office/authoring/design/profiles/official_notice/template.hwpx +0 -0
- {python_hwpx_automation-7.2.0 → python_hwpx_automation-7.3.2}/src/hwpx_automation/office/authoring/design/profiles/report/fragments/body.xml +0 -0
- {python_hwpx_automation-7.2.0 → python_hwpx_automation-7.3.2}/src/hwpx_automation/office/authoring/design/profiles/report/fragments/heading.xml +0 -0
- {python_hwpx_automation-7.2.0 → python_hwpx_automation-7.3.2}/src/hwpx_automation/office/authoring/design/profiles/report/fragments/info_table.xml +0 -0
- {python_hwpx_automation-7.2.0 → python_hwpx_automation-7.3.2}/src/hwpx_automation/office/authoring/design/profiles/report/fragments/title.xml +0 -0
- {python_hwpx_automation-7.2.0 → python_hwpx_automation-7.3.2}/src/hwpx_automation/office/authoring/design/profiles/report/profile.json +0 -0
- {python_hwpx_automation-7.2.0 → python_hwpx_automation-7.3.2}/src/hwpx_automation/office/authoring/design/profiles/report/template.hwpx +0 -0
- {python_hwpx_automation-7.2.0 → python_hwpx_automation-7.3.2}/src/hwpx_automation/office/authoring/design/validator.py +0 -0
- {python_hwpx_automation-7.2.0 → python_hwpx_automation-7.3.2}/src/hwpx_automation/office/authoring/presets/__init__.py +0 -0
- {python_hwpx_automation-7.2.0 → python_hwpx_automation-7.3.2}/src/hwpx_automation/office/authoring/presets/proposal.py +0 -0
- {python_hwpx_automation-7.2.0 → python_hwpx_automation-7.3.2}/src/hwpx_automation/office/authoring/style_profile.py +0 -0
- {python_hwpx_automation-7.2.0 → python_hwpx_automation-7.3.2}/src/hwpx_automation/office/charting/__init__.py +0 -0
- {python_hwpx_automation-7.2.0 → python_hwpx_automation-7.3.2}/src/hwpx_automation/office/compliance/__init__.py +0 -0
- {python_hwpx_automation-7.2.0 → python_hwpx_automation-7.3.2}/src/hwpx_automation/office/compliance/official_lint.py +0 -0
- {python_hwpx_automation-7.2.0 → python_hwpx_automation-7.3.2}/src/hwpx_automation/office/compliance/pii.py +0 -0
- {python_hwpx_automation-7.2.0 → python_hwpx_automation-7.3.2}/src/hwpx_automation/office/document_ops/__init__.py +0 -0
- {python_hwpx_automation-7.2.0 → python_hwpx_automation-7.3.2}/src/hwpx_automation/office/document_ops/comparison.py +0 -0
- {python_hwpx_automation-7.2.0 → python_hwpx_automation-7.3.2}/src/hwpx_automation/office/document_ops/mail_merge.py +0 -0
- {python_hwpx_automation-7.2.0 → python_hwpx_automation-7.3.2}/src/hwpx_automation/office/document_ops/redline.py +0 -0
- {python_hwpx_automation-7.2.0 → python_hwpx_automation-7.3.2}/src/hwpx_automation/office/evalplan/__init__.py +0 -0
- {python_hwpx_automation-7.2.0 → python_hwpx_automation-7.3.2}/src/hwpx_automation/office/evalplan/runtime.py +0 -0
- {python_hwpx_automation-7.2.0 → python_hwpx_automation-7.3.2}/src/hwpx_automation/office/exam/__init__.py +0 -0
- {python_hwpx_automation-7.2.0 → python_hwpx_automation-7.3.2}/src/hwpx_automation/office/exam/compose.py +0 -0
- {python_hwpx_automation-7.2.0 → python_hwpx_automation-7.3.2}/src/hwpx_automation/office/exam/ir.py +0 -0
- {python_hwpx_automation-7.2.0 → python_hwpx_automation-7.3.2}/src/hwpx_automation/office/exam/measure.py +0 -0
- {python_hwpx_automation-7.2.0 → python_hwpx_automation-7.3.2}/src/hwpx_automation/office/exam/parser.py +0 -0
- {python_hwpx_automation-7.2.0 → python_hwpx_automation-7.3.2}/src/hwpx_automation/office/exam/profile.py +0 -0
- {python_hwpx_automation-7.2.0 → python_hwpx_automation-7.3.2}/src/hwpx_automation/office/form_fill/__init__.py +0 -0
- {python_hwpx_automation-7.2.0 → python_hwpx_automation-7.3.2}/src/hwpx_automation/office/form_fill/classification.py +0 -0
- {python_hwpx_automation-7.2.0 → python_hwpx_automation-7.3.2}/src/hwpx_automation/office/form_fill/fill_residue.py +0 -0
- {python_hwpx_automation-7.2.0 → python_hwpx_automation-7.3.2}/src/hwpx_automation/office/form_fill/fit/__init__.py +0 -0
- {python_hwpx_automation-7.2.0 → python_hwpx_automation-7.3.2}/src/hwpx_automation/office/form_fill/fit/apply.py +0 -0
- {python_hwpx_automation-7.2.0 → python_hwpx_automation-7.3.2}/src/hwpx_automation/office/form_fill/fit/engine.py +0 -0
- {python_hwpx_automation-7.2.0 → python_hwpx_automation-7.3.2}/src/hwpx_automation/office/form_fill/fit/measure.py +0 -0
- {python_hwpx_automation-7.2.0 → python_hwpx_automation-7.3.2}/src/hwpx_automation/office/form_fill/fit/policy.py +0 -0
- {python_hwpx_automation-7.2.0 → python_hwpx_automation-7.3.2}/src/hwpx_automation/office/form_fill/fit/report.py +0 -0
- {python_hwpx_automation-7.2.0 → python_hwpx_automation-7.3.2}/src/hwpx_automation/office/form_fill/fit/seal.py +0 -0
- {python_hwpx_automation-7.2.0 → python_hwpx_automation-7.3.2}/src/hwpx_automation/office/form_fill/fit/wordbox.py +0 -0
- {python_hwpx_automation-7.2.0 → python_hwpx_automation-7.3.2}/src/hwpx_automation/office/form_fill/guidance.py +0 -0
- {python_hwpx_automation-7.2.0 → python_hwpx_automation-7.3.2}/src/hwpx_automation/office/form_fill/quality.py +0 -0
- {python_hwpx_automation-7.2.0 → python_hwpx_automation-7.3.2}/src/hwpx_automation/office/form_fill/split_run.py +0 -0
- {python_hwpx_automation-7.2.0 → python_hwpx_automation-7.3.2}/src/hwpx_automation/office/form_fill/template_formfit.py +0 -0
- {python_hwpx_automation-7.2.0 → python_hwpx_automation-7.3.2}/src/hwpx_automation/office/house_style/__init__.py +0 -0
- {python_hwpx_automation-7.2.0 → python_hwpx_automation-7.3.2}/src/hwpx_automation/office/house_style/composition.py +0 -0
- {python_hwpx_automation-7.2.0 → python_hwpx_automation-7.3.2}/src/hwpx_automation/office/house_style/data/bank.json +0 -0
- {python_hwpx_automation-7.2.0 → python_hwpx_automation-7.3.2}/src/hwpx_automation/office/house_style/data/genres.json +0 -0
- {python_hwpx_automation-7.2.0 → python_hwpx_automation-7.3.2}/src/hwpx_automation/office/house_style/gianmun.py +0 -0
- {python_hwpx_automation-7.2.0 → python_hwpx_automation-7.3.2}/src/hwpx_automation/office/house_style/org_chart.py +0 -0
- {python_hwpx_automation-7.2.0 → python_hwpx_automation-7.3.2}/src/hwpx_automation/office/quality/__init__.py +0 -0
- {python_hwpx_automation-7.2.0 → python_hwpx_automation-7.3.2}/src/hwpx_automation/office/quality/page_guard.py +0 -0
- {python_hwpx_automation-7.2.0 → python_hwpx_automation-7.3.2}/src/hwpx_automation/office/rendering/__init__.py +0 -0
- {python_hwpx_automation-7.2.0 → python_hwpx_automation-7.3.2}/src/hwpx_automation/office/rendering/block_splits.py +0 -0
- {python_hwpx_automation-7.2.0 → python_hwpx_automation-7.3.2}/src/hwpx_automation/office/rendering/detectors.py +0 -0
- {python_hwpx_automation-7.2.0 → python_hwpx_automation-7.3.2}/src/hwpx_automation/office/rendering/diff.py +0 -0
- {python_hwpx_automation-7.2.0 → python_hwpx_automation-7.3.2}/src/hwpx_automation/office/rendering/fixture_corpus.py +0 -0
- {python_hwpx_automation-7.2.0 → python_hwpx_automation-7.3.2}/src/hwpx_automation/office/rendering/page_qa.py +0 -0
- {python_hwpx_automation-7.2.0 → python_hwpx_automation-7.3.2}/src/hwpx_automation/office/rendering/qa_contracts.py +0 -0
- {python_hwpx_automation-7.2.0 → python_hwpx_automation-7.3.2}/src/hwpx_automation/office/rendering/qa_metrics.py +0 -0
- {python_hwpx_automation-7.2.0 → python_hwpx_automation-7.3.2}/src/hwpx_automation/office/utilities/__init__.py +0 -0
- {python_hwpx_automation-7.2.0 → python_hwpx_automation-7.3.2}/src/hwpx_automation/office/utilities/table_compute.py +0 -0
- {python_hwpx_automation-7.2.0 → python_hwpx_automation-7.3.2}/src/hwpx_automation/ops_services/__init__.py +0 -0
- {python_hwpx_automation-7.2.0 → python_hwpx_automation-7.3.2}/src/hwpx_automation/ops_services/_border_fill.py +0 -0
- {python_hwpx_automation-7.2.0 → python_hwpx_automation-7.3.2}/src/hwpx_automation/ops_services/composition.py +0 -0
- {python_hwpx_automation-7.2.0 → python_hwpx_automation-7.3.2}/src/hwpx_automation/ops_services/content_layout.py +0 -0
- {python_hwpx_automation-7.2.0 → python_hwpx_automation-7.3.2}/src/hwpx_automation/ops_services/context.py +0 -0
- {python_hwpx_automation-7.2.0 → python_hwpx_automation-7.3.2}/src/hwpx_automation/ops_services/form_fields.py +0 -0
- {python_hwpx_automation-7.2.0 → python_hwpx_automation-7.3.2}/src/hwpx_automation/ops_services/media.py +0 -0
- {python_hwpx_automation-7.2.0 → python_hwpx_automation-7.3.2}/src/hwpx_automation/ops_services/memo_style.py +0 -0
- {python_hwpx_automation-7.2.0 → python_hwpx_automation-7.3.2}/src/hwpx_automation/ops_services/planning.py +0 -0
- {python_hwpx_automation-7.2.0 → python_hwpx_automation-7.3.2}/src/hwpx_automation/ops_services/preview_export.py +0 -0
- {python_hwpx_automation-7.2.0 → python_hwpx_automation-7.3.2}/src/hwpx_automation/ops_services/read_query.py +0 -0
- {python_hwpx_automation-7.2.0 → python_hwpx_automation-7.3.2}/src/hwpx_automation/ops_services/save_policy.py +0 -0
- {python_hwpx_automation-7.2.0 → python_hwpx_automation-7.3.2}/src/hwpx_automation/ops_services/tables.py +0 -0
- {python_hwpx_automation-7.2.0 → python_hwpx_automation-7.3.2}/src/hwpx_automation/ops_services/transactions.py +0 -0
- {python_hwpx_automation-7.2.0 → python_hwpx_automation-7.3.2}/src/hwpx_automation/preview_output_models.py +0 -0
- {python_hwpx_automation-7.2.0 → python_hwpx_automation-7.3.2}/src/hwpx_automation/py.typed +0 -0
- {python_hwpx_automation-7.2.0 → python_hwpx_automation-7.3.2}/src/hwpx_automation/quality.py +0 -0
- {python_hwpx_automation-7.2.0 → python_hwpx_automation-7.3.2}/src/hwpx_automation/quality_generation.py +0 -0
- {python_hwpx_automation-7.2.0 → python_hwpx_automation-7.3.2}/src/hwpx_automation/resources.py +0 -0
- {python_hwpx_automation-7.2.0 → python_hwpx_automation-7.3.2}/src/hwpx_automation/runtime.py +0 -0
- {python_hwpx_automation-7.2.0 → python_hwpx_automation-7.3.2}/src/hwpx_automation/runtime_services.py +0 -0
- {python_hwpx_automation-7.2.0 → python_hwpx_automation-7.3.2}/src/hwpx_automation/server.py +0 -0
- {python_hwpx_automation-7.2.0 → python_hwpx_automation-7.3.2}/src/hwpx_automation/storage.py +0 -0
- {python_hwpx_automation-7.2.0 → python_hwpx_automation-7.3.2}/src/hwpx_automation/tool_bindings.py +0 -0
- {python_hwpx_automation-7.2.0 → python_hwpx_automation-7.3.2}/src/hwpx_automation/tool_contract.py +0 -0
- {python_hwpx_automation-7.2.0 → python_hwpx_automation-7.3.2}/src/hwpx_automation/upstream.py +0 -0
- {python_hwpx_automation-7.2.0 → python_hwpx_automation-7.3.2}/src/hwpx_automation/utils/__init__.py +0 -0
- {python_hwpx_automation-7.2.0 → python_hwpx_automation-7.3.2}/src/hwpx_automation/utils/helpers.py +0 -0
- {python_hwpx_automation-7.2.0 → python_hwpx_automation-7.3.2}/src/hwpx_automation/utils/read_budget.py +0 -0
- {python_hwpx_automation-7.2.0 → python_hwpx_automation-7.3.2}/src/hwpx_automation/visual_qa.py +0 -0
- {python_hwpx_automation-7.2.0 → python_hwpx_automation-7.3.2}/src/hwpx_automation/workflow/__init__.py +0 -0
- {python_hwpx_automation-7.2.0 → python_hwpx_automation-7.3.2}/src/hwpx_automation/workflow/adapters.py +0 -0
- {python_hwpx_automation-7.2.0 → python_hwpx_automation-7.3.2}/src/hwpx_automation/workflow/dispatcher.py +0 -0
- {python_hwpx_automation-7.2.0 → python_hwpx_automation-7.3.2}/src/hwpx_automation/workflow/evidence_lineage.py +0 -0
- {python_hwpx_automation-7.2.0 → python_hwpx_automation-7.3.2}/src/hwpx_automation/workflow/models.py +0 -0
- {python_hwpx_automation-7.2.0 → python_hwpx_automation-7.3.2}/src/hwpx_automation/workflow/policy.py +0 -0
- {python_hwpx_automation-7.2.0 → python_hwpx_automation-7.3.2}/src/hwpx_automation/workflow/render_contracts.py +0 -0
- {python_hwpx_automation-7.2.0 → python_hwpx_automation-7.3.2}/src/hwpx_automation/workflow/render_metrics.py +0 -0
- {python_hwpx_automation-7.2.0 → python_hwpx_automation-7.3.2}/src/hwpx_automation/workflow/render_queue.py +0 -0
- {python_hwpx_automation-7.2.0 → python_hwpx_automation-7.3.2}/src/hwpx_automation/workflow/render_security.py +0 -0
- {python_hwpx_automation-7.2.0 → python_hwpx_automation-7.3.2}/src/hwpx_automation/workflow/render_transport.py +0 -0
- {python_hwpx_automation-7.2.0 → python_hwpx_automation-7.3.2}/src/hwpx_automation/workflow/rendering.py +0 -0
- {python_hwpx_automation-7.2.0 → python_hwpx_automation-7.3.2}/src/hwpx_automation/workflow/service.py +0 -0
- {python_hwpx_automation-7.2.0 → python_hwpx_automation-7.3.2}/src/hwpx_automation/workflow/state_machine.py +0 -0
- {python_hwpx_automation-7.2.0 → python_hwpx_automation-7.3.2}/src/hwpx_automation/workflow/store.py +0 -0
- {python_hwpx_automation-7.2.0 → python_hwpx_automation-7.3.2}/src/hwpx_automation/workspace.py +0 -0
- {python_hwpx_automation-7.2.0 → python_hwpx_automation-7.3.2}/src/python_hwpx_automation.egg-info/dependency_links.txt +0 -0
- {python_hwpx_automation-7.2.0 → python_hwpx_automation-7.3.2}/src/python_hwpx_automation.egg-info/entry_points.txt +0 -0
- {python_hwpx_automation-7.2.0 → python_hwpx_automation-7.3.2}/src/python_hwpx_automation.egg-info/requires.txt +0 -0
- {python_hwpx_automation-7.2.0 → python_hwpx_automation-7.3.2}/src/python_hwpx_automation.egg-info/top_level.txt +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: python-hwpx-automation
|
|
3
|
-
Version: 7.2
|
|
3
|
+
Version: 7.3.2
|
|
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
|
|
@@ -74,11 +74,10 @@ Dynamic: license-file
|
|
|
74
74
|
|
|
75
75
|
<!-- release-state: release-approved -->
|
|
76
76
|
> [!NOTE]
|
|
77
|
-
> 발행이 승인된 7.2
|
|
78
|
-
> 공개 트레인: `python-hwpx 6.
|
|
77
|
+
> 발행이 승인된 7.3.2 후보 (release-approved; 원격 발행 대기): `python-hwpx 6.6.0 → python-hwpx-automation 7.3.2 → hwpx-plugin 2.4.0` (`5e5c23651f92785a`).
|
|
78
|
+
> 공개 트레인: `python-hwpx 6.6.0 → python-hwpx-automation 7.3.1 → hwpx-plugin 2.4.0`.
|
|
79
79
|
> 공개 좌표는 core·automation PyPI와 plugin GitHub
|
|
80
80
|
> Release·marketplace·실제 marketplace 설치 관찰 후에만 승격합니다.
|
|
81
|
-
> [릴리스 runbook](docs/release-runbook.md)
|
|
82
81
|
|
|
83
82
|
[python-hwpx](https://github.com/airmang/python-hwpx) 엔진 위에서 문서 저작·
|
|
84
83
|
양식 채움·시험지 조판·안전한 에이전트 워크플로를 제공하는 응용 계층입니다.
|
|
@@ -132,7 +131,7 @@ Gemini CLI는 `~/.gemini/settings.json`, Cursor·Windsurf는 각 에디터의 MC
|
|
|
132
131
|
"command": "uvx",
|
|
133
132
|
"args": [
|
|
134
133
|
"--from",
|
|
135
|
-
"python-hwpx-automation[mcp]==7.1
|
|
134
|
+
"python-hwpx-automation[mcp]==7.3.1",
|
|
136
135
|
"hwpx-automation-mcp"
|
|
137
136
|
],
|
|
138
137
|
"env": {
|
|
@@ -151,10 +150,23 @@ Gemini CLI는 `~/.gemini/settings.json`, Cursor·Windsurf는 각 에디터의 MC
|
|
|
151
150
|
|
|
152
151
|
> 비-HWPX 문서(PDF/DOCX/XLSX/HTML/TXT)를 `document_to_markdown`으로 읽으려면
|
|
153
152
|
> `pip install "python-hwpx-automation[ingest]"`로 MarkItDown adapter를 함께
|
|
154
|
-
> 설치합니다. 요구 사항: `Python >= 3.10` · `python-hwpx >= 5.0
|
|
153
|
+
> 설치합니다. 요구 사항: `Python >= 3.10` · `python-hwpx >= 6.5.0`.
|
|
155
154
|
|
|
156
|
-
기존 `hwpx-mcp-server` 배포·import·콘솔·설정 키도
|
|
157
|
-
전체 목록과 유지 규칙: [
|
|
155
|
+
기존 `hwpx-mcp-server` 배포·import·콘솔·설정 키도 그대로 동작합니다 —
|
|
156
|
+
전체 목록과 유지 규칙: [호환 표면](docs/compatibility-6x.md)
|
|
157
|
+
|
|
158
|
+
## 한컴으로 PDF 렌더하기
|
|
159
|
+
|
|
160
|
+
한컴(macOS 한컴오피스 한글 또는 Windows 한글 COM)이 있는 컴퓨터에서 문서 하나를
|
|
161
|
+
PDF와 쪽 PNG로 렌더합니다. 별도 환경에서 실행하므로 호출하는 쪽의 python-hwpx
|
|
162
|
+
고정 버전을 건드리지 않습니다.
|
|
163
|
+
|
|
164
|
+
```bash
|
|
165
|
+
uvx --from "python-hwpx-automation[oracle]==7.3.2" \
|
|
166
|
+
hwpx render-pdf in.hwpx out.pdf --png out/page --json
|
|
167
|
+
```
|
|
168
|
+
|
|
169
|
+
JSON 결과·종료 코드·플랫폼 요구 사항: [render-pdf](docs/render-pdf.md)
|
|
158
170
|
|
|
159
171
|
## 무엇을 하나
|
|
160
172
|
|
|
@@ -171,7 +183,8 @@ Gemini CLI는 `~/.gemini/settings.json`, Cursor·Windsurf는 각 에디터의 MC
|
|
|
171
183
|
|
|
172
184
|
## 안전하게 쓰는 법
|
|
173
185
|
|
|
174
|
-
처음부터 모든 도구를 외울 필요는 없습니다.
|
|
186
|
+
처음부터 모든 도구를 외울 필요는 없습니다. 기존 문서 수정은 [조회·대상 확정·보존 저장·검증 안내](docs/existing-edit-navigation.md)를,
|
|
187
|
+
새 문서는 document-plan을 먼저 봅니다. 보통 이렇게 흘러갑니다.
|
|
175
188
|
|
|
176
189
|
1. **읽기** — `get_document_info` → `get_document_outline`/`get_document_text` → `find_text`, `get_table_map`으로 필요한 부분만 파악합니다. (저장하지 않음)
|
|
177
190
|
2. **안전 수정** — `copy_document`로 사본을 만들고, 가장 작은 변경(`search_and_replace`, `set_table_cell_text`, `apply_document_commands`)을 적용한 뒤 다시 읽어 확인하고, 검토가 끝난 사본을 전달합니다.
|
|
@@ -184,7 +197,7 @@ Gemini CLI는 `~/.gemini/settings.json`, Cursor·Windsurf는 각 에디터의 MC
|
|
|
184
197
|
열림안전을 검사하고, 게이트가 실패하면 아무것도 쓰지 않습니다. capability
|
|
185
198
|
handshake는 core/automation/plugin 버전+해시 skew를 fail-closed로 차단합니다.
|
|
186
199
|
보안 상세: [하드닝 가이드](docs/hardening_guide_ko.md) · 옛 이름과의 호환
|
|
187
|
-
식별자: [
|
|
200
|
+
식별자: [호환 표면](docs/compatibility-6x.md)
|
|
188
201
|
|
|
189
202
|
> **위치 계약** — `paragraph_index`는 본문 직속 문단의 0-based 인덱스입니다. 표 안 문단은 여기 섞지 않고
|
|
190
203
|
> `{"kind":"table_cell_paragraph","table_index":0,"row":0,"col":1,"cell_paragraph_index":0}` 같은 `location`
|
|
@@ -205,10 +218,10 @@ handshake는 core/automation/plugin 버전+해시 skew를 fail-closed로 차단
|
|
|
205
218
|
| `HWPX_AUTOMATION_WORKFLOW_STORE` | durable workflow SQLite 경로. 기존 `HWPX_WORKFLOW_STORE`보다 우선 | 기존 6.x 상태 경로 |
|
|
206
219
|
| `LOG_LEVEL` | 로그 레벨 | `INFO` |
|
|
207
220
|
|
|
208
|
-
동일 suffix의 기존 `HWPX_MCP_*` 키는
|
|
221
|
+
동일 suffix의 기존 `HWPX_MCP_*` 키는 fallback으로 유지되며, 두 키가
|
|
209
222
|
함께 있으면 `HWPX_AUTOMATION_*`이 우선합니다. render·workflow·oracle·plugin
|
|
210
223
|
연동용 보존 키 전체 목록과 workflow DB 경로 규칙은
|
|
211
|
-
[
|
|
224
|
+
[호환 표면](docs/compatibility-6x.md)에 있습니다.
|
|
212
225
|
|
|
213
226
|
경로는 기본적으로 workspace 밖 traversal과 symlink escape를 거부하고, URL 입력은 HTTPS·공개 IP만
|
|
214
227
|
허용합니다. 원자 rename을 제공하지 않는 호스트의 동시성 주의사항은 [하드닝 가이드](docs/hardening_guide_ko.md)를 보세요.
|
|
@@ -239,5 +252,3 @@ python scripts/run_conformance.py run \
|
|
|
239
252
|
## License · Maintainer
|
|
240
253
|
|
|
241
254
|
Apache-2.0 ([LICENSE](LICENSE) · [NOTICE](NOTICE)) — **Kohkyuhyun** [@airmang](https://github.com/airmang) · [kokyuhyun@hotmail.com](mailto:kokyuhyun@hotmail.com)
|
|
242
|
-
|
|
243
|
-
기존 문서 수정은 [조회·대상 확정·보존 저장·검증 안내](docs/existing-edit-navigation.md)를 먼저 확인하세요. 새 문서는 document-plan, 에이전트 연결은 선택 MCP와 호스트 플러그인을 사용합니다.
|
|
@@ -14,11 +14,10 @@
|
|
|
14
14
|
|
|
15
15
|
<!-- release-state: release-approved -->
|
|
16
16
|
> [!NOTE]
|
|
17
|
-
> 발행이 승인된 7.2
|
|
18
|
-
> 공개 트레인: `python-hwpx 6.
|
|
17
|
+
> 발행이 승인된 7.3.2 후보 (release-approved; 원격 발행 대기): `python-hwpx 6.6.0 → python-hwpx-automation 7.3.2 → hwpx-plugin 2.4.0` (`5e5c23651f92785a`).
|
|
18
|
+
> 공개 트레인: `python-hwpx 6.6.0 → python-hwpx-automation 7.3.1 → hwpx-plugin 2.4.0`.
|
|
19
19
|
> 공개 좌표는 core·automation PyPI와 plugin GitHub
|
|
20
20
|
> Release·marketplace·실제 marketplace 설치 관찰 후에만 승격합니다.
|
|
21
|
-
> [릴리스 runbook](docs/release-runbook.md)
|
|
22
21
|
|
|
23
22
|
[python-hwpx](https://github.com/airmang/python-hwpx) 엔진 위에서 문서 저작·
|
|
24
23
|
양식 채움·시험지 조판·안전한 에이전트 워크플로를 제공하는 응용 계층입니다.
|
|
@@ -72,7 +71,7 @@ Gemini CLI는 `~/.gemini/settings.json`, Cursor·Windsurf는 각 에디터의 MC
|
|
|
72
71
|
"command": "uvx",
|
|
73
72
|
"args": [
|
|
74
73
|
"--from",
|
|
75
|
-
"python-hwpx-automation[mcp]==7.1
|
|
74
|
+
"python-hwpx-automation[mcp]==7.3.1",
|
|
76
75
|
"hwpx-automation-mcp"
|
|
77
76
|
],
|
|
78
77
|
"env": {
|
|
@@ -91,10 +90,23 @@ Gemini CLI는 `~/.gemini/settings.json`, Cursor·Windsurf는 각 에디터의 MC
|
|
|
91
90
|
|
|
92
91
|
> 비-HWPX 문서(PDF/DOCX/XLSX/HTML/TXT)를 `document_to_markdown`으로 읽으려면
|
|
93
92
|
> `pip install "python-hwpx-automation[ingest]"`로 MarkItDown adapter를 함께
|
|
94
|
-
> 설치합니다. 요구 사항: `Python >= 3.10` · `python-hwpx >= 5.0
|
|
93
|
+
> 설치합니다. 요구 사항: `Python >= 3.10` · `python-hwpx >= 6.5.0`.
|
|
95
94
|
|
|
96
|
-
기존 `hwpx-mcp-server` 배포·import·콘솔·설정 키도
|
|
97
|
-
전체 목록과 유지 규칙: [
|
|
95
|
+
기존 `hwpx-mcp-server` 배포·import·콘솔·설정 키도 그대로 동작합니다 —
|
|
96
|
+
전체 목록과 유지 규칙: [호환 표면](docs/compatibility-6x.md)
|
|
97
|
+
|
|
98
|
+
## 한컴으로 PDF 렌더하기
|
|
99
|
+
|
|
100
|
+
한컴(macOS 한컴오피스 한글 또는 Windows 한글 COM)이 있는 컴퓨터에서 문서 하나를
|
|
101
|
+
PDF와 쪽 PNG로 렌더합니다. 별도 환경에서 실행하므로 호출하는 쪽의 python-hwpx
|
|
102
|
+
고정 버전을 건드리지 않습니다.
|
|
103
|
+
|
|
104
|
+
```bash
|
|
105
|
+
uvx --from "python-hwpx-automation[oracle]==7.3.2" \
|
|
106
|
+
hwpx render-pdf in.hwpx out.pdf --png out/page --json
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
JSON 결과·종료 코드·플랫폼 요구 사항: [render-pdf](docs/render-pdf.md)
|
|
98
110
|
|
|
99
111
|
## 무엇을 하나
|
|
100
112
|
|
|
@@ -111,7 +123,8 @@ Gemini CLI는 `~/.gemini/settings.json`, Cursor·Windsurf는 각 에디터의 MC
|
|
|
111
123
|
|
|
112
124
|
## 안전하게 쓰는 법
|
|
113
125
|
|
|
114
|
-
처음부터 모든 도구를 외울 필요는 없습니다.
|
|
126
|
+
처음부터 모든 도구를 외울 필요는 없습니다. 기존 문서 수정은 [조회·대상 확정·보존 저장·검증 안내](docs/existing-edit-navigation.md)를,
|
|
127
|
+
새 문서는 document-plan을 먼저 봅니다. 보통 이렇게 흘러갑니다.
|
|
115
128
|
|
|
116
129
|
1. **읽기** — `get_document_info` → `get_document_outline`/`get_document_text` → `find_text`, `get_table_map`으로 필요한 부분만 파악합니다. (저장하지 않음)
|
|
117
130
|
2. **안전 수정** — `copy_document`로 사본을 만들고, 가장 작은 변경(`search_and_replace`, `set_table_cell_text`, `apply_document_commands`)을 적용한 뒤 다시 읽어 확인하고, 검토가 끝난 사본을 전달합니다.
|
|
@@ -124,7 +137,7 @@ Gemini CLI는 `~/.gemini/settings.json`, Cursor·Windsurf는 각 에디터의 MC
|
|
|
124
137
|
열림안전을 검사하고, 게이트가 실패하면 아무것도 쓰지 않습니다. capability
|
|
125
138
|
handshake는 core/automation/plugin 버전+해시 skew를 fail-closed로 차단합니다.
|
|
126
139
|
보안 상세: [하드닝 가이드](docs/hardening_guide_ko.md) · 옛 이름과의 호환
|
|
127
|
-
식별자: [
|
|
140
|
+
식별자: [호환 표면](docs/compatibility-6x.md)
|
|
128
141
|
|
|
129
142
|
> **위치 계약** — `paragraph_index`는 본문 직속 문단의 0-based 인덱스입니다. 표 안 문단은 여기 섞지 않고
|
|
130
143
|
> `{"kind":"table_cell_paragraph","table_index":0,"row":0,"col":1,"cell_paragraph_index":0}` 같은 `location`
|
|
@@ -145,10 +158,10 @@ handshake는 core/automation/plugin 버전+해시 skew를 fail-closed로 차단
|
|
|
145
158
|
| `HWPX_AUTOMATION_WORKFLOW_STORE` | durable workflow SQLite 경로. 기존 `HWPX_WORKFLOW_STORE`보다 우선 | 기존 6.x 상태 경로 |
|
|
146
159
|
| `LOG_LEVEL` | 로그 레벨 | `INFO` |
|
|
147
160
|
|
|
148
|
-
동일 suffix의 기존 `HWPX_MCP_*` 키는
|
|
161
|
+
동일 suffix의 기존 `HWPX_MCP_*` 키는 fallback으로 유지되며, 두 키가
|
|
149
162
|
함께 있으면 `HWPX_AUTOMATION_*`이 우선합니다. render·workflow·oracle·plugin
|
|
150
163
|
연동용 보존 키 전체 목록과 workflow DB 경로 규칙은
|
|
151
|
-
[
|
|
164
|
+
[호환 표면](docs/compatibility-6x.md)에 있습니다.
|
|
152
165
|
|
|
153
166
|
경로는 기본적으로 workspace 밖 traversal과 symlink escape를 거부하고, URL 입력은 HTTPS·공개 IP만
|
|
154
167
|
허용합니다. 원자 rename을 제공하지 않는 호스트의 동시성 주의사항은 [하드닝 가이드](docs/hardening_guide_ko.md)를 보세요.
|
|
@@ -179,5 +192,3 @@ python scripts/run_conformance.py run \
|
|
|
179
192
|
## License · Maintainer
|
|
180
193
|
|
|
181
194
|
Apache-2.0 ([LICENSE](LICENSE) · [NOTICE](NOTICE)) — **Kohkyuhyun** [@airmang](https://github.com/airmang) · [kokyuhyun@hotmail.com](mailto:kokyuhyun@hotmail.com)
|
|
182
|
-
|
|
183
|
-
기존 문서 수정은 [조회·대상 확정·보존 저장·검증 안내](docs/existing-edit-navigation.md)를 먼저 확인하세요. 새 문서는 document-plan, 에이전트 연결은 선택 MCP와 호스트 플러그인을 사용합니다.
|
|
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "python-hwpx-automation"
|
|
7
|
-
version = "7.2
|
|
7
|
+
version = "7.3.2"
|
|
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" }]
|
{python_hwpx_automation-7.2.0 → python_hwpx_automation-7.3.2}/src/hwpx_automation/form_fill.py
RENAMED
|
@@ -1122,10 +1122,15 @@ def _runtime_validation(path: str) -> dict[str, Any]:
|
|
|
1122
1122
|
{
|
|
1123
1123
|
"part": getattr(issue, "part_name", None),
|
|
1124
1124
|
"message": getattr(issue, "message", str(issue)),
|
|
1125
|
+
"severity": getattr(issue, "severity", "error"),
|
|
1125
1126
|
}
|
|
1126
1127
|
for issue in getattr(document_report, "issues", ())
|
|
1127
1128
|
]
|
|
1128
|
-
|
|
1129
|
+
# a schema warning from python-hwpx does not block the hand-off; only its errors do
|
|
1130
|
+
structure = {
|
|
1131
|
+
"ok": not any(issue["severity"] == "error" for issue in structure_issues),
|
|
1132
|
+
"issues": structure_issues,
|
|
1133
|
+
}
|
|
1129
1134
|
if validate_package is None:
|
|
1130
1135
|
package = _dependency_unavailable_report(
|
|
1131
1136
|
"python-hwpx>=2.10.3 is required for HWPX package validation",
|
|
@@ -1208,7 +1213,7 @@ def _issue_payload(issue: Any) -> dict[str, Any]:
|
|
|
1208
1213
|
return {
|
|
1209
1214
|
"part": getattr(issue, "part_name", None),
|
|
1210
1215
|
"message": getattr(issue, "message", str(issue)),
|
|
1211
|
-
"level": getattr(issue, "
|
|
1216
|
+
"level": getattr(issue, "severity", "error"),
|
|
1212
1217
|
}
|
|
1213
1218
|
|
|
1214
1219
|
|
{python_hwpx_automation-7.2.0 → python_hwpx_automation-7.3.2}/src/hwpx_automation/identity.json
RENAMED
|
@@ -5,28 +5,28 @@
|
|
|
5
5
|
"releaseState": {
|
|
6
6
|
"status": "release-approved",
|
|
7
7
|
"candidate": {
|
|
8
|
-
"pythonHwpx": "6.
|
|
8
|
+
"pythonHwpx": "6.6.0",
|
|
9
9
|
"canonicalDistribution": "python-hwpx-automation",
|
|
10
|
-
"canonicalAutomation": "7.2
|
|
10
|
+
"canonicalAutomation": "7.3.2",
|
|
11
11
|
"compatibilityDistribution": "hwpx-mcp-server",
|
|
12
|
-
"compatibility": "7.2
|
|
13
|
-
"plugin": "2.
|
|
12
|
+
"compatibility": "7.3.2",
|
|
13
|
+
"plugin": "2.4.0",
|
|
14
14
|
"contractHash": "5e5c23651f92785a"
|
|
15
15
|
},
|
|
16
16
|
"currentPublic": {
|
|
17
|
-
"pythonHwpx": "6.
|
|
17
|
+
"pythonHwpx": "6.6.0",
|
|
18
18
|
"primaryDistribution": "python-hwpx-automation",
|
|
19
|
-
"primaryApplication": "7.1
|
|
20
|
-
"plugin": "2.
|
|
21
|
-
"contractHash": "
|
|
19
|
+
"primaryApplication": "7.3.1",
|
|
20
|
+
"plugin": "2.4.0",
|
|
21
|
+
"contractHash": "5e5c23651f92785a"
|
|
22
22
|
},
|
|
23
23
|
"promotionGate": "Three states are mandatory: unreleased-candidate while auditing; release-approved only after separate owner approval and while currentPublic still names the previously observed coherent stack; released only in a follow-up commit after remote truth is observed for core, canonical automation, the compatibility distribution, the plugin GitHub release, the marketplace entry, and a real marketplace install. The automation tag workflow publishes only release-approved, leaves currentPublic unchanged, and hands an attached receipt to plugin publication.",
|
|
24
24
|
"previousPublic": {
|
|
25
|
-
"pythonHwpx": "6.
|
|
25
|
+
"pythonHwpx": "6.6.0",
|
|
26
26
|
"primaryDistribution": "python-hwpx-automation",
|
|
27
|
-
"primaryApplication": "7.1
|
|
28
|
-
"plugin": "2.
|
|
29
|
-
"contractHash": "
|
|
27
|
+
"primaryApplication": "7.3.1",
|
|
28
|
+
"plugin": "2.4.0",
|
|
29
|
+
"contractHash": "5e5c23651f92785a"
|
|
30
30
|
},
|
|
31
31
|
"publicationEvidence": null
|
|
32
32
|
},
|
|
@@ -19,6 +19,15 @@ from ..model import AgentContractError
|
|
|
19
19
|
|
|
20
20
|
_HWP_UNITS_PER_MM = 7200 / 25.4
|
|
21
21
|
_INLINE_KINDS = frozenset({"table", "picture", "shape", "footnote", "endnote"})
|
|
22
|
+
#: Names a blueprint may give a click-here field. Hancom opens the field only
|
|
23
|
+
#: under its own type name, CLICK_HERE.
|
|
24
|
+
_CLICK_HERE_NAMES = frozenset({"FORM", "CLICKHERE", "NURUMTUL", "누름틀"})
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
def hancom_field_type(field_type: object) -> str | None:
|
|
28
|
+
"""CLICK_HERE for any name of a click-here field, None for another field type."""
|
|
29
|
+
normalized = str(field_type or "ClickHere").replace("_", "").replace("-", "").upper()
|
|
30
|
+
return "CLICK_HERE" if normalized in _CLICK_HERE_NAMES else None
|
|
22
31
|
|
|
23
32
|
|
|
24
33
|
@dataclass(frozen=True, slots=True)
|
|
@@ -463,9 +472,8 @@ class TypedNativeBridge:
|
|
|
463
472
|
def _create_form_field(self, node_id: str, paragraph: Any) -> None:
|
|
464
473
|
node = self.nodes[node_id]
|
|
465
474
|
properties = node["properties"]
|
|
466
|
-
field_type =
|
|
467
|
-
|
|
468
|
-
if normalized_type not in {"FORM", "CLICKHERE", "NURUMTUL", "누름틀"}:
|
|
475
|
+
field_type = hancom_field_type(properties.get("fieldType"))
|
|
476
|
+
if field_type is None:
|
|
469
477
|
raise AgentContractError("unsupported_content", "only FORM fields are replayable", target=node_id)
|
|
470
478
|
host_id = self.references.get((node_id, "hostRun"))
|
|
471
479
|
end_id = self.references.get((node_id, "endRun"))
|
|
@@ -486,7 +494,7 @@ class TypedNativeBridge:
|
|
|
486
494
|
"id": begin_id,
|
|
487
495
|
"fieldid": field_id,
|
|
488
496
|
"name": str(properties.get("name") or "")[:512],
|
|
489
|
-
"type":
|
|
497
|
+
"type": field_type,
|
|
490
498
|
"editable": "0" if properties.get("readOnly") else "1",
|
|
491
499
|
"dirty": "0",
|
|
492
500
|
"zorder": "-1",
|
|
@@ -23,7 +23,7 @@ from .bundle import BlueprintBundle, read_blueprint_bundle
|
|
|
23
23
|
from .dump import dump_document_blueprint
|
|
24
24
|
from .mapping import ReplayPlan, materialize_dependencies, plan_replay
|
|
25
25
|
from .model import BlueprintReplayResult, validate_replay_request
|
|
26
|
-
from .native import CreatedBinding, TypedNativeBridge
|
|
26
|
+
from .native import CreatedBinding, TypedNativeBridge, hancom_field_type
|
|
27
27
|
|
|
28
28
|
IdempotencyStore = MutableMapping[str, Any]
|
|
29
29
|
FaultInjector = Callable[[str, int | None], None]
|
|
@@ -80,6 +80,9 @@ def _semantic_nodes(
|
|
|
80
80
|
identity = mapped.get("identity") if mapped else None
|
|
81
81
|
if isinstance(identity, Mapping) and identity.get("name"):
|
|
82
82
|
properties["style"] = identity["name"]
|
|
83
|
+
if node["kind"] == "form-field" and "fieldType" in properties:
|
|
84
|
+
# A click-here field is written, and so read back, as CLICK_HERE whatever the blueprint called it.
|
|
85
|
+
properties["fieldType"] = hancom_field_type(properties["fieldType"]) or properties["fieldType"]
|
|
83
86
|
normalized.append(
|
|
84
87
|
{
|
|
85
88
|
"blueprintId": str(node["blueprintId"]),
|
|
@@ -591,10 +591,18 @@ def main(
|
|
|
591
591
|
stdin = cast(TextIO, stdin or sys.stdin)
|
|
592
592
|
stdout = cast(TextIO, stdout or sys.stdout)
|
|
593
593
|
stderr = cast(TextIO, stderr or sys.stderr)
|
|
594
|
+
arguments = list(argv) if argv is not None else sys.argv[1:]
|
|
595
|
+
# Dispatched ahead of the parser, whose help and choice errors stay
|
|
596
|
+
# byte-identical to the frozen core CLI. The rendering owner is imported
|
|
597
|
+
# only here, so every other command stays free of the Hancom side.
|
|
598
|
+
if arguments[:1] == ["render-pdf"]:
|
|
599
|
+
from ..rendering.cli import main as render_main
|
|
600
|
+
|
|
601
|
+
return render_main(arguments, prog="hwpx", stdout=stdout, stderr=stderr)
|
|
594
602
|
parser = build_parser()
|
|
595
603
|
try:
|
|
596
604
|
with contextlib.redirect_stdout(stdout), contextlib.redirect_stderr(stderr):
|
|
597
|
-
args = parser.parse_args(
|
|
605
|
+
args = parser.parse_args(arguments)
|
|
598
606
|
if args.command == "help":
|
|
599
607
|
if args.kind == "blueprint":
|
|
600
608
|
if args.json_help:
|
|
@@ -73,6 +73,8 @@ _PARAGRAPH_ALIGNMENTS = frozenset(
|
|
|
73
73
|
_TABLE_ALIGNMENTS = frozenset({"LEFT", "CENTER", "RIGHT", "INSIDE", "OUTSIDE"})
|
|
74
74
|
_VERTICAL_ALIGNMENTS = frozenset({"TOP", "CENTER", "BOTTOM"})
|
|
75
75
|
_INLINE_KINDS = frozenset({"table", "picture", "shape", "footnote", "endnote"})
|
|
76
|
+
#: Notes sit in an hp:ctrl: Hancom drops a note outside one and crashes on an empty one.
|
|
77
|
+
_NOTE_TAGS = frozenset({"footNote", "endNote"})
|
|
76
78
|
_SHAPE_KINDS = frozenset({"line", "rect", "ellipse", "arc", "polygon", "curve", "connectLine"})
|
|
77
79
|
|
|
78
80
|
# Creation needs a few geometry fields that are readable, rather than editable,
|
|
@@ -450,7 +452,12 @@ def _insert_inline(
|
|
|
450
452
|
_tag_like(paragraph.element, "run"),
|
|
451
453
|
{"charPrIDRef": paragraph.char_pr_id_ref or "0"},
|
|
452
454
|
)
|
|
453
|
-
|
|
455
|
+
if _local_name(element) in _NOTE_TAGS:
|
|
456
|
+
control = run.makeelement(_tag_like(paragraph.element, "ctrl"), {})
|
|
457
|
+
control.append(element)
|
|
458
|
+
run.append(control)
|
|
459
|
+
else:
|
|
460
|
+
run.append(element)
|
|
454
461
|
if index >= len(siblings):
|
|
455
462
|
paragraph.element.append(run)
|
|
456
463
|
else:
|
|
@@ -458,6 +465,8 @@ def _insert_inline(
|
|
|
458
465
|
anchor_run = anchor.getparent() if hasattr(anchor, "getparent") else next(
|
|
459
466
|
child for child in paragraph.element if anchor in list(child)
|
|
460
467
|
)
|
|
468
|
+
if _local_name(anchor_run) == "ctrl":
|
|
469
|
+
anchor_run = anchor_run.getparent()
|
|
461
470
|
paragraph.element.insert(list(paragraph.element).index(anchor_run), run)
|
|
462
471
|
paragraph.section.mark_dirty()
|
|
463
472
|
return run
|
|
@@ -468,6 +477,9 @@ def _remove_inline_element(element: Any, paragraph: Any) -> None:
|
|
|
468
477
|
child for child in paragraph.element if element in list(child)
|
|
469
478
|
)
|
|
470
479
|
run.remove(element)
|
|
480
|
+
if _local_name(run) == "ctrl" and not list(run):
|
|
481
|
+
control, run = run, run.getparent()
|
|
482
|
+
run.remove(control)
|
|
471
483
|
if not list(run) and run in list(paragraph.element):
|
|
472
484
|
paragraph.element.remove(run)
|
|
473
485
|
paragraph.section.mark_dirty()
|
|
@@ -55,6 +55,15 @@ def _mm(value: object) -> float | None:
|
|
|
55
55
|
return round(units / _HWP_UNITS_PER_MM, 3)
|
|
56
56
|
|
|
57
57
|
|
|
58
|
+
def _drawn_page_size(page_size: Any) -> tuple[int, int]:
|
|
59
|
+
"""Width and height as Hancom draws the page: as stored for
|
|
60
|
+
``landscape="WIDELY"`` (portrait), turned otherwise (``NARROWLY``)."""
|
|
61
|
+
|
|
62
|
+
if page_size.orientation == "WIDELY":
|
|
63
|
+
return page_size.width, page_size.height
|
|
64
|
+
return page_size.height, page_size.width
|
|
65
|
+
|
|
66
|
+
|
|
58
67
|
def _first_child(element: Any, local_name: str) -> Any | None:
|
|
59
68
|
for child in element:
|
|
60
69
|
if _local_name(child) == local_name:
|
|
@@ -249,7 +258,7 @@ class HwpxAgentDocument:
|
|
|
249
258
|
self._add_record(root)
|
|
250
259
|
for section_index, section in enumerate(self.document.sections, start=1):
|
|
251
260
|
section_path = SemanticPath().child(indexed_segment("section", section_index))
|
|
252
|
-
|
|
261
|
+
page_width, page_height = _drawn_page_size(section.properties.page_size)
|
|
253
262
|
section_record = NodeRecord(
|
|
254
263
|
kind="section",
|
|
255
264
|
path=section_path.canonical,
|
|
@@ -259,8 +268,8 @@ class HwpxAgentDocument:
|
|
|
259
268
|
"index": section_index,
|
|
260
269
|
"partId": Path(section.part_name).name,
|
|
261
270
|
"paragraphCount": len(section.paragraphs),
|
|
262
|
-
"pageWidthMm": _mm(
|
|
263
|
-
"pageHeightMm": _mm(
|
|
271
|
+
"pageWidthMm": _mm(page_width),
|
|
272
|
+
"pageHeightMm": _mm(page_height),
|
|
264
273
|
},
|
|
265
274
|
native=section,
|
|
266
275
|
parent_path="/",
|
|
@@ -2030,6 +2030,10 @@ def _normalize_v2_page(value: Any) -> BuilderPageSize | None:
|
|
|
2030
2030
|
width = _float_value(value.get("widthMm", value.get("width_mm")), default=210)
|
|
2031
2031
|
height = _float_value(value.get("heightMm", value.get("height_mm")), default=297)
|
|
2032
2032
|
orientation = str(value.get("orientation") or "PORTRAIT").strip() or "PORTRAIT"
|
|
2033
|
+
# Hancom's own landscape values, as read from a document: WIDELY is
|
|
2034
|
+
# portrait, NARROWLY landscape. Hand the builder the plain names so every
|
|
2035
|
+
# python-hwpx version draws the same page.
|
|
2036
|
+
orientation = {"WIDELY": "PORTRAIT", "NARROWLY": "LANDSCAPE"}.get(orientation.upper(), orientation)
|
|
2033
2037
|
return BuilderPageSize(width_mm=width, height_mm=height, orientation=orientation)
|
|
2034
2038
|
|
|
2035
2039
|
|
|
@@ -2681,7 +2685,10 @@ def _flow_oversized_authored_table(table: Any) -> None:
|
|
|
2681
2685
|
section = table.paragraph.section
|
|
2682
2686
|
page = section.properties.page_size
|
|
2683
2687
|
margins = section.properties.page_margins
|
|
2684
|
-
|
|
2688
|
+
# Hancom turns every page but landscape="WIDELY", so a landscape page's
|
|
2689
|
+
# drawn height is its stored width.
|
|
2690
|
+
drawn_height = page.height if page.orientation == "WIDELY" else page.width
|
|
2691
|
+
body_height = drawn_height - margins.top - margins.bottom
|
|
2685
2692
|
if body_height > 0 and table.height > body_height:
|
|
2686
2693
|
table.set_treat_as_char(False)
|
|
2687
2694
|
|