python-hwpx-automation 6.0.3__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.3/LICENSE +178 -0
- python_hwpx_automation-6.0.3/MANIFEST.in +2 -0
- python_hwpx_automation-6.0.3/NOTICE +14 -0
- python_hwpx_automation-6.0.3/PKG-INFO +279 -0
- python_hwpx_automation-6.0.3/README.md +224 -0
- python_hwpx_automation-6.0.3/pyproject.toml +202 -0
- python_hwpx_automation-6.0.3/setup.cfg +4 -0
- python_hwpx_automation-6.0.3/src/hwpx_automation/__init__.py +61 -0
- python_hwpx_automation-6.0.3/src/hwpx_automation/__init__.pyi +27 -0
- python_hwpx_automation-6.0.3/src/hwpx_automation/__main__.py +8 -0
- python_hwpx_automation-6.0.3/src/hwpx_automation/agent_document.py +392 -0
- python_hwpx_automation-6.0.3/src/hwpx_automation/api.py +136 -0
- python_hwpx_automation-6.0.3/src/hwpx_automation/blind_eval.py +407 -0
- python_hwpx_automation-6.0.3/src/hwpx_automation/capabilities.py +110 -0
- python_hwpx_automation-6.0.3/src/hwpx_automation/compat.py +48 -0
- python_hwpx_automation-6.0.3/src/hwpx_automation/configuration.py +60 -0
- python_hwpx_automation-6.0.3/src/hwpx_automation/core/__init__.py +2 -0
- python_hwpx_automation-6.0.3/src/hwpx_automation/core/content.py +762 -0
- python_hwpx_automation-6.0.3/src/hwpx_automation/core/context.py +111 -0
- python_hwpx_automation-6.0.3/src/hwpx_automation/core/diff.py +53 -0
- python_hwpx_automation-6.0.3/src/hwpx_automation/core/document.py +37 -0
- python_hwpx_automation-6.0.3/src/hwpx_automation/core/formatting.py +513 -0
- python_hwpx_automation-6.0.3/src/hwpx_automation/core/handles.py +24 -0
- python_hwpx_automation-6.0.3/src/hwpx_automation/core/locations.py +205 -0
- python_hwpx_automation-6.0.3/src/hwpx_automation/core/locator.py +162 -0
- python_hwpx_automation-6.0.3/src/hwpx_automation/core/plan.py +680 -0
- python_hwpx_automation-6.0.3/src/hwpx_automation/core/resources.py +42 -0
- python_hwpx_automation-6.0.3/src/hwpx_automation/core/search.py +296 -0
- python_hwpx_automation-6.0.3/src/hwpx_automation/core/transactions.py +434 -0
- python_hwpx_automation-6.0.3/src/hwpx_automation/core/txn.py +48 -0
- python_hwpx_automation-6.0.3/src/hwpx_automation/document_state.py +95 -0
- python_hwpx_automation-6.0.3/src/hwpx_automation/errors.py +174 -0
- python_hwpx_automation-6.0.3/src/hwpx_automation/execution_lock.py +15 -0
- python_hwpx_automation-6.0.3/src/hwpx_automation/fastmcp_adapter.py +672 -0
- python_hwpx_automation-6.0.3/src/hwpx_automation/form_fill.py +1177 -0
- python_hwpx_automation-6.0.3/src/hwpx_automation/form_output_models.py +223 -0
- python_hwpx_automation-6.0.3/src/hwpx_automation/handlers/__init__.py +2 -0
- python_hwpx_automation-6.0.3/src/hwpx_automation/handlers/_shared.py +377 -0
- python_hwpx_automation-6.0.3/src/hwpx_automation/handlers/agent_document.py +257 -0
- python_hwpx_automation-6.0.3/src/hwpx_automation/handlers/authoring.py +750 -0
- python_hwpx_automation-6.0.3/src/hwpx_automation/handlers/content_edit.py +1078 -0
- python_hwpx_automation-6.0.3/src/hwpx_automation/handlers/form_fill.py +607 -0
- python_hwpx_automation-6.0.3/src/hwpx_automation/handlers/layout_style.py +660 -0
- python_hwpx_automation-6.0.3/src/hwpx_automation/handlers/quality_render.py +566 -0
- python_hwpx_automation-6.0.3/src/hwpx_automation/handlers/read_export.py +1295 -0
- python_hwpx_automation-6.0.3/src/hwpx_automation/handlers/specialized.py +624 -0
- python_hwpx_automation-6.0.3/src/hwpx_automation/handlers/tracked_changes.py +589 -0
- python_hwpx_automation-6.0.3/src/hwpx_automation/handlers/workflow.py +105 -0
- python_hwpx_automation-6.0.3/src/hwpx_automation/hwp_converter.py +227 -0
- python_hwpx_automation-6.0.3/src/hwpx_automation/hwp_support.py +94 -0
- python_hwpx_automation-6.0.3/src/hwpx_automation/hwpx_ops.py +1439 -0
- python_hwpx_automation-6.0.3/src/hwpx_automation/identity.json +263 -0
- python_hwpx_automation-6.0.3/src/hwpx_automation/identity.py +18 -0
- python_hwpx_automation-6.0.3/src/hwpx_automation/ingest_adapters.py +85 -0
- python_hwpx_automation-6.0.3/src/hwpx_automation/markdown_plan.py +216 -0
- python_hwpx_automation-6.0.3/src/hwpx_automation/mcp_cli.py +29 -0
- python_hwpx_automation-6.0.3/src/hwpx_automation/metadata/tools_meta.py +40 -0
- python_hwpx_automation-6.0.3/src/hwpx_automation/mixed_form.py +3007 -0
- python_hwpx_automation-6.0.3/src/hwpx_automation/mutation_models.py +401 -0
- python_hwpx_automation-6.0.3/src/hwpx_automation/network_policy.py +232 -0
- python_hwpx_automation-6.0.3/src/hwpx_automation/office/__init__.py +14 -0
- python_hwpx_automation-6.0.3/src/hwpx_automation/office/agent/__init__.py +125 -0
- python_hwpx_automation-6.0.3/src/hwpx_automation/office/agent/_batch_verification.py +383 -0
- python_hwpx_automation-6.0.3/src/hwpx_automation/office/agent/blueprint/__init__.py +58 -0
- python_hwpx_automation-6.0.3/src/hwpx_automation/office/agent/blueprint/bundle.py +282 -0
- python_hwpx_automation-6.0.3/src/hwpx_automation/office/agent/blueprint/catalog.py +136 -0
- python_hwpx_automation-6.0.3/src/hwpx_automation/office/agent/blueprint/dump.py +520 -0
- python_hwpx_automation-6.0.3/src/hwpx_automation/office/agent/blueprint/mapping.py +312 -0
- python_hwpx_automation-6.0.3/src/hwpx_automation/office/agent/blueprint/model.py +722 -0
- python_hwpx_automation-6.0.3/src/hwpx_automation/office/agent/blueprint/native.py +621 -0
- python_hwpx_automation-6.0.3/src/hwpx_automation/office/agent/blueprint/replay.py +622 -0
- python_hwpx_automation-6.0.3/src/hwpx_automation/office/agent/catalog.py +252 -0
- python_hwpx_automation-6.0.3/src/hwpx_automation/office/agent/cli.py +647 -0
- python_hwpx_automation-6.0.3/src/hwpx_automation/office/agent/commands.py +1383 -0
- python_hwpx_automation-6.0.3/src/hwpx_automation/office/agent/document.py +801 -0
- python_hwpx_automation-6.0.3/src/hwpx_automation/office/agent/form_plan.py +1760 -0
- python_hwpx_automation-6.0.3/src/hwpx_automation/office/agent/model.py +808 -0
- python_hwpx_automation-6.0.3/src/hwpx_automation/office/agent/path.py +155 -0
- python_hwpx_automation-6.0.3/src/hwpx_automation/office/agent/query.py +230 -0
- python_hwpx_automation-6.0.3/src/hwpx_automation/office/agent/story.py +207 -0
- python_hwpx_automation-6.0.3/src/hwpx_automation/office/authoring/__init__.py +3542 -0
- python_hwpx_automation-6.0.3/src/hwpx_automation/office/authoring/advanced_generators.py +154 -0
- python_hwpx_automation-6.0.3/src/hwpx_automation/office/authoring/builder/__init__.py +52 -0
- python_hwpx_automation-6.0.3/src/hwpx_automation/office/authoring/builder/core.py +996 -0
- python_hwpx_automation-6.0.3/src/hwpx_automation/office/authoring/builder/report.py +195 -0
- python_hwpx_automation-6.0.3/src/hwpx_automation/office/authoring/design/__init__.py +30 -0
- python_hwpx_automation-6.0.3/src/hwpx_automation/office/authoring/design/_support.py +144 -0
- python_hwpx_automation-6.0.3/src/hwpx_automation/office/authoring/design/composer.py +282 -0
- python_hwpx_automation-6.0.3/src/hwpx_automation/office/authoring/design/harvest.py +305 -0
- python_hwpx_automation-6.0.3/src/hwpx_automation/office/authoring/design/plan.py +69 -0
- python_hwpx_automation-6.0.3/src/hwpx_automation/office/authoring/design/profile.py +88 -0
- python_hwpx_automation-6.0.3/src/hwpx_automation/office/authoring/design/profiles/application_form/fragments/body.xml +1 -0
- python_hwpx_automation-6.0.3/src/hwpx_automation/office/authoring/design/profiles/application_form/fragments/heading.xml +1 -0
- python_hwpx_automation-6.0.3/src/hwpx_automation/office/authoring/design/profiles/application_form/fragments/info_table.xml +1 -0
- python_hwpx_automation-6.0.3/src/hwpx_automation/office/authoring/design/profiles/application_form/fragments/title.xml +1 -0
- python_hwpx_automation-6.0.3/src/hwpx_automation/office/authoring/design/profiles/application_form/profile.json +25 -0
- python_hwpx_automation-6.0.3/src/hwpx_automation/office/authoring/design/profiles/application_form/template.hwpx +0 -0
- python_hwpx_automation-6.0.3/src/hwpx_automation/office/authoring/design/profiles/home_notice/fragments/body.xml +1 -0
- python_hwpx_automation-6.0.3/src/hwpx_automation/office/authoring/design/profiles/home_notice/fragments/heading.xml +1 -0
- python_hwpx_automation-6.0.3/src/hwpx_automation/office/authoring/design/profiles/home_notice/fragments/title.xml +1 -0
- python_hwpx_automation-6.0.3/src/hwpx_automation/office/authoring/design/profiles/home_notice/profile.json +24 -0
- python_hwpx_automation-6.0.3/src/hwpx_automation/office/authoring/design/profiles/home_notice/template.hwpx +0 -0
- python_hwpx_automation-6.0.3/src/hwpx_automation/office/authoring/design/profiles/official_notice/fragments/body.xml +1 -0
- python_hwpx_automation-6.0.3/src/hwpx_automation/office/authoring/design/profiles/official_notice/fragments/heading.xml +1 -0
- python_hwpx_automation-6.0.3/src/hwpx_automation/office/authoring/design/profiles/official_notice/fragments/info_table.xml +1 -0
- python_hwpx_automation-6.0.3/src/hwpx_automation/office/authoring/design/profiles/official_notice/fragments/title.xml +1 -0
- python_hwpx_automation-6.0.3/src/hwpx_automation/office/authoring/design/profiles/official_notice/profile.json +25 -0
- python_hwpx_automation-6.0.3/src/hwpx_automation/office/authoring/design/profiles/official_notice/template.hwpx +0 -0
- python_hwpx_automation-6.0.3/src/hwpx_automation/office/authoring/design/profiles/report/fragments/body.xml +1 -0
- python_hwpx_automation-6.0.3/src/hwpx_automation/office/authoring/design/profiles/report/fragments/heading.xml +1 -0
- python_hwpx_automation-6.0.3/src/hwpx_automation/office/authoring/design/profiles/report/fragments/info_table.xml +1 -0
- python_hwpx_automation-6.0.3/src/hwpx_automation/office/authoring/design/profiles/report/fragments/title.xml +1 -0
- python_hwpx_automation-6.0.3/src/hwpx_automation/office/authoring/design/profiles/report/profile.json +25 -0
- python_hwpx_automation-6.0.3/src/hwpx_automation/office/authoring/design/profiles/report/template.hwpx +0 -0
- python_hwpx_automation-6.0.3/src/hwpx_automation/office/authoring/design/validator.py +107 -0
- python_hwpx_automation-6.0.3/src/hwpx_automation/office/authoring/presets/__init__.py +22 -0
- python_hwpx_automation-6.0.3/src/hwpx_automation/office/authoring/presets/proposal.py +538 -0
- python_hwpx_automation-6.0.3/src/hwpx_automation/office/authoring/report_parser.py +141 -0
- python_hwpx_automation-6.0.3/src/hwpx_automation/office/authoring/style_profile.py +437 -0
- python_hwpx_automation-6.0.3/src/hwpx_automation/office/authoring/template_analyzer.py +657 -0
- python_hwpx_automation-6.0.3/src/hwpx_automation/office/compliance/__init__.py +38 -0
- python_hwpx_automation-6.0.3/src/hwpx_automation/office/compliance/official_lint.py +478 -0
- python_hwpx_automation-6.0.3/src/hwpx_automation/office/compliance/pii.py +388 -0
- python_hwpx_automation-6.0.3/src/hwpx_automation/office/document_ops/__init__.py +13 -0
- python_hwpx_automation-6.0.3/src/hwpx_automation/office/document_ops/comparison.py +62 -0
- python_hwpx_automation-6.0.3/src/hwpx_automation/office/document_ops/mail_merge.py +73 -0
- python_hwpx_automation-6.0.3/src/hwpx_automation/office/document_ops/redline.py +35 -0
- python_hwpx_automation-6.0.3/src/hwpx_automation/office/evalplan/__init__.py +36 -0
- python_hwpx_automation-6.0.3/src/hwpx_automation/office/evalplan/runtime.py +2762 -0
- python_hwpx_automation-6.0.3/src/hwpx_automation/office/exam/__init__.py +44 -0
- python_hwpx_automation-6.0.3/src/hwpx_automation/office/exam/compose.py +282 -0
- python_hwpx_automation-6.0.3/src/hwpx_automation/office/exam/ir.py +44 -0
- python_hwpx_automation-6.0.3/src/hwpx_automation/office/exam/measure.py +163 -0
- python_hwpx_automation-6.0.3/src/hwpx_automation/office/exam/parser.py +150 -0
- python_hwpx_automation-6.0.3/src/hwpx_automation/office/exam/profile.py +123 -0
- python_hwpx_automation-6.0.3/src/hwpx_automation/office/form_fill/__init__.py +66 -0
- python_hwpx_automation-6.0.3/src/hwpx_automation/office/form_fill/classification.py +108 -0
- python_hwpx_automation-6.0.3/src/hwpx_automation/office/form_fill/fill_residue.py +242 -0
- python_hwpx_automation-6.0.3/src/hwpx_automation/office/form_fill/fit/__init__.py +36 -0
- python_hwpx_automation-6.0.3/src/hwpx_automation/office/form_fill/fit/apply.py +24 -0
- python_hwpx_automation-6.0.3/src/hwpx_automation/office/form_fill/fit/engine.py +24 -0
- python_hwpx_automation-6.0.3/src/hwpx_automation/office/form_fill/fit/measure.py +50 -0
- python_hwpx_automation-6.0.3/src/hwpx_automation/office/form_fill/fit/policy.py +28 -0
- python_hwpx_automation-6.0.3/src/hwpx_automation/office/form_fill/fit/report.py +28 -0
- python_hwpx_automation-6.0.3/src/hwpx_automation/office/form_fill/fit/seal.py +457 -0
- python_hwpx_automation-6.0.3/src/hwpx_automation/office/form_fill/fit/wordbox.py +1343 -0
- python_hwpx_automation-6.0.3/src/hwpx_automation/office/form_fill/guidance.py +704 -0
- python_hwpx_automation-6.0.3/src/hwpx_automation/office/form_fill/quality.py +961 -0
- python_hwpx_automation-6.0.3/src/hwpx_automation/office/form_fill/split_run.py +333 -0
- python_hwpx_automation-6.0.3/src/hwpx_automation/office/form_fill/template_formfit.py +656 -0
- python_hwpx_automation-6.0.3/src/hwpx_automation/office/house_style/__init__.py +196 -0
- python_hwpx_automation-6.0.3/src/hwpx_automation/office/house_style/composition.py +68 -0
- python_hwpx_automation-6.0.3/src/hwpx_automation/office/house_style/data/bank.json +625 -0
- python_hwpx_automation-6.0.3/src/hwpx_automation/office/house_style/data/genres.json +43 -0
- python_hwpx_automation-6.0.3/src/hwpx_automation/office/quality/__init__.py +14 -0
- python_hwpx_automation-6.0.3/src/hwpx_automation/office/quality/page_guard.py +277 -0
- python_hwpx_automation-6.0.3/src/hwpx_automation/office/rendering/__init__.py +145 -0
- python_hwpx_automation-6.0.3/src/hwpx_automation/office/rendering/_hancom_open_rate.ps1 +374 -0
- python_hwpx_automation-6.0.3/src/hwpx_automation/office/rendering/_refresh_hwpx_mac.applescript +162 -0
- python_hwpx_automation-6.0.3/src/hwpx_automation/office/rendering/_render_hwpx.ps1 +72 -0
- python_hwpx_automation-6.0.3/src/hwpx_automation/office/rendering/_render_hwpx_mac.applescript +249 -0
- python_hwpx_automation-6.0.3/src/hwpx_automation/office/rendering/block_splits.py +76 -0
- python_hwpx_automation-6.0.3/src/hwpx_automation/office/rendering/detectors.py +151 -0
- python_hwpx_automation-6.0.3/src/hwpx_automation/office/rendering/diff.py +153 -0
- python_hwpx_automation-6.0.3/src/hwpx_automation/office/rendering/fixture_corpus.py +215 -0
- python_hwpx_automation-6.0.3/src/hwpx_automation/office/rendering/oracle.py +909 -0
- python_hwpx_automation-6.0.3/src/hwpx_automation/office/rendering/page_qa.py +245 -0
- python_hwpx_automation-6.0.3/src/hwpx_automation/office/rendering/qa_contracts.py +293 -0
- python_hwpx_automation-6.0.3/src/hwpx_automation/office/rendering/qa_metrics.py +241 -0
- python_hwpx_automation-6.0.3/src/hwpx_automation/office/rendering/worker.py +290 -0
- python_hwpx_automation-6.0.3/src/hwpx_automation/office/utilities/__init__.py +12 -0
- python_hwpx_automation-6.0.3/src/hwpx_automation/office/utilities/table_compute.py +477 -0
- python_hwpx_automation-6.0.3/src/hwpx_automation/ops_services/__init__.py +1 -0
- python_hwpx_automation-6.0.3/src/hwpx_automation/ops_services/_border_fill.py +283 -0
- python_hwpx_automation-6.0.3/src/hwpx_automation/ops_services/composition.py +55 -0
- python_hwpx_automation-6.0.3/src/hwpx_automation/ops_services/content_layout.py +322 -0
- python_hwpx_automation-6.0.3/src/hwpx_automation/ops_services/context.py +213 -0
- python_hwpx_automation-6.0.3/src/hwpx_automation/ops_services/form_fields.py +557 -0
- python_hwpx_automation-6.0.3/src/hwpx_automation/ops_services/media.py +178 -0
- python_hwpx_automation-6.0.3/src/hwpx_automation/ops_services/memo_style.py +477 -0
- python_hwpx_automation-6.0.3/src/hwpx_automation/ops_services/package_validation.py +166 -0
- python_hwpx_automation-6.0.3/src/hwpx_automation/ops_services/planning.py +201 -0
- python_hwpx_automation-6.0.3/src/hwpx_automation/ops_services/preview_export.py +585 -0
- python_hwpx_automation-6.0.3/src/hwpx_automation/ops_services/read_query.py +601 -0
- python_hwpx_automation-6.0.3/src/hwpx_automation/ops_services/save_policy.py +604 -0
- python_hwpx_automation-6.0.3/src/hwpx_automation/ops_services/tables.py +539 -0
- python_hwpx_automation-6.0.3/src/hwpx_automation/ops_services/transactions.py +616 -0
- python_hwpx_automation-6.0.3/src/hwpx_automation/preview_output_models.py +69 -0
- python_hwpx_automation-6.0.3/src/hwpx_automation/public-modules.json +206 -0
- python_hwpx_automation-6.0.3/src/hwpx_automation/py.typed +1 -0
- python_hwpx_automation-6.0.3/src/hwpx_automation/quality.py +351 -0
- python_hwpx_automation-6.0.3/src/hwpx_automation/quality_generation.py +725 -0
- python_hwpx_automation-6.0.3/src/hwpx_automation/runtime.py +321 -0
- python_hwpx_automation-6.0.3/src/hwpx_automation/runtime_services.py +100 -0
- python_hwpx_automation-6.0.3/src/hwpx_automation/server.py +259 -0
- python_hwpx_automation-6.0.3/src/hwpx_automation/storage.py +747 -0
- python_hwpx_automation-6.0.3/src/hwpx_automation/tool_bindings.py +170 -0
- python_hwpx_automation-6.0.3/src/hwpx_automation/tool_contract.py +982 -0
- python_hwpx_automation-6.0.3/src/hwpx_automation/upstream.py +755 -0
- python_hwpx_automation-6.0.3/src/hwpx_automation/utils/__init__.py +2 -0
- python_hwpx_automation-6.0.3/src/hwpx_automation/utils/helpers.py +29 -0
- python_hwpx_automation-6.0.3/src/hwpx_automation/visual_qa.py +667 -0
- python_hwpx_automation-6.0.3/src/hwpx_automation/workflow/__init__.py +55 -0
- python_hwpx_automation-6.0.3/src/hwpx_automation/workflow/adapters.py +482 -0
- python_hwpx_automation-6.0.3/src/hwpx_automation/workflow/dispatcher.py +213 -0
- python_hwpx_automation-6.0.3/src/hwpx_automation/workflow/models.py +243 -0
- python_hwpx_automation-6.0.3/src/hwpx_automation/workflow/policy.py +198 -0
- python_hwpx_automation-6.0.3/src/hwpx_automation/workflow/render_contracts.py +173 -0
- python_hwpx_automation-6.0.3/src/hwpx_automation/workflow/render_metrics.py +196 -0
- python_hwpx_automation-6.0.3/src/hwpx_automation/workflow/render_queue.py +482 -0
- python_hwpx_automation-6.0.3/src/hwpx_automation/workflow/render_security.py +172 -0
- python_hwpx_automation-6.0.3/src/hwpx_automation/workflow/render_transport.py +369 -0
- python_hwpx_automation-6.0.3/src/hwpx_automation/workflow/rendering.py +206 -0
- python_hwpx_automation-6.0.3/src/hwpx_automation/workflow/service.py +758 -0
- python_hwpx_automation-6.0.3/src/hwpx_automation/workflow/state_machine.py +65 -0
- python_hwpx_automation-6.0.3/src/hwpx_automation/workflow/store.py +747 -0
- python_hwpx_automation-6.0.3/src/hwpx_automation/workspace.py +1694 -0
- python_hwpx_automation-6.0.3/src/python_hwpx_automation.egg-info/PKG-INFO +279 -0
- python_hwpx_automation-6.0.3/src/python_hwpx_automation.egg-info/SOURCES.txt +221 -0
- python_hwpx_automation-6.0.3/src/python_hwpx_automation.egg-info/dependency_links.txt +1 -0
- python_hwpx_automation-6.0.3/src/python_hwpx_automation.egg-info/entry_points.txt +3 -0
- python_hwpx_automation-6.0.3/src/python_hwpx_automation.egg-info/requires.txt +46 -0
- python_hwpx_automation-6.0.3/src/python_hwpx_automation.egg-info/top_level.txt +1 -0
|
@@ -0,0 +1,178 @@
|
|
|
1
|
+
Copyright 2025-2026 airmang (Dr. Wily)
|
|
2
|
+
|
|
3
|
+
Apache License
|
|
4
|
+
Version 2.0, January 2004
|
|
5
|
+
http://www.apache.org/licenses/
|
|
6
|
+
|
|
7
|
+
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
|
|
8
|
+
|
|
9
|
+
1. Definitions.
|
|
10
|
+
|
|
11
|
+
"License" shall mean the terms and conditions for use, reproduction,
|
|
12
|
+
and distribution as defined by Sections 1 through 9 of this document.
|
|
13
|
+
|
|
14
|
+
"Licensor" shall mean the copyright owner or entity authorized by
|
|
15
|
+
the copyright owner that is granting the License.
|
|
16
|
+
|
|
17
|
+
"Legal Entity" shall mean the union of the acting entity and all
|
|
18
|
+
other entities that control, are controlled by, or are under common
|
|
19
|
+
control with that entity. For the purposes of this definition,
|
|
20
|
+
"control" means (i) the power, direct or indirect, to cause the
|
|
21
|
+
direction or management of such entity, whether by contract or
|
|
22
|
+
otherwise, or (ii) ownership of fifty percent (50%) or more of the
|
|
23
|
+
outstanding shares, or (iii) beneficial ownership of such entity.
|
|
24
|
+
|
|
25
|
+
"You" (or "Your") shall mean an individual or Legal Entity
|
|
26
|
+
exercising permissions granted by this License.
|
|
27
|
+
|
|
28
|
+
"Source" form shall mean the preferred form for making modifications,
|
|
29
|
+
including but not limited to software source code, documentation
|
|
30
|
+
source, and configuration files.
|
|
31
|
+
|
|
32
|
+
"Object" form shall mean any form resulting from mechanical
|
|
33
|
+
transformation or translation of a Source form, including but
|
|
34
|
+
not limited to compiled object code, generated documentation,
|
|
35
|
+
and conversions to other media types.
|
|
36
|
+
|
|
37
|
+
"Work" shall mean the work of authorship, whether in Source or
|
|
38
|
+
Object form, made available under the License, as indicated by a
|
|
39
|
+
copyright notice that is included in or attached to the work
|
|
40
|
+
(an example is provided in the Appendix below).
|
|
41
|
+
|
|
42
|
+
"Derivative Works" shall mean any work, whether in Source or Object
|
|
43
|
+
form, that is based on (or derived from) the Work and for which the
|
|
44
|
+
editorial revisions, annotations, elaborations, or other modifications
|
|
45
|
+
represent, as a whole, an original work of authorship. For the purposes
|
|
46
|
+
of this License, Derivative Works shall not include works that remain
|
|
47
|
+
separable from, or merely link (or bind by name) to the interfaces of,
|
|
48
|
+
the Work and Derivative Works thereof.
|
|
49
|
+
|
|
50
|
+
"Contribution" shall mean any work of authorship, including
|
|
51
|
+
the original version of the Work and any modifications or additions
|
|
52
|
+
to that Work or Derivative Works thereof, that is intentionally
|
|
53
|
+
submitted to Licensor for inclusion in the Work by the copyright owner
|
|
54
|
+
or by an individual or Legal Entity authorized to submit on behalf of
|
|
55
|
+
the copyright owner. For the purposes of this definition, "submitted"
|
|
56
|
+
means any form of electronic, verbal, or written communication sent
|
|
57
|
+
to the Licensor or its representatives, including but not limited to
|
|
58
|
+
communication on electronic mailing lists, source code control systems,
|
|
59
|
+
and issue tracking systems that are managed by, or on behalf of, the
|
|
60
|
+
Licensor for the purpose of discussing and improving the Work, but
|
|
61
|
+
excluding communication that is conspicuously marked or otherwise
|
|
62
|
+
designated in writing by the copyright owner as "Not a Contribution."
|
|
63
|
+
|
|
64
|
+
"Contributor" shall mean Licensor and any individual or Legal Entity
|
|
65
|
+
on behalf of whom a Contribution has been received by Licensor and
|
|
66
|
+
subsequently incorporated within the Work.
|
|
67
|
+
|
|
68
|
+
2. Grant of Copyright License. Subject to the terms and conditions of
|
|
69
|
+
this License, each Contributor hereby grants to You a perpetual,
|
|
70
|
+
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
|
71
|
+
copyright license to reproduce, prepare Derivative Works of,
|
|
72
|
+
publicly display, publicly perform, sublicense, and distribute the
|
|
73
|
+
Work and such Derivative Works in Source or Object form.
|
|
74
|
+
|
|
75
|
+
3. Grant of Patent License. Subject to the terms and conditions of
|
|
76
|
+
this License, each Contributor hereby grants to You a perpetual,
|
|
77
|
+
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
|
78
|
+
(except as stated in this section) patent license to make, have made,
|
|
79
|
+
use, offer to sell, sell, import, and otherwise transfer the Work,
|
|
80
|
+
where such license applies only to those patent claims licensable
|
|
81
|
+
by such Contributor that are necessarily infringed by their
|
|
82
|
+
Contribution(s) alone or by combination of their Contribution(s)
|
|
83
|
+
with the Work to which such Contribution(s) was submitted. If You
|
|
84
|
+
institute patent litigation against any entity (including a
|
|
85
|
+
cross-claim or counterclaim in a lawsuit) alleging that the Work
|
|
86
|
+
or a Contribution incorporated within the Work constitutes direct
|
|
87
|
+
or contributory patent infringement, then any patent licenses
|
|
88
|
+
granted to You under this License for that Work shall terminate
|
|
89
|
+
as of the date such litigation is filed.
|
|
90
|
+
|
|
91
|
+
4. Redistribution. You may reproduce and distribute copies of the
|
|
92
|
+
Work or Derivative Works thereof in any medium, with or without
|
|
93
|
+
modifications, and in Source or Object form, provided that You
|
|
94
|
+
meet the following conditions:
|
|
95
|
+
|
|
96
|
+
(a) You must give any other recipients of the Work or
|
|
97
|
+
Derivative Works a copy of this License; and
|
|
98
|
+
|
|
99
|
+
(b) You must cause any modified files to carry prominent notices
|
|
100
|
+
stating that You changed the files; and
|
|
101
|
+
|
|
102
|
+
(c) You must retain, in the Source form of any Derivative Works
|
|
103
|
+
that You distribute, all copyright, patent, trademark, and
|
|
104
|
+
attribution notices from the Source form of the Work,
|
|
105
|
+
excluding those notices that do not pertain to any part of
|
|
106
|
+
the Derivative Works; and
|
|
107
|
+
|
|
108
|
+
(d) If the Work includes a "NOTICE" text file as part of its
|
|
109
|
+
distribution, then any Derivative Works that You distribute must
|
|
110
|
+
include a readable copy of the attribution notices contained
|
|
111
|
+
within such NOTICE file, excluding those notices that do not
|
|
112
|
+
pertain to any part of the Derivative Works, in at least one
|
|
113
|
+
of the following places: within a NOTICE text file distributed
|
|
114
|
+
as part of the Derivative Works; within the Source form or
|
|
115
|
+
documentation, if provided along with the Derivative Works; or,
|
|
116
|
+
within a display generated by the Derivative Works, if and
|
|
117
|
+
wherever such third-party notices normally appear. The contents
|
|
118
|
+
of the NOTICE file are for informational purposes only and
|
|
119
|
+
do not modify the License. You may add Your own attribution
|
|
120
|
+
notices within Derivative Works that You distribute, alongside
|
|
121
|
+
or as an addendum to the NOTICE text from the Work, provided
|
|
122
|
+
that such additional attribution notices cannot be construed
|
|
123
|
+
as modifying the License.
|
|
124
|
+
|
|
125
|
+
You may add Your own copyright statement to Your modifications and
|
|
126
|
+
may provide additional or different license terms and conditions
|
|
127
|
+
for use, reproduction, or distribution of Your modifications, or
|
|
128
|
+
for any such Derivative Works as a whole, provided Your use,
|
|
129
|
+
reproduction, and distribution of the Work otherwise complies with
|
|
130
|
+
the conditions stated in this License.
|
|
131
|
+
|
|
132
|
+
5. Submission of Contributions. Unless You explicitly state otherwise,
|
|
133
|
+
any Contribution intentionally submitted for inclusion in the Work
|
|
134
|
+
by You to the Licensor shall be under the terms and conditions of
|
|
135
|
+
this License, without any additional terms or conditions.
|
|
136
|
+
Notwithstanding the above, nothing herein shall supersede or modify
|
|
137
|
+
the terms of any separate license agreement you may have executed
|
|
138
|
+
with Licensor regarding such Contributions.
|
|
139
|
+
|
|
140
|
+
6. Trademarks. This License does not grant permission to use the trade
|
|
141
|
+
names, trademarks, service marks, or product names of the Licensor,
|
|
142
|
+
except as required for reasonable and customary use in describing the
|
|
143
|
+
origin of the Work and reproducing the content of the NOTICE file.
|
|
144
|
+
|
|
145
|
+
7. Disclaimer of Warranty. Unless required by applicable law or
|
|
146
|
+
agreed to in writing, Licensor provides the Work (and each
|
|
147
|
+
Contributor provides its Contributions) on an "AS IS" BASIS,
|
|
148
|
+
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
|
|
149
|
+
implied, including, without limitation, any warranties or conditions
|
|
150
|
+
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
|
|
151
|
+
PARTICULAR PURPOSE. You are solely responsible for determining the
|
|
152
|
+
appropriateness of using or redistributing the Work and assume any
|
|
153
|
+
risks associated with Your exercise of permissions under this License.
|
|
154
|
+
|
|
155
|
+
8. Limitation of Liability. In no event and under no legal theory,
|
|
156
|
+
whether in tort (including negligence), contract, or otherwise,
|
|
157
|
+
unless required by applicable law (such as deliberate and grossly
|
|
158
|
+
negligent acts) or agreed to in writing, shall any Contributor be
|
|
159
|
+
liable to You for damages, including any direct, indirect, special,
|
|
160
|
+
incidental, or consequential damages of any character arising as a
|
|
161
|
+
result of this License or out of the use or inability to use the
|
|
162
|
+
Work (including but not limited to damages for loss of goodwill,
|
|
163
|
+
work stoppage, computer failure or malfunction, or any and all
|
|
164
|
+
other commercial damages or losses), even if such Contributor
|
|
165
|
+
has been advised of the possibility of such damages.
|
|
166
|
+
|
|
167
|
+
9. Accepting Warranty or Additional Liability. While redistributing
|
|
168
|
+
the Work or Derivative Works thereof, You may choose to offer,
|
|
169
|
+
and charge a fee for, acceptance of support, warranty, indemnity,
|
|
170
|
+
or other liability obligations and/or rights consistent with this
|
|
171
|
+
License. However, in accepting such obligations, You may act only
|
|
172
|
+
on Your own behalf and on Your sole responsibility, not on behalf of
|
|
173
|
+
any other Contributor, and only if You agree to indemnify,
|
|
174
|
+
defend, and hold each Contributor harmless for any liability
|
|
175
|
+
incurred by, or claims asserted against, such Contributor by reason
|
|
176
|
+
of your accepting any such warranty or additional liability.
|
|
177
|
+
|
|
178
|
+
END OF TERMS AND CONDITIONS
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
python-hwpx-automation
|
|
2
|
+
Copyright 2025-2026 airmang
|
|
3
|
+
|
|
4
|
+
This product includes software developed by airmang.
|
|
5
|
+
Licensed under the Apache License, Version 2.0.
|
|
6
|
+
|
|
7
|
+
────────────────────────────────────────
|
|
8
|
+
DISCLAIMER — HWPX Format
|
|
9
|
+
|
|
10
|
+
"HWPX" is the document format specified and trademarked by
|
|
11
|
+
Hancom Inc. (한글과컴퓨터). This project is an independent,
|
|
12
|
+
unofficial implementation and is not affiliated with, endorsed by,
|
|
13
|
+
or sponsored by Hancom Inc.
|
|
14
|
+
────────────────────────────────────────
|
|
@@ -0,0 +1,279 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: python-hwpx-automation
|
|
3
|
+
Version: 6.0.3
|
|
4
|
+
Summary: Task-oriented HWPX document automation for Python, with an optional MCP adapter.
|
|
5
|
+
Author: Kohkyuhyun
|
|
6
|
+
License-Expression: Apache-2.0
|
|
7
|
+
Project-URL: Homepage, https://github.com/airmang/python-hwpx-automation
|
|
8
|
+
Project-URL: Issues, https://github.com/airmang/python-hwpx-automation/issues
|
|
9
|
+
Keywords: hwpx,hancom,document-automation,workflow,mcp,ai-agent
|
|
10
|
+
Classifier: Programming Language :: Python :: 3
|
|
11
|
+
Classifier: Programming Language :: Python :: 3.10
|
|
12
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
13
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
14
|
+
Requires-Python: >=3.10
|
|
15
|
+
Description-Content-Type: text/markdown
|
|
16
|
+
License-File: LICENSE
|
|
17
|
+
License-File: NOTICE
|
|
18
|
+
Requires-Dist: python-hwpx<6,>=5.0.0
|
|
19
|
+
Requires-Dist: pydantic<3,>=2.11
|
|
20
|
+
Requires-Dist: cryptography>=42.0
|
|
21
|
+
Requires-Dist: anyio>=4.0
|
|
22
|
+
Requires-Dist: tomli>=2.0; python_version < "3.11"
|
|
23
|
+
Provides-Extra: mcp
|
|
24
|
+
Requires-Dist: mcp==1.28.1; extra == "mcp"
|
|
25
|
+
Provides-Extra: hwp
|
|
26
|
+
Requires-Dist: olefile>=0.47; extra == "hwp"
|
|
27
|
+
Provides-Extra: http
|
|
28
|
+
Requires-Dist: uvicorn>=0.30; extra == "http"
|
|
29
|
+
Provides-Extra: ingest
|
|
30
|
+
Requires-Dist: markitdown[docx,pdf,xlsx]<0.2,>=0.1.6; extra == "ingest"
|
|
31
|
+
Provides-Extra: oracle
|
|
32
|
+
Requires-Dist: pymupdf>=1.24; extra == "oracle"
|
|
33
|
+
Requires-Dist: pillow>=10.0; extra == "oracle"
|
|
34
|
+
Requires-Dist: numpy>=1.26; extra == "oracle"
|
|
35
|
+
Provides-Extra: vision
|
|
36
|
+
Requires-Dist: pymupdf>=1.24; extra == "vision"
|
|
37
|
+
Requires-Dist: pillow>=10.0; extra == "vision"
|
|
38
|
+
Requires-Dist: numpy>=1.26; extra == "vision"
|
|
39
|
+
Provides-Extra: test
|
|
40
|
+
Requires-Dist: pytest>=8.0; extra == "test"
|
|
41
|
+
Requires-Dist: build>=1.2; extra == "test"
|
|
42
|
+
Requires-Dist: packaging>=23.0; extra == "test"
|
|
43
|
+
Requires-Dist: pytest-cov>=5.0; extra == "test"
|
|
44
|
+
Requires-Dist: jsonschema>=4.22; extra == "test"
|
|
45
|
+
Requires-Dist: pyyaml>=6.0; extra == "test"
|
|
46
|
+
Requires-Dist: olefile>=0.47; extra == "test"
|
|
47
|
+
Requires-Dist: uvicorn>=0.30; extra == "test"
|
|
48
|
+
Requires-Dist: numpy>=1.26; extra == "test"
|
|
49
|
+
Requires-Dist: pillow>=10.0; extra == "test"
|
|
50
|
+
Requires-Dist: ruff>=0.12; extra == "test"
|
|
51
|
+
Provides-Extra: typecheck
|
|
52
|
+
Requires-Dist: mypy<3,>=1.10; extra == "typecheck"
|
|
53
|
+
Requires-Dist: pyright<2,>=1.1.390; extra == "typecheck"
|
|
54
|
+
Dynamic: license-file
|
|
55
|
+
|
|
56
|
+
<p align="center">
|
|
57
|
+
<h1 align="center">python-hwpx-automation</h1>
|
|
58
|
+
<p align="center">
|
|
59
|
+
<strong>HWPX 저작·양식 채움·업무 워크플로를 위한 Python 자동화 계층</strong>
|
|
60
|
+
</p>
|
|
61
|
+
<p align="center">
|
|
62
|
+
<a href="https://pypi.org/project/python-hwpx-automation/"><img src="https://img.shields.io/pypi/v/python-hwpx-automation?color=blue&label=PyPI" alt="PyPI"></a>
|
|
63
|
+
<a href="https://pepy.tech/project/python-hwpx-automation"><img src="https://static.pepy.tech/badge/python-hwpx-automation/month" alt="Downloads"></a>
|
|
64
|
+
<a href="https://pypi.org/project/python-hwpx-automation/"><img src="https://img.shields.io/pypi/pyversions/python-hwpx-automation" alt="Python"></a>
|
|
65
|
+
<a href="https://github.com/airmang/python-hwpx-automation/actions/workflows/tests.yml"><img src="https://img.shields.io/github/actions/workflow/status/airmang/python-hwpx-automation/tests.yml?branch=main&label=tests" alt="Tests"></a>
|
|
66
|
+
<a href="https://github.com/airmang/python-hwpx-automation/blob/main/LICENSE"><img src="https://img.shields.io/badge/license-Apache--2.0-blue" alt="License"></a>
|
|
67
|
+
</p>
|
|
68
|
+
</p>
|
|
69
|
+
|
|
70
|
+
<!-- release-state: release-approved -->
|
|
71
|
+
> [!WARNING]
|
|
72
|
+
> **릴리스 상태 — `release-approved`: 6.0.3 train 발행이 승인되어 진행
|
|
73
|
+
> 중입니다(2026-07-28).** 이 checkout은
|
|
74
|
+
> `python-hwpx 5.0.1 → python-hwpx-automation 6.0.3 → hwpx-plugin 1.0.0`
|
|
75
|
+
> train과 계약 해시 `0ce938371f0b55a6`을 설명하지만, **원격 truth는 아직
|
|
76
|
+
> 관찰 전**입니다. 마지막으로 plugin 설치까지 함께 검증한 완전한 공개
|
|
77
|
+
> 트레인은 여전히
|
|
78
|
+
> `python-hwpx 4.2.0 → hwpx-mcp-server 5.1.0 → hwpx-plugin 0.8.0`,
|
|
79
|
+
> 계약 해시 `429cb6706323e762`입니다. 아래 canonical 설치 명령은 발행
|
|
80
|
+
> readback이 끝나기 전에는 공개 설치로 간주하지 마세요.
|
|
81
|
+
> 상태 승격은 `unreleased-candidate → release-approved → released` 세 단계이며,
|
|
82
|
+
> `released`와 current-public 좌표는 core·canonical·compatibility와 plugin GitHub
|
|
83
|
+
> Release·marketplace·실제 marketplace 설치까지 3스택 전체 원격 정본을 관찰한 뒤
|
|
84
|
+
> 후속 commit에서만 바꿉니다. 절차는
|
|
85
|
+
> [릴리스 상태 runbook](docs/release-runbook.md)에 있습니다.
|
|
86
|
+
|
|
87
|
+
[python-hwpx](https://github.com/airmang/python-hwpx)의 format/object-model 위에서
|
|
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
|
+
| 계층 | 저장소 | 정본 책임 |
|
|
98
|
+
|---|---|---|
|
|
99
|
+
| Core | [`python-hwpx`](https://github.com/airmang/python-hwpx) | HWPX package/object model·OPC/OXML·직렬화·재사용 primitive |
|
|
100
|
+
| Automation | [`python-hwpx-automation`](https://github.com/airmang/python-hwpx-automation) | Python 자동화·워크플로·profile/policy·렌더·선택형 MCP adapter |
|
|
101
|
+
| Judgment | [`hwpx-plugins`](https://github.com/airmang/hwpx-plugins) | 에이전트 intent/genre 판단·ambiguity 처리·plugin/skill 가이드 |
|
|
102
|
+
|
|
103
|
+
이 저장소는 위 표의 Automation 정본입니다.
|
|
104
|
+
|
|
105
|
+
## Python 자동화 시작하기 (6.0 후보)
|
|
106
|
+
|
|
107
|
+
```bash
|
|
108
|
+
pip install python-hwpx-automation
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
```python
|
|
112
|
+
from hwpx_automation import create_document_from_plan
|
|
113
|
+
|
|
114
|
+
document = create_document_from_plan(
|
|
115
|
+
{
|
|
116
|
+
"schemaVersion": "hwpx.document_plan.v1",
|
|
117
|
+
"title": "회의 결과",
|
|
118
|
+
"blocks": [{"type": "paragraph", "text": "결정 사항"}],
|
|
119
|
+
}
|
|
120
|
+
)
|
|
121
|
+
document.save_to_path("meeting-result.hwpx")
|
|
122
|
+
```
|
|
123
|
+
|
|
124
|
+
`python -m hwpx_automation --help`와 `hwpx help`는 같은 task CLI를 실행합니다.
|
|
125
|
+
|
|
126
|
+
## MCP 어댑터 시작하기 (6.0 후보)
|
|
127
|
+
|
|
128
|
+
```bash
|
|
129
|
+
pip install "python-hwpx-automation[mcp]"
|
|
130
|
+
hwpx-automation-mcp
|
|
131
|
+
```
|
|
132
|
+
|
|
133
|
+
6.x 호환 기간에는 `pip install hwpx-mcp-server`와 `hwpx-mcp-server`도
|
|
134
|
+
동작합니다. 옛 distribution/import/console 제거는 7.0 이전에는 하지 않으며,
|
|
135
|
+
최소 90일 공개 관찰과 별도 오너 승인이 필요합니다.
|
|
136
|
+
|
|
137
|
+
MCP 클라이언트 설정 파일에 아래 블록 하나면 `hwpx` 서버를 잡습니다 — Claude Desktop은
|
|
138
|
+
`claude_desktop_config.json`, VS Code는 `.vscode/mcp.json`(키가 `mcpServers` 대신 `servers`),
|
|
139
|
+
Gemini CLI는 `~/.gemini/settings.json`, Cursor·Windsurf는 각 에디터의 MCP 설정 파일입니다.
|
|
140
|
+
|
|
141
|
+
```json
|
|
142
|
+
{
|
|
143
|
+
"mcpServers": {
|
|
144
|
+
"hwpx": {
|
|
145
|
+
"command": "uvx",
|
|
146
|
+
"args": [
|
|
147
|
+
"--from",
|
|
148
|
+
"python-hwpx-automation[mcp]==6.0.3",
|
|
149
|
+
"hwpx-automation-mcp"
|
|
150
|
+
],
|
|
151
|
+
"env": {
|
|
152
|
+
"HWPX_AUTOMATION_WORKSPACE_ROOTS": "[\"~/Documents\"]"
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
```
|
|
158
|
+
|
|
159
|
+
`HWPX_AUTOMATION_WORKSPACE_ROOTS`에는 문서가 있는 폴더(절대경로 또는 `~`)를 지정하세요. Windows는
|
|
160
|
+
`"[\"C:\\\\hwpx\"]"`처럼 씁니다. 값을 비워 두면 서버는 실행 위치(cwd)를 root로 쓰려 하지만,
|
|
161
|
+
Claude Desktop 같은 GUI 클라이언트는 서버를 시스템 디렉터리(Windows `C:\Windows\System32`,
|
|
162
|
+
macOS `/`)에서 띄우므로 이런 degenerate cwd는 거부되고 모든 문서 경로가 막힙니다. 그래서 처음부터
|
|
163
|
+
이 값을 설정하는 것을 권장합니다. 나머지 옵션은 [환경 변수](#환경-변수) 표를 참고하세요.
|
|
164
|
+
|
|
165
|
+
> 비-HWPX 문서(PDF/DOCX/XLSX/HTML/TXT)를 `document_to_markdown`으로 읽으려면
|
|
166
|
+
> `pip install "python-hwpx-automation[ingest]"`(또는 옛 이름 `"hwpx-mcp-server[ingest]"`)로
|
|
167
|
+
> MarkItDown adapter를 함께 설치합니다.
|
|
168
|
+
> 요구 사항: `Python >= 3.10` · `python-hwpx >= 5.0.0`.
|
|
169
|
+
|
|
170
|
+
## 무엇을 하나
|
|
171
|
+
|
|
172
|
+
기본 모드에서 다수의 HWPX 도구를 제공하며, 고급 모드(`HWPX_AUTOMATION_ADVANCED=1`)에서 점검·검증용 도구가 추가됩니다.
|
|
173
|
+
|
|
174
|
+
- **읽기·탐색** — `get_document_info`, `get_document_map`(아웃라인·표 지도·앵커를 한 호출로), `find_text` (저장하지 않음)
|
|
175
|
+
- **검색·치환·편집** — `search_and_replace`, `apply_document_commands`(이종 편집 원자 적용·dry-run·롤백·멱등키), `add_tracked_edit`(변경 추적)
|
|
176
|
+
- **표·양식 채움** — `analyze_form_fill` → `apply_form_fill` → `verify_form_fill` 바이트 보존 트랜잭션, `table_compute`(합계·소계)
|
|
177
|
+
- **문서 생성·공문** — 선언형 `create_document_from_plan`, `inspect_official_document_style`(행정 규정 lint), `mail_merge`
|
|
178
|
+
- **서식·그림·생성기** — `set_paragraph_format`·`set_page_setup`, `insert_picture`, 사진대지·명패·조직도
|
|
179
|
+
- **프리뷰·추출·복구·진단** — `render_preview`(HTML/PNG 자기검증), `hwpx_to_markdown`, `repair_hwpx`, `mcp_server_health`
|
|
180
|
+
|
|
181
|
+
자세한 내용: [사용 사례](docs/use-cases.md) · [스킬 우선 워크플로](docs/skill-first-workflows.md)
|
|
182
|
+
|
|
183
|
+
### 하나의 흐름부터
|
|
184
|
+
|
|
185
|
+
처음부터 모든 도구를 외울 필요는 없습니다. 보통 아래 하나로 시작합니다.
|
|
186
|
+
|
|
187
|
+
1. **읽기** — `get_document_info` → `get_document_outline`/`get_document_text` → `find_text`, `get_table_map`으로 필요한 부분만. (저장하지 않음)
|
|
188
|
+
2. **안전 수정** — `copy_document`로 사본 생성 → 읽기 도구로 대상 확인 → `search_and_replace`, `set_table_cell_text` 같은 전문 도구나 `apply_document_commands`로 가장 작은 변경 → 다시 읽어 확인 → 검토가 끝난 복사본을 handoff.
|
|
189
|
+
|
|
190
|
+
핵심은 **copy first · smallest edit · re-read after edits**입니다.
|
|
191
|
+
|
|
192
|
+
## 안전과 품질 게이트
|
|
193
|
+
|
|
194
|
+
- **read first** — 먼저 읽기 도구로 문서를 파악합니다.
|
|
195
|
+
- **copy before risky edits** — 결과물을 보존해야 하면 `copy_document`를 먼저 호출합니다.
|
|
196
|
+
- **mutating tools persist immediately** — 수정 도구는 호출 즉시 저장되므로 검토용은 복사본에서 작업합니다.
|
|
197
|
+
- **explicit handoff uses the reviewed copy** — 납품·handoff는 검토가 끝난 복사본 파일 기준입니다.
|
|
198
|
+
|
|
199
|
+
모델은 operation/plan만 보내고 raw XML을 직접 편집하지 않습니다. 일반 저장 경로는 python-hwpx의
|
|
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)에 있습니다.
|
|
211
|
+
|
|
212
|
+
> **위치 계약** — `paragraph_index`는 본문 직속 문단의 0-based 인덱스입니다. 표 안 문단은 여기 섞지 않고
|
|
213
|
+
> `{"kind":"table_cell_paragraph","table_index":0,"row":0,"col":1,"cell_paragraph_index":0}` 같은 `location`
|
|
214
|
+
> 객체로 지정하며, `get_table_map`/`find_text`가 반환한 값을 그대로 넘길 수 있습니다.
|
|
215
|
+
|
|
216
|
+
## 환경 변수
|
|
217
|
+
|
|
218
|
+
| 변수 | 설명 | 기본값 |
|
|
219
|
+
|---|---|---|
|
|
220
|
+
| `HWPX_AUTOMATION_WORKSPACE_ROOTS` | 허용할 workspace 절대경로의 JSON 배열(복수 root 지원). 상대경로는 첫 root 기준 | unset → 프로세스 cwd. degenerate cwd는 `WORKSPACE_ROOT_INVALID`로 거부 |
|
|
221
|
+
| `HWPX_AUTOMATION_MAX_CHARS` | 텍스트 반환 도구 기본 최대 길이 | `10000` |
|
|
222
|
+
| `HWPX_AUTOMATION_AUTOBACKUP` | `1`이면 저장 전 `.bak` 백업 생성 | `1` |
|
|
223
|
+
| `HWPX_AUTOMATION_ADVANCED` | `1`이면 고급 도구 활성화 | `0` |
|
|
224
|
+
| `HWPX_AUTOMATION_FETCH_TIMEOUT_SECONDS` | URL 기반 HWPX fetch timeout | `20.0` |
|
|
225
|
+
| `HWPX_AUTOMATION_ALLOW_PRIVATE_NETWORK` | `1`이면 신뢰된 사설/루프백 HTTPS 대상 허용. 링크로컬·metadata·예약 주소는 계속 차단 | `0` |
|
|
226
|
+
| `HWPX_AUTOMATION_QUALITY` | 전역 기본 저장 게이트 정책(`transparent`/`strict`). 도구별 `quality`가 우선 | `transparent` |
|
|
227
|
+
| `HWPX_AUTOMATION_REQUIRE_CAPABILITY` | `0`이면 capability skew fail-closed를 끔(진단/전문가용) | `1` |
|
|
228
|
+
| `HWPX_AUTOMATION_WORKFLOW_STORE` | durable workflow SQLite 경로. 기존 `HWPX_WORKFLOW_STORE`보다 우선 | 기존 6.x 상태 경로 |
|
|
229
|
+
| `LOG_LEVEL` | 로그 레벨 | `INFO` |
|
|
230
|
+
|
|
231
|
+
동일 suffix의 기존 `HWPX_MCP_*` 키는 6.x 동안 fallback으로 유지됩니다.
|
|
232
|
+
두 키가 함께 있으면 `HWPX_AUTOMATION_*`이 우선합니다. workflow DB의 기존
|
|
233
|
+
`.../hwpx-mcp-server/workflows.sqlite3` 기본 경로도 6.x에서는 데이터 유실을
|
|
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를 새로 만들지 않습니다.
|
|
248
|
+
|
|
249
|
+
경로는 기본적으로 workspace 밖 traversal과 symlink escape를 거부하고, URL 입력은 HTTPS·공개 IP만
|
|
250
|
+
허용합니다. 원자 rename을 제공하지 않는 호스트의 동시성 주의사항은 [하드닝 가이드](docs/hardening_guide_ko.md)를 보세요.
|
|
251
|
+
|
|
252
|
+
## 기여하기
|
|
253
|
+
|
|
254
|
+
[good first issue](https://github.com/airmang/python-hwpx-automation/issues?q=is%3Aissue+is%3Aopen+label%3A%22good+first+issue%22) ·
|
|
255
|
+
[마일스톤](https://github.com/airmang/python-hwpx-automation/milestones) ·
|
|
256
|
+
[Discussions](https://github.com/airmang/python-hwpx-automation/discussions) ·
|
|
257
|
+
[CONTRIBUTING](CONTRIBUTING.md) ·
|
|
258
|
+
[CHANGELOG](CHANGELOG.md)
|
|
259
|
+
|
|
260
|
+
```bash
|
|
261
|
+
python -m pip install -e ".[test]" # 테스트 의존성
|
|
262
|
+
python -m pytest -q # 전체 테스트
|
|
263
|
+
python scripts/run_conformance.py run \
|
|
264
|
+
--tier structural --check tests/conformance/golden/structural.json
|
|
265
|
+
# 공개 합성 코퍼스를 다시 만들 때만:
|
|
266
|
+
python scripts/conformance_corpus_build.py
|
|
267
|
+
```
|
|
268
|
+
|
|
269
|
+
## 감사의 말
|
|
270
|
+
|
|
271
|
+
코어 라이브러리 [python-hwpx](https://github.com/airmang/python-hwpx) 위에서 동작하며, 아래 공개 표준·프로젝트에 빚지고 있습니다.
|
|
272
|
+
|
|
273
|
+
- **[OWPML — 개방형 워드프로세서 마크업 언어 (KS X 6101)](https://www.kssn.net/search/stddetail.do?itemNo=K001010119985)** — HWPX가 기반하는 한국 산업 표준
|
|
274
|
+
- **[hancom-io/hwpx-owpml-model](https://github.com/hancom-io/hwpx-owpml-model)** — OWPML 요소 구조 참조 모델 · **[neolord0/hwpxlib](https://github.com/neolord0/hwpxlib)** — 오라클 샘플 코퍼스
|
|
275
|
+
- **[edwardkim/rhwp](https://github.com/edwardkim/rhwp)** — 멱등성·검증 게이트 설계 영감
|
|
276
|
+
|
|
277
|
+
## License · Maintainer
|
|
278
|
+
|
|
279
|
+
Apache-2.0 ([LICENSE](LICENSE) · [NOTICE](NOTICE)) — **Kohkyuhyun** [@airmang](https://github.com/airmang) · [kokyuhyun@hotmail.com](mailto:kokyuhyun@hotmail.com)
|