python-hwpx-automation 6.0.4__tar.gz → 6.2.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.
- {python_hwpx_automation-6.0.4/src/python_hwpx_automation.egg-info → python_hwpx_automation-6.2.1}/PKG-INFO +57 -92
- {python_hwpx_automation-6.0.4 → python_hwpx_automation-6.2.1}/README.md +50 -90
- {python_hwpx_automation-6.0.4 → python_hwpx_automation-6.2.1}/pyproject.toml +7 -2
- {python_hwpx_automation-6.0.4 → python_hwpx_automation-6.2.1}/src/hwpx_automation/handlers/content_edit.py +37 -0
- {python_hwpx_automation-6.0.4 → python_hwpx_automation-6.2.1}/src/hwpx_automation/handlers/form_fill.py +34 -0
- {python_hwpx_automation-6.0.4 → python_hwpx_automation-6.2.1}/src/hwpx_automation/hwpx_ops.py +50 -0
- python_hwpx_automation-6.2.1/src/hwpx_automation/identity.json +263 -0
- {python_hwpx_automation-6.0.4 → python_hwpx_automation-6.2.1}/src/hwpx_automation/ops_services/content_layout.py +128 -0
- {python_hwpx_automation-6.0.4 → python_hwpx_automation-6.2.1}/src/hwpx_automation/ops_services/form_fields.py +61 -0
- {python_hwpx_automation-6.0.4 → python_hwpx_automation-6.2.1}/src/hwpx_automation/server.py +2 -0
- {python_hwpx_automation-6.0.4 → python_hwpx_automation-6.2.1}/src/hwpx_automation/tool_bindings.py +2 -0
- {python_hwpx_automation-6.0.4 → python_hwpx_automation-6.2.1}/src/hwpx_automation/tool_contract.py +14 -13
- {python_hwpx_automation-6.0.4 → python_hwpx_automation-6.2.1/src/python_hwpx_automation.egg-info}/PKG-INFO +57 -92
- {python_hwpx_automation-6.0.4 → python_hwpx_automation-6.2.1}/src/python_hwpx_automation.egg-info/requires.txt +1 -1
- python_hwpx_automation-6.0.4/src/hwpx_automation/identity.json +0 -263
- {python_hwpx_automation-6.0.4 → python_hwpx_automation-6.2.1}/LICENSE +0 -0
- {python_hwpx_automation-6.0.4 → python_hwpx_automation-6.2.1}/MANIFEST.in +0 -0
- {python_hwpx_automation-6.0.4 → python_hwpx_automation-6.2.1}/NOTICE +0 -0
- {python_hwpx_automation-6.0.4 → python_hwpx_automation-6.2.1}/setup.cfg +0 -0
- {python_hwpx_automation-6.0.4 → python_hwpx_automation-6.2.1}/src/hwpx_automation/__init__.py +0 -0
- {python_hwpx_automation-6.0.4 → python_hwpx_automation-6.2.1}/src/hwpx_automation/__init__.pyi +0 -0
- {python_hwpx_automation-6.0.4 → python_hwpx_automation-6.2.1}/src/hwpx_automation/__main__.py +0 -0
- {python_hwpx_automation-6.0.4 → python_hwpx_automation-6.2.1}/src/hwpx_automation/agent_document.py +0 -0
- {python_hwpx_automation-6.0.4 → python_hwpx_automation-6.2.1}/src/hwpx_automation/api.py +0 -0
- {python_hwpx_automation-6.0.4 → python_hwpx_automation-6.2.1}/src/hwpx_automation/blind_eval.py +0 -0
- {python_hwpx_automation-6.0.4 → python_hwpx_automation-6.2.1}/src/hwpx_automation/capabilities.py +0 -0
- {python_hwpx_automation-6.0.4 → python_hwpx_automation-6.2.1}/src/hwpx_automation/compat.py +0 -0
- {python_hwpx_automation-6.0.4 → python_hwpx_automation-6.2.1}/src/hwpx_automation/configuration.py +0 -0
- {python_hwpx_automation-6.0.4 → python_hwpx_automation-6.2.1}/src/hwpx_automation/core/__init__.py +0 -0
- {python_hwpx_automation-6.0.4 → python_hwpx_automation-6.2.1}/src/hwpx_automation/core/content.py +0 -0
- {python_hwpx_automation-6.0.4 → python_hwpx_automation-6.2.1}/src/hwpx_automation/core/context.py +0 -0
- {python_hwpx_automation-6.0.4 → python_hwpx_automation-6.2.1}/src/hwpx_automation/core/diff.py +0 -0
- {python_hwpx_automation-6.0.4 → python_hwpx_automation-6.2.1}/src/hwpx_automation/core/document.py +0 -0
- {python_hwpx_automation-6.0.4 → python_hwpx_automation-6.2.1}/src/hwpx_automation/core/formatting.py +0 -0
- {python_hwpx_automation-6.0.4 → python_hwpx_automation-6.2.1}/src/hwpx_automation/core/handles.py +0 -0
- {python_hwpx_automation-6.0.4 → python_hwpx_automation-6.2.1}/src/hwpx_automation/core/locations.py +0 -0
- {python_hwpx_automation-6.0.4 → python_hwpx_automation-6.2.1}/src/hwpx_automation/core/locator.py +0 -0
- {python_hwpx_automation-6.0.4 → python_hwpx_automation-6.2.1}/src/hwpx_automation/core/plan.py +0 -0
- {python_hwpx_automation-6.0.4 → python_hwpx_automation-6.2.1}/src/hwpx_automation/core/resources.py +0 -0
- {python_hwpx_automation-6.0.4 → python_hwpx_automation-6.2.1}/src/hwpx_automation/core/search.py +0 -0
- {python_hwpx_automation-6.0.4 → python_hwpx_automation-6.2.1}/src/hwpx_automation/core/transactions.py +0 -0
- {python_hwpx_automation-6.0.4 → python_hwpx_automation-6.2.1}/src/hwpx_automation/core/txn.py +0 -0
- {python_hwpx_automation-6.0.4 → python_hwpx_automation-6.2.1}/src/hwpx_automation/document_state.py +0 -0
- {python_hwpx_automation-6.0.4 → python_hwpx_automation-6.2.1}/src/hwpx_automation/errors.py +0 -0
- {python_hwpx_automation-6.0.4 → python_hwpx_automation-6.2.1}/src/hwpx_automation/execution_lock.py +0 -0
- {python_hwpx_automation-6.0.4 → python_hwpx_automation-6.2.1}/src/hwpx_automation/fastmcp_adapter.py +0 -0
- {python_hwpx_automation-6.0.4 → python_hwpx_automation-6.2.1}/src/hwpx_automation/form_fill.py +0 -0
- {python_hwpx_automation-6.0.4 → python_hwpx_automation-6.2.1}/src/hwpx_automation/form_output_models.py +0 -0
- {python_hwpx_automation-6.0.4 → python_hwpx_automation-6.2.1}/src/hwpx_automation/handlers/__init__.py +0 -0
- {python_hwpx_automation-6.0.4 → python_hwpx_automation-6.2.1}/src/hwpx_automation/handlers/_shared.py +0 -0
- {python_hwpx_automation-6.0.4 → python_hwpx_automation-6.2.1}/src/hwpx_automation/handlers/agent_document.py +0 -0
- {python_hwpx_automation-6.0.4 → python_hwpx_automation-6.2.1}/src/hwpx_automation/handlers/authoring.py +0 -0
- {python_hwpx_automation-6.0.4 → python_hwpx_automation-6.2.1}/src/hwpx_automation/handlers/layout_style.py +0 -0
- {python_hwpx_automation-6.0.4 → python_hwpx_automation-6.2.1}/src/hwpx_automation/handlers/quality_render.py +0 -0
- {python_hwpx_automation-6.0.4 → python_hwpx_automation-6.2.1}/src/hwpx_automation/handlers/read_export.py +0 -0
- {python_hwpx_automation-6.0.4 → python_hwpx_automation-6.2.1}/src/hwpx_automation/handlers/specialized.py +0 -0
- {python_hwpx_automation-6.0.4 → python_hwpx_automation-6.2.1}/src/hwpx_automation/handlers/tracked_changes.py +0 -0
- {python_hwpx_automation-6.0.4 → python_hwpx_automation-6.2.1}/src/hwpx_automation/handlers/workflow.py +0 -0
- {python_hwpx_automation-6.0.4 → python_hwpx_automation-6.2.1}/src/hwpx_automation/hwp_converter.py +0 -0
- {python_hwpx_automation-6.0.4 → python_hwpx_automation-6.2.1}/src/hwpx_automation/hwp_support.py +0 -0
- {python_hwpx_automation-6.0.4 → python_hwpx_automation-6.2.1}/src/hwpx_automation/identity.py +0 -0
- {python_hwpx_automation-6.0.4 → python_hwpx_automation-6.2.1}/src/hwpx_automation/ingest_adapters.py +0 -0
- {python_hwpx_automation-6.0.4 → python_hwpx_automation-6.2.1}/src/hwpx_automation/markdown_plan.py +0 -0
- {python_hwpx_automation-6.0.4 → python_hwpx_automation-6.2.1}/src/hwpx_automation/mcp_cli.py +0 -0
- {python_hwpx_automation-6.0.4 → python_hwpx_automation-6.2.1}/src/hwpx_automation/metadata/tools_meta.py +0 -0
- {python_hwpx_automation-6.0.4 → python_hwpx_automation-6.2.1}/src/hwpx_automation/mixed_form.py +0 -0
- {python_hwpx_automation-6.0.4 → python_hwpx_automation-6.2.1}/src/hwpx_automation/mutation_models.py +0 -0
- {python_hwpx_automation-6.0.4 → python_hwpx_automation-6.2.1}/src/hwpx_automation/network_policy.py +0 -0
- {python_hwpx_automation-6.0.4 → python_hwpx_automation-6.2.1}/src/hwpx_automation/office/__init__.py +0 -0
- {python_hwpx_automation-6.0.4 → python_hwpx_automation-6.2.1}/src/hwpx_automation/office/agent/__init__.py +0 -0
- {python_hwpx_automation-6.0.4 → python_hwpx_automation-6.2.1}/src/hwpx_automation/office/agent/_batch_verification.py +0 -0
- {python_hwpx_automation-6.0.4 → python_hwpx_automation-6.2.1}/src/hwpx_automation/office/agent/blueprint/__init__.py +0 -0
- {python_hwpx_automation-6.0.4 → python_hwpx_automation-6.2.1}/src/hwpx_automation/office/agent/blueprint/bundle.py +0 -0
- {python_hwpx_automation-6.0.4 → python_hwpx_automation-6.2.1}/src/hwpx_automation/office/agent/blueprint/catalog.py +0 -0
- {python_hwpx_automation-6.0.4 → python_hwpx_automation-6.2.1}/src/hwpx_automation/office/agent/blueprint/dump.py +0 -0
- {python_hwpx_automation-6.0.4 → python_hwpx_automation-6.2.1}/src/hwpx_automation/office/agent/blueprint/mapping.py +0 -0
- {python_hwpx_automation-6.0.4 → python_hwpx_automation-6.2.1}/src/hwpx_automation/office/agent/blueprint/model.py +0 -0
- {python_hwpx_automation-6.0.4 → python_hwpx_automation-6.2.1}/src/hwpx_automation/office/agent/blueprint/native.py +0 -0
- {python_hwpx_automation-6.0.4 → python_hwpx_automation-6.2.1}/src/hwpx_automation/office/agent/blueprint/replay.py +0 -0
- {python_hwpx_automation-6.0.4 → python_hwpx_automation-6.2.1}/src/hwpx_automation/office/agent/catalog.py +0 -0
- {python_hwpx_automation-6.0.4 → python_hwpx_automation-6.2.1}/src/hwpx_automation/office/agent/cli.py +0 -0
- {python_hwpx_automation-6.0.4 → python_hwpx_automation-6.2.1}/src/hwpx_automation/office/agent/commands.py +0 -0
- {python_hwpx_automation-6.0.4 → python_hwpx_automation-6.2.1}/src/hwpx_automation/office/agent/document.py +0 -0
- {python_hwpx_automation-6.0.4 → python_hwpx_automation-6.2.1}/src/hwpx_automation/office/agent/form_plan.py +0 -0
- {python_hwpx_automation-6.0.4 → python_hwpx_automation-6.2.1}/src/hwpx_automation/office/agent/model.py +0 -0
- {python_hwpx_automation-6.0.4 → python_hwpx_automation-6.2.1}/src/hwpx_automation/office/agent/path.py +0 -0
- {python_hwpx_automation-6.0.4 → python_hwpx_automation-6.2.1}/src/hwpx_automation/office/agent/query.py +0 -0
- {python_hwpx_automation-6.0.4 → python_hwpx_automation-6.2.1}/src/hwpx_automation/office/agent/story.py +0 -0
- {python_hwpx_automation-6.0.4 → python_hwpx_automation-6.2.1}/src/hwpx_automation/office/authoring/__init__.py +0 -0
- {python_hwpx_automation-6.0.4 → python_hwpx_automation-6.2.1}/src/hwpx_automation/office/authoring/advanced_generators.py +0 -0
- {python_hwpx_automation-6.0.4 → python_hwpx_automation-6.2.1}/src/hwpx_automation/office/authoring/builder/__init__.py +0 -0
- {python_hwpx_automation-6.0.4 → python_hwpx_automation-6.2.1}/src/hwpx_automation/office/authoring/builder/core.py +0 -0
- {python_hwpx_automation-6.0.4 → python_hwpx_automation-6.2.1}/src/hwpx_automation/office/authoring/builder/report.py +0 -0
- {python_hwpx_automation-6.0.4 → python_hwpx_automation-6.2.1}/src/hwpx_automation/office/authoring/design/__init__.py +0 -0
- {python_hwpx_automation-6.0.4 → python_hwpx_automation-6.2.1}/src/hwpx_automation/office/authoring/design/_support.py +0 -0
- {python_hwpx_automation-6.0.4 → python_hwpx_automation-6.2.1}/src/hwpx_automation/office/authoring/design/composer.py +0 -0
- {python_hwpx_automation-6.0.4 → python_hwpx_automation-6.2.1}/src/hwpx_automation/office/authoring/design/harvest.py +0 -0
- {python_hwpx_automation-6.0.4 → python_hwpx_automation-6.2.1}/src/hwpx_automation/office/authoring/design/plan.py +0 -0
- {python_hwpx_automation-6.0.4 → python_hwpx_automation-6.2.1}/src/hwpx_automation/office/authoring/design/profile.py +0 -0
- {python_hwpx_automation-6.0.4 → python_hwpx_automation-6.2.1}/src/hwpx_automation/office/authoring/design/profiles/application_form/fragments/body.xml +0 -0
- {python_hwpx_automation-6.0.4 → python_hwpx_automation-6.2.1}/src/hwpx_automation/office/authoring/design/profiles/application_form/fragments/heading.xml +0 -0
- {python_hwpx_automation-6.0.4 → python_hwpx_automation-6.2.1}/src/hwpx_automation/office/authoring/design/profiles/application_form/fragments/info_table.xml +0 -0
- {python_hwpx_automation-6.0.4 → python_hwpx_automation-6.2.1}/src/hwpx_automation/office/authoring/design/profiles/application_form/fragments/title.xml +0 -0
- {python_hwpx_automation-6.0.4 → python_hwpx_automation-6.2.1}/src/hwpx_automation/office/authoring/design/profiles/application_form/profile.json +0 -0
- {python_hwpx_automation-6.0.4 → python_hwpx_automation-6.2.1}/src/hwpx_automation/office/authoring/design/profiles/application_form/template.hwpx +0 -0
- {python_hwpx_automation-6.0.4 → python_hwpx_automation-6.2.1}/src/hwpx_automation/office/authoring/design/profiles/home_notice/fragments/body.xml +0 -0
- {python_hwpx_automation-6.0.4 → python_hwpx_automation-6.2.1}/src/hwpx_automation/office/authoring/design/profiles/home_notice/fragments/heading.xml +0 -0
- {python_hwpx_automation-6.0.4 → python_hwpx_automation-6.2.1}/src/hwpx_automation/office/authoring/design/profiles/home_notice/fragments/title.xml +0 -0
- {python_hwpx_automation-6.0.4 → python_hwpx_automation-6.2.1}/src/hwpx_automation/office/authoring/design/profiles/home_notice/profile.json +0 -0
- {python_hwpx_automation-6.0.4 → python_hwpx_automation-6.2.1}/src/hwpx_automation/office/authoring/design/profiles/home_notice/template.hwpx +0 -0
- {python_hwpx_automation-6.0.4 → python_hwpx_automation-6.2.1}/src/hwpx_automation/office/authoring/design/profiles/official_notice/fragments/body.xml +0 -0
- {python_hwpx_automation-6.0.4 → python_hwpx_automation-6.2.1}/src/hwpx_automation/office/authoring/design/profiles/official_notice/fragments/heading.xml +0 -0
- {python_hwpx_automation-6.0.4 → python_hwpx_automation-6.2.1}/src/hwpx_automation/office/authoring/design/profiles/official_notice/fragments/info_table.xml +0 -0
- {python_hwpx_automation-6.0.4 → python_hwpx_automation-6.2.1}/src/hwpx_automation/office/authoring/design/profiles/official_notice/fragments/title.xml +0 -0
- {python_hwpx_automation-6.0.4 → python_hwpx_automation-6.2.1}/src/hwpx_automation/office/authoring/design/profiles/official_notice/profile.json +0 -0
- {python_hwpx_automation-6.0.4 → python_hwpx_automation-6.2.1}/src/hwpx_automation/office/authoring/design/profiles/official_notice/template.hwpx +0 -0
- {python_hwpx_automation-6.0.4 → python_hwpx_automation-6.2.1}/src/hwpx_automation/office/authoring/design/profiles/report/fragments/body.xml +0 -0
- {python_hwpx_automation-6.0.4 → python_hwpx_automation-6.2.1}/src/hwpx_automation/office/authoring/design/profiles/report/fragments/heading.xml +0 -0
- {python_hwpx_automation-6.0.4 → python_hwpx_automation-6.2.1}/src/hwpx_automation/office/authoring/design/profiles/report/fragments/info_table.xml +0 -0
- {python_hwpx_automation-6.0.4 → python_hwpx_automation-6.2.1}/src/hwpx_automation/office/authoring/design/profiles/report/fragments/title.xml +0 -0
- {python_hwpx_automation-6.0.4 → python_hwpx_automation-6.2.1}/src/hwpx_automation/office/authoring/design/profiles/report/profile.json +0 -0
- {python_hwpx_automation-6.0.4 → python_hwpx_automation-6.2.1}/src/hwpx_automation/office/authoring/design/profiles/report/template.hwpx +0 -0
- {python_hwpx_automation-6.0.4 → python_hwpx_automation-6.2.1}/src/hwpx_automation/office/authoring/design/validator.py +0 -0
- {python_hwpx_automation-6.0.4 → python_hwpx_automation-6.2.1}/src/hwpx_automation/office/authoring/presets/__init__.py +0 -0
- {python_hwpx_automation-6.0.4 → python_hwpx_automation-6.2.1}/src/hwpx_automation/office/authoring/presets/proposal.py +0 -0
- {python_hwpx_automation-6.0.4 → python_hwpx_automation-6.2.1}/src/hwpx_automation/office/authoring/report_parser.py +0 -0
- {python_hwpx_automation-6.0.4 → python_hwpx_automation-6.2.1}/src/hwpx_automation/office/authoring/style_profile.py +0 -0
- {python_hwpx_automation-6.0.4 → python_hwpx_automation-6.2.1}/src/hwpx_automation/office/authoring/template_analyzer.py +0 -0
- {python_hwpx_automation-6.0.4 → python_hwpx_automation-6.2.1}/src/hwpx_automation/office/compliance/__init__.py +0 -0
- {python_hwpx_automation-6.0.4 → python_hwpx_automation-6.2.1}/src/hwpx_automation/office/compliance/official_lint.py +0 -0
- {python_hwpx_automation-6.0.4 → python_hwpx_automation-6.2.1}/src/hwpx_automation/office/compliance/pii.py +0 -0
- {python_hwpx_automation-6.0.4 → python_hwpx_automation-6.2.1}/src/hwpx_automation/office/document_ops/__init__.py +0 -0
- {python_hwpx_automation-6.0.4 → python_hwpx_automation-6.2.1}/src/hwpx_automation/office/document_ops/comparison.py +0 -0
- {python_hwpx_automation-6.0.4 → python_hwpx_automation-6.2.1}/src/hwpx_automation/office/document_ops/mail_merge.py +0 -0
- {python_hwpx_automation-6.0.4 → python_hwpx_automation-6.2.1}/src/hwpx_automation/office/document_ops/redline.py +0 -0
- {python_hwpx_automation-6.0.4 → python_hwpx_automation-6.2.1}/src/hwpx_automation/office/evalplan/__init__.py +0 -0
- {python_hwpx_automation-6.0.4 → python_hwpx_automation-6.2.1}/src/hwpx_automation/office/evalplan/runtime.py +0 -0
- {python_hwpx_automation-6.0.4 → python_hwpx_automation-6.2.1}/src/hwpx_automation/office/exam/__init__.py +0 -0
- {python_hwpx_automation-6.0.4 → python_hwpx_automation-6.2.1}/src/hwpx_automation/office/exam/compose.py +0 -0
- {python_hwpx_automation-6.0.4 → python_hwpx_automation-6.2.1}/src/hwpx_automation/office/exam/ir.py +0 -0
- {python_hwpx_automation-6.0.4 → python_hwpx_automation-6.2.1}/src/hwpx_automation/office/exam/measure.py +0 -0
- {python_hwpx_automation-6.0.4 → python_hwpx_automation-6.2.1}/src/hwpx_automation/office/exam/parser.py +0 -0
- {python_hwpx_automation-6.0.4 → python_hwpx_automation-6.2.1}/src/hwpx_automation/office/exam/profile.py +0 -0
- {python_hwpx_automation-6.0.4 → python_hwpx_automation-6.2.1}/src/hwpx_automation/office/form_fill/__init__.py +0 -0
- {python_hwpx_automation-6.0.4 → python_hwpx_automation-6.2.1}/src/hwpx_automation/office/form_fill/classification.py +0 -0
- {python_hwpx_automation-6.0.4 → python_hwpx_automation-6.2.1}/src/hwpx_automation/office/form_fill/fill_residue.py +0 -0
- {python_hwpx_automation-6.0.4 → python_hwpx_automation-6.2.1}/src/hwpx_automation/office/form_fill/fit/__init__.py +0 -0
- {python_hwpx_automation-6.0.4 → python_hwpx_automation-6.2.1}/src/hwpx_automation/office/form_fill/fit/apply.py +0 -0
- {python_hwpx_automation-6.0.4 → python_hwpx_automation-6.2.1}/src/hwpx_automation/office/form_fill/fit/engine.py +0 -0
- {python_hwpx_automation-6.0.4 → python_hwpx_automation-6.2.1}/src/hwpx_automation/office/form_fill/fit/measure.py +0 -0
- {python_hwpx_automation-6.0.4 → python_hwpx_automation-6.2.1}/src/hwpx_automation/office/form_fill/fit/policy.py +0 -0
- {python_hwpx_automation-6.0.4 → python_hwpx_automation-6.2.1}/src/hwpx_automation/office/form_fill/fit/report.py +0 -0
- {python_hwpx_automation-6.0.4 → python_hwpx_automation-6.2.1}/src/hwpx_automation/office/form_fill/fit/seal.py +0 -0
- {python_hwpx_automation-6.0.4 → python_hwpx_automation-6.2.1}/src/hwpx_automation/office/form_fill/fit/wordbox.py +0 -0
- {python_hwpx_automation-6.0.4 → python_hwpx_automation-6.2.1}/src/hwpx_automation/office/form_fill/guidance.py +0 -0
- {python_hwpx_automation-6.0.4 → python_hwpx_automation-6.2.1}/src/hwpx_automation/office/form_fill/quality.py +0 -0
- {python_hwpx_automation-6.0.4 → python_hwpx_automation-6.2.1}/src/hwpx_automation/office/form_fill/split_run.py +0 -0
- {python_hwpx_automation-6.0.4 → python_hwpx_automation-6.2.1}/src/hwpx_automation/office/form_fill/template_formfit.py +0 -0
- {python_hwpx_automation-6.0.4 → python_hwpx_automation-6.2.1}/src/hwpx_automation/office/house_style/__init__.py +0 -0
- {python_hwpx_automation-6.0.4 → python_hwpx_automation-6.2.1}/src/hwpx_automation/office/house_style/composition.py +0 -0
- {python_hwpx_automation-6.0.4 → python_hwpx_automation-6.2.1}/src/hwpx_automation/office/house_style/data/bank.json +0 -0
- {python_hwpx_automation-6.0.4 → python_hwpx_automation-6.2.1}/src/hwpx_automation/office/house_style/data/genres.json +0 -0
- {python_hwpx_automation-6.0.4 → python_hwpx_automation-6.2.1}/src/hwpx_automation/office/quality/__init__.py +0 -0
- {python_hwpx_automation-6.0.4 → python_hwpx_automation-6.2.1}/src/hwpx_automation/office/quality/page_guard.py +0 -0
- {python_hwpx_automation-6.0.4 → python_hwpx_automation-6.2.1}/src/hwpx_automation/office/rendering/__init__.py +0 -0
- {python_hwpx_automation-6.0.4 → python_hwpx_automation-6.2.1}/src/hwpx_automation/office/rendering/_hancom_open_rate.ps1 +0 -0
- {python_hwpx_automation-6.0.4 → python_hwpx_automation-6.2.1}/src/hwpx_automation/office/rendering/_refresh_hwpx_mac.applescript +0 -0
- {python_hwpx_automation-6.0.4 → python_hwpx_automation-6.2.1}/src/hwpx_automation/office/rendering/_render_hwpx.ps1 +0 -0
- {python_hwpx_automation-6.0.4 → python_hwpx_automation-6.2.1}/src/hwpx_automation/office/rendering/_render_hwpx_mac.applescript +0 -0
- {python_hwpx_automation-6.0.4 → python_hwpx_automation-6.2.1}/src/hwpx_automation/office/rendering/block_splits.py +0 -0
- {python_hwpx_automation-6.0.4 → python_hwpx_automation-6.2.1}/src/hwpx_automation/office/rendering/detectors.py +0 -0
- {python_hwpx_automation-6.0.4 → python_hwpx_automation-6.2.1}/src/hwpx_automation/office/rendering/diff.py +0 -0
- {python_hwpx_automation-6.0.4 → python_hwpx_automation-6.2.1}/src/hwpx_automation/office/rendering/fixture_corpus.py +0 -0
- {python_hwpx_automation-6.0.4 → python_hwpx_automation-6.2.1}/src/hwpx_automation/office/rendering/oracle.py +0 -0
- {python_hwpx_automation-6.0.4 → python_hwpx_automation-6.2.1}/src/hwpx_automation/office/rendering/page_qa.py +0 -0
- {python_hwpx_automation-6.0.4 → python_hwpx_automation-6.2.1}/src/hwpx_automation/office/rendering/qa_contracts.py +0 -0
- {python_hwpx_automation-6.0.4 → python_hwpx_automation-6.2.1}/src/hwpx_automation/office/rendering/qa_metrics.py +0 -0
- {python_hwpx_automation-6.0.4 → python_hwpx_automation-6.2.1}/src/hwpx_automation/office/rendering/worker.py +0 -0
- {python_hwpx_automation-6.0.4 → python_hwpx_automation-6.2.1}/src/hwpx_automation/office/utilities/__init__.py +0 -0
- {python_hwpx_automation-6.0.4 → python_hwpx_automation-6.2.1}/src/hwpx_automation/office/utilities/table_compute.py +0 -0
- {python_hwpx_automation-6.0.4 → python_hwpx_automation-6.2.1}/src/hwpx_automation/ops_services/__init__.py +0 -0
- {python_hwpx_automation-6.0.4 → python_hwpx_automation-6.2.1}/src/hwpx_automation/ops_services/_border_fill.py +0 -0
- {python_hwpx_automation-6.0.4 → python_hwpx_automation-6.2.1}/src/hwpx_automation/ops_services/composition.py +0 -0
- {python_hwpx_automation-6.0.4 → python_hwpx_automation-6.2.1}/src/hwpx_automation/ops_services/context.py +0 -0
- {python_hwpx_automation-6.0.4 → python_hwpx_automation-6.2.1}/src/hwpx_automation/ops_services/media.py +0 -0
- {python_hwpx_automation-6.0.4 → python_hwpx_automation-6.2.1}/src/hwpx_automation/ops_services/memo_style.py +0 -0
- {python_hwpx_automation-6.0.4 → python_hwpx_automation-6.2.1}/src/hwpx_automation/ops_services/package_validation.py +0 -0
- {python_hwpx_automation-6.0.4 → python_hwpx_automation-6.2.1}/src/hwpx_automation/ops_services/planning.py +0 -0
- {python_hwpx_automation-6.0.4 → python_hwpx_automation-6.2.1}/src/hwpx_automation/ops_services/preview_export.py +0 -0
- {python_hwpx_automation-6.0.4 → python_hwpx_automation-6.2.1}/src/hwpx_automation/ops_services/read_query.py +0 -0
- {python_hwpx_automation-6.0.4 → python_hwpx_automation-6.2.1}/src/hwpx_automation/ops_services/save_policy.py +0 -0
- {python_hwpx_automation-6.0.4 → python_hwpx_automation-6.2.1}/src/hwpx_automation/ops_services/tables.py +0 -0
- {python_hwpx_automation-6.0.4 → python_hwpx_automation-6.2.1}/src/hwpx_automation/ops_services/transactions.py +0 -0
- {python_hwpx_automation-6.0.4 → python_hwpx_automation-6.2.1}/src/hwpx_automation/preview_output_models.py +0 -0
- {python_hwpx_automation-6.0.4 → python_hwpx_automation-6.2.1}/src/hwpx_automation/public-modules.json +0 -0
- {python_hwpx_automation-6.0.4 → python_hwpx_automation-6.2.1}/src/hwpx_automation/py.typed +0 -0
- {python_hwpx_automation-6.0.4 → python_hwpx_automation-6.2.1}/src/hwpx_automation/quality.py +0 -0
- {python_hwpx_automation-6.0.4 → python_hwpx_automation-6.2.1}/src/hwpx_automation/quality_generation.py +0 -0
- {python_hwpx_automation-6.0.4 → python_hwpx_automation-6.2.1}/src/hwpx_automation/runtime.py +0 -0
- {python_hwpx_automation-6.0.4 → python_hwpx_automation-6.2.1}/src/hwpx_automation/runtime_services.py +0 -0
- {python_hwpx_automation-6.0.4 → python_hwpx_automation-6.2.1}/src/hwpx_automation/storage.py +0 -0
- {python_hwpx_automation-6.0.4 → python_hwpx_automation-6.2.1}/src/hwpx_automation/upstream.py +0 -0
- {python_hwpx_automation-6.0.4 → python_hwpx_automation-6.2.1}/src/hwpx_automation/utils/__init__.py +0 -0
- {python_hwpx_automation-6.0.4 → python_hwpx_automation-6.2.1}/src/hwpx_automation/utils/helpers.py +0 -0
- {python_hwpx_automation-6.0.4 → python_hwpx_automation-6.2.1}/src/hwpx_automation/visual_qa.py +0 -0
- {python_hwpx_automation-6.0.4 → python_hwpx_automation-6.2.1}/src/hwpx_automation/workflow/__init__.py +0 -0
- {python_hwpx_automation-6.0.4 → python_hwpx_automation-6.2.1}/src/hwpx_automation/workflow/adapters.py +0 -0
- {python_hwpx_automation-6.0.4 → python_hwpx_automation-6.2.1}/src/hwpx_automation/workflow/dispatcher.py +0 -0
- {python_hwpx_automation-6.0.4 → python_hwpx_automation-6.2.1}/src/hwpx_automation/workflow/models.py +0 -0
- {python_hwpx_automation-6.0.4 → python_hwpx_automation-6.2.1}/src/hwpx_automation/workflow/policy.py +0 -0
- {python_hwpx_automation-6.0.4 → python_hwpx_automation-6.2.1}/src/hwpx_automation/workflow/render_contracts.py +0 -0
- {python_hwpx_automation-6.0.4 → python_hwpx_automation-6.2.1}/src/hwpx_automation/workflow/render_metrics.py +0 -0
- {python_hwpx_automation-6.0.4 → python_hwpx_automation-6.2.1}/src/hwpx_automation/workflow/render_queue.py +0 -0
- {python_hwpx_automation-6.0.4 → python_hwpx_automation-6.2.1}/src/hwpx_automation/workflow/render_security.py +0 -0
- {python_hwpx_automation-6.0.4 → python_hwpx_automation-6.2.1}/src/hwpx_automation/workflow/render_transport.py +0 -0
- {python_hwpx_automation-6.0.4 → python_hwpx_automation-6.2.1}/src/hwpx_automation/workflow/rendering.py +0 -0
- {python_hwpx_automation-6.0.4 → python_hwpx_automation-6.2.1}/src/hwpx_automation/workflow/service.py +0 -0
- {python_hwpx_automation-6.0.4 → python_hwpx_automation-6.2.1}/src/hwpx_automation/workflow/state_machine.py +0 -0
- {python_hwpx_automation-6.0.4 → python_hwpx_automation-6.2.1}/src/hwpx_automation/workflow/store.py +0 -0
- {python_hwpx_automation-6.0.4 → python_hwpx_automation-6.2.1}/src/hwpx_automation/workspace.py +0 -0
- {python_hwpx_automation-6.0.4 → python_hwpx_automation-6.2.1}/src/python_hwpx_automation.egg-info/SOURCES.txt +0 -0
- {python_hwpx_automation-6.0.4 → python_hwpx_automation-6.2.1}/src/python_hwpx_automation.egg-info/dependency_links.txt +0 -0
- {python_hwpx_automation-6.0.4 → python_hwpx_automation-6.2.1}/src/python_hwpx_automation.egg-info/entry_points.txt +0 -0
- {python_hwpx_automation-6.0.4 → python_hwpx_automation-6.2.1}/src/python_hwpx_automation.egg-info/top_level.txt +0 -0
|
@@ -1,21 +1,26 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: python-hwpx-automation
|
|
3
|
-
Version: 6.
|
|
3
|
+
Version: 6.2.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
|
|
7
7
|
Project-URL: Homepage, https://github.com/airmang/python-hwpx-automation
|
|
8
8
|
Project-URL: Issues, https://github.com/airmang/python-hwpx-automation/issues
|
|
9
9
|
Keywords: hwpx,hancom,document-automation,workflow,mcp,ai-agent
|
|
10
|
+
Classifier: Intended Audience :: Developers
|
|
10
11
|
Classifier: Programming Language :: Python :: 3
|
|
11
12
|
Classifier: Programming Language :: Python :: 3.10
|
|
12
13
|
Classifier: Programming Language :: Python :: 3.11
|
|
13
14
|
Classifier: Programming Language :: Python :: 3.12
|
|
15
|
+
Classifier: Programming Language :: Python :: 3.13
|
|
16
|
+
Classifier: Programming Language :: Python :: 3.14
|
|
17
|
+
Classifier: Topic :: Software Development :: Libraries
|
|
18
|
+
Classifier: Typing :: Typed
|
|
14
19
|
Requires-Python: >=3.10
|
|
15
20
|
Description-Content-Type: text/markdown
|
|
16
21
|
License-File: LICENSE
|
|
17
22
|
License-File: NOTICE
|
|
18
|
-
Requires-Dist: python-hwpx<6,>=5.
|
|
23
|
+
Requires-Dist: python-hwpx<6,>=5.2.0
|
|
19
24
|
Requires-Dist: pydantic<3,>=2.11
|
|
20
25
|
Requires-Dist: cryptography>=42.0
|
|
21
26
|
Requires-Dist: anyio>=4.0
|
|
@@ -68,41 +73,30 @@ Dynamic: license-file
|
|
|
68
73
|
</p>
|
|
69
74
|
|
|
70
75
|
<!-- release-state: release-approved -->
|
|
71
|
-
> [!
|
|
72
|
-
>
|
|
73
|
-
>
|
|
74
|
-
> `python-hwpx 5.
|
|
75
|
-
>
|
|
76
|
-
>
|
|
77
|
-
>
|
|
78
|
-
>
|
|
79
|
-
>
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
기본 설치는 MCP SDK 없이 Python API와 `hwpx` CLI를 사용할 수 있습니다.
|
|
90
|
-
[모델 컨텍스트 프로토콜(MCP)](https://modelcontextprotocol.io)은 `[mcp]` extra로
|
|
91
|
-
추가하는 선택 어댑터입니다.
|
|
92
|
-
|
|
93
|
-
한컴오피스도 Windows도 필요하지 않으므로 **ChatGPT 채팅 환경에서도 HWPX
|
|
94
|
-
문서를 다룰 수 있습니다.** 파이썬이 도는 곳이면 저작·양식 채움 워크플로가
|
|
95
|
-
그대로 동작합니다.
|
|
96
|
-
|
|
97
|
-
| 계층 | 저장소 | 정본 책임 |
|
|
76
|
+
> [!NOTE]
|
|
77
|
+
> 이 저장소의 main은 아직 공개되지 않은 6.2.1 후보 — release-approved 상태의 후보(수식 저작 `add_equation`,
|
|
78
|
+
> 계약 `342cf672f29cd183`, 129 도구)입니다. 현재 공개 트레인은
|
|
79
|
+
> `python-hwpx 5.1.1 → python-hwpx-automation 6.1.3 → hwpx-plugin 1.1.0`
|
|
80
|
+
> (계약 `ac1a422376b5ac84`, 2026-07-31 released)입니다. 공개 트레인은
|
|
81
|
+
> core·automation PyPI와 plugin GitHub
|
|
82
|
+
> Release·marketplace·실제 marketplace 설치까지 확인한 뒤 승격했으며, 기존
|
|
83
|
+
> 5.x 설치는 별도 발행된 `hwpx-mcp-server 5.1.1`이 보호합니다. 절차와 상태
|
|
84
|
+
> 머신: [릴리스 runbook](docs/release-runbook.md)
|
|
85
|
+
|
|
86
|
+
[python-hwpx](https://github.com/airmang/python-hwpx) 엔진 위에서 문서 저작·
|
|
87
|
+
양식 채움·시험지 조판·안전한 에이전트 워크플로를 제공하는 응용 계층입니다.
|
|
88
|
+
기본 설치는 MCP 없이 Python API와 `hwpx` CLI로 쓰고,
|
|
89
|
+
[모델 컨텍스트 프로토콜(MCP)](https://modelcontextprotocol.io) 서버는 필요할 때
|
|
90
|
+
`[mcp]` extra로 더합니다. 한컴오피스도 Windows도 필요 없으므로 **파이썬이 도는
|
|
91
|
+
ChatGPT 채팅 안에서도** 그대로 동작합니다.
|
|
92
|
+
|
|
93
|
+
| | 저장소 | 역할 |
|
|
98
94
|
|---|---|---|
|
|
99
|
-
|
|
|
100
|
-
|
|
|
101
|
-
|
|
|
95
|
+
| 📦 | [`python-hwpx`](https://github.com/airmang/python-hwpx) | HWPX 문서를 읽고·고치고·만드는 순수 파이썬 엔진 |
|
|
96
|
+
| 🔌 | [`python-hwpx-automation`](https://github.com/airmang/python-hwpx-automation) | 저작·양식 채움 워크플로, `hwpx` CLI, 선택형 MCP 서버 |
|
|
97
|
+
| 🎯 | [`hwpx-plugins`](https://github.com/airmang/hwpx-plugins) | 에이전트가 알맞은 도구를 고르도록 돕는 플러그인/스킬 번들 |
|
|
102
98
|
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
## Python 자동화 시작하기 (6.0 후보)
|
|
99
|
+
## Python 자동화 시작하기
|
|
106
100
|
|
|
107
101
|
```bash
|
|
108
102
|
pip install python-hwpx-automation
|
|
@@ -123,17 +117,13 @@ document.save_to_path("meeting-result.hwpx")
|
|
|
123
117
|
|
|
124
118
|
`python -m hwpx_automation --help`와 `hwpx help`는 같은 task CLI를 실행합니다.
|
|
125
119
|
|
|
126
|
-
## MCP 어댑터 시작하기
|
|
120
|
+
## MCP 어댑터 시작하기
|
|
127
121
|
|
|
128
122
|
```bash
|
|
129
123
|
pip install "python-hwpx-automation[mcp]"
|
|
130
124
|
hwpx-automation-mcp
|
|
131
125
|
```
|
|
132
126
|
|
|
133
|
-
6.x 호환 기간에는 `pip install hwpx-mcp-server`와 `hwpx-mcp-server`도
|
|
134
|
-
동작합니다. 옛 distribution/import/console 제거는 7.0 이전에는 하지 않으며,
|
|
135
|
-
최소 90일 공개 관찰과 별도 오너 승인이 필요합니다.
|
|
136
|
-
|
|
137
127
|
MCP 클라이언트 설정 파일에 아래 블록 하나면 `hwpx` 서버를 잡습니다 — Claude Desktop은
|
|
138
128
|
`claude_desktop_config.json`, VS Code는 `.vscode/mcp.json`(키가 `mcpServers` 대신 `servers`),
|
|
139
129
|
Gemini CLI는 `~/.gemini/settings.json`, Cursor·Windsurf는 각 에디터의 MCP 설정 파일입니다.
|
|
@@ -145,7 +135,7 @@ Gemini CLI는 `~/.gemini/settings.json`, Cursor·Windsurf는 각 에디터의 MC
|
|
|
145
135
|
"command": "uvx",
|
|
146
136
|
"args": [
|
|
147
137
|
"--from",
|
|
148
|
-
"python-hwpx-automation[mcp]==6.
|
|
138
|
+
"python-hwpx-automation[mcp]==6.1.3",
|
|
149
139
|
"hwpx-automation-mcp"
|
|
150
140
|
],
|
|
151
141
|
"env": {
|
|
@@ -156,16 +146,18 @@ Gemini CLI는 `~/.gemini/settings.json`, Cursor·Windsurf는 각 에디터의 MC
|
|
|
156
146
|
}
|
|
157
147
|
```
|
|
158
148
|
|
|
159
|
-
`HWPX_AUTOMATION_WORKSPACE_ROOTS`에는 문서가 있는 폴더(절대경로 또는 `~`)를
|
|
160
|
-
`"[\"C:\\\\hwpx\"]"`처럼 씁니다. 값을 비워 두면
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
149
|
+
`HWPX_AUTOMATION_WORKSPACE_ROOTS`에는 문서가 있는 폴더(절대경로 또는 `~`)를
|
|
150
|
+
지정하세요. Windows는 `"[\"C:\\\\hwpx\"]"`처럼 씁니다. 값을 비워 두면 GUI
|
|
151
|
+
클라이언트는 서버를 시스템 디렉터리에서 띄우기 때문에 모든 문서 경로가
|
|
152
|
+
막힙니다 — 처음부터 지정하는 것을 권장합니다. 나머지 옵션은
|
|
153
|
+
[환경 변수](#환경-변수) 표를 참고하세요.
|
|
164
154
|
|
|
165
155
|
> 비-HWPX 문서(PDF/DOCX/XLSX/HTML/TXT)를 `document_to_markdown`으로 읽으려면
|
|
166
|
-
> `pip install "python-hwpx-automation[ingest]"
|
|
167
|
-
>
|
|
168
|
-
|
|
156
|
+
> `pip install "python-hwpx-automation[ingest]"`로 MarkItDown adapter를 함께
|
|
157
|
+
> 설치합니다. 요구 사항: `Python >= 3.10` · `python-hwpx >= 5.0.0`.
|
|
158
|
+
|
|
159
|
+
기존 `hwpx-mcp-server` 배포·import·콘솔·설정 키도 6.x 동안 그대로 동작합니다 —
|
|
160
|
+
전체 목록과 유지 규칙: [6.x 호환 표면](docs/compatibility-6x.md)
|
|
169
161
|
|
|
170
162
|
## 무엇을 하나
|
|
171
163
|
|
|
@@ -180,34 +172,22 @@ macOS `/`)에서 띄우므로 이런 degenerate cwd는 거부되고 모든 문
|
|
|
180
172
|
|
|
181
173
|
자세한 내용: [사용 사례](docs/use-cases.md) · [스킬 우선 워크플로](docs/skill-first-workflows.md)
|
|
182
174
|
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
처음부터 모든 도구를 외울 필요는 없습니다. 보통 아래 하나로 시작합니다.
|
|
175
|
+
## 안전하게 쓰는 법
|
|
186
176
|
|
|
187
|
-
|
|
188
|
-
2. **안전 수정** — `copy_document`로 사본 생성 → 읽기 도구로 대상 확인 → `search_and_replace`, `set_table_cell_text` 같은 전문 도구나 `apply_document_commands`로 가장 작은 변경 → 다시 읽어 확인 → 검토가 끝난 복사본을 handoff.
|
|
177
|
+
처음부터 모든 도구를 외울 필요는 없습니다. 보통 이렇게 흘러갑니다.
|
|
189
178
|
|
|
190
|
-
|
|
179
|
+
1. **읽기** — `get_document_info` → `get_document_outline`/`get_document_text` → `find_text`, `get_table_map`으로 필요한 부분만 파악합니다. (저장하지 않음)
|
|
180
|
+
2. **안전 수정** — `copy_document`로 사본을 만들고, 가장 작은 변경(`search_and_replace`, `set_table_cell_text`, `apply_document_commands`)을 적용한 뒤 다시 읽어 확인하고, 검토가 끝난 사본을 전달합니다.
|
|
191
181
|
|
|
192
|
-
|
|
182
|
+
핵심은 **copy first · smallest edit · re-read after edits**입니다. 수정 도구는
|
|
183
|
+
호출 즉시 저장되므로 검토용 작업은 반드시 사본에서 하세요.
|
|
193
184
|
|
|
194
|
-
|
|
195
|
-
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
단일 `SavePipeline` 게이트를 통과해 무결성·XML·OPC/ID·열림안전을 검사하고, `quality`에 따라
|
|
201
|
-
`visualComplete` 블록(`ok`·`status`·`errorCodes`)을 응답에 실으며, 게이트가 실패하면 아무것도 쓰지 않고
|
|
202
|
-
소유 후보만 원복합니다. capability handshake가 core/automation/plugin
|
|
203
|
-
버전+해시 skew를 fail-closed로 차단합니다. 6.x 응답의 `versions.mcp`와
|
|
204
|
-
`minMcpVersion`은 기존 소비자를 위한 alias로만 유지됩니다.
|
|
205
|
-
같은 이유로 `MIN_MCP_VERSION`, 공개 오류 schema `hwpx.mcp-error/v1`,
|
|
206
|
-
동결된 architecture receipt ID `hwpx-mcp.*`, parity receipt 필드
|
|
207
|
-
`mcpRuntimeMembers`도 6.x에서 정확히 보존합니다. canonical 표기는
|
|
208
|
-
`versions.automation`·`minAutomationVersion`·`MIN_AUTOMATION_VERSION`이며,
|
|
209
|
-
보존된 MCP 철자는 제품 소유권이 아니라 wire/receipt 호환 식별자입니다.
|
|
210
|
-
보안 상세는 [하드닝 가이드](docs/hardening_guide_ko.md)에 있습니다.
|
|
185
|
+
모델은 operation/plan만 보내고 raw XML을 직접 편집하지 않습니다. 일반 저장
|
|
186
|
+
경로는 python-hwpx의 단일 `SavePipeline` 게이트를 통과해 무결성·XML·OPC/ID·
|
|
187
|
+
열림안전을 검사하고, 게이트가 실패하면 아무것도 쓰지 않습니다. capability
|
|
188
|
+
handshake는 core/automation/plugin 버전+해시 skew를 fail-closed로 차단합니다.
|
|
189
|
+
보안 상세: [하드닝 가이드](docs/hardening_guide_ko.md) · 옛 이름과의 호환
|
|
190
|
+
식별자: [6.x 호환 표면](docs/compatibility-6x.md)
|
|
211
191
|
|
|
212
192
|
> **위치 계약** — `paragraph_index`는 본문 직속 문단의 0-based 인덱스입니다. 표 안 문단은 여기 섞지 않고
|
|
213
193
|
> `{"kind":"table_cell_paragraph","table_index":0,"row":0,"col":1,"cell_paragraph_index":0}` 같은 `location`
|
|
@@ -228,23 +208,10 @@ macOS `/`)에서 띄우므로 이런 degenerate cwd는 거부되고 모든 문
|
|
|
228
208
|
| `HWPX_AUTOMATION_WORKFLOW_STORE` | durable workflow SQLite 경로. 기존 `HWPX_WORKFLOW_STORE`보다 우선 | 기존 6.x 상태 경로 |
|
|
229
209
|
| `LOG_LEVEL` | 로그 레벨 | `INFO` |
|
|
230
210
|
|
|
231
|
-
동일 suffix의 기존 `HWPX_MCP_*` 키는 6.x 동안 fallback으로
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
제품-neutral integration/capability 키는 옛 MCP 제품명을 담지 않으므로 이름을
|
|
237
|
-
바꾸지 않습니다.
|
|
238
|
-
|
|
239
|
-
| 분류 | 보존하는 정확한 키 |
|
|
240
|
-
|---|---|
|
|
241
|
-
| render integration | `HWPX_RENDER_QUEUE_ROOT`, `HWPX_RENDER_QUEUE_URL`, `HWPX_RENDER_QUEUE_SECRET`, `HWPX_RENDER_TRANSPORT_AUTH`, `HWPX_RENDER_CA_FILE`, `HWPX_RENDER_CLIENT_CERT_FILE`, `HWPX_RENDER_CLIENT_KEY_FILE` |
|
|
242
|
-
| workflow security | `HWPX_WORKFLOW_ENCRYPTION_KEY` |
|
|
243
|
-
| oracle capability | `HWPX_ORACLE_STRUCTURAL_ONLY`, `HWPX_ORACLE_BUDGET_SECONDS` |
|
|
244
|
-
| plugin integration | `HWPX_SKILL_VERSION`, `HWPX_PLUGIN_ROOT` |
|
|
245
|
-
|
|
246
|
-
이 키들은 `integration-preserved` 또는 `capability-preserved` 정본이며
|
|
247
|
-
`HWPX_AUTOMATION_*` alias를 새로 만들지 않습니다.
|
|
211
|
+
동일 suffix의 기존 `HWPX_MCP_*` 키는 6.x 동안 fallback으로 유지되며, 두 키가
|
|
212
|
+
함께 있으면 `HWPX_AUTOMATION_*`이 우선합니다. render·workflow·oracle·plugin
|
|
213
|
+
연동용 보존 키 전체 목록과 workflow DB 경로 규칙은
|
|
214
|
+
[6.x 호환 표면](docs/compatibility-6x.md)에 있습니다.
|
|
248
215
|
|
|
249
216
|
경로는 기본적으로 workspace 밖 traversal과 symlink escape를 거부하고, URL 입력은 HTTPS·공개 IP만
|
|
250
217
|
허용합니다. 원자 rename을 제공하지 않는 호스트의 동시성 주의사항은 [하드닝 가이드](docs/hardening_guide_ko.md)를 보세요.
|
|
@@ -262,8 +229,6 @@ python -m pip install -e ".[test]" # 테스트 의존성
|
|
|
262
229
|
python -m pytest -q # 전체 테스트
|
|
263
230
|
python scripts/run_conformance.py run \
|
|
264
231
|
--tier structural --check tests/conformance/golden/structural.json
|
|
265
|
-
# 공개 합성 코퍼스를 다시 만들 때만:
|
|
266
|
-
python scripts/conformance_corpus_build.py
|
|
267
232
|
```
|
|
268
233
|
|
|
269
234
|
## 감사의 말
|
|
@@ -13,41 +13,30 @@
|
|
|
13
13
|
</p>
|
|
14
14
|
|
|
15
15
|
<!-- release-state: release-approved -->
|
|
16
|
-
> [!
|
|
17
|
-
>
|
|
18
|
-
>
|
|
19
|
-
> `python-hwpx 5.
|
|
20
|
-
>
|
|
21
|
-
>
|
|
22
|
-
>
|
|
23
|
-
>
|
|
24
|
-
>
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
기본 설치는 MCP SDK 없이 Python API와 `hwpx` CLI를 사용할 수 있습니다.
|
|
35
|
-
[모델 컨텍스트 프로토콜(MCP)](https://modelcontextprotocol.io)은 `[mcp]` extra로
|
|
36
|
-
추가하는 선택 어댑터입니다.
|
|
37
|
-
|
|
38
|
-
한컴오피스도 Windows도 필요하지 않으므로 **ChatGPT 채팅 환경에서도 HWPX
|
|
39
|
-
문서를 다룰 수 있습니다.** 파이썬이 도는 곳이면 저작·양식 채움 워크플로가
|
|
40
|
-
그대로 동작합니다.
|
|
41
|
-
|
|
42
|
-
| 계층 | 저장소 | 정본 책임 |
|
|
16
|
+
> [!NOTE]
|
|
17
|
+
> 이 저장소의 main은 아직 공개되지 않은 6.2.1 후보 — release-approved 상태의 후보(수식 저작 `add_equation`,
|
|
18
|
+
> 계약 `342cf672f29cd183`, 129 도구)입니다. 현재 공개 트레인은
|
|
19
|
+
> `python-hwpx 5.1.1 → python-hwpx-automation 6.1.3 → hwpx-plugin 1.1.0`
|
|
20
|
+
> (계약 `ac1a422376b5ac84`, 2026-07-31 released)입니다. 공개 트레인은
|
|
21
|
+
> core·automation PyPI와 plugin GitHub
|
|
22
|
+
> Release·marketplace·실제 marketplace 설치까지 확인한 뒤 승격했으며, 기존
|
|
23
|
+
> 5.x 설치는 별도 발행된 `hwpx-mcp-server 5.1.1`이 보호합니다. 절차와 상태
|
|
24
|
+
> 머신: [릴리스 runbook](docs/release-runbook.md)
|
|
25
|
+
|
|
26
|
+
[python-hwpx](https://github.com/airmang/python-hwpx) 엔진 위에서 문서 저작·
|
|
27
|
+
양식 채움·시험지 조판·안전한 에이전트 워크플로를 제공하는 응용 계층입니다.
|
|
28
|
+
기본 설치는 MCP 없이 Python API와 `hwpx` CLI로 쓰고,
|
|
29
|
+
[모델 컨텍스트 프로토콜(MCP)](https://modelcontextprotocol.io) 서버는 필요할 때
|
|
30
|
+
`[mcp]` extra로 더합니다. 한컴오피스도 Windows도 필요 없으므로 **파이썬이 도는
|
|
31
|
+
ChatGPT 채팅 안에서도** 그대로 동작합니다.
|
|
32
|
+
|
|
33
|
+
| | 저장소 | 역할 |
|
|
43
34
|
|---|---|---|
|
|
44
|
-
|
|
|
45
|
-
|
|
|
46
|
-
|
|
|
35
|
+
| 📦 | [`python-hwpx`](https://github.com/airmang/python-hwpx) | HWPX 문서를 읽고·고치고·만드는 순수 파이썬 엔진 |
|
|
36
|
+
| 🔌 | [`python-hwpx-automation`](https://github.com/airmang/python-hwpx-automation) | 저작·양식 채움 워크플로, `hwpx` CLI, 선택형 MCP 서버 |
|
|
37
|
+
| 🎯 | [`hwpx-plugins`](https://github.com/airmang/hwpx-plugins) | 에이전트가 알맞은 도구를 고르도록 돕는 플러그인/스킬 번들 |
|
|
47
38
|
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
## Python 자동화 시작하기 (6.0 후보)
|
|
39
|
+
## Python 자동화 시작하기
|
|
51
40
|
|
|
52
41
|
```bash
|
|
53
42
|
pip install python-hwpx-automation
|
|
@@ -68,17 +57,13 @@ document.save_to_path("meeting-result.hwpx")
|
|
|
68
57
|
|
|
69
58
|
`python -m hwpx_automation --help`와 `hwpx help`는 같은 task CLI를 실행합니다.
|
|
70
59
|
|
|
71
|
-
## MCP 어댑터 시작하기
|
|
60
|
+
## MCP 어댑터 시작하기
|
|
72
61
|
|
|
73
62
|
```bash
|
|
74
63
|
pip install "python-hwpx-automation[mcp]"
|
|
75
64
|
hwpx-automation-mcp
|
|
76
65
|
```
|
|
77
66
|
|
|
78
|
-
6.x 호환 기간에는 `pip install hwpx-mcp-server`와 `hwpx-mcp-server`도
|
|
79
|
-
동작합니다. 옛 distribution/import/console 제거는 7.0 이전에는 하지 않으며,
|
|
80
|
-
최소 90일 공개 관찰과 별도 오너 승인이 필요합니다.
|
|
81
|
-
|
|
82
67
|
MCP 클라이언트 설정 파일에 아래 블록 하나면 `hwpx` 서버를 잡습니다 — Claude Desktop은
|
|
83
68
|
`claude_desktop_config.json`, VS Code는 `.vscode/mcp.json`(키가 `mcpServers` 대신 `servers`),
|
|
84
69
|
Gemini CLI는 `~/.gemini/settings.json`, Cursor·Windsurf는 각 에디터의 MCP 설정 파일입니다.
|
|
@@ -90,7 +75,7 @@ Gemini CLI는 `~/.gemini/settings.json`, Cursor·Windsurf는 각 에디터의 MC
|
|
|
90
75
|
"command": "uvx",
|
|
91
76
|
"args": [
|
|
92
77
|
"--from",
|
|
93
|
-
"python-hwpx-automation[mcp]==6.
|
|
78
|
+
"python-hwpx-automation[mcp]==6.1.3",
|
|
94
79
|
"hwpx-automation-mcp"
|
|
95
80
|
],
|
|
96
81
|
"env": {
|
|
@@ -101,16 +86,18 @@ Gemini CLI는 `~/.gemini/settings.json`, Cursor·Windsurf는 각 에디터의 MC
|
|
|
101
86
|
}
|
|
102
87
|
```
|
|
103
88
|
|
|
104
|
-
`HWPX_AUTOMATION_WORKSPACE_ROOTS`에는 문서가 있는 폴더(절대경로 또는 `~`)를
|
|
105
|
-
`"[\"C:\\\\hwpx\"]"`처럼 씁니다. 값을 비워 두면
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
89
|
+
`HWPX_AUTOMATION_WORKSPACE_ROOTS`에는 문서가 있는 폴더(절대경로 또는 `~`)를
|
|
90
|
+
지정하세요. Windows는 `"[\"C:\\\\hwpx\"]"`처럼 씁니다. 값을 비워 두면 GUI
|
|
91
|
+
클라이언트는 서버를 시스템 디렉터리에서 띄우기 때문에 모든 문서 경로가
|
|
92
|
+
막힙니다 — 처음부터 지정하는 것을 권장합니다. 나머지 옵션은
|
|
93
|
+
[환경 변수](#환경-변수) 표를 참고하세요.
|
|
109
94
|
|
|
110
95
|
> 비-HWPX 문서(PDF/DOCX/XLSX/HTML/TXT)를 `document_to_markdown`으로 읽으려면
|
|
111
|
-
> `pip install "python-hwpx-automation[ingest]"
|
|
112
|
-
>
|
|
113
|
-
|
|
96
|
+
> `pip install "python-hwpx-automation[ingest]"`로 MarkItDown adapter를 함께
|
|
97
|
+
> 설치합니다. 요구 사항: `Python >= 3.10` · `python-hwpx >= 5.0.0`.
|
|
98
|
+
|
|
99
|
+
기존 `hwpx-mcp-server` 배포·import·콘솔·설정 키도 6.x 동안 그대로 동작합니다 —
|
|
100
|
+
전체 목록과 유지 규칙: [6.x 호환 표면](docs/compatibility-6x.md)
|
|
114
101
|
|
|
115
102
|
## 무엇을 하나
|
|
116
103
|
|
|
@@ -125,34 +112,22 @@ macOS `/`)에서 띄우므로 이런 degenerate cwd는 거부되고 모든 문
|
|
|
125
112
|
|
|
126
113
|
자세한 내용: [사용 사례](docs/use-cases.md) · [스킬 우선 워크플로](docs/skill-first-workflows.md)
|
|
127
114
|
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
처음부터 모든 도구를 외울 필요는 없습니다. 보통 아래 하나로 시작합니다.
|
|
115
|
+
## 안전하게 쓰는 법
|
|
131
116
|
|
|
132
|
-
|
|
133
|
-
2. **안전 수정** — `copy_document`로 사본 생성 → 읽기 도구로 대상 확인 → `search_and_replace`, `set_table_cell_text` 같은 전문 도구나 `apply_document_commands`로 가장 작은 변경 → 다시 읽어 확인 → 검토가 끝난 복사본을 handoff.
|
|
117
|
+
처음부터 모든 도구를 외울 필요는 없습니다. 보통 이렇게 흘러갑니다.
|
|
134
118
|
|
|
135
|
-
|
|
119
|
+
1. **읽기** — `get_document_info` → `get_document_outline`/`get_document_text` → `find_text`, `get_table_map`으로 필요한 부분만 파악합니다. (저장하지 않음)
|
|
120
|
+
2. **안전 수정** — `copy_document`로 사본을 만들고, 가장 작은 변경(`search_and_replace`, `set_table_cell_text`, `apply_document_commands`)을 적용한 뒤 다시 읽어 확인하고, 검토가 끝난 사본을 전달합니다.
|
|
136
121
|
|
|
137
|
-
|
|
122
|
+
핵심은 **copy first · smallest edit · re-read after edits**입니다. 수정 도구는
|
|
123
|
+
호출 즉시 저장되므로 검토용 작업은 반드시 사본에서 하세요.
|
|
138
124
|
|
|
139
|
-
|
|
140
|
-
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
단일 `SavePipeline` 게이트를 통과해 무결성·XML·OPC/ID·열림안전을 검사하고, `quality`에 따라
|
|
146
|
-
`visualComplete` 블록(`ok`·`status`·`errorCodes`)을 응답에 실으며, 게이트가 실패하면 아무것도 쓰지 않고
|
|
147
|
-
소유 후보만 원복합니다. capability handshake가 core/automation/plugin
|
|
148
|
-
버전+해시 skew를 fail-closed로 차단합니다. 6.x 응답의 `versions.mcp`와
|
|
149
|
-
`minMcpVersion`은 기존 소비자를 위한 alias로만 유지됩니다.
|
|
150
|
-
같은 이유로 `MIN_MCP_VERSION`, 공개 오류 schema `hwpx.mcp-error/v1`,
|
|
151
|
-
동결된 architecture receipt ID `hwpx-mcp.*`, parity receipt 필드
|
|
152
|
-
`mcpRuntimeMembers`도 6.x에서 정확히 보존합니다. canonical 표기는
|
|
153
|
-
`versions.automation`·`minAutomationVersion`·`MIN_AUTOMATION_VERSION`이며,
|
|
154
|
-
보존된 MCP 철자는 제품 소유권이 아니라 wire/receipt 호환 식별자입니다.
|
|
155
|
-
보안 상세는 [하드닝 가이드](docs/hardening_guide_ko.md)에 있습니다.
|
|
125
|
+
모델은 operation/plan만 보내고 raw XML을 직접 편집하지 않습니다. 일반 저장
|
|
126
|
+
경로는 python-hwpx의 단일 `SavePipeline` 게이트를 통과해 무결성·XML·OPC/ID·
|
|
127
|
+
열림안전을 검사하고, 게이트가 실패하면 아무것도 쓰지 않습니다. capability
|
|
128
|
+
handshake는 core/automation/plugin 버전+해시 skew를 fail-closed로 차단합니다.
|
|
129
|
+
보안 상세: [하드닝 가이드](docs/hardening_guide_ko.md) · 옛 이름과의 호환
|
|
130
|
+
식별자: [6.x 호환 표면](docs/compatibility-6x.md)
|
|
156
131
|
|
|
157
132
|
> **위치 계약** — `paragraph_index`는 본문 직속 문단의 0-based 인덱스입니다. 표 안 문단은 여기 섞지 않고
|
|
158
133
|
> `{"kind":"table_cell_paragraph","table_index":0,"row":0,"col":1,"cell_paragraph_index":0}` 같은 `location`
|
|
@@ -173,23 +148,10 @@ macOS `/`)에서 띄우므로 이런 degenerate cwd는 거부되고 모든 문
|
|
|
173
148
|
| `HWPX_AUTOMATION_WORKFLOW_STORE` | durable workflow SQLite 경로. 기존 `HWPX_WORKFLOW_STORE`보다 우선 | 기존 6.x 상태 경로 |
|
|
174
149
|
| `LOG_LEVEL` | 로그 레벨 | `INFO` |
|
|
175
150
|
|
|
176
|
-
동일 suffix의 기존 `HWPX_MCP_*` 키는 6.x 동안 fallback으로
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
제품-neutral integration/capability 키는 옛 MCP 제품명을 담지 않으므로 이름을
|
|
182
|
-
바꾸지 않습니다.
|
|
183
|
-
|
|
184
|
-
| 분류 | 보존하는 정확한 키 |
|
|
185
|
-
|---|---|
|
|
186
|
-
| render integration | `HWPX_RENDER_QUEUE_ROOT`, `HWPX_RENDER_QUEUE_URL`, `HWPX_RENDER_QUEUE_SECRET`, `HWPX_RENDER_TRANSPORT_AUTH`, `HWPX_RENDER_CA_FILE`, `HWPX_RENDER_CLIENT_CERT_FILE`, `HWPX_RENDER_CLIENT_KEY_FILE` |
|
|
187
|
-
| workflow security | `HWPX_WORKFLOW_ENCRYPTION_KEY` |
|
|
188
|
-
| oracle capability | `HWPX_ORACLE_STRUCTURAL_ONLY`, `HWPX_ORACLE_BUDGET_SECONDS` |
|
|
189
|
-
| plugin integration | `HWPX_SKILL_VERSION`, `HWPX_PLUGIN_ROOT` |
|
|
190
|
-
|
|
191
|
-
이 키들은 `integration-preserved` 또는 `capability-preserved` 정본이며
|
|
192
|
-
`HWPX_AUTOMATION_*` alias를 새로 만들지 않습니다.
|
|
151
|
+
동일 suffix의 기존 `HWPX_MCP_*` 키는 6.x 동안 fallback으로 유지되며, 두 키가
|
|
152
|
+
함께 있으면 `HWPX_AUTOMATION_*`이 우선합니다. render·workflow·oracle·plugin
|
|
153
|
+
연동용 보존 키 전체 목록과 workflow DB 경로 규칙은
|
|
154
|
+
[6.x 호환 표면](docs/compatibility-6x.md)에 있습니다.
|
|
193
155
|
|
|
194
156
|
경로는 기본적으로 workspace 밖 traversal과 symlink escape를 거부하고, URL 입력은 HTTPS·공개 IP만
|
|
195
157
|
허용합니다. 원자 rename을 제공하지 않는 호스트의 동시성 주의사항은 [하드닝 가이드](docs/hardening_guide_ko.md)를 보세요.
|
|
@@ -207,8 +169,6 @@ python -m pip install -e ".[test]" # 테스트 의존성
|
|
|
207
169
|
python -m pytest -q # 전체 테스트
|
|
208
170
|
python scripts/run_conformance.py run \
|
|
209
171
|
--tier structural --check tests/conformance/golden/structural.json
|
|
210
|
-
# 공개 합성 코퍼스를 다시 만들 때만:
|
|
211
|
-
python scripts/conformance_corpus_build.py
|
|
212
172
|
```
|
|
213
173
|
|
|
214
174
|
## 감사의 말
|
|
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "python-hwpx-automation"
|
|
7
|
-
version = "6.
|
|
7
|
+
version = "6.2.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" }]
|
|
@@ -13,10 +13,15 @@ license-files = ["LICENSE", "NOTICE"]
|
|
|
13
13
|
requires-python = ">=3.10"
|
|
14
14
|
keywords = ["hwpx", "hancom", "document-automation", "workflow", "mcp", "ai-agent"]
|
|
15
15
|
classifiers = [
|
|
16
|
+
"Intended Audience :: Developers",
|
|
16
17
|
"Programming Language :: Python :: 3",
|
|
17
18
|
"Programming Language :: Python :: 3.10",
|
|
18
19
|
"Programming Language :: Python :: 3.11",
|
|
19
20
|
"Programming Language :: Python :: 3.12",
|
|
21
|
+
"Programming Language :: Python :: 3.13",
|
|
22
|
+
"Programming Language :: Python :: 3.14",
|
|
23
|
+
"Topic :: Software Development :: Libraries",
|
|
24
|
+
"Typing :: Typed",
|
|
20
25
|
]
|
|
21
26
|
dependencies = [
|
|
22
27
|
# 5.0 is the floor, not a preference: this package declares the `hwpx` console
|
|
@@ -24,7 +29,7 @@ dependencies = [
|
|
|
24
29
|
# the bounded major here is what makes "no valid install has two declarers"
|
|
25
30
|
# true rather than hopeful, and prevents the next core major from silently
|
|
26
31
|
# breaking an already-published automation line.
|
|
27
|
-
"python-hwpx>=5.
|
|
32
|
+
"python-hwpx>=5.2.0,<6", # HWPX object model, OXML/OPC, format-native primitives
|
|
28
33
|
|
|
29
34
|
"pydantic>=2.11,<3",
|
|
30
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,41 @@ def add_page_break(
|
|
|
679
680
|
return _with_save_verification({"success": True}, verification)
|
|
680
681
|
|
|
681
682
|
|
|
683
|
+
def add_equation(
|
|
684
|
+
filename: str,
|
|
685
|
+
latex: str = None,
|
|
686
|
+
script: str = None,
|
|
687
|
+
paragraph_index: int = None,
|
|
688
|
+
table_index: int = None,
|
|
689
|
+
row: int = None,
|
|
690
|
+
col: int = None,
|
|
691
|
+
base_unit: int = 1100,
|
|
692
|
+
dry_run: bool = False,
|
|
693
|
+
expected_revision: str = None,
|
|
694
|
+
) -> dict:
|
|
695
|
+
"""네이티브 수식(<hp:equation>)을 삽입합니다. latex(권장) 또는 EqEdit script 중
|
|
696
|
+
하나만 지정 — LaTeX는 렌더 검증된 토큰셋만 EqEdit로 변환하고, 밖이면
|
|
697
|
+
EQUATION_LATEX_UNSUPPORTED로 거부합니다(무음 근사 없음). 산출 수식은 실한컴이
|
|
698
|
+
조판하고 기존 리더(eqedit_to_latex)가 되읽습니다(응답 readerLatex).
|
|
699
|
+
배치: 기본=문서 끝 새 문단, paragraph_index=기존 문단, tableIndex+row+col=표 셀."""
|
|
700
|
+
path = resolve_path(filename)
|
|
701
|
+
guard = _revision_guard(path, expected_revision)
|
|
702
|
+
if guard is not None:
|
|
703
|
+
return guard
|
|
704
|
+
result = RUNTIME_SERVICES.ops.add_equation(
|
|
705
|
+
path,
|
|
706
|
+
latex=latex,
|
|
707
|
+
script=script,
|
|
708
|
+
paragraph_index=paragraph_index,
|
|
709
|
+
table_index=table_index,
|
|
710
|
+
row=row,
|
|
711
|
+
col=col,
|
|
712
|
+
base_unit=base_unit,
|
|
713
|
+
dry_run=dry_run,
|
|
714
|
+
)
|
|
715
|
+
return _with_document_state(result, path)
|
|
716
|
+
|
|
717
|
+
|
|
682
718
|
def insert_picture(
|
|
683
719
|
filename: str,
|
|
684
720
|
image_base64: str,
|
|
@@ -1060,6 +1096,7 @@ __all__ = [
|
|
|
1060
1096
|
"insert_paragraph",
|
|
1061
1097
|
"delete_paragraph",
|
|
1062
1098
|
"add_page_break",
|
|
1099
|
+
"add_equation",
|
|
1063
1100
|
"apply_edits",
|
|
1064
1101
|
"undo_last_edit",
|
|
1065
1102
|
"replace_by_anchor",
|
|
@@ -381,6 +381,39 @@ def list_form_fields(filename: str) -> dict:
|
|
|
381
381
|
return _with_document_state(RUNTIME_SERVICES.ops.list_form_fields(path), path)
|
|
382
382
|
|
|
383
383
|
|
|
384
|
+
def add_form_field(
|
|
385
|
+
filename: str,
|
|
386
|
+
name: str,
|
|
387
|
+
prompt: str = "",
|
|
388
|
+
memo: str = "",
|
|
389
|
+
paragraph_index: int = None,
|
|
390
|
+
table_index: int = None,
|
|
391
|
+
row: int = None,
|
|
392
|
+
col: int = None,
|
|
393
|
+
dry_run: bool = False,
|
|
394
|
+
expected_revision: str = None,
|
|
395
|
+
) -> dict:
|
|
396
|
+
"""누름틀(click-here) 필드를 생성합니다. 실한컴 CLICKHERE 형상 그대로 방출되어
|
|
397
|
+
기존 list/fill/한컴이 특수분기 없이 소비합니다. prompt(안내문)는 화면 전용(미인쇄).
|
|
398
|
+
배치: 기본=문서 끝 새 문단, paragraph_index=기존 문단, tableIndex+row+col=표 셀."""
|
|
399
|
+
path = resolve_path(filename)
|
|
400
|
+
guard = _revision_guard(path, expected_revision)
|
|
401
|
+
if guard is not None:
|
|
402
|
+
return guard
|
|
403
|
+
result = RUNTIME_SERVICES.ops.add_form_field(
|
|
404
|
+
path,
|
|
405
|
+
name=name,
|
|
406
|
+
prompt=prompt,
|
|
407
|
+
memo=memo,
|
|
408
|
+
paragraph_index=paragraph_index,
|
|
409
|
+
table_index=table_index,
|
|
410
|
+
row=row,
|
|
411
|
+
col=col,
|
|
412
|
+
dry_run=dry_run,
|
|
413
|
+
)
|
|
414
|
+
return _with_document_state(result, path)
|
|
415
|
+
|
|
416
|
+
|
|
384
417
|
def fill_form_field(
|
|
385
418
|
filename: str,
|
|
386
419
|
value: str,
|
|
@@ -589,6 +622,7 @@ apply_form_fill.__hwpx_input_schema_extra__ = { # type: ignore[attr-defined]
|
|
|
589
622
|
|
|
590
623
|
|
|
591
624
|
__all__ = [
|
|
625
|
+
"add_form_field",
|
|
592
626
|
"analyze_form_fill",
|
|
593
627
|
"analyze_template_formfit",
|
|
594
628
|
"apply_body_ops",
|