Releases: sergey-tihon/Clippit
Releases · sergey-tihon/Clippit
Release list
3.9.0 - August 12, 2026
- perf: optimize immutable lookups, dictionary access, enumeration, and string slicing across Excel, HTML, PowerPoint, and Word (#444, #445, #448, #450, #451, #452, #454, #459, #462, #463, #466, #470)
- refactor: modernize core types and remove dead code/debug scaffolding from production and tests (#443, #456, #458, #459, #461)
- test(common): add
StrictOoxmlTranslatorcoverage (#447) - chore(deps): update SkiaSharp 4.150.1 → 4.151.1, TUnit 1.59.0 → 1.64.13, JsonSchema.Net 9.2.2 → 9.4.0, and System.CommandLine preview.5 → preview.7 (#442, #455, #457, #463, #467, #469)
- chore(ci): bump
actions/setup-dotnetfrom 5 to 6 (#446)
3.8.0 - July 19, 2026
- feat(cli): add
clippit install --skillscommand to install bundled Clippit workspace skills for OpenCode, Pi, and Claude Code assistants - perf: convert static readonly
DictionarytoFrozenDictionaryin PowerPoint and Word (#434) - perf: convert static readonly
DictionarytoFrozenDictionaryin Word and Html (#435) - perf: convert static readonly
DictionarytoFrozenDictionaryin Excel, Html, and Word (#437) - perf(word): use
Dictionaryfor O(1) image deduplication inDocumentBuilder(#428) - test(common): strengthen
MetricsGettertests with structural assertions (MG002-MG014) (#436) - test+refactor:
StringExtensions.SplitAndKeeptests +fr_FRdead code removal (#430) - chore(deps): update SkiaSharp 4.148.0 → 4.150.0 (#429)
- chore(deps): update SkiaSharp 4.150.0→4.150.1, TUnit 1.58.0→1.59.0, Test.Sdk 18.7.0→18.8.1 (#431)
- chore(deps): bump actions/setup-node from 6 to 7 (#433)
3.7.0 - July 12, 2026
- feat(cli): add
clippit word build init/runcommand (#422) - feat(cli): add
clippit excel createcommand (#423) - feat: add
clippit word consolidatecommand (#419) - feat(word): add
RegisterCustomHandlerextensibility toDocumentAssembler(#417) - feat(cli): add
clippit word simplify-markupcommand (#412) - feat(cli): add
clippit word assemblecommand (#405) - feat(cli): add
clippit word accept-revisionscommand (#406) - perf(word): fix image deduplication in
DocumentBuilder(#415) - fix(excel): correct dimension element and table id in
SpreadsheetWriter(#425) - fix(excel): keep
tableColumnscount in sync when data rows are wider than headings (#404) - fix(word): respect
xml:space="preserve"inUnicodeMapper.RunToString(#411) - fix: correct
OpenXmlRegexmatching withlastRenderedPageBreak(#409) - fix(word): correct
DocumentAssemblerxml:spacepreservation for content text (#408) - fix: isolate Sample2 output dirs to prevent parallel test collision
- test(cli): add JSON contract tests for word assemble, consolidate, and excel create (#427)
- test: add
OpenXmlRegexcallback/delete tests and PPTXTextReplacertests (#426) - docs: split CLI docs by format (#413)
- ci: migrate NuGet publish to trusted publishing (OIDC) (#407)
3.6.0 - July 4, 2026
- feat(word): add German and Spanish localized list-item text getters (
de-DE,es-ES) (#389) - feat(cli): add
word comparecommand for DOCX diff (#365) - feat(cli): add Windows ARM64 npm binary (#363)
- feat(cli): add Linux ARM64 npm binary (#360)
- perf: use
FrozenSet<T>forHashSetlookups (#361) - perf: convert
DictionarytoFrozenDictionary(#362) - perf: replace remaining
List<T>withFrozenSet<T>inPtOpenXmlUtil(#371) - fix: guard
TextReplaceragainstIndexOutOfRangeExceptionon empty replacement string (#381) - fix(word): add
Optional="true"support toConditionaldirective inDocumentAssembler(#382) - feat(word): add
HeaderRowCountattribute toDocumentAssemblerTabledirective for multi-row headers (#387) - fix: guard
WmlComparer.HashBlockLevelContentagainstArgumentNullExceptionfrom missingpt:Unidattributes (#380) - fix: guard
WmlComparer.FindIndexOfNextParaMarkagainstInvalidCastExceptionfrom non-ComparisonUnitWordunits (#385) - fix(html): preserve
w:anchorfragment on external hyperlinks — append#anchorwhen the URL has no existing fragment (#384) - fix(html): correct
rowspanfor vertically merged cells when preceding cells usew:gridSpan(#383) - fix(pptx): handle
ExtendedPartchart workbooks inCopyChartObjectsandCopyExtendedChartObjects— prevents silent data loss when a chart's external data relationship resolves to anExtendedPart(#388) - refactor: modernize
== null/!= nulltois null/is not nullacross 20+ files (#349, #350, #352, #353, #355, #356) - test: add
FieldRetriever.ParseFieldunit tests FR001–FR010 (#354) - test: add regression tests for
TextReplacerempty-string replacement TR007–TR008 (#381) - test: add regression tests for
WmlComparerdefensive fixes WC380, WC385 (#380, #385) - chore(deps): update TUnit 1.56.35 → 1.57.17 (#351, #359, #369)
- chore(ci): update
actions/checkoutv6 → v7 (#347)
3.5.1 - June 23, 2026
- chore(deps): update SkiaSharp 3.119.4 → 4.148.0 with migration fix (#346)
- chore(deps): update Microsoft.NET.Test.Sdk 18.6.0 → 18.7.0 (#346)
- chore(deps): update dotnet-outdated-tool 4.7.1 → 4.8.1 (#346)
- chore(deps): update csharpier 1.2.6 → 1.3.0 (#346)
- chore(deps): update System.CommandLine 3.0.0-preview.4 → preview.5 (#346)
- fix: replace deprecated
SKPaint.MeasureTextwithSKFont.MeasureTextfor SkiaSharp 4.x compatibility (#346)
3.5.0 - June 20, 2026
- feat: replace SixLabors.ImageSharp with SkiaSharp for all image processing (#341)
- feat: add Linux native SkiaSharp asset support (
SkiaSharp.NativeAssets.Linux.NoDependencies) (#341) - fix(html): guard null
srcAttributeinLoadImageForTransformto preventNullReferenceException(#341) - fix(html): encode image before adding
ImagePartto prevent dangling empty relationship on encode failure (#341) - fix(docs): update
WmlToHtmlConvertertutorial from ImageSharp to SkiaSharp API (#341) - fix(docs): add
using SkiaSharp;note in tutorial code sample (#341) - refactor: replace
Image.Load/Image.SavewithSKBitmap.Decode/SKImage.Encodeacross all converters and helpers (#341) - refactor: replace
SixLabors.Fontstext measurement withSKTypeface/SKPaint.MeasureTextinMetricsGetterandPtOpenXmlUtil(#341) - refactor: use safe fallback chain for
GetTextWidth—ArgumentExceptioncatch now works correctly after removing blanket catch in_getTextWidth(#341) - fix(cli): use
FileMode.Createinstead ofFileMode.OpenOrCreateinDefaultImageHandlerto avoid corrupted image on re-encode (#341) - fix(cli): return
nullinstead ofnull!inCreateInlineImagefailure paths (#341) - fix(test): add explicit null-check with
InvalidOperationExceptioninBuildTestPngSkiaSharp encode (#341) - perf: wrap
SKTypeface/SKFont/SKImagewithusingto prevent native handle leaks (#341) - chore(deps): remove
SixLabors.ImageSharp.Drawingdependency (#341) - chore(deps): add
SkiaSharp 3.119.4(#341)
3.4.7 - June 16, 2026
- feat(cli): add
word to-html,word from-html, andexcel to-htmlcommands (#338) - fix(powerpoint): support ISO/IEC 29500 Strict OOXML presentations — translate Strict namespace URIs lazily via
XmlReaderwrapper inGetXDocument()(#339) - fix(powerpoint): translate
<a:graphicData uri=…>content-type URIs and fix sourceXDocumentmutation inCopyPresentationParts(#340) - refactor: modernize
as+ null-check tois notpattern matching inWmlToHtmlConverterandWmlToXml(#336) - chore(deps): update TUnit 1.49.0 → 1.54.0 (#337)
3.4.6 - June 10, 2026
- feat(cli): add
word verifyandexcel verifycommands (#329) - fix(html): convert
w:pageBreakBeforeparagraph property to CSSpage-break-before(#325) - refactor: modernize
as+ null-check tois notpattern matching inOpenXmlRegex(#315) - chore(deps): update TUnit 1.48.6 → 1.49.0 (#327)
- chore(deps): update JsonSchema.Net 7.4.0 → 9.2.1 (#317)
3.4.5 - June 3, 2026
- feat: add Clippit CLI —
pptx split,pptx build,pptx verify, andversioncommands (#309) - fix(pptx): fix PowerPoint relationship copying edge cases — prevent missing parts after slide copy (#312)
- fix(cli): set
AssemblyName=clippitto avoid NativeAOT rename on Windows - fix(cli): use
$(ExeSuffix)inRenameNativeAotExecutableMSBuild target - fix(cli): fix npm publishing workflow
- refactor: modernize
as+ null-check tois notpattern matching inRevisionProcessor(#307) - refactor: modernize
as+ null-check tois notpattern matching inMarkupSimplifier(#308) - test(excel): expand
WorksheetAccessortests —SetCellValue/GetCellValueround-trips WA004–WA013 (#314) - chore(deps): update TUnit 1.47.0 → 1.48.6 (#313)
- docs: add README for Clippit.Cli NuGet tool and npm clippit package (#320)
- docs: restore classic Clippy hero image and redesign homepage with retro Clippy speech bubble
3.4.4 - May 20, 2026
- fix(pptx): prevent
NullReferenceExceptioninGetSlideTitlewhencSld/spTreeis missing (#287) - fix(html): render Word page breaks as CSS
page-breakdiv in HTML output (#281) - fix(word):
RemoveSoftHyphensandRemoveLastRenderedPageBreakinMarkupSimplifierwere silently ignored (#284) - perf: replace
ToUpper()+StartsWith()withOrdinalIgnoreCasecomparisons (#282) - perf: replace
.Where(pred).Count()with.Count(pred)andCount()!=1withSkip(1).Any()(#270) - perf: replace
ContainsKey+indexer double-lookups withTryGetValue(#274) - refactor: modernize
GetListItemTextlocale files (#283) - refactor: modernize
UnicodeMapper.cs(#278) - refactor: modernize Word/Assembler helper files (#275)
- refactor: modernize
MetricsGetter.cs— file-scoped namespace,is null/is not null, pattern matching (#273) - refactor: modernize
FieldRetriever.cs— file-scoped namespace,W.*constants,is null, slices,TryGetValue(#272) - refactor: simplify
Select().SelectMany()chains inWmlComparertoSelectMany()(#271) - refactor: simplify
FileUtils.GetFilesRecursiveusingSearchOption.AllDirectories(#268) - refactor: modernize null checks to use
ArgumentNullException.ThrowIfNull(#265) - test: add unit tests for
OpenXmlPowerToolsDocumentandOpenXmlMemoryStreamDocument(OXD001–OXD040) (#266) - test: add
ReferenceAdderunit tests (RA100–RA140) and fixAddTofw:dirtynamespace bug (#263) - chore(deps): update TUnit 1.43.11 → 1.45.8 (#264, #267, #276, #277)