* 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>
* fix: include current changelog in releases
* test: normalize workflow line endings
---------
Co-authored-by: Stefan Broenner <stbrnner@microsoft.com>
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.
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>
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
* 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
* 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
* 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
* 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>
* 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
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>
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.
* 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
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>
* 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>
* 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>
* 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>
* 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>
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>
@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>
* 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>
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>
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>
* 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>
- 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>
- 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>
- 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>