Releases: harumiWeb/exstruct
v0.7.1
v0.7.1 Release Notes
This patch release publishes the CLI and package import startup optimization work
completed under issues #107, #108, and #109.
Highlights
- The extraction CLI now always shows
--auto-page-breaks-dirin help output
and validates support only when the option is actually used at runtime. - Lightweight CLI paths now avoid unnecessary heavy imports:
exstruct --help- extraction-style argv that do not route to edit commands
exstruct ops list
- Public package imports are lighter:
import exstructimport exstruct.engine- exported names from
exstructandexstruct.editremain compatible while
loading implementation modules lazily
- Regression coverage now locks the startup boundary and validates that
lightweight import paths do not eagerly load extraction, edit, MCP, render,
orpydanticdependencies.
Startup impact
Compared with v0.7.0, local median startup timings on the same Python
environment improved by approximately:
python -m exstruct.cli.main --help:2195 ms -> 64 ms(34.4xfaster)import exstruct:1039 ms -> 55 ms(19.0xfaster)python -m exstruct.cli.main ops list:1143 ms -> 207 ms(5.5xfaster)import exstruct.engine:1005 ms -> 223 ms(4.5xfaster)
These measurements were taken locally against v0.7.0 and the current
v0.7.1 code using the same virtual environment and direct source imports, so
exact numbers will vary by machine and startup conditions.
Notes
- No new CLI commands were added in
v0.7.1. - MCP tool names and payload shapes remain compatible in
v0.7.1. - Backend selection policy remains
auto/com/openpyxl. - The edit CLI
validatesubcommand once again propagatesRuntimeError
instead of converting it into handled CLI error output.
v0.7.0
v0.7.0 Release Notes
This release publishes the workbook editing work completed under issue #99,
including the new exstruct.edit API surface, the editing CLI, compatibility
follow-ups, and maintainer-facing documentation needed to keep the layering
clear for future changes.
Next steps
Currently, the CLI startup is slow due to issues with the initial implementation,
so we plan to release an update in the near future to improve its performance.
Highlights
- Added a first-class workbook editing API under
exstruct.edit, including:- public
patch_workbook()/make_workbook()entrypoints - public request/result models
- shared patch-op schema discovery helpers
- public
- Added public editing CLI commands under
exstruct:patchmakeopsvalidate
- Clarified the editing architecture split so
exstruct.editis the canonical
core and MCP remains the host-managed integration / compatibility layer. - Updated public docs to explain canonical usage across Python, CLI, and MCP,
including the recommendeddry_run -> inspect -> applyworkflow and the
backend="auto"caveat for same-engine comparisons. - Added maintainer-facing documentation coverage for editing architecture,
specs, ADR alignment, and agent workflow expectations used during the issue
#99closeout. - Fixed release-significant review follow-ups, including:
- top-level
sheetfallback while preservingop.sheetprecedence - legacy monkeypatch compatibility across compatibility shims
- rename-reservation cleanup on openpyxl failure paths
- dry-run / backend / CLI failure wording drift in docs
- top-level
Notes
- The legacy extraction CLI invocation (
exstruct INPUT.xlsx ...) is unchanged. - MCP tool names and payload shapes remain compatible in
v0.7.0. - Patch backend policy remains
auto/com/openpyxl; this release does
not change backend selection semantics.
v0.6.1
v0.6.1 Release Notes
This patch release hardens Windows LibreOffice smoke coverage and runtime
resolution for the libreoffice extraction path.
Highlights
- Added a dedicated Windows GitHub Actions LibreOffice smoke job:
- runs on
windows-2025 - installs
libreoffice-fresh - discovers
EXSTRUCT_LIBREOFFICE_PATHand bundled LibreOffice Python - runs
tests/core/test_libreoffice_smoke.py -m libreofficewith
RUN_LIBREOFFICE_SMOKE=1
- runs on
- Improved Windows runtime discovery:
soffice.comis now preferred oversoffice.exewhen available- bundled LibreOffice Python detection now covers
python-core-*layouts
- Hardened LibreOffice bridge subprocess startup on Windows:
- bridge probe, handshake, and extraction now run from the runtime Python
directory - the runtime directory is prepended to
PATHfor UNO import and DLL
resolution
- bridge probe, handshake, and extraction now run from the runtime Python
- Reduced smoke-gate false negatives:
- slow
soffice --versionprobes are retried with a longer timeout - if version probing still times out, the smoke gate falls back to a
short-lived LibreOffice session probe before marking the runtime
unavailable
- slow
- Added regression tests for Windows runtime normalization, bundled Python
discovery, bridge subprocess environment handling, and timeout fallback.
Notes
- This is a reliability-focused patch release for Windows LibreOffice CI and
runtime detection. - No public API or output schema changes were introduced in this release.
v0.6.0
v0.6.0 Release Notes
This release adds a new best-effort libreoffice extraction mode for
non-COM environments and extends shape/chart metadata with provenance fields.
Highlights
- Added
mode="libreoffice"across the Python API, CLI, and MCP server. - Added early validation for
.xls+mode="libreoffice"with a clear error. - Added extraction-only validation for
mode="libreoffice":- rejects PDF/PNG rendering
- rejects auto page-break export
- Added
FallbackReason.LIBREOFFICE_UNAVAILABLEand
FallbackReason.LIBREOFFICE_PIPELINE_FAILED. - Added backend metadata to shapes/charts:
provenanceapproximation_levelconfidence- serialized output now keeps these fields opt-in via
include_backend_metadata
- Added OOXML-based best-effort reconstruction for:
- shapes
- connectors
- charts
- Added a LibreOffice runtime helper so server/Linux/macOS environments can
opt into rich extraction without Excel COM. - Added bundled bridge compatibility probing for LibreOffice Python runtime
selection, including fail-fast handling for incompatible
EXSTRUCT_LIBREOFFICE_PYTHON_PATHoverrides. - Added a required Linux GitHub Actions smoke job that installs LibreOffice
python3-unoand runs thepytest.mark.libreofficesample smoke test.
Notes
libreofficeis available for.xlsx/.xlsmonly.libreofficeis best-effort and not a strict subset of COM output.- v1 does not add LibreOffice PDF/PNG rendering or auto page-break extraction.
v0.5.3
v0.5.3 Release Notes
This patch release improves capture_sheet_images subprocess reliability and
observability, and updates MCP guidance for safe production rollout.
Highlights
- Added dedicated subprocess worker entrypoint:
python -m exstruct.render.subprocess_workeris now used for
capture_sheet_imagessubprocess mode.- worker bootstrap is decoupled from parent
__main__restoration.
- Updated default runtime behavior:
- MCP now defaults
EXSTRUCT_RENDER_SUBPROCESS=1based on profile-comparison
runs showing stable behavior in both modes. EXSTRUCT_RENDER_SUBPROCESS=0remains available to force in-process mode.
- MCP now defaults
- Improved timeout and failure diagnostics:
- wait ordering now prioritizes result receipt before join wait to reduce
false timeout failures after successful worker output. - stage-aware error reporting (
startup/join/result/worker) now
includes actionable context and stderr snippets when available.
- wait ordering now prioritizes result receipt before join wait to reduce
- Documentation updates:
- MCP
exstruct_capture_sheet_imagesis marked Experimental. - README/MCP docs now include subprocess timeout tuning guidance, including
EXSTRUCT_RENDER_SUBPROCESS_STARTUP_TIMEOUT_SEC.
- MCP
Notes
- No new patch operations were added in this release.
- MCP tools include the experimental
exstruct_capture_sheet_imagespath updated in this release. - This is a reliability-focused patch release for image-capture execution paths.
v0.5.2
v0.5.2 Release Notes
This patch release restores mixed chart/table patch workflows on COM-backed
execution and clarifies error behavior for non-COM environments.
Highlights
- Restored mixed-op support:
create_chartandapply_table_stylecan be executed in one request when
the backend resolves to COM (backend="com"or COM-available
backend="auto").
- Improved error behavior:
- when COM is unavailable, mixed
create_chart+apply_table_style
requests now return a clear COM-required error.
- when COM is unavailable, mixed
- Added and updated regression coverage:
- mixed request succeeds on COM
- mixed request fails clearly when COM is unavailable
backend="openpyxl"continues to rejectcreate_chartrequests
Notes
- This release does not add new MCP tools or patch operations.
- Documentation (README and MCP guide) has been aligned with the restored
mixed-op behavior.
v0.5.1
v0.5.1 Release Notes
This patch release tightens MCP patch operation constraints and updates
documentation for backend behavior clarity.
Highlights
- Added a service-level guard for backend-only op mixing:
create_chartandapply_table_stylecan no longer be combined in a
single request.
- Updated MCP docs and README pages for
create_chartconstraints:- COM-only behavior
- supported chart types:
line,column,bar,area,pie,
doughnut,scatter,radar - chart type aliases:
column_clustered->column,bar_clustered->
bar,xy_scatter->scatter,donut->doughnut - related flag limitations
- incompatibility with
apply_table_stylein one request
Notes
- This is a compatibility and correctness-focused patch release with no new
public tool surface added.
v0.5.0
v0.5.0 Release Notes
This release expands MCP editing from MVP scope to practical workbook design
flows, and adds new MCP tools for workbook creation, op discovery, and runtime
diagnostics.
Highlights
- Added
exstruct_makefor one-call workbook creation and initialopsapply.out_pathis required,opsis optional.- Supports
.xlsx,.xlsm, and.xls(with COM constraints on.xls).
- Expanded
exstruct_patchdesign editing operations:draw_grid_border,set_bold,set_font_size,set_font_color,
set_fill_color,set_dimensions,auto_fit_columns,merge_cells,
unmerge_cells,set_alignment,set_style,apply_table_style- Internal inverse op:
restore_design_snapshot
- Added MCP operation schema discovery tools:
exstruct_list_opsexstruct_describe_op
- Added MCP runtime diagnostics tool:
exstruct_get_runtime_info
- Improved patch UX and output controls:
- Top-level
sheetfallback for non-add_sheetops (op.sheethas higher
priority when both are present) - Artifact mirroring via
mirror_artifactand server--artifact-bridge-dir - Backend controls for patch/make:
backendinput andengineoutput
- Top-level
Notes
backend="auto"now prefers COM when available, with controlled fallback to
openpyxl for compatible cases.apply_table_stylerequested withbackend="com"falls back to openpyxl
with a warning.- MCP docs and README pages were updated to reflect the new make/patch flows
and operation schema guidance.
v0.4.4
v0.4.4 Release Notes
This release delivers an MVP for Excel editing on the MCP server, plus new
direct-read tools to make agent workflows faster and more precise.
Highlights
- Added Excel edit MVP via
exstruct_patchwith atomic apply semantics:- Core operations:
set_value,set_formula,add_sheet - Extended operations:
set_range_values,fill_formula,
set_value_if,set_formula_if - Safety and review options:
dry_run,return_inverse_ops,
preflight_formula_check,auto_formula - Better output handling: output directory creation, structured errors, and
default conflict policy set tooverwrite - Compatibility improvement:
opsnow accepts both object lists
(recommended) and JSON object strings
- Core operations:
- Added direct A1-oriented read tools for extracted JSON:
exstruct_read_rangeexstruct_read_cellsexstruct_read_formulas
- Improved MCP extraction/read consistency:
- Added
alpha_colsupport (Excel-style column keys likeA,B, ...)
across CLI/MCP extraction paths - Added
merged_rangesoutput foralpha_colmode - Clarified MCP mode/chunk guidance and improved chunk-reader error messages
- Added
- Expanded MCP documentation, tool schemas, and tests for patch/read flows.
Notes
- In MCP,
options.alpha_colnow defaults totrue. Set
options.alpha_col=falseif you need legacy numeric string column keys. exstruct_patchfollows server-level--on-conflictunless overridden in
the tool call.
v0.4.0
v0.4.0 Release Notes
This release introduces MCP server support for ExStruct, enabling agent tool
integration with a stdio server, plus new extraction utilities, policies, and
expanded tests and documentation.
Please read the official documentation for detailed setup instructions.
MCP Server
Highlights
- Added MCP stdio server (
exstruct-mcp) with tools:exstruct_extractexstruct_read_json_chunk(cursor + filters for large outputs)exstruct_validate_input(pre-checks for files and COM availability)
- Introduced MCP path policy (allowlist + deny globs), output conflict handling
(--on-conflict), and optional warmup for latency reduction. - Added typed extraction options for MCP runs (pretty/indent and side outputs),
and clarified file validation errors. - Improved openpyxl border scanning (deferred column shrink) for late-table
detection; added backend selection for border clustering. - Documentation updates for MCP setup and agent configuration (site nav and
README updates), plus expanded tests and CI dependency installation.
Notes
- MCP dependencies are optional: install with
pip install exstruct[mcp]. read_json_chunkenforces file paths and chunk size limits; usesheet/
filterwhen outputs are large.