139 Commits

Author SHA1 Message Date
Copilot 953b108158 [WIP] Fix broken links on excelmcpserver.dev (#877)
* Initial plan

* Fix lychee --root-dir arg and repair broken outbound links in docs

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

* Add changeset for the Power BI Desktop and registry link fixes

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-09-16 07:53:40 +09:00
Stefan Broenner 5eafcbfc8f Keep npm lockfiles portable and preserve inherited package sources (#871)
Co-authored-by: Stefan Broenner <stbrnner@microsoft.com>
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
2026-09-11 09:07:01 -07:00
Stefan Broenner 9d54902254 Use one feature overview and fix documentation commit checks (#866)
* docs: trim agent instructions to repository-specific essentials

Consolidate overlapping guidance, correct stale contracts and testing policy, and preserve scoped Excel safety and release requirements.

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

* docs: preserve detailed guidance in contributor documentation

Move useful examples and authoring procedures out of automatic instructions into their general guides; correct stale contributor guidance and retain short discovery links.

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

* docs: single-source feature overview and refine commit checks

Generate the website overview from FEATURES.md. Keep validation-only commits out of release packaging while preserving build and count checks, and retain the original output when packaging fails.

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-09-10 22:17:25 -07:00
Stefan Broenner b7a01a1ccd Fix usage analytics interpretation validation (#860)
Co-authored-by: Stefan Broenner <stbrnner@microsoft.com>
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
2026-09-08 17:26:10 -07: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 be26b87716 Classify privacy-safe invocation failures (#826)
Separate expected diagnostic results from failures, map structured categories to fixed privacy-safe classes, preserve typed session recovery categories across CLI and MCP, and publish schema-v2 categorized reliability beginning with v2.0.4. Excel performance changes are intentionally out of scope.
2026-08-28 12:35:15 +02:00
Stefan Broenner 0a89220c61 Fix release metadata line-ending normalization (#821)
Closes #820
2026-08-28 11:11:17 +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 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 97a9352fba fix: normalize cloud setup cache paths (#804)
* chore: refresh coding agent setup

Remove the unused Squad configuration and align Copilot instructions with the current generated architecture. Add deterministic Windows cloud-agent dependency setup.

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

Copilot-Session: b6c52095-fe7c-4482-8789-f490af2ffad3

* docs: update generated surface checklist

Replace obsolete hand-written MCP wiring steps in the pull request template with the current generator and parity checks.

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

Copilot-Session: b6c52095-fe7c-4482-8789-f490af2ffad3

* fix: normalize cloud setup cache paths

Use repository-style paths for action cache inputs and the documentation requirements file.

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

Copilot-Session: b6c52095-fe7c-4482-8789-f490af2ffad3

---------

Copilot-Session: b6c52095-fe7c-4482-8789-f490af2ffad3
2026-08-20 08:56:38 +00:00
Stefan Broenner 11de41ac7f chore: refresh coding agent setup (#802)
* chore: refresh coding agent setup

Remove the unused Squad configuration and align Copilot instructions with the current generated architecture. Add deterministic Windows cloud-agent dependency setup.

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

Copilot-Session: b6c52095-fe7c-4482-8789-f490af2ffad3

* docs: update generated surface checklist

Replace obsolete hand-written MCP wiring steps in the pull request template with the current generator and parity checks.

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

Copilot-Session: b6c52095-fe7c-4482-8789-f490af2ffad3

---------

Copilot-Session: b6c52095-fe7c-4482-8789-f490af2ffad3
2026-08-20 08:44:24 +00:00
Stefan Broenner f05294fd25 Generate shared bootstrap template (#794)
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 3e5fb997-433e-427b-9b60-5485fb0813a8
2026-08-20 07:13:37 +00: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 3f51870d40 fix(docs): report real page dates in the sitemap, assert accessibility fixes (#774)
* fix(docs): report real page dates in the sitemap, assert accessibility fixes

The sitemap carried no <lastmod> at all. hooks.py stripped every value with a
regex over the built XML, because MkDocs stamps the *build* date on each URL --
which told crawlers all 52 pages changed on every deploy. Removing them avoided
the false signal but replaced it with no signal.

Dates now come from git: one `git log` walk maps each tracked path to its last
commit, and a wrapper page takes the newest date among itself and the canonical
repo file it mirrors. Verified against `git log -1` for five paths across all
four source layouts.

That let the sitemap become a real template. overrides/sitemap.xml renders both
<lastmod> and the home page's <video:video> block declaratively, replacing ~55
lines of regex surgery plus a manual re-gzip in on_post_build. MkDocs now writes
sitemap.xml.gz from the same rendered output, so the two cannot diverge.

Same treatment for two of the three accessibility patches: the logo (alt="logo",
no dimensions) and the progress bar (role=progressbar with no accessible name)
are now overrides/partials/, since upstream ships them as a 7-line and a 1-line
template. The search dialog stays a string patch on purpose -- Material's search
partial is ~45 lines of markup, icon lookups and feature flags, so forking it to
add one attribute would pin a large slice of theme internals.

None of these were verified before. audit_site.py now asserts all four in the
built HTML, so a Material upgrade that renames a class fails the build instead
of silently regressing accessibility, and asserts every URL has a valid,
non-uniform <lastmod>.

Both workflows that build the site check out with fetch-depth: 0, because a
shallow clone dates every page to the tip commit.

Verification:
- Negative-tested every new guard. Stripped lastmod, uniform dates and a
  malformed date each exit 1 with the right message; rebuilding with the
  overrides removed and the search patch disabled produces 208 failures
  (4 per page x 52).
- That exercise caught a bug in the a11y guard itself (`for ... = checks`
  instead of `in`), which had made the check a no-op.
- It also disproved a heuristic I had written: a shallow clone lists all 843
  tracked files under one date, so the "few paths means shallow" test never
  fires. Replaced with `git rev-parse --is-shallow-repository`, verified True
  against a real depth-1 clone and False here.
- Only HTML delta versus the previous build is the minifier dropping quotes
  around the logo's src/width/height, which hooks.py used to re-add after
  minification. Semantically identical.
- mkdocs build --strict --clean, audit_site.py (52 pages) and
  check_deploy_paths.py all pass; 166 files.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 388229c1-868a-416f-8b0a-7d6ee058e788

* fix(docs): match the a11y audit to the elements it actually patches

Copilot review raised two problems with audit_accessibility, both real.

The checks matched any <div role=dialog> / <div role=progressbar> rather than
the specific Material elements the build patches. That fails the wrong way in
both directions: an unrelated dialog Material grows later would fail the build
even though nothing we patch regressed, and - worse - if an upgrade restructured
the search markup out from under the patch, the role-based search would find
nothing and pass silently. Absence was indistinguishable from success, which is
the exact failure mode the audit exists to prevent.

Both now match on the Material class we patch (md-search, md-progress), and an
element that cannot be found is an explicit failure rather than a quiet skip.

Measured first: every built page carries exactly one md-search, one md-progress
and two logo images, so requiring at least one of each is safe.

Verified both of the reported cases:
- Renaming md-search and dropping the aria-label now fails with "no search
  dialog found" instead of passing.
- Injecting an unrelated unlabelled <div role=dialog> no longer fails the build.
- Removing both overrides and disabling the search patch still produces the
  original 208 failures, and a clean build still passes at 52 pages.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 388229c1-868a-416f-8b0a-7d6ee058e788

---------

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 388229c1-868a-416f-8b0a-7d6ee058e788
2026-08-15 17:06:56 +02:00
Stefan Broenner 8310b3f27c ci(docs): validate the Pages site on PRs and harden the build (#772)
* ci(docs): validate the Pages site on PRs and harden the build

The docs site was validated by nothing before merge: CI Gate never built
it, and pre-commit.ps1 classifies gh-pages/ as doc-only. A broken site was
only discoverable after it had already deployed.

Validation
- New "Docs Site" CI job: mkdocs build --strict, audit_site.py and the new
  check_deploy_paths.py on every pull request.
- check_deploy_paths.py proves the deploy workflow paths: filter covers
  every source hooks.py mirrors. That filter was hand-maintained, so a new
  mirrored file silently stopped triggering a deploy.
- Dependabot pip entry for gh-pages: mkdocs-material was never updating.

Build fixes
- hooks.py wrote its generated pages into docs_dir, which mkdocs serve
  watches, so every build retriggered itself and looped forever. Generated
  output moved to gh-pages/_generated/ with snippets base_path extended to
  match. Rebuild detections after one edit: 9+ -> 1.
- Added a watch: key so serve reloads on FEATURES.md, CHANGELOG.md, docs/
  and skills/ instead of only on gh-pages/.

Workflow split
- Persisting the star history needs contents: write, and it shared a job
  with pip install -r requirements.txt. Split into star-history.yml; the
  Pages build is now contents: read and only renders the chart. The
  generator tests also run on pull requests now, not just after merge.
- New link-check.yml runs lychee weekly over the built site and files an
  issue on link rot. Scheduled rather than per-PR because external
  endpoints rate-limit and would make it flaky.

Site output is byte-identical across all 164 files.
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 388229c1-868a-416f-8b0a-7d6ee058e788

* fix(docs): keep excluding the former docs/_generated/ location

Moving generated output out of docs_dir also removed the exclude_docs
entry, so a stale docs/_generated/ left in a long-lived clone was silently
built and published as real pages: reproduced at 52 pages instead of 51,
with audit_site.py passing.

Restore the exclusion and keep the old .gitignore entry so the leftover
directory neither gets published nor shows up as untracked.
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 388229c1-868a-416f-8b0a-7d6ee058e788

---------

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 388229c1-868a-416f-8b0a-7d6ee058e788
2026-08-15 15:51:34 +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 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
Stefan Broenner a67212a278 Update all dependencies and GitHub Actions (#758)
* chore(deps): update all dependencies

Updates NuGet, npm, Python, the .NET SDK, VS Code tooling, and GitHub Actions.

Tests: Release build; MCP protocol and transport tests; extension compile and lint; documentation build; package vulnerability audits.

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

Copilot-Session: 5e3452df-35bd-418d-b1f4-8b6903f8df24

* ci: allow verified Python package licenses

Allows MIT-0 and PSF-2.0 dependencies and scopes the typing-extensions metadata exception to that package.

Tests: dependency workflow YAML parse; full pre-commit gates.

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

Copilot-Session: 5e3452df-35bd-418d-b1f4-8b6903f8df24

---------

Copilot-Session: 5e3452df-35bd-418d-b1f4-8b6903f8df24
2026-08-06 16:54:31 +02:00
Stefan Broenner 965b4569e3 fix(release): commit changelog to main via Git Data API instead of a PR (#747)
The release workflow's changelog commit-back failed on v1.10.2 at 'gh pr
create' with 'Resource not accessible by personal access token
(createPullRequest)'. RELEASE_PAT is a fine-grained token with
'contents: write' (branch push succeeds) but no 'pull requests: write',
so the push-branch -> open-PR -> admin-merge design cannot work.

Replace that flow with a direct commit to main through the Git Data API
(blob -> tree -> commit -> update ref), authenticated as RELEASE_PAT. The
repo owner is the ruleset's only bypass actor (admin, bypass_mode:
always), so an admin-authenticated ref update bypasses the PR/status-check
rules. This needs only 'contents: write', never calls createPullRequest,
and avoids the ambiguous raw git push to protected main that failed in
v1.10.1. The commit is parented on the live main tip so the fast-forward
ref update fails loudly on concurrent pushes rather than clobbering them.

Also drop the now-unused 'pull-requests: write' permission and the stale
'fetch-depth: 0' from the create-release checkout.

Co-authored-by: Stefan Broenner <stbrnner@microsoft.com>
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
2026-07-27 11:04:58 +02:00
Stefan Broenner 2bffe1dceb fix: use PR + admin-merge instead of raw push for release changelog commit-back (#742)
* fix: use PR + admin-merge instead of raw push for release changelog commit-back

* fix: address Copilot review feedback (set -euo pipefail, idempotent PR reuse, shorter changeset)

* fix: rebase onto latest main before publishing changelog PR branch

---------

Co-authored-by: Stefan Broenner <stbrnner@microsoft.com>
2026-07-23 16:59: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 d6d48db4bb ci: push release changelog directly to main via RELEASE_PAT (#739)
* ci: push release changelog directly to main via RELEASE_PAT

The post-release 'Commit Changelog Update' step now pushes the compiled
CHANGELOG.md/package.json update straight to main using an admin
RELEASE_PAT (a ruleset bypass actor) instead of opening a
chore/changelog-vX PR.

On this user-owned repo the GitHub Actions bot cannot be granted a
branch-protection bypass, so the changelog PR could never satisfy the
required status checks (bot-authored PRs don't trigger workflows and the
commit carries [skip ci]). The PR piled up open forever, leaving several
releases with a stale/missing CHANGELOG on main. Direct push removes the
stuck-PR failure mode entirely.

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

* ci: address review - unshallow checkout and fail fast on missing RELEASE_PAT

- Set fetch-depth: 0 on the create-release checkout so the changelog
  commit-back can rebase onto main reliably (a shallow clone breaks rebase
  when main has advanced).
- Fail fast with an explicit error if the RELEASE_PAT secret is missing,
  instead of producing a confusing masked-token auth error later.

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 09:27:05 +02:00
Stefan Broenner 798c3c75bc ci: use STAR_HISTORY_TOKEN secret for star history chart (#732)
The default Actions GITHUB_TOKEN can no longer read the timestamp-enriched
stargazers endpoint (returns HTTP 403), which failed the Deploy GitHub Pages
job. Read an optional fine-grained PAT (metadata: read) from the
STAR_HISTORY_TOKEN secret, falling back to github.token when unset.


Copilot-Session: 051534da-9fe0-45e6-8326-a8ed9303a307

Co-authored-by: Stefan Broenner <stbrnner@microsoft.com>
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
2026-07-21 17:04:33 +00: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 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
github-actions[bot] 25473ac5d1 chore: update CHANGELOG.md for v1.9.4 release (#713)
* chore: update CHANGELOG.md for v1.9.4 release [skip ci]

* ci: auto-merge the post-release changelog PR

The release workflow only created the chore/changelog-vX PR and left it
open, so it piled up unmerged until a maintainer merged it by hand -
leaving several releases with a stale CHANGELOG on main. Add a merge step
(queued auto-merge with an immediate-merge fallback) right after the PR
is created.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 4cf56eb1-a0f2-4209-a224-5091d6882d17

---------

Co-authored-by: github-actions[bot] <github-actions[bot]@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-11 06:59:58 +02:00
Stefan Broenner 4f45f4ffda docs: add daily star history chart (#710)
Validated with the strict MkDocs build and deterministic SVG generation.

Co-authored-by: Stefan Broenner <stbrnner@microsoft.com>
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
2026-07-10 18:29:29 +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 08d2ec6171 Fail release loudly if changelog PR creation fails (#702)
Removes continue-on-error from the 'Commit Changelog Update' step.
This step silently failed during the v1.9.1 release (Actions lacked
permission to create PRs) while still reporting success, which is
exactly the failure mode the changesets re-architecture set out to
fix. The repo setting has been corrected separately; this change
ensures any future failure surfaces immediately instead of being
masked.

Co-authored-by: Stefan Broenner <stbrnner@microsoft.com>
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
2026-07-09 10:00:36 +02:00
Stefan Broenner 1143757776 Fix release workflow: pass GITHUB_TOKEN to changeset changelog compilation (#700)
@changesets/changelog-github requires a GITHUB_TOKEN environment
variable to look up PR/commit info when generating changelog entries.
The 'Compile changesets into CHANGELOG.md' step was missing this,
causing 'npx changeset version' to fail during the v1.9.1 release
attempt.

Co-authored-by: Stefan Broenner <stbrnner@microsoft.com>
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
2026-07-09 09:13:09 +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 e6454c8295 ci: upgrade GitHub Actions off deprecated Node 20 runtime (#696)
GitHub is deprecating the Node.js 20 Actions runtime and force-migrating
node20 actions to node24 with warnings. Bump each affected first-party
action to the earliest major that defaults to Node.js 24 (the most mature
version that resolves the deprecation):

- actions/checkout            v4 -> v5
- actions/setup-dotnet        v4 -> v5
- actions/setup-node          v4 -> v5
- actions/setup-python        v5 -> v6
- actions/upload-artifact     v4 -> v6
- actions/download-artifact   v4 -> v7
- actions/configure-pages     v4 -> v6
- actions/upload-pages-artifact v3 -> v5
- actions/deploy-pages        v4 -> v5
- actions/dependency-review-action v4 -> v5

Left unchanged (already node24): actions/stale@v10, NuGet/login@v1,
github/codeql-action@v4. HaaLeo/publish-vscode-extension@v2 has no Node 24
major published yet and remains a known follow-up.

Verified our usage is unaffected by behavioral changes in these majors:
setup-node has no cache: input, artifacts are downloaded by name (not id),
and no checkout step checks out a fork PR head under workflow_run.

Closes #695

Co-authored-by: Stefan Broenner <stbrnner@microsoft.com>
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
2026-07-08 17:47:31 +02:00
Stefan Broenner 46db2d343b Migrate docs site from Jekyll to MkDocs Material (#694)
Rewrite the GitHub Pages site (excelmcpserver.dev) for consistency, site
navigation, search, and SEO, replacing the ad-hoc Jekyll setup.

- Add MkDocs Material config (mkdocs.yml), Python build hook (hooks.py) that
  regenerates docs/_generated/*.md from canonical repo sources at build time
  (ports the old build.sh transforms + rewrites repo-relative links to
  site/GitHub URLs), requirements.txt, and Material template overrides for a
  custom marketing homepage plus SEO head (JSON-LD, Bing verification,
  per-page keywords).
- Rebuild all pages under gh-pages/docs/ with consistent icon grid cards, a
  hero homepage, nav, and thin wrapper pages that snippet-include generated
  content. Preserve all existing URLs, CNAME, sitemap, robots.txt, IndexNow
  key, and the 26 tools / 232 operations counts.
- Remove Jekyll files (_config.yml, _layouts/, _includes/, build.sh,
  Gemfile[.lock]) and old root wrapper pages / duplicated static assets.
- Rewrite deploy-gh-pages.yml to build with Python + MkDocs (--strict),
  keeping the IndexNow submit step.
- Update check-doc-counts.ps1 for the new homepage path, and refresh the
  readme-management instructions + squad charter to document the MkDocs
  pipeline.
- Remove obsolete Jekyll .vscode tasks (mkdocs serve is a one-liner).

Co-authored-by: Stefan Broenner <stbrnner@microsoft.com>
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
2026-07-08 17:02:54 +02:00
Stefan Broenner 5cb51cf5c0 Update dependencies and harden CLI daemon startup (#651)
* Update dependencies and harden CLI daemon startup

Switch the VS Code extension lint path to oxlint, refresh dependency locks, and make CLI daemon autostart recover from a clean early-exit startup race by retrying when no daemon mutex remains.

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

* Harden CLI daemon and session lifecycle for rapid open/close cycles

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

* Allow MPL-2.0 in dependency review allowlist

certifi (transitive dev-only Python test dep) ships under MPL-2.0
upstream; allow it so the LLM test harness can stay on latest versions
per the team directive.

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-05-13 12:50:07 +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 8cf91443cc fix: clear handled git diff exit code in publish workflow
- reset LASTEXITCODE after classifying the expected git diff changed-state in publish-plugins
- keep the hotfix limited to the remaining PowerShell exit propagation edge case

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-04-25 17:01:47 +02:00
Stefan Broenner eb97d61a8b fix: allow publish workflow to detect staged plugin changes
- handle git diff --staged --quiet exit code 1 as expected changed-state data in the plugin publish workflow
- keep the hotfix limited to publish-plugins and the recorded Cheritto learning

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-04-25 16:51:30 +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 b9d82be352 Fix hidden Excel leak on locked-workbook startup + categorized PQ error reporting (#576)
* Fix daemon shutdown and PQ error reporting

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

* Fix locked-workbook startup cleanup and add regressions

Fixes #575

* chore: Update to squad 0.9.1

* Address PR review feedback: fix flaky tests, Rule 26, pipe cleanup

- Remove confidential project reference from CHANGELOG (Rule 26)
- Replace Thread.Sleep + global process count with PID-set polling
  in ExcelBatchTests and SessionManagerTests (reliability)
- Remove redundant pipe Complete() calls in protocol regression tests
- Simplify IAsyncDisposable to IAsyncLifetime pattern with proper
  CTS disposal

---------

Co-authored-by: Stefan Broenner <stefan.broenner@microsoft.comm>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-03-27 10:08:04 +01: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