v0.10.0
What's Changed
Features
- feat(docx-core): publish DOM-aware tracked-change emitter helpers (#135) by @stevenobiajulu in #147
- feat(docx-core): emit w:ins/w:del at write time in text.ts (#136) by @stevenobiajulu in #149
- feat(docx-core): expose comment range metadata in getComments() by @stevenobiajulu in #134
- feat(docx-mcp): render comments inline at paragraph level in read_file by @stevenobiajulu in #132
- feat(docx-mcp): render comment ranges inline in read_file with milestone markers by @stevenobiajulu in #150
- feat(docx-core): emit tracked-change markup from insertParagraph (#137) by @stevenobiajulu in #162
- feat(docx-core): emit tracked-change markup for comment body anchors (#138) by @stevenobiajulu in #163
- feat(docx-core): emit tracked-change markup for footnote body + note text (#139) by @stevenobiajulu in #166
- feat(docx-core): emit pPrChange/trPrChange/tcPrChange from layout setters (#140) by @stevenobiajulu in #167
- feat(docx-mcp): emit rPrChange from clear_formatting MCP tool (#141) by @stevenobiajulu in #170
- feat(docx-mcp): wire configurable AI author through MCP layer (#142) by @stevenobiajulu in #172
- feat(docx-core): add derived heading object to DocumentViewNode (closes #179) by @stevenobiajulu in #190
- feat(verification): close inv_field_001 with Tier 2 OoxmlDoc subset by @stevenobiajulu in #208
- feat(docx-core): sweep side-part revisions on accept/reject by @stevenobiajulu in #218
- feat(docx-core): emit rPrChange for formatted paragraph replacements by @stevenobiajulu in #215
- feat(spec-compliance): structured ECMA-376 traceability framework by @stevenobiajulu in #230
- feat(test-narrative): add narrative-tag Zod schema package by @stevenobiajulu in #243
- feat(allure-test-factory): add visibility metadata + corpusVisibility label by @stevenobiajulu in #245
- feat(test-narrative): add AST extractor + check_test_narratives CI gate by @stevenobiajulu in #247
- feat(scripts): add draft-narrative-jsdoc.mjs local Codex authoring helper by @stevenobiajulu in #249
- feat(scripts): emit tests-corpus.json + schema artifact at tag time by @stevenobiajulu in #251
- feat(scripts): batch narrative-generation driver for unattended Codex runs by @stevenobiajulu in #258
- feat(ci): add LLM-Based Quality Gate (Phase 1, advisory) by @stevenobiajulu in #253
- feat(verification): close inv_rt_001 round-trip text proof (zero-sorry spike) by @stevenobiajulu in #293
- feat(verification): reproducible Lean↔TS LCS differential harness (Tier 2.5) by @stevenobiajulu in #308
- feat(verification): extend Lean↔TS differential to Tier 2 accept/reject/validate helpers (Tier 2.5) by @stevenobiajulu in #309
- feat(docx-mcp): DOCX → Markdown export via shared serializer core by @stevenobiajulu in #310
- feat(verification): broaden the Lean Atom projection past the overfit LCS-soundness lemma (Tier 2.5) by @stevenobiajulu in #316
- feat(docx-mcp): DOCX → HTML export (first wave) (#304) by @stevenobiajulu in #322
- feat(docx-core): add DOCX → plain text export (#305) by @stevenobiajulu in #327
- feat(odf-core): add ODF .odt core library (archive, view, replace) by @stevenobiajulu in #328
- feat(verification): close the LCS DP-equivalence proof (Tier 2.5) by @stevenobiajulu in #330
- feat(verification): model the DeletedFieldCode locality constraint in Lean (closes G1/G2) by @stevenobiajulu in #334
- feat(docx-mcp): provider-aware ODF (.odt) backend (Phase 1 wiring) by @stevenobiajulu in #335
- feat(docx-mcp): ODF grep + insert_paragraph (Phase 2a) by @stevenobiajulu in #336
- feat(verification): broaden lean accept to keep empty-collapsing paragraphs (closes g3) by @stevenobiajulu in #340
- feat(docx-mcp): ODF comments — add_comment + get_comments for .odt (Phase 2b-1) by @stevenobiajulu in #341
- feat(docx-mcp): ODF compare_documents — paragraph-granularity redline for .odt (Slice 1) by @stevenobiajulu in #348
- feat(docx-core): formatting-fidelity comparison check (#363) by @stevenobiajulu in #365
- feat(docx-mcp): ODF compare_documents session mode — redline a .odt session against its original by @stevenobiajulu in #366
- feat(odf-core,docx-mcp): ODF compare_documents — intra-paragraph (run-level) tracked changes (#356) by @stevenobiajulu in #370
Bug Fixes
- fix(docx-core): split runs in insertCommentMarkers for sub-paragraph anchor ranges by @stevenobiajulu in #153
- fix(docx-core): handle collapsed ranges and validate offsets in addComment by @stevenobiajulu in #155
- fix(docx-mcp): document bk* paragraph ID stability and add opt-in content_fingerprint by @stevenobiajulu in #161
- fix(docx-mcp): honor SAFE_DOCX_AI_AUTHOR in CLI entry points (#181) by @stevenobiajulu in #182
- fix(docx-core): harden heading detection (#157 Phase 1) by @stevenobiajulu in #178
- fix(docx-mcp): warn when read_file budget is exceeded by a single node (closes #184) by @stevenobiajulu in #186
- fix(docx-core): declare xmlns:w14/w15 on comments root before writing prefixed attributes (#154) by @stevenobiajulu in #180
- fix(docx-mcp): surface comment_load_error on the default budgeted read path (closes #189) by @stevenobiajulu in #191
- fix(docx-core): suppress non-sectional false-positive headings (closes #187) by @stevenobiajulu in #188
- fix(docx-mcp): allow system temp roots in path policy by @stevenobiajulu in #210
- fix(docx-core): validate w:delInstrText placement and reject w:fldChar inside <w:del> by @stevenobiajulu in #211
- fix(docx-core): partition field-closure validation by ECMA-376 story (#212) by @stevenobiajulu in #225
- fix(docx-mcp): seed revision ids from side parts by @stevenobiajulu in #216
- fix(docx-core): fragment w:fldChar outside w:del per ECMA-376 Part 4 by @stevenobiajulu in #228
- fix(spec-compliance): make conformance-doc generator deterministic (closes #231) by @stevenobiajulu in #232
- fix(scripts): allure-labels validator false positives on factory self-test and fixture sources by @stevenobiajulu in #267
- fix(ci): npm 11 rejects double-loaded user/global config — split paths by @stevenobiajulu in #270
- fix(ci): harden LLM-gate against npm config-load failures (closes #273) by @stevenobiajulu in #274
- fix(ci): pass --repo to gh pr view in workflow_dispatch path (closes #275) by @stevenobiajulu in #276
- fix(docx-core): strip sectPr from cloned paragraph shell in insert_paragraph by @stevenobiajulu in #289
- fix(docx-core): preserve rsid identity in replace_text post-mutation merge by @stevenobiajulu in #290
- fix(allure-test-factory): restore Allure tree grouping under allure-vitest ≥3.6 project-scoped labels by @stevenobiajulu in #314
- fix(docx-mcp): resolve final write-path component to block symlink escape (#313) by @stevenobiajulu in #320
- fix(llm-gate): stagger LLM calls + retry backoff to avoid API bursts by @stevenobiajulu in #338
- fix(docx-core): make Reject All paragraph removal mark-based, not content-based (closes G4) by @stevenobiajulu in #337
- fix(docx-core): make accept all paragraph removal mark-based, not content-based (closes g5) by @stevenobiajulu in #342
- fix(docx-core): use replaceData in setLeafText to sync xmldom data/nodeValue by @stevenobiajulu in #40
- fix(docx-core): corrected reject/accept round-trip oracle — projection-to-projection (#347) by @stevenobiajulu in #361
- fix(docx-core): skip xmlns declarations in formatting-fidelity canonicalization by @stevenobiajulu in #371
- fix(docx-core): preserve w:hyperlink wrappers in rebuild reconstruction by @stevenobiajulu in #377
- fix(odf-core): anchor EOF-replacement deletion backward so reject-all restores the original (#367) by @stevenobiajulu in #374
- fix(odf-core): group adjacent word replacements in ODF inline compare by @stevenobiajulu in #379
- fix(docx-core): surface text-empty paragraphs that anchor a footnote reference by @stevenobiajulu in #384
- fix(docx-mcp): render each footnote marker exactly once in read_file output by @stevenobiajulu in #386
- fix(docx-core): surface text-empty paragraphs anchoring endnotes, comments, or drawings by @stevenobiajulu in #387
Documentation
- docs(docx-core): ratify revisionable AI editing surface in SUPPORT.md (#119) by @stevenobiajulu in #133
- docs(readme): add architecture diagram by @stevenobiajulu in #234
- docs(readme): replace branding header with action-led title and autosync translations by @stevenobiajulu in #237
- docs(spec): add openspec change add-test-corpus-narrative by @stevenobiajulu in #236
- docs(openspec): align spec text with impl — only canonical README.md is auto-generated by @stevenobiajulu in #268
- docs(comments): reclassify addCommentReply as Table B (side-part metadata only) by @stevenobiajulu in #269
- docs(scripts): align conformance script headers with canonical-README contract by @stevenobiajulu in #271
- docs(spec-compliance): enumerate ECMA-376 Non-Goals and hide generator banner by @stevenobiajulu in #292
- docs(openspec): archive merged Lean-spike changes (inv-rt-001 + field-bearing arbitrary) by @stevenobiajulu in #295
CI / Infrastructure
- ci(verification): fix actionlint SC2086 in lean-build zero-sorry audit by @stevenobiajulu in #193
- ci(llm-gate): skip package-lock-only PRs by @stevenobiajulu in #279
- ci(llm-gate): mirror conclusion to PR head SHA on workflow_dispatch by @stevenobiajulu in #288
- ci(llm-gate): path-filter checks + bound per-check diff input (closes #324, fixes #272 large-diff) by @stevenobiajulu in #325
- ci(docx-core): eliminate import cycles + add madge --circular gate (closes #321) by @stevenobiajulu in #323
- ci(release): add ODF release-isolation guard and OpenSpec proposal by @stevenobiajulu in #326
- ci(release): auto-tag version-bump merges so releases cannot strand untagged by @stevenobiajulu in #385
Refactoring
- refactor(verification): weaken inv_field_001 axiom to document-level preservationFriendly (rebased follow-up to #208) by @stevenobiajulu in #220
- refactor(docx-core): extract shared OOXML test fixtures (#221) by @stevenobiajulu in #229
- refactor(scripts): lift shared conformance-registry parser by @stevenobiajulu in #241
- refactor(docx-core): extract shared xml-helpers (dedupe defensive XML access) (closes #311) by @stevenobiajulu in #312
- refactor(docx-core): split document_view into focused modules (closes #315) by @stevenobiajulu in #317
- refactor(docx-core): split inPlaceModifier into focused modules (closes #318) by @stevenobiajulu in #319
Other Changes
- chore(assets): add 400x400 logo for marketplace listings by @stevenobiajulu in #148
- test(docx-core,docx-mcp): final regression suite for canonical emission (#143) by @stevenobiajulu in #175
- chore(verification): atom-level Lean 4 spike with proofs + bridge + CI by @stevenobiajulu in #164
- test(docx-core): extend Lean bridge to pre-tracked paragraph-only document.xml input (closes #194) by @stevenobiajulu in #195
- chore(verification): scaffold OpenSpec change for Tier 2 OoxmlDoc model + inv_field_001 closure by @stevenobiajulu in #202
- test(docx-core): fix intermittent lean-spec-bridge whitespace failure (#203) by @stevenobiajulu in #204
- Update README to clarify Safe Docx positioning by @stevenobiajulu in #254
- chore(readme): UTM-tag usejunior.com privacy link across all 5 READMEs by @stevenobiajulu in #281
- test: pin OOXML preservation invariants (and discover two real bugs) by @stevenobiajulu in #287
- test(docx-comparison): field-bearing fast-check arbitrary for the Lean spec bridge by @stevenobiajulu in #294
- test(docx-comparison): fragmented-field fast-check arbitrary for the Lean spec bridge by @stevenobiajulu in #296
- chore(openspec): archive add-comment-read-tool (already implemented) by @stevenobiajulu in #297
- chore(openspec): archive add-ecma-376-conformance-framework change by @stevenobiajulu in #329
- chore(deps): declare @xmldom/xmldom + jszip as explicit root devDeps by @stevenobiajulu in #332
- test(docx-core): enable three pre-existing skipped tests by @stevenobiajulu in #344
- test(docx-core): wire a libreoffice accept/reject oracle voter into the differential harness by @stevenobiajulu in #345
- chore(gitignore): ignore Office lock files (~$*) by @stevenobiajulu in #277
- test(docx-core): characterize collision/salt-loop in insertParagraphBookmarks (closes #282) by @stevenobiajulu in #284
- test(docx-core): characterize the LibreOffice accept/reject oracle trust boundary by @stevenobiajulu in #364
- chore(release): fold @usejunior/odf-core into the suite release train by @stevenobiajulu in #373
- chore(release): bump workspace versions to 0.10.0 by @stevenobiajulu in #375
New Contributors
- @dependabot[bot] made their first contribution in #89
Full Changelog: v0.9.1...v0.10.0