Commit Graph

119 Commits

Author SHA1 Message Date
Stefan Broenner 09694d8afe Add table-creation range preflight (#844)
* Add table creation preflight

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>

* fix: preserve sessions during stale cleanup

Wait for the tracked daemon to finish graceful shutdown even when its reply is lost, so pre-build cleanup cannot interrupt session auto-save.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>

* fix: preserve sessions during stale cleanup

Wait for the tracked daemon to finish graceful shutdown even when its reply is lost, so pre-build cleanup cannot interrupt session auto-save.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>

* Fix quoted formula reference detection

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>

Copilot-Session: ea1cae23-233e-46ce-9cf7-e22fa9f5ac8b

* fix: await tracked Excel shutdown

Treat graceful cleanup as complete only after the exact daemon generation and its tracked Excel processes exit, while retaining the existing bounded forced fallback.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>

Copilot-Session: b07d5dc3-38d8-4d20-9f07-122e079dd612

* fix: stabilize MCPB staging cleanup

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>

Copilot-Session: 9b9eefe6-dd82-44e6-abdc-98202899cf32

* Bound merged-range discovery scans

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>

* Bound table preflight heuristics

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>

---------

Co-authored-by: Stefan Broenner <stbrnner@microsoft.com>
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: ea1cae23-233e-46ce-9cf7-e22fa9f5ac8b
Copilot-Session: b07d5dc3-38d8-4d20-9f07-122e079dd612
Copilot-Session: 9b9eefe6-dd82-44e6-abdc-98202899cf32
2026-08-31 17:13:31 +02:00
Stefan Broenner d2c993248c Return canonical Excel formula error names (#843)
* fix: return canonical formula error names

Centralize Excel COM formula error mappings and expose canonical names with cell-level diagnostics consistently through Core, CLI, and MCP range reads.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>

* fix: preserve sessions during stale cleanup

Wait for the tracked daemon to finish graceful shutdown even when its reply is lost, so pre-build cleanup cannot interrupt session auto-save.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>

* fix: return canonical formula error names

Centralize Excel COM formula error mappings and expose canonical names with cell-level diagnostics consistently through Core, CLI, and MCP range reads.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>

* fix: distinguish Python object placeholders

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 09caed35-cd31-4286-9b73-a4166c5e7a88

* fix: map double formula error variants

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>

* test: cover double error variants end to end

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>

---------

Co-authored-by: Stefan Broenner <stbrnner@microsoft.com>
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 09caed35-cd31-4286-9b73-a4166c5e7a88
2026-08-31 16:23:16 +02:00
Stefan Broenner 7bddb7d6b6 fix: include current changelog in releases (#829)
* fix: include current changelog in releases

* test: normalize workflow line endings

---------

Co-authored-by: Stefan Broenner <stbrnner@microsoft.com>
2026-08-28 15:43:11 +02:00
Stefan Broenner 36845831ec Publish privacy-safe usage analytics (#816)
* Add privacy-safe usage analytics reporting

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>

Copilot-Session: 915c2266-658e-45b7-ae7d-c9213c810f01

* Fix analytics changeset package

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>

Copilot-Session: 915c2266-658e-45b7-ae7d-c9213c810f01

* Make analytics report public-friendly

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>

Copilot-Session: 915c2266-658e-45b7-ae7d-c9213c810f01

* Finalize public usage analytics

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>

Copilot-Session: 915c2266-658e-45b7-ae7d-c9213c810f01

* Harden analytics validation

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>

Copilot-Session: 915c2266-658e-45b7-ae7d-c9213c810f01

---------

Copilot-Session: 915c2266-658e-45b7-ae7d-c9213c810f01
2026-08-28 09:45:09 +02:00
Stefan Broenner 288ccea074 Audit public docs and tool help (#819)
Audit and correct public documentation, GitHub Pages presentation, tool descriptions, generated CLI help, and documentation validation.
2026-08-27 18:54:10 +02:00
Stefan Broenner 9a13dba5ae fix: address codebase review findings (#815)
* fix: enforce VBA run timeout

Pass caller-supplied VBA run timeouts through ExcelBatch cancellation and cover blocked macro cleanup with a real-Excel regression test.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>

* fix: synchronize release version metadata

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>

* fix: preserve invalid file create paths

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>

* fix: preserve automation contract failures

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>

Copilot-Session: 0b5016ea-1678-43fc-9427-b1578901df47

* fix: create linked PivotCharts

Create and verify PivotCharts through Excel's UI-equivalent COM sequence for regular and Data Model PivotTables. Reject unsupported chart types without reporting a static chart as linked.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>

* fix: complete window layout and view contracts

Resolve Arrange presets against Excel's current monitor work area with per-monitor DPI conversion, and expose formula display through Core, CLI, MCP, tests, and guidance.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>

Copilot-Session: e5373bc0-9387-4f79-9b56-28e41a13496c

* test: use named measure format

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 0b5016ea-1678-43fc-9427-b1578901df47

* fix: preserve nested release metadata versions

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 0b5016ea-1678-43fc-9427-b1578901df47

* fix: address final review findings

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 0b5016ea-1678-43fc-9427-b1578901df47

* docs: add project context glossary

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 0b5016ea-1678-43fc-9427-b1578901df47

* docs: connect agent rules and issue templates

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 0b5016ea-1678-43fc-9427-b1578901df47

---------

Co-authored-by: Stefan Broenner <stbrnner@microsoft.com>
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 0b5016ea-1678-43fc-9427-b1578901df47
Copilot-Session: e5373bc0-9387-4f79-9b56-28e41a13496c
2026-08-26 09:12:02 +02:00
Stefan Broenner 3ad8ca3831 Verify plugin runtime downloads (#813)
Publish SHA-256 checksums for Windows runtime archives and require both plugin bootstraps to verify fresh and cached downloads before extraction.

Co-authored-by: Stefan Broenner <stbrnner@microsoft.com>
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
2026-08-24 19:42:27 +02:00
Stefan Broenner d43a165f85 Preserve Agent Plugins 1.0 source fixes (#811)
* fix(plugin): preserve Agent Plugins 1.0 source

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>

* docs(plugin): define publication source of truth

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>

---------

Co-authored-by: Stefan Broenner <stbrnner@microsoft.com>
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
2026-08-24 15:40:28 +02:00
Stefan Broenner cbbc529be9 fix: harden IRM test skips and registry publishing (#809)
Verify opt-in IRM tests skip without a configured workbook and registry metadata stamping validates both version fields.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>

Copilot-Session: 57225379-2632-4201-98b6-94b43b419f5c
2026-08-24 08:47:17 +02:00
Stefan Broenner f9a25d155f feat!: unify CLI and MCP automation contracts (#807)
* feat!: unify CLI and MCP automation contracts

Implement the seven-layer CLI/MCP remediation stack: safe pipe-owned cleanup, truthful daemon states, strict generated contracts, canonical inputs, exact Power Query identity, compact reads, and a unified file lifecycle.

Fixes #781, #782, #783, #784, #785, #786, #787, #788, #789, #796, #797, #798, #799, #800, #801

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>

Copilot-Session: 57225379-2632-4201-98b6-94b43b419f5c

* test: strengthen protocol regression assertions

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>

Copilot-Session: 6a90669a-c01e-46be-838f-2a2418e9b788

---------

Copilot-Session: 57225379-2632-4201-98b6-94b43b419f5c
Copilot-Session: 6a90669a-c01e-46be-838f-2a2418e9b788
2026-08-21 16:59:45 +02:00
Stefan Broenner 4e670445f7 Fix generated skill version validation (#803)
* Fix generated skill version metadata

Require explicit package versions and stamp generated skill outputs across plugin, ZIP, and VS Code distributions.

Tests: Skill version integration tests; plugin packaging tests; Release solution build; VS Code package build.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>

* Restrict VS Code skill copy target

Remove the caller-controlled deletion path so the packaging script only replaces its fixed generated extension directory.

Tests: CopyVscodeSkills_CleansOutputAndStampsExtensionVersion.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>

---------

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
2026-08-20 14:10:35 +02:00
Stefan Broenner 3a7abdc916 fix(screenshot): capture the live Excel window instead of a temp chart (#777) (#778)
* fix(screenshot): capture the live Excel window instead of a temp chart (#777)

Screenshot capture never took a screenshot: it rendered one inside Excel by
inserting a temporary ChartObject into the target worksheet, pasting a
CopyPicture image into it, and exporting the chart. Excel blocks drawing-object
inserts on a protected worksheet, so `capture` and `capture-sheet` failed with a
bare COMException 0x800A03EC (#777).

Replace that pipeline with a real window capture (PrintWindow with
PW_RENDERFULLCONTENT), using the approach from the sister repo mcp-windows.
Ranges larger than the Excel window are zoomed to fit down to a readable floor
and, if still too large, captured in several passes and stitched together.
Extremely large ranges are truncated to their top-left portion and the result
message says so.

New in ExcelMcp.Core/Commands/Screenshot:
- WindowCapture.cs: PrintWindow plus per-monitor DPI awareness primitives
- ScreenshotEncoder.cs: preserves the existing quality contract
  (High = PNG 100%, Medium = JPEG 75% scale, Low = JPEG 50% scale)
- CapturePlanner.cs: fit-zoom, tile segmentation, tile budget and truncation

Behaviour changes for users:
- Protected sheets can be captured
- The clipboard is no longer overwritten and the workbook is never modified or
  dirtied by taking a screenshot
- Capture requires an interactive desktop session; it fails on a locked desktop
  or a disconnected Remote Desktop session

Two non-obvious details are handled explicitly:
- ExcelWriteGuard sets Application.ScreenUpdating = false for every batch
  operation. With it off Excel does not repaint and PrintWindow returns a stale
  frame, so capture temporarily re-enables it and restores it in finally. This
  is the documented exception to the usual "no ScreenUpdating in command code"
  rule.
- Setting Window.Zoom makes Excel re-scroll to keep the selection visible, so
  the view state is restored zoom first, then ScrollRow/ScrollColumn.

The public surface is unchanged (same actions, parameters, ScreenshotResult and
quality semantics), so no CLI/MCP sync points needed edits.

Tests (Feature=Screenshot, 19/19 passing):
- Protected-sheet regressions for capture, capture-sheet, and protection intact
- Tiling of a range larger than the viewport, asserting stitched corner content
- Zoom/scroll restoration and workbook-unmodified assertions

Docs updated: IScreenshotCommands XML summary, MCP tool description,
skills/shared/screenshot.md plus regenerated skill references, and
docs/features/CHARTS-VISUALS.md.

Fixes #777

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 9df3bcb1-9813-4003-adec-93062dec7bf2

* refactor(screenshot): address Copilot review feedback

Use Convert.ToInt32 rather than direct casts when reading UsedRange row/column
counts and origins from Excel COM, matching the convention elsewhere in Core and
avoiding runtime binder conversion errors if COM hands back a double.

Clarify the MinReadableZoom documentation: the readable-zoom floor is a
preference, not a hard limit. The tile budget takes precedence, so a range that
would otherwise need more than PreferredMaxTiles tiles can still be zoomed below
the floor, down to its fit zoom.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 9df3bcb1-9813-4003-adec-93062dec7bf2

---------

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 9df3bcb1-9813-4003-adec-93062dec7bf2
2026-08-19 17:24:20 +02:00
Stefan Broenner b2eab4ca91 Migrate plugins to Agent Plugins 1.0 (#776)
Build plugins from canonical source templates, validate portable manifests and MCP configuration, synchronize complete Agent Skill directories, and scope Excel E2E to runtime-impacting changes.

Tests: 23 targeted SkillGeneration tests passed; Release build completed with 0 warnings and 0 errors; Excel E2E path classification passed for 12 cases; MCPB and Agent Skills packaging passed.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>

Co-authored-by: Stefan Brönner <sbroenne@openclaw.fritz.box>
Copilot-Session: 858e5fa0-f0ef-490f-a154-00c470943904
2026-08-16 10:11:38 +02:00
Stefan Broenner c3f402226e docs: guard against silently-dropped front matter, split out an FAQ page (#771)
* docs: guard against silently-dropped front matter, split out an FAQ page

Ported from the sibling mcp-server-powerpoint repo (PR #48), which found these
while adapting this repo's docs-site tooling.

audit_site.py
- Fail when a page's meta description equals site_description verbatim. Material
  falls back to it whenever per-page front matter does not apply, and MkDocs
  reports nothing. Two silent triggers: a double quote in an unquoted
  description value (truncates the rendered content="..." attribute) and an
  unquoted YAML scalar containing ": " (makes the whole block unparseable,
  dropping title, description and keywords together).
- site_description is parsed out of mkdocs.yml rather than copied, so rewording
  it cannot turn the guard into a silent no-op. Handles the folded block scalar
  form used here; a full yaml.safe_load is impossible because mkdocs.yml carries
  !!python/name: tags.
- Match badge images on host via urlsplit instead of substring, so extensionless
  shields.io URLs with query strings are recognised, and exempt the theme logo,
  which Material emits from its own partial and sizes via CSS.
- Validate every JSON-LD block parses, and assert the FAQ page carries FAQPage
  data with a plausible number of questions.

hooks.py
- _faq_jsonld now accepts "### Question?" headings in addition to
  "??? question" admonitions. Collapsible admonitions have no stable anchor, so
  individual answers cannot be deep-linked or appear in the page contents.
- Drop fenced code blocks and table rows from structured answers, and strip list
  markers only at line start so mid-sentence dashes survive.
- Require at least three questions before emitting FAQPage, so a guide with one
  question-shaped heading does not claim to be an FAQ.

Content
- New /faq/ page (previously a 404) using "###" headings, carrying the
  question-shaped Q&A that used to sit inside the troubleshooting page.
  Troubleshooting keeps the diagnostic material; the two cross-link.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>

* docs: compute meta description length from the normalized value

Keeps the length check and the site_description fallback comparison
operating on the same string.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>

* docs: assert sitemap.xml.gz matches sitemap.xml

The gzipped twin is what many crawlers actually fetch, and hooks.py rewrites
it separately after stripping lastmod and adding the video markup. The audit
only checked that it exists, so the two could silently diverge - publishing a
.gz still carrying the lastmod values the plain file had dropped, with nothing
reporting it.

Negative-tested in both directions. The interesting one is a stale .gz beside a
correct sitemap.xml: the lastmod check and the existence check both pass, and
only the parity check catches it.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>

* docs: catch every way a corrupt sitemap.xml.gz surfaces

gzip reports corruption three ways and only one is an OSError. BadGzipFile
(wrong format, CRC failure) subclasses it, but EOFError (truncated write) and
zlib.error (damaged deflate stream) inherit straight from Exception, so the two
most likely real-world cases escaped as a traceback - the exact outcome the
try/except was added to prevent, and one that buries every other finding the
audit produced.

Measured rather than assumed: over 400 single-byte corruptions of a valid
archive, 395 raised gzip.BadGzipFile and 5 raised zlib.error; truncation raises
EOFError. All three now produce a clean audit failure.

The exception type is reported module-qualified because zlib.error's bare name
is just "error". "EOFError" means a truncated write where "gzip.BadGzipFile"
means the wrong format entirely, so naming it saves a debugging round trip.

An empty .gz raises nothing at all - it reads as an empty string and is caught
by the mismatch check instead, which is the correct report.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>

---------

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
2026-08-15 15:51:18 +02:00
Stefan Broenner d526b22d0e Fix CLI reliability, lifecycle cleanup, and documentation (#770)
* Fix CLI reliability and documentation

Reject unknown options, aggregate missing parameters, harden timeout and daemon cleanup, correct visibility tracking, and regenerate audited CLI guidance. Validated with targeted regressions, Release build, CLI E2E, and MCP smoke coverage.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>

Copilot-Session: 90f6efc1-e532-40e2-b377-ab2c89ab9f21

* fix: isolate daemon tracking notifications

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>

Copilot-Session: 90f6efc1-e532-40e2-b377-ab2c89ab9f21

* docs: simplify star history section

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>

Copilot-Session: 90f6efc1-e532-40e2-b377-ab2c89ab9f21

---------

Copilot-Session: 90f6efc1-e532-40e2-b377-ab2c89ab9f21
2026-08-15 12:52:40 +02:00
Stefan Broenner 37aa032503 Docs site: task guides, LLM discoverability layer, and published reference corpus (#769)
* docs: improve discovery and documentation UX

Restructure feature documentation around canonical category pages, improve GitHub Pages navigation and SEO, and align contributor guidance with the canonical-first model.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: f3240d8f-e245-4dfb-a1f5-79373ca1ca1f

* docs: add release note

Document the user-visible discovery and documentation navigation improvements.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: f3240d8f-e245-4dfb-a1f5-79373ca1ca1f

* docs: complete site SEO improvements

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>

Copilot-Session: f3240d8f-e245-4dfb-a1f5-79373ca1ca1f

* docs: add task guides, LLM discoverability layer, and skills reference to site

Intent-matching content (docs/guides/):
- Five canonical task guides built from verified material: refresh Power
  Query, automate PivotTables, query the Data Model with DAX, run VBA
  macros, and COM automation vs. file-parser libraries
- Guides hub index, Guides nav section, cross-links from feature docs,
  FEATURES.md, home page and troubleshooting

Machine-readable layer for AI assistants (gh-pages/hooks.py):
- /llms.txt (llmstxt.org format) and /llms-full.txt, generated from the
  resolved MkDocs nav so they cannot go stale
- Markdown mirror of every page, advertised via rel=alternate
- /tools.json derived from canonical feature docs, build fails on count
  mismatch with FEATURES.md
- FAQPage JSON-LD generated from existing question admonitions
- Explicit AI-crawler allow policy in robots.txt

Reference corpus (skills/shared/ -> /reference/):
- Publish all 24 expert files as a nav-grouped Reference section
- Fix stray outer code fences in conditionalformat, pivottable and
  slicer that also rendered wrong inside the shipped skill packages

Distribution metadata:
- Correct stale tool/operation counts in mcpb/manifest.json and the CLI
  package description
- Point NuGet PackageProjectUrl and .mcp/server.json at the docs site
- Extend check-doc-counts.ps1 to guard both, so this cannot recur

Validation:
- New gh-pages/audit_site.py gate (canonicals, metadata completeness,
  single H1, image dimensions, internal links, sitemap, llms outputs,
  mirror cleanliness, tools.json counts, robots policy) wired into the
  Pages deploy workflow, keeping the docs-only pre-commit path fast

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: f3240d8f-e245-4dfb-a1f5-79373ca1ca1f

* docs: fix marketplace extension identifier and security PoC command

The publisher guide linked to itemName=sbroenne.excelmcp, but the
extension is published as sbroenne.excel-mcp (14 other references in
the repo already use the correct form), so both links 404.

The SECURITY.md path-traversal example invoked 'powerquery export',
which is not a command. Replaced with 'powerquery view', which does
take a file path and so actually illustrates the class of issue.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: f3240d8f-e245-4dfb-a1f5-79373ca1ca1f

---------

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: f3240d8f-e245-4dfb-a1f5-79373ca1ca1f
2026-08-15 12:25:52 +02:00
Stefan Broenner 8c34c73d09 Expand Excel COM coverage to 326 operations (#768)
* Add workbook and worksheet COM coverage

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>

Copilot-Session: 00044f4a-446d-46de-856c-5effb4268aab

* Add worksheet view and outline APIs

Tests: Release build; 24 targeted CLI, Core Excel, and MCP E2E tests; COM leak, success flag, coverage, and documentation audits.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 00044f4a-446d-46de-856c-5effb4268aab

* Integrate expanded Excel COM coverage

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>

Copilot-Session: 00044f4a-446d-46de-856c-5effb4268aab

* Address automated review feedback

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>

Copilot-Session: 00044f4a-446d-46de-856c-5effb4268aab

* Harden QueryTable output and Save As tracking

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>

Copilot-Session: 00044f4a-446d-46de-856c-5effb4268aab

* Preserve workbook outputs on failed overwrite

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>

Copilot-Session: 00044f4a-446d-46de-856c-5effb4268aab

---------

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 00044f4a-446d-46de-856c-5effb4268aab
2026-08-15 08:18:58 +02:00
Stefan Broenner a77007db43 Fix missing star history restore exit code (#763)
* fix: handle missing star history restore

Reset the native exit status after expected Contents API 404 responses while preserving explicit failures for all other API errors.

Tests: Test-StarHistory.ps1 (12 tests), PowerShell parser, actionlint v1.7.12, strict MkDocs build.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>

* chore: refresh required checks

Re-run pull request checks with the CI-only skip-changelog label already applied.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>

* fix: validate restored star history payload

Reject successful GitHub API responses that do not contain a non-empty file content payload before decoding or overwriting the bootstrap history.

Tests: Test-StarHistory.ps1 (13 tests), PowerShell parser.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>

---------

Co-authored-by: Stefan Brönner <sbroenne@Stefans-Mac-mini-2.fritz.box>
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
2026-08-13 18:33:00 +02:00
Stefan Broenner bab44ac22e Fix durable aggregate star history (#762)
* fix: persist aggregate GitHub star history

Validated: Test-StarHistory.ps1 (7 tests), strict MkDocs build, SVG parsing, aggregate count parity, and actionlint.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>

* Refresh required checks

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: ed9907ce-dda8-4f33-b484-58d4a1088f62

* fix: recover missing star history snapshot

Tests: pwsh -NoLogo -NoProfile -File ./scripts/Test-StarHistory.ps1

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>

Copilot-Session: bbd95640-7e12-4776-b0d6-5f283f8b9682

---------

Co-authored-by: Stefan Brönner <sbroenne@Stefans-Mac-mini-2.fritz.box>
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Stefan Brönner <sbroenne@openclaw.fritz.box>
Copilot-Session: ed9907ce-dda8-4f33-b484-58d4a1088f62
Copilot-Session: bbd95640-7e12-4776-b0d6-5f283f8b9682
2026-08-13 18:18:08 +02:00
Copilot 8f7340ae66 Fix conditional formatting deserialization and retire Excel runner (#757)
* Initial plan

* fix: accept bool/int args for conditionalformat add-rule over MCP

Co-authored-by: sbroenne <3026464+sbroenne@users.noreply.github.com>

* ci: run Excel-dependent smoke tests on self-hosted Windows Excel runner

Co-authored-by: sbroenne <3026464+sbroenne@users.noreply.github.com>

* ci: fix stale note about smoke tests not running in CI

Co-authored-by: sbroenne <3026464+sbroenne@users.noreply.github.com>

* fix: harden conditional formatting and local E2E

Validate conditional-format rule arguments, release Border COM objects, and verify typed bool/int arguments through CLI and MCP workflows. Retire the Azure Excel runner and replace it with explicit local integration and E2E attestations.

Tests: Release build (0 warnings); ConditionalFormat 27/27; CLI E2E 12/12; MCP E2E 1/1; COM leak and documentation count checks passed.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>

Copilot-Session: b7375555-1096-40ae-92a3-2b76383e7934

---------

Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: sbroenne <3026464+sbroenne@users.noreply.github.com>
Co-authored-by: sbroenne <stefan_broenner@yahoo.com>
Copilot-Session: b7375555-1096-40ae-92a3-2b76383e7934
2026-08-06 20:06:29 +02:00
github-actions[bot] 352b1da895 Revert: remove RELEASE_PAT verification scratch file [skip ci]
Reverts the scratch verification commit; confirms PAT push authentication
and ruleset bypass work end-to-end for the release-automation fix.
2026-07-23 09:40:03 +02:00
github-actions[bot] f1d85698f3 test: verify RELEASE_PAT can push directly to protected main [skip ci]
This is a scratch verification commit for the release-automation fix in
PR #739 (direct changelog push using RELEASE_PAT as a ruleset bypass
actor). It will be reverted immediately by a follow-up commit.
2026-07-23 09:39:47 +02:00
Stefan Broenner 8988f67ac7 Add list-rules and list-worksheet-rules to conditionalformat (#730) (#734)
* Add list-rules and list-worksheet-rules to conditionalformat (#730)

Add two read actions to the conditionalformat tool so existing conditional
formatting rules can be inspected:

- list-rules: reads rules for a range (Range.FormatConditions)
- list-worksheet-rules: reads all rules on a sheet (Worksheet.Cells.FormatConditions)

Both return rule type, operator, formulas, applies-to range, priority, and
formatting (interior/font/borders) with colors as #RRGGBB hex, in priority order.
MCP + CLI parity is generated automatically from IConditionalFormattingCommands.

Adds ConditionalFormatListResult/ConditionalFormatRuleInfo models, reverse
int->string mappers, FormattingHelpers.ColorToHex, and 8 integration tests.
Docs updated (232 -> 234 operations; Conditional Formatting 2 -> 4).

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 941463de-eb97-4c6d-9f06-f2904603293c

* Harden CF rule reads against COM double/DBNull values (#730)

Address Copilot review on PR #734:
- Read interior/font/border numeric COM props via Convert.ToInt32 so values
  surfaced as double no longer throw and silently skip formatting.
- Treat InvalidCastException (DBNull from unset props) as skippable in the
  COM read guard so mixed-formatting worksheet rules read cleanly.
- Strengthen priority-order test to assert every cellValue rule has a priority.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 941463de-eb97-4c6d-9f06-f2904603293c

* Read CF Type/Operator via Convert.ToInt32 for COM double safety (#730)

Address Copilot re-review on PR #734: FormatCondition.Type and .Operator
can surface as double via dynamic; read them with Convert.ToInt32 so valid
rules are not degraded to unknown/null.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 941463de-eb97-4c6d-9f06-f2904603293c

* Rename CF model file to ConditionalFormatTypes.cs; clarify border docs (#730)

Address Copilot re-review on PR #734:
- Rename ConditionalFormatListResult.cs to ConditionalFormatTypes.cs, matching
  the repo convention for multi-type model files (ResultTypes.cs, PivotTableTypes.cs).
- Document that BorderStyle/BorderColor are sourced from the left edge border
  (xlEdgeLeft), matching the read implementation.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 941463de-eb97-4c6d-9f06-f2904603293c

* Read CF borders across all four edges (#730)

Address Copilot re-review on PR #734: border reading previously inspected only
the left edge, so a rule that set only top/bottom/right borders would report no
border. Now scans left/top/bottom/right and uses the first edge that has a
style. Model docs updated to match.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 941463de-eb97-4c6d-9f06-f2904603293c

* Treat Automatic interior color index as no fill (#730)

Address Copilot re-review on PR #734: Interior.ColorIndex can be
xlColorIndexAutomatic (-4105) when no explicit fill is set. Skip it like
xlColorIndexNone so InteriorColor is not populated (e.g. white) for rules
that did not set an interior color, matching the font-color logic.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 941463de-eb97-4c6d-9f06-f2904603293c

* Read formatConditions.Count via Convert.ToInt32 (#730)

Address Copilot re-review on PR #734: the COM collection count can be surfaced
as double via dynamic; read it with Convert.ToInt32 so rule enumeration does
not throw. Completes the COM-numeric-read hardening for the CF read path.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 941463de-eb97-4c6d-9f06-f2904603293c

---------

Co-authored-by: Stefan Broenner <stbrnner@microsoft.com>
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 941463de-eb97-4c6d-9f06-f2904603293c
2026-07-23 07:04:34 +02:00
Stefan Broenner 163d9b247e Add self-hosted Excel integration runner (#727)
* Add cost-optimized Excel integration runner

Validated: Release build (0 warnings/errors), Azure Bicep deployment validation, and post-reboot Excel COM value round-trip.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: dd1f2a91-18a6-4edd-b6e3-d907f528e09f

* Install PowerShell 7 on Excel runner

Validated: PowerShell 7 installed on the live VM and the GitHub runner service reconnected successfully.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: dd1f2a91-18a6-4edd-b6e3-d907f528e09f

* Harden Excel service-session runner

Validated: post-fix ComInterop improved to 70/72 remotely; both remaining corrected regression tests pass individually.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: dd1f2a91-18a6-4edd-b6e3-d907f528e09f

* Run Excel CI in an interactive session

Configure auto-logon and launch the runner in the desktop session so Excel window and clipboard operations work after reboot. Enforce the serialized xUnit configuration in every Excel-facing test project.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: dd1f2a91-18a6-4edd-b6e3-d907f528e09f

* Isolate Core integration test classes

Run each Core integration test class in a fresh testhost and clean up Excel between classes so a blocked COM instance cannot contaminate the remaining nightly suite.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: dd1f2a91-18a6-4edd-b6e3-d907f528e09f

* Fix cumulative Excel write guard leaks

Release temporary Range COM objects in the write guard regression tests so cumulative execution cannot retain Excel RCWs.

Tests: 72 ComInterop integration tests passed.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>

Copilot-Session: dd1f2a91-18a6-4edd-b6e3-d907f528e09f

* Preserve scalar write guard semantics

Release temporary Range COM objects without replacing scalar writes with array assignments, which can block Excel recalculation callbacks.

Tests: 8 ExcelWriteGuard integration tests passed.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>

Copilot-Session: dd1f2a91-18a6-4edd-b6e3-d907f528e09f

* Normalize Excel runner locale per run

Set and verify the en-US profile and Excel separators before integration tests so regional profile drift cannot corrupt number-format assertions.

Tests: chart number-format integration test passed on the Azure runner.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>

Copilot-Session: dd1f2a91-18a6-4edd-b6e3-d907f528e09f

* Bound Core integration runtime

Run non-PowerQuery Core tests in one fresh host while preserving per-class isolation for the eight PowerQuery classes that exhibit cumulative COM contamination.

Validation: all 697 Core tests map exactly once with zero duplicates.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>

Copilot-Session: dd1f2a91-18a6-4edd-b6e3-d907f528e09f

* Use sustained CPU for Excel integration

Resize the runner from burstable B2as v2 to D2as v5 and allow a five-hour safety window so long Excel integration runs retain sustained performance and complete cleanup.

Validation: resized VM retained Office, interactive runner startup, en-US locale, and Excel COM automation.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>

Copilot-Session: dd1f2a91-18a6-4edd-b6e3-d907f528e09f

* Use Intel CPU for Excel integration

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>

Copilot-Session: dd1f2a91-18a6-4edd-b6e3-d907f528e09f

* Enforce scoped Excel integration testing

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>

Copilot-Session: dd1f2a91-18a6-4edd-b6e3-d907f528e09f

* Address runner review findings

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>

Copilot-Session: dd1f2a91-18a6-4edd-b6e3-d907f528e09f

* Fix MCP integration regressions

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>

Copilot-Session: dd1f2a91-18a6-4edd-b6e3-d907f528e09f

* Verify runner setup downloads

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>

Copilot-Session: dd1f2a91-18a6-4edd-b6e3-d907f528e09f

* Keep runner setup lightweight

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>

Copilot-Session: dd1f2a91-18a6-4edd-b6e3-d907f528e09f

* Fix session lock validation order

Preserve the specific duplicate-session error before checking for external file locks, while retaining pre-COM lock rejection.

Tests: SessionManager duplicate-session and external-lock regressions; 27 OnDemand session lifecycle tests.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>

Copilot-Session: dd1f2a91-18a6-4edd-b6e3-d907f528e09f

* Clarify runner account and labels

Document the parameterized local account and distinguish the custom Excel label from GitHub's default runner labels.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>

Copilot-Session: dd1f2a91-18a6-4edd-b6e3-d907f528e09f

* Limit CI OnDemand scope to session tests

Keep environment-specific Core diagnostics manual while retaining all mandatory ComInterop session lifecycle coverage in the full merge gate.

Tests: 27 ComInterop OnDemand session tests passed; failed full run confirmed Core diagnostics require optional Python licensing or manual CPU analysis.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>

Copilot-Session: dd1f2a91-18a6-4edd-b6e3-d907f528e09f

---------

Co-authored-by: Stefan Broenner <stbrnner@microsoft.com>
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
2026-07-19 10:43:57 +02:00
Stefan Broenner 52a6c8f945 docs: add newcomer onboarding (Features intro, Troubleshooting/FAQ page) (#719)
* docs: standardize Features page and fix docs inconsistencies

Make the website's user-facing docs consistent and newcomer-friendly:

- FEATURES.md: give every tool section the same shape (plain-language
  intro sentence, operations grouped under bold category headers, a single
  consistent Notes block) and fix the duplicate section emoji. Operation
  counts are unchanged (232 across 17 sections).
- CLI README: remove an unresolved git merge-conflict marker, consolidate a
  duplicated/empty "Related Tools" section, and fix a dangling
  "VBA Operations Setup above" cross-reference.
- INSTALLATION-CLI.md: normalize PowerShell comment style (## -> #).
- skills/README.md: drop developer-only Building/Structure sections from the
  public Agent Skills page.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 6009421d-ccc1-4e9d-b45a-c8b76e686819

* docs: add newcomer onboarding to the site

Follow-up to the docs review, focused on people new to Excel MCP Server:

- FEATURES.md: add a "New here?" intro that reassures readers they don't need
  to learn the operations and points to the most-used tools.
- New Troubleshooting & FAQ page (gh-pages) consolidating the common first-timer
  issues (Excel must be closed, VBA trust, DAX/MSOLAP, PATH, IRM/AIP, npx) that
  were previously scattered across the install guides; linked from both install
  guides and added to the nav.
- skills/README.md: explain what a skill is and why you'd want one, instead of
  jumping straight into a comparison table.
- CLI README: clarify that the CLI's "18 command categories" are the same 232
  operations the MCP Server exposes as 26 tools.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 6009421d-ccc1-4e9d-b45a-c8b76e686819

* docs: keep CLI README doc-count headline phrase intact

The check-doc-counts guard requires the literal 'with 232 operations
matching' phrase in the CLI README. Reword the count clarification to
preserve it (this gate runs in CI but is skipped in docs-only pre-commit).

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 6009421d-ccc1-4e9d-b45a-c8b76e686819

---------

Co-authored-by: Stefan Broenner <stbrnner@microsoft.com>
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
2026-07-12 14:52:44 +00:00
Stefan Broenner 5a1bfc1fb1 docs: standardize Features page and fix docs inconsistencies (#718)
Make the website's user-facing docs consistent and newcomer-friendly:

- FEATURES.md: give every tool section the same shape (plain-language
  intro sentence, operations grouped under bold category headers, a single
  consistent Notes block) and fix the duplicate section emoji. Operation
  counts are unchanged (232 across 17 sections).
- CLI README: remove an unresolved git merge-conflict marker, consolidate a
  duplicated/empty "Related Tools" section, and fix a dangling
  "VBA Operations Setup above" cross-reference.
- INSTALLATION-CLI.md: normalize PowerShell comment style (## -> #).
- skills/README.md: drop developer-only Building/Structure sections from the
  public Agent Skills page.


Copilot-Session: 6009421d-ccc1-4e9d-b45a-c8b76e686819

Co-authored-by: Stefan Broenner <stbrnner@microsoft.com>
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
2026-07-12 14:20:39 +00:00
Stefan Broenner 97df07a316 Harden PR/CI: add required CI Gate, remove stale/superseded workflows (#715)
* ci: add required CI Gate, remove stale/superseded workflows

Consolidate PR validation into a single always-running 'CI Gate' workflow
(.github/workflows/ci.yml) that ports the Excel-free pre-commit gates so they
are enforced server-side even if the local hook is bypassed:
- Release build (compile + source generators)
- COM-leak, success-flag, coverage/naming, MCP-Core, doc-counts, dynamic-cast,
  plugin-README audits
- Excel-free CLI --help and MCP Server build smoke + artifact upload

Excel-dependent gates (CLI workflow smoke, MCP smoke, integration tests) are
NOT run in CI - GitHub runners have no Excel - and remain local-only.

Also:
- Remove superseded Build CLI / Build MCP Server workflows (absorbed by CI Gate;
  fixes the missing pull_request trigger on the MCP build)
- Remove stale.yml (stale-issues automation)
- Drop the dead 'develop' push trigger from CodeQL (branch does not exist)
- Add .github/CODEOWNERS (routing only)
- Document that the CI Gate mirrors the Excel-free gates

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: a1546dd0-9bc6-46a6-8648-e700b0bcc8bf

* docs: point workflow references at consolidated CI Gate

Update README badges, PRE-COMMIT-SETUP.md, and development-workflow
instructions to reference ci.yml (CI Gate) instead of the removed
build-cli.yml / build-mcp-server.yml workflows. Addresses Copilot PR
review feedback on #715.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: a1546dd0-9bc6-46a6-8648-e700b0bcc8bf

* ci: drop brittle gate/rule number citations in CI Gate step labels

Release build comment referenced 'pre-commit gate 6' and the dynamic-cast
step was labeled 'Rule 14'; both cross-references were inaccurate (gate
numbering differs between pre-commit.ps1 and the instructions table, and
Rule 14 is unrelated). Describe the steps instead. Addresses Copilot
review feedback on #715.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: a1546dd0-9bc6-46a6-8648-e700b0bcc8bf

---------

Co-authored-by: Stefan Broenner <stbrnner@microsoft.com>
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
2026-07-12 08:11:50 +02:00
Stefan Broenner bef84d9184 docs: comprehensive documentation audit and fact-check pass (#703)
* Restore Excel green branding and shrink docs hero

Fix two visual regressions on the MkDocs site plus a stray heading bug:

- Color: palette was set to Material teal; restore the Excel brand green
  (#217346 primary, #107c41 accent, #217346->#33a85c hero gradient) via
  custom Material color variables in extra.css, with lifted variants for
  dark mode.
- Hero size: reduce .mcp-hero padding (3rem->1.8rem), icon (96->72px),
  title (2.6->2.1rem) and margins so the header box is less oversized.
- Stray "Home" heading: home.html had a literal {{ super() }} inside an
  HTML comment, which Jinja still evaluated and re-rendered Material's
  auto-injected page title. Render {{ page.content }} directly instead;
  the hero already provides the page's single h1.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>

* Redesign docs landing page for clarity and consistency

Rework the homepage so it routes visitors instead of dumping the whole
manual on one long scroll:

- Remove the triple-represented feature content; keep one consistent
  "Key features" grid (uniform .lg .middle icons + dividers on every card).
- Trim the redundant "Documentation" grid into a consistent "Explore the
  docs" section with matching card styling and call-to-action links.
- Keep the count line ("26 tools and 232 operations") exactly once, so the
  doc-count guard still has its anchor.
- Move the internal architecture detail off the landing page into a new
  architecture.md page, replacing the dated ASCII diagram with a Mermaid
  flowchart (superfences custom_fence added to mkdocs.yml).
- Move author-portfolio "Related projects" into its own related-projects.md
  page under the More nav section.
- Restructure nav: keep Home/Features/Installation/MCP Server/CLI as top
  tabs; group Agent Skills, Architecture, Changelog and the rest under More.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>

* docs: reframe value prop and critically review all READMEs

Landing page:
- Lead with capability-first "real Excel engine" differentiator (names
  openpyxl / Anthropic xlsx skill as the file-parser contrast)
- Hero H1: "Automate real Excel with AI"
- Add transparent-background nav logo

READMEs (critical review against actual repo):
- Reframe "100% Safe / Zero corruption risk" overclaims to "real Excel engine"
- tests: fix VBA test folder (Vba/), real filenames, drop non-existent trait
- examples: replace non-existent session-demo scripts with inline commands
- infrastructure/azure: fix cost contradiction ($30 -> $61 24/7)
- skills: fix plugin install syntax (@mcp-server-excel-plugins), bash->powershell,
  weak /releases links -> SKILL.md, reorder Goose row
- CLI: convert GitHub Actions bash step to PowerShell (shell: pwsh)
- vscode: add missing Calculation Mode feature, fix broken Troubleshooting heading
- docs proposal: fix plugin install syntax

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>

* docs: align vscode README with landing page and unify doc links

- Reword landing-page differentiator in plain language (drop
  "re-serialized/approximated" jargon; name the concrete consequence)
- Mirror the reworded value prop and curated "Key features" themes in the
  VS Code marketplace README so it matches excelmcpserver.dev
- Point all documentation links to excelmcpserver.dev (replace stale
  sbroenne.github.io URLs) across vscode, McpServer, CLI, and plugin READMEs;
  keep source-file/issue/badge links on GitHub

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>

* docs: comprehensive documentation audit and fact-check pass

Full review of all Markdown documentation for accuracy, consistency, and staleness:

- FEATURES.md: fixed verb tense inconsistencies, a nested-list rendering bug
  (Conditional Formatting/Screenshot sections rendering flat instead of nested),
  un-backticked references, removed redundant summary sections.
- Removed the defunct HeyGen MCP server reference and fixed stale tool/operation
  counts across docs.
- SECURITY.md: replaced a stale Supported Versions table (1.6.x/1.7.x) with an
  accurate latest release only policy, and fixed a Version History date error
  (1.0.0 mis-dated 2024 instead of 2025).
- PRIVACY.md: clarified that telemetry is collected by the MCP Server only -
  verified via code search that the CLI has zero telemetry code.
- docs/CONTRIBUTING.md: rewrote the technical sections to describe the actual
  current 5-layer architecture (ComInterop/Core/Service/CLI/McpServer) and
  workflow, replacing a defunct flat-command-registration description.
- CHANGELOG.md: fixed a confirmed year typo - 8 entries (v1.5.0-v1.5.14) were
  dated 2025-01/02 instead of 2026-01/02, verified against actual PR merge
  commit dates, which had broken chronological ordering.
- gh-pages/overrides/main.html: removed a stale hardcoded JSON-LD software
  version with no build-time injection mechanism.
- Reviewed and fixed installation guides, VS Code extension docs, Agent Skills
  docs, and GitHub Copilot plugin READMEs:
  - .github/plugins/excel-mcp/README.md: restored a missing Python in Excel
    (2 ops) row so the category list sums to the advertised 232 operations.
  - skills/README.md and docs/INSTALLATION-MCP-SERVER.md: corrected false
    claims that the VS Code extension auto-installs both the excel-mcp and
    excel-cli skills - it only registers excel-mcp via chatSkills.
  - docs/INSTALLATION.md: corrected a misleading tip claiming the VS Code
    extension bundles the CLI alongside the MCP Server.
- Reviewed MkDocs navigation structure and all site pages for correctness.

Verified: scripts/check-doc-counts.ps1 passes (26 tools / 232 operations),
mkdocs build --strict --clean passes with 0 errors.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>

* docs: fix remaining VS Code extension / CLI bundling inaccuracies

- docs/INSTALLATION-MCP-SERVER.md: the VS Code extension bundles the MCP
  server only, not the CLI - fixed a claim saying it bundles both.
- docs/INSTALLATION-CLI.md: the excel-cli Copilot plugin bootstraps/downloads
  excelcli.exe on first use rather than bundling it, and the VS Code
  extension does not include the CLI at all - fixed a claim saying the CLI
  is "already included" via either path.
- docs/INSTALLATION.md: clarified the VS Code extension only auto-installs
  the excel-mcp skill (not excel-cli).

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>

---------

Co-authored-by: Stefan Broenner <stbrnner@microsoft.com>
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
2026-07-09 15:51:41 +02:00
Stefan Broenner 760a352a18 Re-architect changelog generation and release notes (#698)
* Re-architect changelog generation and release notes

Replace manual CHANGELOG.md editing and fragile awk/sed extraction with
changesets (@changesets/cli), following the industry-standard pattern used
by many open source JS/TS projects for human-curated, end-user-facing
changelogs.

- Add changesets tooling (package.json, .changeset/config.json,
  .changeset/README.md) using @changesets/changelog-github for PR-linked
  entries
- Add changeset-check.yml CI workflow: fails a PR if no changeset fragment
  was added, unless labeled skip-changelog
- Add scripts/Build-Changelog.ps1: compiles pending changesets into
  CHANGELOG.md and a release-notes body, replacing the old awk-based
  Unreleased extraction and sed-based rename step in release.yml
- Extract the GitHub Release body into a template file
  (.github/release-notes-template.md) with {{VERSION}}/{{CHANGELOG}}
  placeholders, rendered via PowerShell instead of an inline bash heredoc
  mixed with GitHub Actions expression syntax
- Clean up CHANGELOG.md: collapse several releases' worth of content that
  had been mislabeled as Unreleased (root cause: the old auto-PR-rename
  step silently failed to merge for months) into a single accurate
  released version entry, and condense verbose engineering prose into
  concise end-user-facing bullets
- Delete orphaned chore/changelog-v* branches left over from the broken
  automation
- Update Rule 27 and related instructions/docs (development-workflow,
  readme-management, RELEASE-STRATEGY, PR template) to describe the new
  changeset-based workflow

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>

* Allow Python-2.0 license for argparse (transitive changesets dep)

The argparse npm package (transitive dependency of @changesets/cli via
js-yaml) declares its license as Python-2.0, an OSI-approved permissive
license, which was blocking the Dependency Review check.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>

---------

Co-authored-by: Stefan Broenner <stbrnner@microsoft.com>
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
2026-07-09 06:49:50 +02:00
Stefan Broenner 198b60a385 Restore Excel green branding and shrink docs hero (#697)
* Restore Excel green branding and shrink docs hero

Fix two visual regressions on the MkDocs site plus a stray heading bug:

- Color: palette was set to Material teal; restore the Excel brand green
  (#217346 primary, #107c41 accent, #217346->#33a85c hero gradient) via
  custom Material color variables in extra.css, with lifted variants for
  dark mode.
- Hero size: reduce .mcp-hero padding (3rem->1.8rem), icon (96->72px),
  title (2.6->2.1rem) and margins so the header box is less oversized.
- Stray "Home" heading: home.html had a literal {{ super() }} inside an
  HTML comment, which Jinja still evaluated and re-rendered Material's
  auto-injected page title. Render {{ page.content }} directly instead;
  the hero already provides the page's single h1.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>

* Redesign docs landing page for clarity and consistency

Rework the homepage so it routes visitors instead of dumping the whole
manual on one long scroll:

- Remove the triple-represented feature content; keep one consistent
  "Key features" grid (uniform .lg .middle icons + dividers on every card).
- Trim the redundant "Documentation" grid into a consistent "Explore the
  docs" section with matching card styling and call-to-action links.
- Keep the count line ("26 tools and 232 operations") exactly once, so the
  doc-count guard still has its anchor.
- Move the internal architecture detail off the landing page into a new
  architecture.md page, replacing the dated ASCII diagram with a Mermaid
  flowchart (superfences custom_fence added to mkdocs.yml).
- Move author-portfolio "Related projects" into its own related-projects.md
  page under the More nav section.
- Restructure nav: keep Home/Features/Installation/MCP Server/CLI as top
  tabs; group Agent Skills, Architecture, Changelog and the rest under More.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>

* docs: reframe value prop and critically review all READMEs

Landing page:
- Lead with capability-first "real Excel engine" differentiator (names
  openpyxl / Anthropic xlsx skill as the file-parser contrast)
- Hero H1: "Automate real Excel with AI"
- Add transparent-background nav logo

READMEs (critical review against actual repo):
- Reframe "100% Safe / Zero corruption risk" overclaims to "real Excel engine"
- tests: fix VBA test folder (Vba/), real filenames, drop non-existent trait
- examples: replace non-existent session-demo scripts with inline commands
- infrastructure/azure: fix cost contradiction ($30 -> $61 24/7)
- skills: fix plugin install syntax (@mcp-server-excel-plugins), bash->powershell,
  weak /releases links -> SKILL.md, reorder Goose row
- CLI: convert GitHub Actions bash step to PowerShell (shell: pwsh)
- vscode: add missing Calculation Mode feature, fix broken Troubleshooting heading
- docs proposal: fix plugin install syntax

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>

* docs: align vscode README with landing page and unify doc links

- Reword landing-page differentiator in plain language (drop
  "re-serialized/approximated" jargon; name the concrete consequence)
- Mirror the reworded value prop and curated "Key features" themes in the
  VS Code marketplace README so it matches excelmcpserver.dev
- Point all documentation links to excelmcpserver.dev (replace stale
  sbroenne.github.io URLs) across vscode, McpServer, CLI, and plugin READMEs;
  keep source-file/issue/badge links on GitHub

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>

---------

Co-authored-by: Stefan Broenner <stbrnner@microsoft.com>
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
2026-07-08 21:16:19 +02:00
Stefan Broenner 44dbd94c47 docs: fix service architecture diagram, remove HeyGen, reconcile tool/operation counts, add count-drift guard (#693)
* docs: fix service architecture diagram, remove HeyGen, clean up historic artifacts

Correct the 'shared ExcelMCP Service / shared sessions' claim in README, gh-pages, MCP Server README, and the MCP skill. In reality the MCP Server runs the ExcelMCP Service in-process (direct calls, no pipe) while the CLI uses a background daemon; each hosts its own service and Excel instance and they do not share live sessions. Reworded the diagram and key benefits accordingly.

Remove the retired HeyGen MCP Server link from README and gh-pages, and drop a broken link to the deleted archive/API-COMPARISON-REPORT.md.

Delete historic artifacts: root bug reports, docs/archive, .squad run logs/orchestration logs/sessions/agent histories, and completed specs/ feature folders.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>

* docs: fix tool/operation counts and add permanent count-drift guard

Reconcile the user-facing surface to 26 tools / 232 operations everywhere and
prevent the count discrepancy from ever recurring.

- FEATURES.md: Charts header 28 -> 29 (chart 8 + chartconfig 21); fix two
  corrupted section-header emoji. Section headers + summary table now both = 232.
- GenerateSkillFile: add ExcludeCommands / ExtraOperationCount / ExtraToolCount so
  the generated skills report the true user-facing surface (manifest 229 - diag 3
  + file 6 = 232). Both CLI and MCP skill targets pass ExcludeCommands=diag,
  ExtraOperationCount=6, ExtraToolCount=1. MCP SKILL.md now says 232 (was 229).
- CLI README: refresh stale per-category table (Power Query 10->12, Charts 14->8,
  Chart Config 14->21, add missing Window Management row) so 18 categories = 232.
- README: drop stale "22 command categories" claim.
- NEW pre-commit gate scripts/check-doc-counts.ps1: derives canonical counts from
  code (skill manifest + FileAction enum, cross-checked against the real
  [McpServerTool] surface) and fails if any user-facing doc or generated SKILL.md
  advertises a mismatching count. Wired into pre-commit.ps1; documented in gates table.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>

---------

Co-authored-by: Stefan Broenner <stbrnner@microsoft.com>
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
2026-07-08 16:20:58 +02:00
Stefan Broenner 7036c16e14 Move Excel interop back to PIA-first (#669)
* Move Excel interop back to PIA-first

Upgrade Microsoft.Office.Interop.Excel to 16.x and replace Power Query plus Data Model measure dynamic access with typed PIA APIs where the newer interop assembly exposes them.

Refresh the Nerdbank.MessagePack audit override so restore and pre-commit checks pass without suppressing NuGet audit policy.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* Refresh dependency pins

Update central .NET package pins and VS Code extension linter dependency while keeping VS Code typings aligned with the declared engine.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* Refresh dependencies to latest stable

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* Embed Excel PIA and remove Office assembly resolver

The hand-rolled office.dll assembly resolver was a workaround for a
misconfigured build, not a real PIA limitation. EmbedInteropTypes=true set
as metadata on a <PackageReference> is silently ignored by the .NET SDK, so
the Excel PIA was referenced (not embedded) and the built assemblies took a
transitive runtime dependency on office (Microsoft.Office.Core) v16.0.0.0.
Any host without the resolver (e.g. Core/ComInterop tests, which have no
Main) crashed with FileNotFoundException: office, Version=16.0.0.0.

Fix: force genuine interop embedding via a repo-root Directory.Build.targets
target that flips the resolved Excel PIA reference to /link: after
ResolveAssemblyReferences, plus <ExcludeAssets>runtime</ExcludeAssets> to keep
the PIA compile-only. Only the Excel interop types actually used are baked
into ComInterop/Core (none are Office.Core types), so the assemblies carry no
office.dll dependency and no deps.json entry. The ignored EmbedInteropTypes
metadata is removed from the PackageReferences; the target is the single
documented mechanism.

- Fixed CS1769 (embedded interop type as generic arg across assembly
  boundary) by changing ComUtilities.ForEachColumn to Action<object,int>.
- Removed RegisterOfficeAssemblyResolver/ResolveOfficeDll from McpServer and
  CLI Program.cs; no test-side resolver added.
- AutomationSecurity stays ((dynamic)(object)) late-bound (Office.Core enum
  intentionally not referenced); corrected the misleading (object)-cast
  rationale in ExcelBatch.cs and docs/PIA-COVERAGE.md.

Verified: solution builds 0/0; ComInterop/Core embed 25/49 Excel types with
zero office/Excel/stdole/Vbe references; Release deps.json office=0; Core.Tests
(no Main, resolver gone) Feature=PowerQuery 125 passed/0 failed and
Feature=DataModel 102 passed/0 failed.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

---------

Co-authored-by: Stefan Broenner <stefan.broenner@microsoft.comm>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-06-10 17:12:58 +02:00
Stefan Broenner 1fbdd9a02d Fix Excel PIA startup alignment
Align Excel PIA startup with the registered Office Click-to-Run PIA and shorten session startup timeouts to 120 seconds with actionable override guidance.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-05-27 18:11:58 +02:00
Stefan Broenner 3b54044d39 Ship plugin bootstrap runtime wrappers and packaging validation
## Summary
- Ship bootstrap-only Copilot CLI plugin packages for Excel CLI and MCP runtime launchers.
- Auto-download the latest self-contained Windows runtime on first invocation and refresh through wrapper scripts.
- Keep public skills concise by moving detailed CLI command guidance into references/cli-commands.md.
- Add packaging regressions for plugin bootstrap assets and CLI command reference inclusion.

## Validation
- dotnet test tests\ExcelMcp.SkillGeneration.Tests\ExcelMcp.SkillGeneration.Tests.csproj --filter "FullyQualifiedName~PluginBootstrapBuildTests|Feature=SkillGeneration" --blame-hang-timeout 5m --no-restore

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-04-27 13:35:17 +02:00
Stefan Broenner 848f12b9ff fix: publish excel-cli plugin without bundled binary (#613)
Co-authored-by: Stefan Broenner <stefan.broenner@microsoft.comm>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-04-25 17:16:10 +02:00
Stefan Broenner 9924234aec chore: harden release workflows and extension packaging
- fix publish-plugins tag resolution for annotated release tags
- remove retired workflow/package distribution surfaces and align docs
- switch vscode-extension packaging to @vscode/vsce 2.25.0 to clear the unpatchable Dependabot uuid chain

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-04-25 16:25:56 +02:00
Stefan Broenner cb14f2eb5b Add Copilot CLI plugin publish flow and Squad cleanup (#608)
* chore(squad): plan refinement after rubber-duck review — added Phase -1 spike

- Accept all 4 critical + 4 moderate findings from rubber-duck critique
- User approved Phase -1 spike to validate {pluginDir} placeholder before Phase 0
- Incorporate wrapper script design, GitHub App auth, SHA256 verification
- Answer all 5 open questions (Q1–Q5)
- Document decisions in .squad/decisions.md (merged from inbox, deduplicated)
- Update Kelso agent history with session context
- Created orchestration logs and session log for audit trail

Critical fixes ready for Phase -1 execution:
1. Wrapper script (bin/start-mcp.ps1) for missing-binary detection
2. Phase -1 spike to prove {pluginDir} placeholder works
3. GitHub App replacing PAT in release workflow (Phase 4)
4. SHA256 checksum verification in download.ps1 (Phase 4)
5. Version skew detection (version.txt + wrapper validation)
6. Workflow atomicity (concurrency control, single commit)
7. CLI discovery without agent (skill-driven)
8. Drop non-spec frontmatter fields

Next: Execute Phase -1 spike, await Phase 0 GO/NO-GO decision.

* Add plugin publish pipeline

Add Copilot CLI plugin publish automation and supporting docs for syncing
excel-mcp and excel-cli artifacts to the published plugin repository.

Refs #606

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* Update Squad governance and remove workflows

Add Kelso to the Squad roster, save the default GPT-5.4 model preference,
remove unused Squad GitHub workflows, and align the active agent guidance
with workflow-free operation.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* docs: Plugin release path audit and documentation sync

Agents: Kelso (Plugin Release), Trejo (Documentation)

## Orchestration

- Kelso: Validated GitHub Copilot CLI plugin publishing workflow; added
  preflight validation; identified PLUGINS_REPO_TOKEN as required secret
- Trejo: Aligned install docs and release strategy with two-plugin flow;
  removed CLI-exclusive wording; clarified plugin support across surfaces

## Changes

### Release Automation
- `.github/workflows/publish-plugins.yml`: Added preflight job that fails
  fast when PLUGINS_REPO_TOKEN is missing (better UX than generic auth error)
- `docs/RELEASE-STRATEGY.md`: Treats plugin publish as required follow-on
  step; added surface-neutral wording for release artifacts

### Documentation Updates
- `README.md`: Two-plugin install flow (marketplace registration + dual install)
- `docs/INSTALLATION.md`: Clarified plugin surface support (Copilot CLI, VS
  Code, Claude); removed CLI-exclusive language
- `gh-pages/index.md`: Updated landing content to reflect multi-surface plugin
  support
- `docs/publish-plugins-setup.md`: Separated artifact publication from
  client-specific install UX

## Decisions Merged

- 2026-04-24: Plugin release preflight and verification (Kelso)
- 2026-04-24: Plugin release wording should be surface-neutral (Kelso)
- 2026-04-24: Plugin install and release sync (Trejo)
- 2026-04-24: Plugin wording must separate concept from install path (Trejo)

## Session Logs

- `.squad/orchestration-log/2026-04-24T10-36-50Z-kelso.md`
- `.squad/orchestration-log/2026-04-24T10-36-50Z-trejo.md`
- `.squad/log/2026-04-24T10-36-50Z-release-plugin-audit.md`

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* chore: revert plugin publish auth from GitHub App to stored PAT

Switches publish-plugins.yml from GitHub App auth (PLUGINS_PUBLISH_APP_ID + PLUGINS_PUBLISH_APP_PRIVATE_KEY) back to a single stored cross-repo token (PLUGINS_REPO_TOKEN) while preserving all operational hardening (preflight gate, sync gate, version guards, manual re-sync path).

WORKFLOW CHANGES:

- Removed GitHub App token minting steps

- Replaced app-id/private-key refs with PLUGINS_REPO_TOKEN secret

- Kept preflight validation (fails fast if token missing/unreachable)

- Kept all guards: downgrade, tag mismatch, duplicate skip, manual override

- Changed commit identity from app bot to github-actions[bot]

DOCS UPDATED:

- publish-plugins-setup.md: PAT setup instructions (removed App sections)

- RELEASE-STRATEGY.md: Updated secrets table, troubleshooting

- INSTALLATION.md: Changed 'GitHub App auth' to 'stored cross-repo PAT'

- README.md: Updated release strategy reference

- gh-pages/index.md: Aligned with README change

- cross-repo-release-preflight SKILL: Generalized patterns for both PAT and App auth

RATIONALE:

Simpler setup (1 secret vs 1 variable + 1 secret), easier rotation, same security posture for this public-repo use case. Keeps iq-core-style operational hardening intact.

* docs: record plugin auth revert decision and learnings

* Scribe: Orchestrate plugin auth revert session (Kelso + Trejo)

- Merged inbox decision: Revert plugin publish auth from GitHub App to stored PAT (PLUGINS_REPO_TOKEN)
- Kelso verified workflow already token-based; coordinated docs revert
- Trejo aligned all user-facing and maintainer docs to simpler PAT model
- Cross-repo-release-preflight skill generalized to document both PAT and App auth patterns
- Updated agent history files with session context and coordination notes
- Decision merged to decisions.md; inbox file deleted

Status: Ready for user to store PLUGINS_REPO_TOKEN secret in repo

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* Fix Copilot plugin marketplace layout

Align the source repo with the two-plugin marketplace model and migrate
published marketplace sync toward the canonical manifest layout.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

---------

Co-authored-by: Stefan Broenner <stefan.broenner@microsoft.comm>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-04-25 14:38:47 +02:00
Stefan Broenner 7888a43541 docs: document squash merge policy across PR workflows (#596)
- Update development-workflow.instructions.md with explicit squash merge requirement
- Update CONTRIBUTING.md to clarify merge strategy in PR process
- Update DEVELOPMENT.md PR review section with squash merge instructions

All PRs are now explicitly documented to be merged via squash merge, keeping
main branch history clean with one commit per feature/fix.

Co-authored-by: Stefan Broenner <stefan.broenner@microsoft.comm>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-04-07 09:00:27 +02:00
Stefan Broenner ccb76d7d7e Pre-commit release gates: Add 14 validation gates with comprehensive packaging verification (#593)
* .squad: Pre-commit release gates hardening (2026-04-02)

## Context
Release workflow run 23886836872 failed when VS Code extension packaging
detected dependency mismatch. Lighter checks (install, compile) passed;
only packaging step caught the defect.

## Work
Trejo:
- Extended scripts/pre-commit.ps1 with VS Code extension packaging gate
- Aligned vscode-extension/package.json to engines.vscode ^1.110.0
- Updated docs (PRE-COMMIT-SETUP.md, copilot-instructions.md)

Nate:
- Validated evidence: npm run package is the minimum catching gate
- Lighter checks insufficient (install, compile both passed)

## Decisions Merged
- copilot-directive-2026-04-02T083429Z: Build everything in pre-commit
- nate-vscode-package-precommit: Packaging validation is required gate
- trejo-precommit-extension-package: Add packaging to pre-commit

## Logs Created
- Orchestration: .squad/orchestration-log/20260402-084216-precommit-release-gates.md
- Session: .squad/log/20260402-084216-precommit-release-gates.md
- Agent history: Updated Trejo and Nate learnings
- Skills: Added precommit-release-gates pattern doc

## Blocker
CLI session close failure prevents full pre-commit validation on HEAD
(separate issue; not in scope for this work).

## Inbox Cleanup
Deleted inbox files after merge:
- copilot-directive-2026-04-02T083429Z.md
- nate-vscode-package-precommit.md
- trejo-precommit-extension-package.md

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* Pre-commit release gates: Add 14 validation gates with local CLI/MCP/extension/MCPB/skills packaging

Adds comprehensive pre-commit validation gates that verify all release
deliverables build and package locally before commit:

- Extends release solution build to refresh generated skill outputs
- Adds CLI release deliverables validation (NuGet pack + zip)
- Adds MCP Server release deliverables validation (NuGet pack + zip)
- Adds VS Code extension packaging validation (npm run package)
- Adds MCPB Claude Desktop bundle build validation
- Adds agent skills packaging validation
- Adds dynamic cast audit to enforce cast justification comments

Validation gates increase from 10 to 14 gates. This ensures packaging
integrity throughout the development cycle, preventing broken releases
at merge time and providing fast feedback during local development.

Updates Copilot instructions to document the expanded gate suite.
Updates pre-commit setup documentation with complete workflow.

Product changes only. .squad history excluded per gate requirements.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

---------

Co-authored-by: Stefan Broenner <stefan.broenner@microsoft.comm>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-04-02 09:48:34 +02:00
Stefan Broenner f5866fdf66 Harden VBA run flows and pre-commit governance (#592)
- harden reopened macro workbook VBA execution across Core, CLI, and MCP
- tighten CLI validation and add focused VBA coverage
- codify pre-commit hooks as hard stops in squad governance

Co-authored-by: Stefan Broenner <stefan.broenner@microsoft.comm>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-04-02 08:14:02 +02:00
Stefan Broenner bbd1fdb1ff Migration: pytest-aitest -> pytest-skill-engineering for llm-tests (#590)
* Refresh dependencies and migrate llm-tests to pytest-skill-engineering (#589)

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* Exclude worksheet reference from pytest migration PR

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* Orchestration: Chart hardening assessment + MCP LLM test investigation

Scribe role execution:

1. ORCHESTRATION LOGS (session 2026-04-01T13-38-34Z):
   - Created .squad/orchestration-log/2026-04-01T13-38-34Z-mccauley.md
   - Created .squad/orchestration-log/2026-04-01T13-38-34Z-cheritto.md
   Documents chart hardening assessment (deferred) and MCP/CLI parity findings

2. SESSION LOG:
   - Created .squad/log/2026-04-01T13-38-34Z-chart-hardening-assessment.md
   Brief summary of assessment topic, outcomes, and next steps

3. DECISION INBOX CONSOLIDATION:
   - Merged 6 inbox decisions into .squad/decisions.md (new 2026-04-01 and 2026-04-02 sections):
     * McCauley: Chart hardening assessment → deferred indefinitely (no functional gap, no confirmed bugs)
     * Cheritto: MCP/CLI parity assessment → parity verified, defer implementation
     * Nate: LLM test harness repairs → test code repaired, pytest-skill-engineering harness regression identified
     * Cheritto: Calculation mode discoverability fix → aligned Program.cs with skill docs
     * Cheritto: MCP LLM test failure investigation → no MCP schema gaps, test authoring issues
     * Trejo: Calculation mode LLM alignment → created dedicated reference, enhanced tool description

   - Deleted all inbox files after merge

4. CROSS-AGENT HISTORY UPDATES:
   - McCauley: Added chart hardening assessment summary (deferred, no functional gap)
   - Cheritto: Added MCP/CLI parity findings and calculation_mode guidance fix
   - Nate: Added test harness repair summary and pytest-skill-engineering regression finding
   - Trejo: Added calculation_mode discoverability alignment work

5. DECISIONS.MD STATUS:
   - Size: 30.78 KB (exceeds 20KB threshold but within 30-day window)
   - All entries dated 2026-03-16 or later (no archiving needed)
   - Inbox folder now empty (all decisions migrated)

6. GIT COMMIT:
   - Staged: .squad/agents/{cheritto,mccauley,nate,trejo}/history.md
   - Staged: .squad/decisions.md
   - Staged: .squad/decisions/inbox/ (deletion of merged files)
   - Staged: new orchestration logs and session log
   - Status: Ready for commit

---

Chart hardening: Deferred indefinitely (no product gap, cost outweighs value)
MCP/CLI parity: Verified, no gaps in current implementation
LLM tests: Test code repaired, pytest-skill-engineering harness issue identified
Calculation mode: Guidance aligned between Program.cs and skill docs

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* Align MCP LLM tests with current skill guidance

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

---------

Co-authored-by: Stefan Broenner <stefan.broenner@microsoft.comm>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-04-01 16:10:47 +02:00
Copilot f5bb12a810 Standalone self-contained executables as primary distribution, NuGet as secondary (#557)
* feat: replace NuGet publishing with standalone exe distribution

- Replace NuGet version checkers with GitHub Releases API in CLI and MCP Server
- Update update notification messages to point to GitHub releases download page
- Remove NuGet packaging properties from .csproj files (PackAsTool, ToolCommandName, etc.)
- Remove NuGet tool pack hack MSBuild targets from both .csproj files
- Update server.json to remove NuGet package entry
- Rewrite release workflow: build standalone self-contained exes instead of NuGet packages
- Remove NuGet login/push steps from publish job
- Remove NuGet propagation wait from MCP Registry job
- Add CLI ZIP artifact to GitHub release
- Update release notes to describe standalone exe distribution

Co-authored-by: sbroenne <3026464+sbroenne@users.noreply.github.com>

* docs: update all documentation for standalone exe distribution

- Rewrite docs/INSTALLATION.md: standalone exe download/extraction instead of dotnet tool install
- Update README.md: remove NuGet badges, update Quick Start table and Manual Installation
- Rewrite docs/RELEASE-STRATEGY.md: reflect standalone exe distribution model
- Rewrite docs/VERSION-CHECKING.md: describe GitHub Releases API version checking
- Archive docs/NUGET-GUIDE.md with historical note
- Rewrite docs/MCP_REGISTRY_PUBLISHING.md: remove NuGet references
- Update src/ExcelMcp.McpServer/README.md: new badges, installation instructions
- Update src/ExcelMcp.CLI/README.md: new badges, download-based installation
- Update gh-pages/index.md: remove NuGet badges, update manual installation
- Update examples READMEs and skills files: replace dotnet tool install with download links
- Update skills/templates/SKILL.cli.sbn: new install instruction
- Fix release workflow: fail fast if expected exe not found during rename

Co-authored-by: sbroenne <3026464+sbroenne@users.noreply.github.com>

* feat: restore NuGet as secondary distribution channel (primary: standalone exe)

Per feedback: keep NuGet publishing but as a secondary channel, with standalone
self-contained executables as the primary distribution channel.

Code changes:
- Restored NuGet packaging properties (PackAsTool, ToolCommandName, PackageId, etc.)
  in both ExcelMcp.McpServer.csproj and ExcelMcp.CLI.csproj
- Restored NuGet tool pack hack MSBuild targets in both .csproj files
- Restored server.json NuGet packages entry for MCP Registry
- Release workflow: added dotnet pack (secondary) alongside dotnet publish --self-contained (primary)
- Release workflow: restored NuGet OIDC login and dotnet nuget push in publish job
- Release workflow: restored NuGet propagation wait step in publish-mcp-registry job
- Release workflow: updated server.json version update regex to handle both top-level and package version fields
- Release notes: show standalone exe as primary, NuGet as secondary

Documentation:
- docs/INSTALLATION.md: added NuGet section as "Alternative: Secondary" channel; exe is primary
- docs/RELEASE-STRATEGY.md: updated to show dual distribution model
- docs/NUGET-GUIDE.md: restored from archive, added secondary channel note, fixed workflow names
- docs/VERSION-CHECKING.md: added NuGet update path alongside exe update path
- docs/MCP_REGISTRY_PUBLISHING.md: restored NuGet wait step reference
- src/ExcelMcp.McpServer/README.md: added NuGet badge + secondary install instructions
- src/ExcelMcp.CLI/README.md: added NuGet badge + secondary install section
- gh-pages/index.md: restored NuGet download badges; manual install shows both options
- examples READMEs and mcp-configs: show both install methods

Co-authored-by: sbroenne <3026464+sbroenne@users.noreply.github.com>

* fix: upgrade Scriban from 6.5.3 to 6.6.0 to resolve known vulnerabilities

Scriban 6.5.3 had three known vulnerabilities:
- GHSA-5rpf-x9jg-8j5p (moderate severity)
- GHSA-grr9-747v-xvcp (high severity)
- GHSA-wgh7-7m3c-fx25 (high severity)

These caused NU1902/NU1903 errors (treated as errors via TreatWarningsAsErrors=true)
in the build-cli.yml CI workflow during dotnet restore.

Scriban 6.6.0 has no known vulnerabilities.

Co-authored-by: sbroenne <3026464+sbroenne@users.noreply.github.com>

* fix: remove -- from XML comment in McpServer.csproj to fix CodeQL build

XML comments cannot contain '--'. The comment on line 38 included
dotnet publish flags '--runtime win-x64 --self-contained true' which
caused MSB4025: The project file could not be loaded.

Replaced '--runtime' and '--self-contained' with their MSBuild property
equivalents '-r' and '-p:SelfContained=true' to avoid invalid XML.

Co-authored-by: sbroenne <3026464+sbroenne@users.noreply.github.com>

---------

Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: sbroenne <3026464+sbroenne@users.noreply.github.com>
2026-03-20 15:35:22 +01:00
Copilot 53cf42d612 Add awesome-copilot plugin structure and contribution proposal (#540)
* Initial plan

* Add awesome-copilot plugin structure and contribution proposal

Create .github/plugins/excel-automation/ with:
- plugin.json (Claude Code spec metadata)
- agents/excel-automation.agent.md (Excel automation agent)
- README.md (plugin documentation)

Create docs/AWESOME-COPILOT-PROPOSAL.md with:
- External plugin contribution strategy
- Step-by-step PR instructions for awesome-copilot
- external.json entry template
- PR description template

Co-authored-by: sbroenne <3026464+sbroenne@users.noreply.github.com>

* Address code review feedback: remove relative skill path, add screenshot capability

Co-authored-by: sbroenne <3026464+sbroenne@users.noreply.github.com>

---------

Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: sbroenne <3026464+sbroenne@users.noreply.github.com>
2026-03-06 06:34:13 +01:00
Copilot 2f998fddf0 docs: fix SECURITY.md placeholder/versions, remove duplicate test section, archive stale research docs (#536)
* Initial plan

* Fix documentation issues: SECURITY.md, duplicate section, applyTo spacing, archive research docs

Co-authored-by: sbroenne <3026464+sbroenne@users.noreply.github.com>

---------

Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: sbroenne <3026464+sbroenne@users.noreply.github.com>
2026-03-03 06:41:13 +01:00
Stefan Broenner 3029f39ea4 refactor: PIA migration + fix office.dll crash on all Excel sessions (#487)
Migrates Excel COM interop to strongly-typed Microsoft.Office.Interop.Excel PIA types throughout the codebase, and fixes a critical regression where all Excel sessions crashed with FileNotFoundException for office.dll after the PIA migration.

- Strongly-typed PIA for Power Query, DataModel, Connection, Range, Sheet, Table commands
- PIA coverage enforcement via pre-commit check (check-dynamic-casts.ps1)
- Fixed office.dll crash: cast tempExcel to (object) before (dynamic) to force IDispatch
- Removed wrong-version office.dll reference (v15 hint path, v16 required at runtime)
- CLI smoke test now exercises session open round-trip to catch deployment-level crashes

Fixes #487
Closes #486
2026-02-20 18:01:04 +01:00
Copilot c579aa03d8 Align and resequence installation docs for current MCP/CLI packaging and setup flow (#462)
* Initial plan

* docs: align installation instructions with actual package layout

Co-authored-by: sbroenne <3026464+sbroenne@users.noreply.github.com>

* docs: rework installation section sequencing

Co-authored-by: sbroenne <3026464+sbroenne@users.noreply.github.com>

---------

Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: sbroenne <3026464+sbroenne@users.noreply.github.com>
2026-02-16 17:18:41 +01:00
Stefan Broenner 212319d72e feat: publish CLI NuGet package separately with service version negotiation (#452)
- Add service version negotiation: client validates exact version match
  with running service on first connect, hard fails on mismatch with
  clear error message instructing to restart the service
- Re-publish CLI as separate NuGet package (Sbroenne.ExcelMcp.CLI)
  alongside MCP Server in release workflow, always same version
- Update docs to show two install commands instead of 'unified package'
- Fix pre-existing test: ActionValidatorTests expected 'datamodelrel'
  but generated CLI command name is 'datamodelrelationship'

Co-authored-by: Stefan Broenner <stefan.broenner@microsoft.comm>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-02-15 17:24:00 +01:00
Stefan Broenner ed08fd5112 docs: add npx add-mcp as primary installation method (#449)
* docs: add npx add-mcp as primary installation method

Add auto-configuration via npx add-mcp for all MCP clients (Cursor, VS Code,
Claude Code, Claude Desktop, Codex, Zed, Gemini CLI). Keeps manual JSON
config as fallback (Option B).

Updated: README.md, docs/INSTALLATION.md, gh-pages/index.md

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* docs: add Node.js/winget install note for npx

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* docs: list Node.js as optional dependency in System Requirements

Node.js is only needed for npx commands (add-mcp, skills), not for
the MCP Server or CLI themselves. Added to Optional section with
winget install command.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

---------

Co-authored-by: Stefan Broenner <stefan.broenner@microsoft.comm>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-02-15 11:54:30 +01:00
Stefan Broenner d1c9f37f28 feat: switch release to workflow_dispatch with version bump UI and add stale workflow (#443)
- Convert release.yml from tag-triggered (push v*) to workflow_dispatch
  with version bump choice (major/minor/patch) and custom version input
- Add version calculation job that auto-increments from latest git tag
- Add create-tag job that tags after successful builds
- All existing release jobs preserved (CLI, MCP Server, VS Code, MCPB,
  Agent Skills, MCP Registry, GitHub Release)
- Add stale.yml workflow to auto-close inactive issues/PRs (30+7 days)
- Update 5 docs to reflect new release process

Co-authored-by: Stefan Broenner <stefan.broenner@microsoft.comm>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-02-15 08:53:16 +01:00
Stefan Broenner 902bd3e1e1 Reduce MCP prompt bloat and shorten server label (#442)
* Reduce MCP prompt bloat and shorten server label (#441)

- Change VS Code extension server label from 'Excel MCP Server' to 'excel'
- Remove 'excel_' prefix from all prompt names
- Remove 3 redundant prompts (chart_guide, table_guide, worksheet_cross_file)
- Trim powerquery_guide (180 lines) to m_code_syntax (20 lines)
- Trim datamodel_guide (150 lines) to dmv_reference (40 lines)
- Keep range_number_formatting_guide and data_validation_checklist as-is
- Net: 7 prompts -> 4 prompts, ~76% content reduction

* Remove SpecKit since I currently do not use it

* Fix VSIX packaging pipeline and reduce extension size

- Add .vscodeignore to control VSIX contents (144 -> 30 files)
- Add clean:bin script to prevent stale build artifacts
- Fix double-build in package script (was triggering build twice)
- Fix CHANGELOG.md copy into vscode:prepublish pipeline
- Remove redundant 'files' field from package.json
- Fix IL3000 warning for Assembly.Location in single-file publish
- Delete bash test script (Windows-only project)

* Remove Glama.ai support (Dockerfile, glama.json, .dockerignore, docs)

* Remove excel_ prefix from all MCP tool names (BREAKING CHANGE)

Rename all 23 MCP tool names to remove redundant 'excel_' prefix:

  excel_file -> file, excel_range -> range, excel_chart -> chart,

  excel_worksheet -> worksheet, excel_table -> table, etc.

Changes across 102 files:

- Core: Updated all 22 [McpTool] attributes (names + titles)

- MCP Server: ExcelFileTool, resources, prompts, telemetry, service bridge

- Generators: CliSettingsGenerator, ServiceRegistryGenerator (4 locations)

- Skills: Renamed 9 shared/*.md files and updated content

- Tests: Updated 10 LLM test files (allowed_tools, assertions)

- Docs: Updated 46+ markdown files (specs, docs, instructions, gh-pages)

- VS Code extension: Server name 'excel-mcp', label 'Excel MCP Server'

* Remove excel_ prefix from all MCP tool names (BREAKING CHANGE)

Rename all 23 MCP tool names to remove redundant 'excel_' prefix:

  excel_file -> file, excel_range -> range, excel_chart -> chart,

  excel_worksheet -> worksheet, excel_table -> table, etc.

Changes across 102 files:

- Core: Updated all 22 [McpTool] attributes (names + titles)

- MCP Server: ExcelFileTool, resources, prompts, telemetry, service bridge

- Generators: CliSettingsGenerator, ServiceRegistryGenerator (4 locations)

- Skills: Renamed 9 shared/*.md files and updated content

- Tests: Updated 10 LLM test files (allowed_tools, assertions)

- Docs: Updated 46+ markdown files (specs, docs, instructions, gh-pages)

- VS Code extension: Server name 'excel-mcp', label 'Excel MCP Server'

* Fix Build.Tasks DLL lock during extension packaging

MSBuild node reuse kept Build.Tasks.dll locked between builds, causing

MSB3027 errors on repeated 'npm run package' invocations.

- clean script: add 'dotnet build-server shutdown' to kill lingering nodes

- publish command: add -nodeReuse:false to prevent new node persistence

* Rename MCP server key from 'excel' to 'excel-mcp' in configs

Aligns server name across all sample MCP configs, installation docs,

issue template, and gh-pages with the VS Code extension identifier.

* Exclude diag tool from MCP server, fix smoke test tool names

- Filter interfaces without [McpTool] attribute from MCP generation
  (McpToolGenerator skips services where McpToolName == 'unknown')
- Diag remains available via CLI through [ServiceCategory] fallback
- Update McpServerSmokeTests to use new tool names without excel_ prefix
  (consequence of the tool rename in cb3cd93)

* Remove excel_ prefix from tool names and fix pre-existing test failures

Tool name cleanup:

- Remove 'excel_' prefix from all tool name references across the codebase

- Update C# source, tests, skills docs, LLM tests, scripts, and extension docs

Bug fixes:

- Fix CLI List<string> JSON parsing: LLM sends JSON arrays like '["North"]' but

  Spectre.Console can't parse them. Added IsSimpleListType() and DeserializeList<T>()

  to ServiceRegistryGenerator so CLI Settings uses string? and deserializes JSON.

  Affects: slicer selectedItems, pivottable-field selectedValues, tablecolumn values,

  range-edit/tablecolumn sortColumns.

- Increase max_turns 20->25 for test_mcp_sheet_structural_changes and

  test_mcp_pivottable_compact_layout to prevent flaky turn-limit failures.

Verified: Build 0W/0E, smoke tests 2/2 passed, generated code confirmed correct.

---------

Co-authored-by: Stefan Broenner <stefan.broenner@microsoft.comm>
2026-02-12 15:56:01 -08:00