Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
2754 commits
Select commit Hold shift + click to select a range
285d402
fix(docx/dump): accept noMarkRPrInherit on add run to silence batch w…
goworm May 18, 2026
59ddc54
fix(pptx/transition): drop invY for p15 -out + add cube/rotate/orbit/…
goworm May 18, 2026
d9d6b2e
fix(docx/dump): do not clear docDefaults.font.latin when source has e…
goworm May 18, 2026
317b88f
fix(pptx/schema): declare textbox name and lang properties
goworm May 18, 2026
a7f32f6
fix(pptx/schema): declare zorder as add/set on shape (+ textbox already)
goworm May 18, 2026
88b3f08
docs(examples/pptx/transitions): strip OOXML internals from trio .md …
goworm May 18, 2026
3956ac1
fix(pptx/shape): omit shape-level size/color when runs disagree
goworm May 18, 2026
258fc9a
fix(pptx/slide): bind auto-emitted content shape to layout body slot
goworm May 18, 2026
cfc9b7a
docs(schema/pptx): clarify slide layout slot population and table rea…
goworm May 18, 2026
c908b2b
docs(cli): document per-handler parent path conventions on add
goworm May 18, 2026
d0a184d
docs(schema): single-quote example paths so zsh doesn't glob-expand
goworm May 18, 2026
11e1bdd
fix(pptx/dump): emit chart axis-role set rows for non-default props
goworm May 19, 2026
e3daed8
fix(pptx/dump): emit presentation-level attrs beyond slide size
goworm May 19, 2026
8fe6884
fix(pptx/dump): preserve zorder on group emit
goworm May 19, 2026
bc1b5d3
fix(schemas): declare emitted props matching dump output
goworm May 19, 2026
39aa84e
fix(pptx/chart): anchor varyColors after radarStyle/scatterStyle; anc…
goworm May 19, 2026
29ebc94
fix(pptx/chart): emit series transparency as percent so dump round-trips
goworm May 19, 2026
aa51926
fix(pptx/dump): emit add run instead of set run[1] when placeholder s…
goworm May 19, 2026
e571f97
fix(pptx/dump): defer run-level slide-jump link instead of dropping it
goworm May 19, 2026
909b149
fix(pptx/chart): accept outlineColor / outlineWidth / outlineDash on …
goworm May 19, 2026
06bae07
fix(pptx/dump): emit per-series gradient / outlineWidth / outlineDash…
goworm May 19, 2026
2a9fb8c
fix(pptx): preserve absent idx on subtitle placeholder add
goworm May 19, 2026
c10d70c
fix(pptx): round-trip gradient stroke on shape and connector lines
goworm May 19, 2026
bbdc10a
fix(pptx/chart): also anchor chart-level crossBetween before majorUnit
goworm May 19, 2026
bd6143c
fix(chart): defer series outline subkeys so add-path round-trips
goworm May 19, 2026
2ac95f9
fix(pptx/connector): read line.gradient back from outline GradientFill
goworm May 19, 2026
958dfeb
fix(chart): preserve trendline poly order / movingAvg period on readback
goworm May 19, 2026
df886e6
fix(chart): preserve gradient angle=0 on readback
goworm May 19, 2026
4d3366c
fix(pptx/shape): accept colon-separated gradient angle on input
goworm May 19, 2026
ff0db84
fix(chart): null-coalesce TrendlineType.InnerText at FormatTrendlineS…
goworm May 19, 2026
71e472b
fix(pptx/dump): chart axis-set uses positional path; stop emitting gr…
goworm May 19, 2026
79e8bd1
fix(pptx/dump): include trendline keys in per-series flatten
goworm May 19, 2026
5f2ef3e
fix(pptx/add): accept line.gradient on connector and shape
goworm May 19, 2026
0358165
fix(chart): scatter series accepts colors[] like bar/line/radar builders
goworm May 19, 2026
2a86f35
fix(chart): ParseDashStyle accepts OOXML camelCase dash names
goworm May 19, 2026
d5c5d15
fix(chart): preserve all per-series trendlines on read and replay
goworm May 19, 2026
d61eaa3
fix(chart): 1-stop series gradient emits and replays instead of silen…
goworm May 19, 2026
1b2e64f
fix(chart): dashDot maps to PresetLineDashValues.DashDot, not SystemD…
goworm May 19, 2026
d41e21e
fix(chart): trendline rejects unknown type instead of silent Linear f…
goworm May 19, 2026
aef4756
fix(chart): axis[@role=value2] majorUnit/minorUnit write to secondary…
goworm May 19, 2026
51b474d
fix(pptx/dump): strip chart-level trendline once per-series rows emit
goworm May 19, 2026
7852c35
fix(chart): per-series errBars round-trip carries magnitude on dump
goworm May 19, 2026
5bb217d
fix(chart): autoTitleDeleted round-trips on dump for scatter and friends
goworm May 19, 2026
2d7fa77
fix(chart): area+referenceLine reads as area, dump emits referenceLin…
goworm May 19, 2026
73d14ec
fix(chart): scatter series ln drops NoFill before adding SolidFill/Wi…
goworm May 19, 2026
c6d30a8
fix(chart): errbars=percentage now maps to ErrorValues.Percentage
goworm May 19, 2026
51744d3
fix(chart): linedash maps native presets distinct from system aliases
goworm May 19, 2026
c77bf08
fix(chart): setting title back clears autoTitleDeleted
goworm May 19, 2026
722c8a8
fix(chart): pie/doughnut/stock honor series{N}.color on Add
goworm May 19, 2026
3da3ef1
fix(pptx/dump): drop primary-value-axis duplicates already emitted as…
goworm May 19, 2026
c704ad7
fix(chart): combo builder honors comboTypes for non-column+line mixes
goworm May 19, 2026
31a5782
fix(chart): multiple reference lines accumulate via semicolon-joined …
goworm May 19, 2026
fe29c5f
fix(pptx/dump): fold transitionDuration into transition compound form
goworm May 19, 2026
1862a2a
fix(chart): chart-level marker summary skips reference-line overlay s…
goworm May 19, 2026
247f484
fix(pptx/dump): empty paragraph + lang-only collapsed run skipped on …
goworm May 19, 2026
2f2c7c0
fix(pptx/chart): errBars on lineChart and line3DChart series no longe…
goworm May 19, 2026
9c97461
feat(pptx/chart): emit dropLines/hiLowLines/upDownBars on line chart …
goworm May 19, 2026
a9b9b1c
docs(schemas/chart): align errbars help with canonical CLI tokens (fi…
goworm May 19, 2026
3b79cfe
docs(schemas/lineDash): document dashDotDot as an explicit alias for …
goworm May 19, 2026
298ef2c
fix(chart): per-series spPr inserted in schema position, not appended
goworm May 19, 2026
e36de60
fix(chart): droplines/hilowlines=false removes overlay without throwing
goworm May 19, 2026
52754af
fix(chart): updownbars accepts bare gapWidth value
goworm May 19, 2026
4998ce8
fix(pptx/dump): skip per-series row when chart-level summary matches
goworm May 19, 2026
6f689af
fix(pptx/chart): accept color=none for series fill (per-series and pi…
goworm May 19, 2026
2778017
fix(pptx/chart): ApplySeriesMarker preserves per-series size/spPr/extLst
goworm May 19, 2026
329f44a
fix(pptx/group): accept nested-group parent path for add and zorder
goworm May 19, 2026
8b2c3bf
fix(pptx/chart): gradient fan-out preserves per-series gradient
goworm May 19, 2026
254d48a
fix(pptx/chart): areafill= clears existing NoFill before writing new …
goworm May 19, 2026
b1ca4e0
fix(pptx/chart): ApplyDataPointColor accepts color=none, emits NoFill
goworm May 19, 2026
a666276
fix(pptx/chart): Reader emits color=none for NoFill series and data-p…
goworm May 19, 2026
0dd1df4
fix(pptx/issues): view issues respects in-memory slide rels, no false…
goworm May 19, 2026
a913062
fix(chart): emit line_stacked / line_percentStacked from chartType re…
goworm May 19, 2026
b39bd9d
fix(chart): surface and accept markerColor so the third marker slot r…
goworm May 19, 2026
1c321a6
fix(chart): dump labelFont size / color / bold / name so data-label s…
goworm May 19, 2026
b5bb757
fix(pptx/chart): enforce schema order across axis / series / chartGro…
goworm May 20, 2026
7554acd
fix(pptx/chart): reader gaps and axisFont pt-suffix size
goworm May 20, 2026
0b177ba
fix(pptx/handler): add / set / remove symmetry across shape, run, tab…
goworm May 20, 2026
e84b606
fix(pptx/query): zorder / isTitle / regex filters and selector aliasing
goworm May 20, 2026
54e5bd0
fix(cli): trim resident stderr to first line; align add-part help wit…
goworm May 20, 2026
d5f05f3
docs(schemas): remove picture marker, fix list= values, align with ha…
goworm May 20, 2026
e0a9b5b
fix(excel,word/chart): drop Where() on TrackingPropertyDictionary for…
goworm May 20, 2026
06cc700
ci: drop dotnet-quality preview to pull .NET 10 GA SDK
goworm May 20, 2026
fc24ebe
docs(examples/pptx): exhaustive shape / textbox / picture trios
goworm May 20, 2026
3780dbc
feat(resident,handler): save verb + shared FileStream open for word/e…
goworm May 20, 2026
05f4157
ci: add .NET 8-only runtime smoke test on linux-x64
goworm May 20, 2026
41dd54b
chore: bump version to 1.0.95
goworm May 20, 2026
ec129f5
feat(pptx/animation): support chart animations + chartBuild for per-s…
goworm May 20, 2026
9454095
feat(pptx/animation): Get / Set / Query / Remove parity for /slide[N]…
goworm May 20, 2026
b0fec9f
fix(pptx/animation): emit <p:bldAsOne/> for chartBuild=asWhole — empt…
goworm May 20, 2026
7b07fc8
fix(pptx/animation): fan out chart per-element builds into N click-gr…
goworm May 20, 2026
3e5dec8
feat(pptx/animation): add 16 template-backed exit effects (Boomerang,…
goworm May 20, 2026
0a8c712
feat(pptx): add 15 template-backed emphasis animations
goworm May 20, 2026
8c91159
feat(release-mirror): primary download/SKILL through d.officecli.ai
goworm May 21, 2026
acba6e3
ci(build): smoke-test install.sh / install.ps1 on each platform
goworm May 21, 2026
d489786
feat(cli/error): hint Git Bash MSYS path rewrite in error output
goworm May 21, 2026
436c328
Merge branch 'main' of https://github.com/iOfficeAI/OfficeCLI
goworm May 21, 2026
1752988
chore: bump version to 1.0.96
goworm May 21, 2026
5efa79e
fix(build): silence CS8602 nullable warnings in FormatBevel/outline r…
goworm May 21, 2026
867d265
fix: bundle of interview-team edit-command bug fixes (R1–R12)
goworm May 20, 2026
49ad5ed
fix(pptx): route add --type linebreak through shape-paragraph resolver
goworm May 20, 2026
f3f9ddf
fix: interview-realuse R1–R4 bundle (10 real bugs)
goworm May 21, 2026
661c6d8
feat(metadata): stamp OfficeCLI audit trail in docProps/custom.xml on…
goworm May 21, 2026
30f2d82
fix(word): emit typed add textbox in dump round-trip instead of doubl…
goworm May 21, 2026
fc694df
fix(pptx): paragraph set direction=rtl no longer writes rPr rtl on runs
goworm May 21, 2026
50aec58
fix(pptx/schema): clarify shape.tooltip requires link, mirror picture…
goworm May 21, 2026
dcaa4f8
fix(pptx/schema): declare table.colWidths to match handler
goworm May 21, 2026
749537b
fix(pptx/dump): defer picture set-only effects out of add op props
goworm May 21, 2026
c529683
fix(pptx/chart): markercolor routed through deferred-set so series co…
goworm May 22, 2026
73e3a22
docs(install): drop region-specific comment from mirror block
goworm May 22, 2026
4b68408
fix(pptx/schema): mark chart/table/group zorder and chart.chartType a…
goworm May 22, 2026
837b030
fix(pptx/chart): labelFont.* dotted subkeys routed through deferred-s…
goworm May 22, 2026
b13f290
fix(pptx/anim): preserve duration on template-based emphasis effects
goworm May 22, 2026
816dc55
fix(pptx/placeholder): preserve geometry, suppress auto-idx when call…
goworm May 22, 2026
2fe3a99
fix(pptx/anim): drop hardcoded direction on fillColor/lineColor empha…
goworm May 22, 2026
c574db7
fix(pptx/shape): stop seeding lang=en-US on empty-text shapes
goworm May 22, 2026
53ed12c
chore(assets): refresh showcase gifs with newer captures (2x speed)
goworm May 22, 2026
b0bcef7
fix(pptx): NodeBuilder walks spTree in declared element order
goworm May 22, 2026
c46cedd
fix(pptx/chart): combo labelPos applies per-group; yaxis.labelRotatio…
goworm May 22, 2026
2af1424
fix(pptx/dump): shape emit no longer assumes seeded first run on replay
goworm May 22, 2026
1bd05f2
feat(pptx/dump): morph + p14/p15 transitions and motion-path timing r…
goworm May 22, 2026
7ac7c07
feat(pptx/dump): SmartArt round-trip via add-part smartart + raw-set …
goworm May 22, 2026
d65beb7
fix(word/dump): two real-corpus round-trip drifts surfaced by fidelit…
goworm May 22, 2026
413682b
fix(docx/chart): exclude refLine series from data string on dump
goworm May 22, 2026
b9a3a6e
fix(docx/hyperlink): AddHyperlink consumes font.latin
goworm May 22, 2026
35feb17
fix(docx/style): style Get emits only canonical 'direction', drops 'b…
goworm May 22, 2026
dd62ace
fix(docx/section): AddSection consumes columns.equalWidth and style a…
goworm May 22, 2026
cb9b036
fix(word/dump): trailing paragraph after nested table is structurally…
goworm May 22, 2026
3310e0b
fix(pptx/dump): probe also detects am3d: 3D model namespace
goworm May 22, 2026
91a9f9e
feat(pptx/dump): embedded video/audio round-trip via add-part + raw-s…
goworm May 22, 2026
93f6c92
feat(pptx/dump): embedded am3d 3D-model round-trip via add-part + raw…
goworm May 22, 2026
3d3a59e
feat(pptx/dump): embedded OLE object round-trip via add-part + raw-se…
goworm May 22, 2026
d89c13a
docs(pptx-schema): declare shape.isTitle readback
goworm May 22, 2026
0bbd2f0
docs(schema): tighten verbose element notes across all three formats
goworm May 22, 2026
28af545
feat(skill): embed umbrella SKILL.md from skills/officecli/, fix gh s…
goworm May 22, 2026
80458d5
refactor(skill): make skills/officecli/SKILL.md a symlink to root SKI…
goworm May 22, 2026
2052e90
feat(xlsx/pivot): label/topN persistent filters, x14 fillDownLabels, …
goworm May 24, 2026
bbf62e5
perf(word/navigation): cache body paragraph/table index to fix O(n²) …
goworm May 24, 2026
c3d7dc6
chore: bump version to 1.0.97
goworm May 24, 2026
42b98fc
feat(docx): trackChange=moveFrom/moveTo low-level synthesis primitives
goworm May 24, 2026
6e7ad29
docs: v1.0.97 — surface plugins, view modes (pdf/svg/forms), pptx dum…
goworm May 24, 2026
57c5bdc
refactor(docx): unify revision id allocation with paraId pool
goworm May 24, 2026
bc73ba2
feat(docx): set + trackChange decorator for rPrChange/pPrChange capture
goworm May 25, 2026
d941edd
feat(docx): move + trackChange auto-pairs moveFrom/moveTo (run-level)
goworm May 25, 2026
c5045dd
feat(docx): remove + trackChange auto-wraps in w:del (run/paragraph)
goworm May 25, 2026
f1aeb73
feat(docx): set + trackChange extends to sect/tbl/tc/tr PrChange
goworm May 25, 2026
690ecb0
feat(docx): add row + trackChange.author marks row as inserted (no ca…
goworm May 25, 2026
56fd631
feat(docx): add paragraph + trackChange.author marks ¶ and content as…
goworm May 25, 2026
3b08005
feat(docx): complete table row/cell/col coverage for trackChange
goworm May 25, 2026
8ec8a7e
feat(docx): close trackChange dump→batch round-trip gaps
goworm May 25, 2026
422a0c6
refactor!: rename PackageProperties.Revision key from `revision` to `…
goworm May 25, 2026
d9e812f
refactor!(docx): unify revision API — rename trackChange.* → revision…
goworm May 25, 2026
de58f86
feat(docx): per-target revision accept/reject via /revision selector
goworm May 25, 2026
41de08d
feat(docx): query revision full type coverage + nativePath
goworm May 25, 2026
ee946eb
feat(docx): native-path revision=accept|reject closes the silent-misr…
goworm May 25, 2026
6e1495c
refactor!(docx): split revision into revision.type + revision.action
goworm May 25, 2026
55d458d
docs(docx/revision): catalog paraMarkIns + *PrChange + nativePath sub…
goworm May 25, 2026
74afaed
fix(schemas): finish revisionNumber rename across docx/xlsx/pptx
goworm May 25, 2026
439dcf7
feat(docx): /revision path keys off w:id when present, [N] is fallback
goworm May 25, 2026
ba07f67
fix(docx): tighten /revision get filters + loud-fail on missing @id
goworm May 25, 2026
dcd8660
fix(docx): set + revision.type=ins|del|moveFrom|moveTo wraps run inst…
goworm May 25, 2026
5ddf75f
feat(docx): set + revision.* on a run requires a real action (D2) + e…
goworm May 25, 2026
0f1f9a3
fix(docx): set + revision.type=moveFrom|moveTo emits Range markers so…
goworm May 25, 2026
2f47f72
fix(docx): dump→batch round-trip restores real tblPrChange / trPrChan…
goworm May 25, 2026
5db1395
fix(docx): cascade per-row tblPrExChange so Mac Word renders table-le…
goworm May 25, 2026
3b84172
fix(docx): capture tblGridChange when set + revision on a cell mutate…
goworm May 25, 2026
e2e3a0a
fix(docx): coalesce contiguous moveFrom / moveTo wraps into a single …
goworm May 25, 2026
bd680d6
fix(docx): cascade per-row tblPrExChange must use unique revision ids
goworm May 25, 2026
5fd9c59
fix(docx): stamp compatibilityMode=15 + Word-2013+ companion compatSe…
goworm May 25, 2026
a28c3a1
docs(examples): add docx revision API coverage trio under examples/wo…
goworm May 25, 2026
3d4ead2
fix(ci): add least-privilege permissions to skill-parity workflow
goworm May 25, 2026
1a69012
docs: v1.0.98 — revision API redesign (revision.type + revision.actio…
goworm May 25, 2026
da03e41
refactor(cli): group mark/unmark/marks/goto under `watch` subcommand
goworm May 25, 2026
e9bba5f
feat(docx): find + revision support — Word-style Find&Replace with Tr…
goworm May 25, 2026
8f35a4c
docs(skill): v1.0.98 — switch trackChange.* table row to revision.typ…
goworm May 25, 2026
0c07fdb
fix(docx/dump): /p/r[N] skips runs inside child textbox/sdt/fldSimple
goworm May 25, 2026
5627869
fix(pptx): dump shape image fill (blipFill) as data URL so replay res…
goworm May 25, 2026
7e72e6b
fix(chart): labelFont compound 3rd slot accepts fontname (was bold-only)
goworm May 25, 2026
299430c
fix(chart): legendFont / axisFont color readback retains '#' prefix
goworm May 25, 2026
9e29042
docs(docx/revision): surface D2 strictness + find breadcrumb + operat…
goworm May 25, 2026
2823c09
fix(chart): per-series labelFont (compound + dotted) reuses chart-lev…
goworm May 25, 2026
89582b2
fix(pptx): chart Setter reports gapWidth/overlap as unsupported on no…
goworm May 25, 2026
f85c9ea
fix(docx/dump): multi-drawing paragraph keeps side-by-side textbox la…
goworm May 25, 2026
d5ca396
docs(examples/revisions): 7a uses regex lookbehind to track only the …
goworm May 25, 2026
a9aed01
fix(docx/dump): tables nested inside a textbox survive round-trip
goworm May 25, 2026
2d1c889
fix(chart): chart-level dLbls readback ignores series-level dLbls
goworm May 25, 2026
a511dd5
fix(pptx): materialize inherited placeholder in layout phType order s…
goworm May 25, 2026
8aa55ea
fix(pptx): Add placeholder rejects duplicate phType on the same slide
goworm May 25, 2026
c00cdb2
fix(pptx-chart): series-level labelFont round-trips through dump/replay
goworm May 25, 2026
512af0e
docs(examples/revisions): scrub self-referential find targets in 7c/8…
goworm May 25, 2026
c42202a
fix(pptx-chart): per-data-point sub-keys round-trip through dump/replay
goworm May 25, 2026
bd21b06
fix(docx/numbering): accept OOXML attribute names as aliases on add a…
goworm May 25, 2026
0ef442f
fix(pptx-chart): point{M}.marker / markerSize / markerColor apply to dPt
goworm May 25, 2026
f4cad14
fix(cli): raw-set validates action before xpath; batch 'set' rejects …
goworm May 25, 2026
a2b5e44
fix(pptx): Set "Shape N not found" reports total like Remove and Get do
goworm May 25, 2026
37f43cc
docs(docx/numbering): document abstractNum, num, level help schemas
goworm May 25, 2026
0147be8
fix(pptx/dump): skip empty-props set for first-paragraph seed
goworm May 25, 2026
9723b1b
fix(pptx/picture): expose relId/contentType/fileSize on Get so `get -…
goworm May 25, 2026
857b33c
fix(pptx/animation): template-effect L2 props (repeat/restart/autoRev…
goworm May 25, 2026
c848502
fix(formula/latex): matrix cells emit single-space delimiters, stable…
goworm May 25, 2026
86b8de8
fix(pptx): query "slide chart" returns charts not slides; CSS descend…
goworm May 25, 2026
ca660d9
fix(formula/latex): upright function-name runs (sin/cos/...) round-tr…
goworm May 25, 2026
647c82b
fix(formula/latex): unbraced single-arg skips leading whitespace, kee…
goworm May 25, 2026
382d3ce
fix(raw-set): xpath miss throws ArgumentException; mutation contract …
goworm May 25, 2026
6dd6ada
fix(raw-set): inject mc:Ignorable on root when mc:Choice fragments la…
goworm May 25, 2026
304d919
fix(chart): combo chart series rebuilt as target type, not cloned as …
goworm May 25, 2026
47b7470
fix(raw-set): reorder p:sld children into schema order after mutation
goworm May 25, 2026
859827d
fix(pptx-dump): pre-declare ambient prefixes so slice normalize parse…
goworm May 25, 2026
70585fb
fix(pptx): placeholder Get keeps child paths under placeholder[K]
goworm May 25, 2026
44f1afc
fix(pptx): reject unsupported selectors, union comma list, warn on [k…
goworm May 25, 2026
63fdfd4
docs(xlsx-cell): document Set auto-vivify on in-bounds cells
goworm May 25, 2026
069a823
fix(pptx): add-part smartart injects host graphicFrame so dump round-…
goworm May 25, 2026
90549d6
fix(docx/style): w:link round-trips Get/Add/Set so paired character s…
goworm May 25, 2026
7fef61d
fix(pptx/dump): custShowLst and extLst pass through with rId-stale wa…
goworm May 25, 2026
cd0042a
fix(pptx): smartart stub frame uses Presentation cNvPr type when scan…
goworm May 25, 2026
e12b91c
fix(pptx): axis title.font parses composite "size:color:font" spec
goworm May 25, 2026
61e5e2a
fix(pptx): dump preserves slide clrMapOvr and slide-level extLst
goworm May 25, 2026
f4a8ac1
fix(pptx/dump): media timing (<p:audio>/<p:video>) survives round-trip
goworm May 25, 2026
af8cc88
fix(pptx): strip unused extension xmlns decls from slice root in dump
goworm May 25, 2026
6c9ce9e
fix(docx/dump): ole runs surface as envelope warning instead of silen…
goworm May 25, 2026
96a17b1
fix(docx/dump): preserve nested fields and surface malformed begin-on…
goworm May 25, 2026
84e18bb
chore(tests): align tests with canonical Get keys (ilvl, instruction,…
goworm May 26, 2026
429325f
docs(schemas): align pptx schemas with handler reality
goworm May 26, 2026
cee0b5b
fix(pptx): shape Add rejects standalone tooltip without link
goworm May 26, 2026
62625ce
fix(update-checker): stop spawn-spam on read-only home, shorten UA
goworm May 26, 2026
0e2ba81
fix(chart): preserve sibling element when setting crosses + crossesAt…
goworm May 26, 2026
1f34710
fix(docx): honor Val attribute when reading bold.cs / italic.cs
goworm May 26, 2026
f3181d7
revert(pptx): drop tooltip-requires-link guards and read-only-prop re…
goworm May 26, 2026
e8598ec
fix(schema): equation.formula get=true is pptx-only; shared base reve…
goworm May 26, 2026
84c01be
revert(handlers): drop RawSet null-arg guards on Excel/Word
goworm May 26, 2026
cfb4c55
fix(docx/formula): emit valid OOXML for mathbb/mathcal scripts and ca…
goworm May 26, 2026
6e1cf34
feat(docx/formula): recognize \iff \mid \land \| and related logic/ar…
goworm May 26, 2026
7503ef2
docs(examples): expand word/formulas.sh to cover full LaTeX feature s…
goworm May 26, 2026
973fd33
fix(docx/formula): consume \sum/\int base across the inter-token whit…
goworm May 26, 2026
27e4089
fix(pptx/placeholder): route size=full|half|quarter to <p:ph sz=...> …
goworm May 26, 2026
96934b5
fix(xlsx/formula): empty-cell refs coerce to "" in string concat, 0 i…
goworm May 26, 2026
1b4cc6c
feat(docx/i18n): create now honors locale — auto-RTL for ar/he/fa/ur,…
goworm May 26, 2026
305f561
fix(docx/i18n): RTL-agent friction fixes from real-world UX test
goworm May 26, 2026
2b7bda3
fix(docx): wire w14 namespace + surface bare-key UNSUPPORTED for add …
goworm May 26, 2026
dd5b90e
fix(docx/run): align/halign/alignment on a run reports the canonical …
goworm May 26, 2026
a2fc595
fix(docx): drop dead 'scope' key from find prop skip-list
goworm May 26, 2026
a7e3703
feat(cli): introduce --find selector flag on query and set
goworm May 26, 2026
b69fbd6
feat(cli): promote --replace to top-level flag on set
goworm May 26, 2026
b5a7fac
chore: bump version to 1.0.99
goworm May 26, 2026
000d2fe
chore(deps): bump OpenMcdf 3.1.3 -> 3.1.4 (GHSA-5qwm-7pvp-w988)
goworm May 26, 2026
832af4f
chore: bump version to 1.0.100
goworm May 26, 2026
2ad28fe
feat(xlsx): detect table-shaped blocks in query + surface tables/char…
goworm May 26, 2026
d06bbbe
docs(examples): migrate revisions example to --find/--replace flags
goworm May 26, 2026
7c5f36e
feat(agents-project): add agents import helper project
Copilot May 22, 2026
6b12887
fix(agents-project): update to latest project files
Copilot May 22, 2026
481e5be
ci: add e2e tests, startup endpoint and readiness checks
Copilot May 27, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
Binary file removed .docx
Binary file not shown.
105 changes: 82 additions & 23 deletions .github/workflows/build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -34,33 +34,23 @@ jobs:
os: ubuntu-latest
- rid: win-x64
name: officecli-win-x64.exe
os: ubuntu-latest
os: windows-latest
- rid: win-arm64
name: officecli-win-arm64.exe
os: ubuntu-latest
os: windows-latest
runs-on: ${{ matrix.os }}

steps:
- uses: actions/checkout@v4

- name: Clone wiki for embedded help
run: git clone "https://x-access-token:${{ github.token }}@github.com/${{ github.repository }}.wiki.git" src/officecli/wiki || echo "Wiki clone failed, using fallback help"
defaults:
run:
shell: bash

- name: Verify wiki version matches csproj version
run: |
CSPROJ_VERSION=$(grep '<Version>' src/officecli/officecli.csproj | sed 's/.*<Version>\(.*\)<\/Version>.*/\1/')
WIKI_VERSION=$(python3 -c "import json; print(json.load(open('src/officecli/wiki/version.json'))['version'])" 2>/dev/null || echo "unknown")
echo "csproj: $CSPROJ_VERSION, wiki: $WIKI_VERSION"
if [ "$WIKI_VERSION" != "$CSPROJ_VERSION" ]; then
echo "::error::Wiki version ($WIKI_VERSION) does not match csproj version ($CSPROJ_VERSION). Update wiki before building."
exit 1
fi
steps:
- uses: actions/checkout@v5

- name: Setup .NET
uses: actions/setup-dotnet@v4
uses: actions/setup-dotnet@v5
with:
dotnet-version: '10.0.x'
dotnet-quality: 'preview'

- name: Publish
run: dotnet publish src/officecli/officecli.csproj -c Release -r ${{ matrix.rid }} -o publish --nologo
Expand All @@ -81,16 +71,85 @@ jobs:
if: >-
(matrix.rid == 'osx-arm64' && runner.arch == 'ARM64') ||
(matrix.rid == 'osx-x64' && runner.arch == 'X64') ||
(matrix.rid == 'linux-x64' && runner.os == 'Linux')
(matrix.rid == 'linux-x64' && runner.os == 'Linux') ||
(matrix.rid == 'win-x64' && runner.os == 'Windows')
env:
# Disable Git Bash (MSYS) POSIX-to-Windows path conversion on
# windows-latest, which otherwise mangles `/body` into
# `C:/Program Files/Git/body` before it reaches the CLI.
MSYS_NO_PATHCONV: '1'
MSYS2_ARG_CONV_EXCL: '*'
run: |
chmod +x publish/${{ matrix.name }}
publish/${{ matrix.name }} create test_smoke.docx
publish/${{ matrix.name }} add test_smoke.docx /body --type paragraph --prop text="Hello from CI"
publish/${{ matrix.name }} get test_smoke.docx /body/p[1]
publish/${{ matrix.name }} get test_smoke.docx '/body/p[1]'
publish/${{ matrix.name }} close test_smoke.docx
rm -f test_smoke.docx

- name: Smoke test - .NET 8-only runtime (linux-x64)
if: matrix.rid == 'linux-x64' && runner.os == 'Linux'
run: |
chmod +x publish/${{ matrix.name }}
mkdir -p smoke_net8
docker run --rm \
-v "$PWD/publish:/app:ro" \
-v "$PWD/smoke_net8:/work" \
-w /work \
mcr.microsoft.com/dotnet/runtime:8.0 \
bash -c "set -e; \
/app/${{ matrix.name }} create issue115.docx; \
/app/${{ matrix.name }} add issue115.docx /body --type paragraph --prop text='net8 smoke'; \
/app/${{ matrix.name }} close issue115.docx; \
/app/${{ matrix.name }} view issue115.docx text --json"

- name: Smoke test - install
if: >-
(matrix.rid == 'osx-arm64' && runner.arch == 'ARM64') ||
(matrix.rid == 'osx-x64' && runner.arch == 'X64') ||
(matrix.rid == 'linux-x64' && runner.os == 'Linux') ||
(matrix.rid == 'win-x64' && runner.os == 'Windows')
env:
MSYS_NO_PATHCONV: '1'
MSYS2_ARG_CONV_EXCL: '*'
run: |
publish/${{ matrix.name }} install
if [ "$RUNNER_OS" == "Windows" ]; then
test -f "$LOCALAPPDATA/OfficeCLI/officecli.exe" || { echo "FAIL: officecli.exe not found in %LOCALAPPDATA%\\OfficeCLI"; exit 1; }
"$LOCALAPPDATA/OfficeCLI/officecli.exe" --version
else
test -f "$HOME/.local/bin/officecli" || { echo "FAIL: officecli not found in ~/.local/bin"; exit 1; }
"$HOME/.local/bin/officecli" --version
fi

- name: Smoke test - install.sh / install.ps1
# Exercises the shell installers themselves (separate from the CLI's
# own `install` subcommand tested above). Downloads from
# d.officecli.ai with github fallback — validates the production
# mirror is reachable AND the in-repo script is syntactically and
# logically correct on each platform.
if: >-
(matrix.rid == 'osx-arm64' && runner.arch == 'ARM64') ||
(matrix.rid == 'osx-x64' && runner.arch == 'X64') ||
(matrix.rid == 'linux-x64' && runner.os == 'Linux') ||
(matrix.rid == 'win-x64' && runner.os == 'Windows')
shell: bash
env:
MSYS_NO_PATHCONV: '1'
MSYS2_ARG_CONV_EXCL: '*'
run: |
if [ "$RUNNER_OS" == "Windows" ]; then
pwsh -NoProfile -ExecutionPolicy Bypass -File ./install.ps1
test -f "$LOCALAPPDATA/OfficeCLI/officecli.exe" || { echo "FAIL: officecli.exe not installed"; exit 1; }
"$LOCALAPPDATA/OfficeCLI/officecli.exe" --version
else
bash install.sh
test -f "$HOME/.local/bin/officecli" || { echo "FAIL: officecli not installed at ~/.local/bin"; exit 1; }
"$HOME/.local/bin/officecli" --version
fi

- name: Upload artifact
uses: actions/upload-artifact@v4
uses: actions/upload-artifact@v6
with:
name: ${{ matrix.name }}
path: publish/${{ matrix.name }}
Expand All @@ -103,7 +162,7 @@ jobs:
contents: write
steps:
- name: Download all artifacts
uses: actions/download-artifact@v4
uses: actions/download-artifact@v8
with:
path: artifacts

Expand All @@ -119,7 +178,7 @@ jobs:
cat SHA256SUMS

- name: Create Draft Release
uses: softprops/action-gh-release@v2
uses: softprops/action-gh-release@v3
with:
files: artifacts/**/*
generate_release_notes: true
Expand Down
41 changes: 41 additions & 0 deletions .github/workflows/skill-parity.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
name: Skill parity

# Root SKILL.md is the file the public URL serves
# (https://d.officecli.ai/SKILL.md, raw GitHub URL) and is what
# `curl ... | bash` consumers fetch. skills/officecli/SKILL.md is a
# symlink to it — the spec-conforming location that `gh skill install`
# and `npx skills add` discover, and what the binary embeds.
#
# On macOS / Linux the symlink resolves transparently and this diff
# always passes. The check exists for the Windows case: git on Windows
# without core.symlinks=true checks out symlinks as plain text files
# containing the link target path (e.g. literal "../../SKILL.md"), so
# diff catches that corruption before it ships in a release build.

on:
push:
branches: [main]
pull_request:
paths:
- 'SKILL.md'
- 'skills/officecli/SKILL.md'
- '.github/workflows/skill-parity.yml'

permissions:
contents: read

jobs:
diff:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v5
- name: Diff root SKILL.md vs skills/officecli/SKILL.md
run: |
if ! diff -q SKILL.md skills/officecli/SKILL.md; then
echo "::error::SKILL.md and skills/officecli/SKILL.md are out of sync."
echo "The two files must be byte-identical. The binary embeds skills/officecli/SKILL.md;"
echo "the public URL (d.officecli.ai/SKILL.md, raw GitHub) serves the root copy."
echo "Fix: cp SKILL.md skills/officecli/SKILL.md (or the reverse) and commit."
exit 1
fi
echo "OK: SKILL.md == skills/officecli/SKILL.md"
126 changes: 126 additions & 0 deletions CONTRIBUTING.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,126 @@
# Contributing to OfficeCLI

> 中文版 / Chinese version: [CONTRIBUTING.zh.md](./CONTRIBUTING.zh.md)

> You must follow the two rules below. Code style, dependencies, tests, and
> docs are handled by the maintainer in post-merge cleanup — do not worry
> about them.

## Rule 1: One PR = one atomic change

A PR must contain exactly one feature or one bug fix that cannot be further
decomposed. If your change can be split into multiple pieces that each have
standalone value, submit each piece as a separate PR.

### Self-check

Before opening the PR, ask your AI tool:

> "Analyze this diff. Can it be decomposed into multiple PRs where each
> could be merged or reverted independently? If yes, list them."

If the answer is "yes, N PRs", split into N PRs before submitting.

### Examples

**✅ Single-PR bugs** — one root cause, one fix
- `Picture added with only 'width' specified gets wrong default height`
- `Body-level find: anchor throws ArgumentException`
- `AddParagraph --index N is off-by-one when the body contains a table`

**✅ Single-PR features** — one coherent capability
- `query ole: list embedded OLE objects with ProgID and dimensions`
- `set wrap/hposition/vposition on floating pictures`

**❌ Must split** — multiple independent changes bundled together
- `Fix picture index bug + add OLE detection + add HTML heading numbering`
→ 3 PRs, zero shared code
- `Add OLE object detection + add EMF→PNG conversion`
→ 2 PRs, two independent layers
- `Add auto aspect ratio + fix index off-by-one + fix line spacing clipping`
→ 3 PRs, three unrelated root causes

**🤔 Judgment calls** — default to splitting
- `Add helper function + its first consumer`
→ 1 or 2 PRs; split if the helper has standalone reuse potential
- `Add read support + add write support for the same property`
→ 1 or 2 PRs; split if you want read to land before write is vetted

## Rule 2: Every PR must include a verifiable validation method

State in the PR description (or a linked issue) how a reviewer can confirm
your change actually works.

### For bug-fix PRs — pick one (in order of preference)

1. **officecli command sequence** showing broken output before and fixed
output after
2. **Shell or Python script** that reproduces the bug and runs clean after
the fix
3. **Authoritative reference** showing what the correct behavior should be
(OOXML spec, Microsoft / ECMA docs, etc.)
4. **Screenshot** — only when the bug is purely visual

### For feature PRs — include at minimum

- **A screenshot** of the feature in action (Word / Excel / PowerPoint
window, HTML preview, or terminal output)
- Optionally a command sequence showing how to trigger it

### Examples

**Bug fix — command sequence (ideal):**

```bash
# Before my fix:
officecli blank test.docx
officecli add test.docx picture --prop "path=photo-2x1.png" --prop "width=10cm"
officecli query test.docx picture
# → height: "10.2cm" ❌ WRONG (hardcoded 4-inch default)

# After my fix:
officecli blank test.docx
officecli add test.docx picture --prop "path=photo-2x1.png" --prop "width=10cm"
officecli query test.docx picture
# → height: "5.0cm" ✓ CORRECT (auto-computed from 2:1 pixel ratio)
```

**Feature — screenshot (ideal):**

> **Heading auto-numbering from style chain**
>
> Before: ![heading-before.png] (plain "Chapter One" with no number)
> After: ![heading-after.png] ("1. Chapter One" with auto-numbering span)
>
> How to trigger:
> ```bash
> officecli blank demo.docx
> officecli add demo.docx paragraph --prop "style=Heading1" --prop "text=Chapter One"
> officecli watch demo.docx
> ```

## If you don't follow these rules

The maintainer reserves two options.

### Option A — Reject and ask for resubmission (preferred)

The maintainer closes the PR with a link to this guide and asks you to
resubmit as properly decomposed PRs with validation methods.

**Your credit:** the PR is entirely yours, including the **"Merged"** badge
after resubmission.

### Option B — Cherry-pick the valuable parts (last resort)

If part of your PR is clearly valuable and worth saving, the maintainer runs
`git cherry-pick` on those commits into `main` directly and closes the
original PR.

**Your credit:**
- `git cherry-pick` preserves the original author, so `git log` and
`git blame` still show you as author of those lines.
- The maintainer's reconcile commit message carries a
`Co-authored-by: <you> <your-email>` trailer, which counts toward your
GitHub contribution graph.
- **However, the original PR shows as "Closed" instead of "Merged"**.
Loading