* 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>
Normalize generated CLI shared references to LF and compare packaged content independently of checkout line endings. Refresh the stale table reference so the v2.0.6 publication replay validates current main.
Co-authored-by: Stefan Broenner <stbrnner@microsoft.com>
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
* fix: preserve sessions during stale cleanup
Wait for the tracked daemon to finish graceful shutdown even when its reply is lost, so pre-build cleanup cannot interrupt session auto-save.
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
* fix: await tracked Excel shutdown
Treat graceful cleanup as complete only after the exact daemon generation and its tracked Excel processes exit, while retaining the existing bounded forced fallback.
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: b07d5dc3-38d8-4d20-9f07-122e079dd612
* fix: unify exact process exit handling
Observe exact process identities before requesting termination, share the bounded exit window across session and pipe cleanup, keep daemon readiness probes within their existing deadline, and wait deterministically for verified MCPB staging locks to release.
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: b07d5dc3-38d8-4d20-9f07-122e079dd612
* fix: stabilize MCPB staging cleanup
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 9b9eefe6-dd82-44e6-abdc-98202899cf32
---------
Co-authored-by: Stefan Broenner <stbrnner@microsoft.com>
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: b07d5dc3-38d8-4d20-9f07-122e079dd612
Copilot-Session: 9b9eefe6-dd82-44e6-abdc-98202899cf32
Correct the categorized reliability boundary after v2.0.4 was released before the classification changes merged. Updates only the query minimum version, fixtures, and public report label; prior releases remain unclassified and are not reinterpreted.
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.
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): correct the MCP help banner, stamp a CLI VERSION, and fix misleading skill rules
The MCP server's --help banner advertised "22 tools with 195+ operations". The server
registers 31 tools with 326 operations. This repo already computes those numbers from
code on every commit and enforces them across sixteen user-facing documents -- the
banner just was not one of them, which is exactly how it drifted. Correct the text and
add Program.cs to that guard, so the same drift now fails the build instead of shipping.
The excel-cli plugin shipped without the VERSION file excel-mcp carries. Two things
caused it: the build never passed -Version through for the CLI skill, and the helper
only rewrote a VERSION that already existed rather than creating one. Both are fixed,
so a missing source VERSION can no longer silently produce an unversioned plugin. The
matching test helper treated VERSION as a copied file and asserted the built skill
contained exactly the source's files; it now models VERSION as build-stamped and
asserts both plugins carry the requested version.
Two skill rules were misleading in ways that produce visibly wrong workbooks. The
number-format table presented rendered results as if separators were fixed, but Excel
renders them per the user's Windows regional settings -- $#,##0.00 shows $1.234,56 on
a German machine, which invites an agent to "correct" the format code and break every
other locale. Say plainly that codes are written in US notation and only the rendering
is locale-dependent. The formatting workflow also ended at applying a number format,
which leaves date and currency columns showing ##### because formatted values are wider
than the raw ones; auto-fitting columns is now a required third step.
The CLI skill's ~100 examples invoke bare excelcli, but the plugin's global shim is
explicitly opt-in, so an agent following the skill after a plain plugin install hits
command-not-found. State the PATH requirement and how to satisfy it.
SKILL.md is generated, so the edits are in skills/templates/*.sbn with the regenerated
output committed alongside.
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: edb4d8c2-36e0-4719-ab55-4d501b7a2462
* refactor(mcp): derive the --help tool counts from the live registration
The banner's counts were a hard-coded literal, which is how it came to advertise
"22 tools with 195+ operations" for a server that registers 31 tools / 326
operations. Correcting the literal would have fixed today's number and left the
same drift mechanism in place.
McpToolSurface now reflects over the actual [McpServerToolType]/[McpServerTool]
registration - the same surface GeminiCompatibleToolRegistration walks - and counts
operations as the values of each tool's required 'action' enum. The banner
interpolates those, so it cannot disagree with the server's own tools/list again.
Reflection independently reproduces 31/326, matching scripts/check-doc-counts.ps1.
check-doc-counts.ps1 previously validated the literal. It now asserts the opposite:
the banner must stay derived, and reintroducing a hard-coded count fails the build
even when that count is correct on the day it is written.
Build-Plugins.ps1 additionally verifies that every packaged skill carries a VERSION
stamped with the build version, so the excel-cli defect cannot silently return.
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: edb4d8c2-36e0-4719-ab55-4d501b7a2462
* docs(skills): make locale-dependence and column auto-fit explicit in shared references
The SKILL templates already carried these corrections; the shared domain references
that agents actually read while working did not.
behavioral-rules.md, range.md and dashboard.md presented rendered results in a
"Result"/"Example" column as though separators were fixed. Excel renders a format
code per the user's regional settings, so $#,##0.00 shows $1.234,56 on de-DE.
The columns are now labelled en-US and each file states that rendering is
locale-dependent and warns against "correcting" a format code when a screenshot
shows swapped separators.
dashboard.md's report workflow went straight from formatting to charts, which is
why formatted date and currency columns render as ##### in the verification
screenshot. Auto-fit is now an explicit step between them, the screenshot step
checks for #####, and the checklist asserts it.
Per-plugin references/ copies regenerated from skills/shared/.
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: edb4d8c2-36e0-4719-ab55-4d501b7a2462
---------
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: edb4d8c2-36e0-4719-ab55-4d501b7a2462
* 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
CHANGELOG.md's intro preamble had drifted down into the middle of the
1.9.1 section, with a stray "## [Unreleased]" ("No pending changes")
block wedged between 1.9.1 and 1.9.0. Root cause: Build-Changelog.ps1
reassembled the file as title + newSection + body, so every release
inserted the new version between the title and the preamble, pushing
the preamble one release further down each time until it was buried.
Fix both:
- CHANGELOG.md: move the preamble back directly under the "# Changelog"
title and drop the vestigial "## [Unreleased]" block (the changesets
workflow tracks pending changes as .changeset/*.md fragments, not an
Unreleased section).
- Build-Changelog.ps1 (Step 5): split the existing body into the
preamble (prose before the first "## [" heading) and prior versions,
and reassemble as title + preamble + newSection + priorVersions, so
the new release lands below the preamble and above the previous latest
version. The preamble now stays pinned at the top permanently.
Validated the reassembly logic with a simulation of a release run:
the preamble stays on top and the new version is inserted directly
beneath it.
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.
* Skip build/packaging pre-commit gates for docs-only commits
The pre-commit hook ran the Release build, smoke tests and every release
packaging gate on every commit, including pure documentation changes. Those
gates only validate compiled binaries and release artifacts, so they add no
value for docs and cost several minutes.
- Recognize the gh-pages/ documentation website as docs (its MkDocs config,
hooks.py, templates and image assets are part of the docs site, not the
shipped product).
- Wrap the Release build, doc-count validation, smoke tests and all five
release-packaging gates in the existing hasCodeChanges guard so docs-only
commits skip them. Cheap source-level guards (COM leaks, coverage/naming,
MCP-Core, success flag, plugin READMEs, dynamic casts) still run every time.
- Add a changeset.
* Improve docs-site SEO: video sitemap, structured data, social card
gh-pages docs site (excelmcpserver.dev) SEO improvements:
- hooks.py: on_post_build enriches sitemap.xml with a Google video-sitemap
<video:video> entry for the home-page intro video (regenerates .gz too),
since MkDocs' plain URL sitemap cannot reference embedded video.
- index.md: add VideoObject JSON-LD for the intro video.
- main.html: home-only Open Graph/Twitter video + player meta; dedicated
1200x630 og-card.png social image with width/height/alt; enrich
SoftwareApplication schema (sameAs, image, license); site-wide WebSite+Person
graph; per-page BreadcrumbList structured data.
- og-card.png: branded 1200x630 social preview card.
---------
Co-authored-by: Stefan Broenner <stbrnner@microsoft.com>
Smoke tests (CLI workflow + MCP Server E2E) launch real Excel via COM
and take minutes to run. They add no value when a commit only touches
documentation or changeset files, and Excel COM automation is flaky
enough that unrelated doc commits could get blocked by transient
smoke test failures.
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>
* 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>
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>
* docs: fix service architecture diagram, remove HeyGen, clean up historic artifacts
Correct the 'shared ExcelMCP Service / shared sessions' claim in README, gh-pages, MCP Server README, and the MCP skill. In reality the MCP Server runs the ExcelMCP Service in-process (direct calls, no pipe) while the CLI uses a background daemon; each hosts its own service and Excel instance and they do not share live sessions. Reworded the diagram and key benefits accordingly.
Remove the retired HeyGen MCP Server link from README and gh-pages, and drop a broken link to the deleted archive/API-COMPARISON-REPORT.md.
Delete historic artifacts: root bug reports, docs/archive, .squad run logs/orchestration logs/sessions/agent histories, and completed specs/ feature folders.
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
* docs: fix tool/operation counts and add permanent count-drift guard
Reconcile the user-facing surface to 26 tools / 232 operations everywhere and
prevent the count discrepancy from ever recurring.
- FEATURES.md: Charts header 28 -> 29 (chart 8 + chartconfig 21); fix two
corrupted section-header emoji. Section headers + summary table now both = 232.
- GenerateSkillFile: add ExcludeCommands / ExtraOperationCount / ExtraToolCount so
the generated skills report the true user-facing surface (manifest 229 - diag 3
+ file 6 = 232). Both CLI and MCP skill targets pass ExcludeCommands=diag,
ExtraOperationCount=6, ExtraToolCount=1. MCP SKILL.md now says 232 (was 229).
- CLI README: refresh stale per-category table (Power Query 10->12, Charts 14->8,
Chart Config 14->21, add missing Window Management row) so 18 categories = 232.
- README: drop stale "22 command categories" claim.
- NEW pre-commit gate scripts/check-doc-counts.ps1: derives canonical counts from
code (skill manifest + FileAction enum, cross-checked against the real
[McpServerTool] surface) and fails if any user-facing doc or generated SKILL.md
advertises a mismatching count. Wired into pre-commit.ps1; documented in gates table.
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
---------
Co-authored-by: Stefan Broenner <stbrnner@microsoft.com>
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Align Excel PIA startup with the registered Office Click-to-Run PIA and shorten session startup timeouts to 120 seconds with actionable override guidance.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
The dependency-update PR added <RuntimeIdentifiers>win-x64</RuntimeIdentifiers> to
ExcelMcp.CLI.csproj and ExcelMcp.McpServer.csproj. Combined with PackAsTool=true,
that property routes the pack flow through the RID-aware publish path, which
expects the build output in bin/Release/net10.0-windows/win-x64/. The release.yml
workflow builds each project per-csproj without a runtime flag and writes plain
bin/Release/net10.0-windows/, so 'dotnet pack --no-build' failed with MSB3030
in run 25794507981 for both NuGet (secondary distribution) jobs.
Removed the property from both csproj files and added inline comments warning
not to re-add it. Standalone exe publish still passes the runtime on the
command line, so the primary distribution is unchanged.
Also dropped the no-restore switch from the two 'dotnet publish' calls in
scripts/pre-commit.ps1 so publish performs a RID-aware restore on its own,
matching the release.yml workflow. Without it, the local hook fails to
populate cli-publish/excelcli.exe after the RuntimeIdentifiers removal.
Verified locally with the exact CI commands:
- MCP Server NuGet pack succeeds, produces 6.79 MB nupkg
- CLI NuGet pack succeeds, produces 4.35 MB nupkg
- CLI standalone publish succeeds, produces 184 MB exe
Co-authored-by: Stefan Broenner <stefan.broenner@microsoft.comm>
Co-authored-by: Copilot <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>
Remove MCP-style shared references from the CLI skill package and keep the generated CLI command reference as the source of truth.\n\nCo-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>
- Create packages/excel-mcp-skill/ and packages/excel-cli-skill/ as
standalone npm packages with 'agent-skill' keyword
- Extend Build-AgentSkills.ps1 to populate npm package directories
with SKILL.md and references during build
- Add npm publish steps to release workflow
- Update .gitignore to track static package files but ignore
build artifacts (SKILL.md, references/)
Migrates Excel COM interop to strongly-typed Microsoft.Office.Interop.Excel PIA types throughout the codebase, and fixes a critical regression where all Excel sessions crashed with FileNotFoundException for office.dll after the PIA migration.
- Strongly-typed PIA for Power Query, DataModel, Connection, Range, Sheet, Table commands
- PIA coverage enforcement via pre-commit check (check-dynamic-casts.ps1)
- Fixed office.dll crash: cast tempExcel to (object) before (dynamic) to force IDispatch
- Removed wrong-version office.dll reference (v15 hint path, v16 required at runtime)
- CLI smoke test now exercises session open round-trip to catch deployment-level crashes
Fixes#487Closes#486
* feat: Agent Mode - watch AI work in Excel in real-time (#470)
Implement Agent Mode for Excel automation with window management capabilities:
Core Infrastructure:
- Add IWindowCommands interface with 9 actions (show, hide, set-state, set-position, arrange, bring-to-front, get-info, set-status-bar, clear-status-bar)
- Implement WindowCommands with Excel COM interop and Win32 P/Invoke
- Add SessionManager visibility tracking per session
- Wire DispatchWindowAsync in ExcelMcpService with session-scoped operations
Agent Mode UX:
- LLM guidance: ask user with action cards before starting multi-step tasks
- Action cards include tradeoffs (visible = slower rendering; hidden = faster but no visual feedback)
- Add excel_agent_mode.md and window.md shared skill references
- Update behavioral-rules.md, ServerInstructions, and SKILL.md
Documentation:
- Add Agent Mode feature card and example to gh-pages/index.md
- Add Window Management section to gh-pages features
- Update mcpb/README.md with Agent Mode highlights
- Update all READMEs with new operation counts (225 total)
- Update FEATURES.md and CHANGELOG.md
Bug Fix:
- Fix ExcelBatch.Dispose race condition: wait for EXCEL.EXE process to terminate before returning, preventing CO_E_SERVER_EXEC_FAILURE on rapid create/destroy cycles
Scripts:
- Fix all 14 PowerShell scripts for cross-environment compatibility
Tests:
- Add 29 integration tests for Window commands (visibility, state, position, arrange, status bar, info)
* fix: address bug reports from dashboard session
Bug 5 - SetDataLabels seriesIndex=0: treat 0 as null (apply to all
series) since MCP clients may send 0 instead of omitting the parameter.
Improved all series index error messages with 1-based indexing hint.
Bug 6 - CaptureSheet: cap UsedRange to 500 rows x 50 columns to avoid
CopyPicture failures on sheets with formatting extending far beyond data.
Bug 7 - RPC_S_SERVER_UNAVAILABLE (0x800706BA): add handling in resilience
pipeline and WithSessionAsync. Auto-cleanup dead sessions and return
friendly error message instead of cryptic COM exception.
Bug 3 - Documentation: fix incorrect 'range_format set-number-format'
references (should be 'range set-number-format') in 5 skill/template files.
Bug 2/4 - Improve tool descriptions for SetStyle (style_id parameter),
SetDataLabels (seriesIndex=0 semantics), and AddTrendline (type values).
Screenshot stability: add 1s render delay after visibility toggle in
ExportRangeAsImage to prevent CopyPicture crashes. Start screenshot test
batches with show:true since CopyPicture requires a visible window.
Bug 1 - Filed as GitHub issue #472 (session timeout auto-save).
Bug 2/4 - Filed as GitHub issue #473 (parameter naming discoverability).
* fix: auto-save sessions on shutdown and add session creation resilience
- SessionManager.Dispose() auto-saves all live sessions before closing
to prevent silent data loss on MCP client disconnect or process exit
- ServiceBridge.Dispose() + Program.cs finally block ensure cleanup runs
- Added CreateSessionCreationPipeline() in ResiliencePipelines for
transient COM failures (CO_E_SERVER_EXEC_FAILURE, RPC_E_CALL_FAILED)
during Excel process startup under resource constraints
- SessionManager.CreateSession/CreateSessionForNewFile wrapped in retry
- Tests simplified: removed test-level retry, uses per-test unique files
---------
Co-authored-by: Stefan Broenner <stefan.broenner@microsoft.comm>
* fix: resolve 100% CPU spin in STA message pump loop
ROOT CAUSE: Two independent mechanisms caused the STA thread to spin at 100% CPU:
1. Silent catch(Exception){} at end of polling loop bypassed Thread.Sleep(10) on any exception, causing 0ms backoff spin
2. Thread.Sleep(10) on STA thread with OLE message filter returned immediately due to pending COM messages, providing no actual sleep
FIX: Replace polling pattern (TryRead + Thread.Sleep) with WaitToReadAsync() blocking wait that efficiently suspends the thread and wakes instantly when work arrives.
ADDITIONAL FIXES:
- Race condition 1 (shutdown drain): Work items orphaned during cancellation are now drained so callers get results instead of hanging for 5-minute timeout
- Race condition 2 (Execute after Dispose): ChannelClosedException converted to ObjectDisposedException for clean error when Dispose races with Execute
- Process leak in IsExcelProcessAlive(): added using to Process.GetProcessById()
- Corrected misleading comment about COM message pumping on .NET 10
REGRESSION TESTS (5 new):
- MessagePump_WhenIdle_DoesNotSpinCpu (measured 0.0% vs 100% before)
- MessagePump_WhenWorkArrives_WakesWithLowLatency (0.38ms median)
- Dispose_WithPendingWork_DrainsBeforeExiting
- Execute_AfterDispose_ThrowsObjectDisposedException
- Dispose_DuringActiveExecute_GivesCleanError
* chore: auto-stage generated SKILL.md in pre-commit hook
Pre-commit hook now auto-generates and auto-stages SKILL.md files during the Release build step, so developers never need to manually track these generated files.
* chore: track skill reference files and auto-stage in pre-commit
Reference files (skills/excel-*/references/*.md) were gitignored but are needed by npx skills add. Removed gitignore rules so they're tracked, and updated pre-commit hook to auto-stage both SKILL.md and references/.
---------
Co-authored-by: Stefan Broenner <stefan.broenner@microsoft.comm>