Implements Task 4: container-level property control for PBIR visuals.
visual_set_container() updates border/background show and title text in
visual.visualContainerObjects using immutable dict spreading. The CLI
command pbi visual set-container exposes all three options as optional
flags, leaving unspecified keys unchanged.
- Register cardVisual and actionButton in SUPPORTED_VISUAL_TYPES
- Add aliases: card_visual, modern_card -> cardVisual; action_button, button -> actionButton
- cardVisual template includes Data queryState role and sortDefinition (matches Desktop export)
- actionButton template omits query entirely and adds howCreated: InsertVisualButton
- Add Data to MEASURE_ROLES, update VISUAL_DATA_ROLES and ROLE_ALIASES accordingly
- Set default sizes from real Desktop export: cardVisual (217x87), actionButton (51x22)
- Add renderer colors and icons for both new types
- 4 new tests; all 398 tests pass, ruff clean
- Run ruff format on all source files
- Fix mypy type: ignore comments for .NET imports (import-not-found)
- Add mypy overrides for pythonnet/clr/clr_loader (no type stubs)
- Fix trace_export return type (dict[str, Any] not dict[str, str])
- Restrict CI test matrix to Windows-only (Power BI Desktop requirement)
Remove the MCP server binary dependency entirely. All 22 command groups now
connect directly to Power BI Desktop's Analysis Services engine via pythonnet
and bundled Microsoft.AnalysisServices DLLs (~20MB, in-process).
- Direct .NET TOM/ADOMD.NET interop for sub-second command execution
- 7 Claude Code skills (added Diagnostics and Partitions & Expressions)
- New commands: trace, transaction, calendar, expression, partition, advanced culture
- 91 tests passing, all skills updated, README/CHANGELOG rewritten
The MCP server assigns connection names like "PBIDesktop-demo-57947"
but we were saving and reusing "localhost-57947", causing "connection
not found" errors on subsequent commands. Now _auto_reconnect extracts
the server-returned connectionName from the Connect response.
Each non-REPL command starts a fresh MCP server process, so the
connection must be re-established. Commands now silently reconnect
using the saved connection info before running the actual tool call.
- Add Store version path (~\Microsoft\Power BI Desktop Store App\)
alongside MSI path for port auto-discovery
- Fix UTF-16 LE encoding when reading msmdsrv.port.txt
- Update all 5 skills to reflect new install flow (pipx + pbi connect)
- Update error messages, docstrings, and READMEs to mention pbi connect
as the primary entry point instead of pbi setup
- Add tests for Store path discovery, encoding, and path candidates
- Update version in pyproject.toml and __init__.py (fixes prior mismatch)
- Change classifier from Alpha to Production/Stable
- Update SECURITY.md supported versions
- Consolidate CHANGELOG into single 1.0.0 release
- Remove forbidden connectionName param from Connect/ConnectFabric requests
- Extract server-returned connectionName from response for local tracking
- Auto-download MCP binary if missing when running connect
- Auto-install Claude Code skills if missing when running connect
- Simplify README Get Started to two-command flow (pipx + connect)
pip installs to a user Scripts directory not on PATH by default,
causing "pbi is not recognized" errors. Added collapsible guide
with pipx and manual PATH fix options.
- Fix Traversable import with TYPE_CHECKING guard for Python 3.10-3.14 compat
- Add explicit dict[str, object] type annotations to all request dicts
- Fix unused variable and import warnings in connection.py and test files
- Break long lines to satisfy ruff E501 (100-char limit)
- Fix click.MultiCommand -> click.Group for mypy arg-type in repl.py
- Wrap binary_manager return in str() for mypy no-any-return
Skills section now sits right after Quick Start as the primary feature.
Each skill shows a plain-English prompt example with collapsible
behind-the-scenes commands. Removed heavy text, simplified architecture
and commands sections. Framed the whole project around the Claude Code
workflow: install, ask in English, Claude handles the rest.
The name pbi-cli was already taken on PyPI, and power-bi-cli was too
similar to the existing powerbi-cli package. The distribution name is
now pbi-cli-tool while the CLI command remains `pbi`.