- visual bind: remove legacy Commands/SemanticQueryDataShapeCommand block
(PBIR 2.7.0 uses additionalProperties:false -- Commands is a hard schema error)
- visual bind: add active:true to column (category/row/detail) projections
so Desktop treats the field as the active axis
- visual add: remove empty "objects:{}" from all 32 visual templates
(noisy and rejected by strict schema validators)
- visual add: write position coordinates as integers not floats
(Desktop normalises to int; 320.0 vs 320 caused inconsistency)
- report set-background: always write transparency:0 alongside color
(Desktop defaults missing transparency to 100 = fully invisible)
- report validate: drop false-positive layoutOptimization required error
(real Microsoft 3.2.0 schema does not require this field)
- all write commands: add --no-sync flag to report/visual/filters/bookmarks
groups to suppress per-command Desktop reload during scripted builds;
use pbi report reload for a single sync at the end
- Run ruff format on all 26 unformatted files
- Fix mypy strict errors: add explicit typing for json.loads returns,
add pywin32/websockets to mypy ignore_missing_imports
- Remove yaml dependency from test_skill_triggering.py (use regex parser)
- Fix skill triggering test to handle both single-line and multi-line
description formats in YAML frontmatter
19 files from earlier v3 sessions were created on disk but never
staged/committed: 11 source modules (backends, preview, templates,
utils) and 8 test files (488 tests depend on these).
Without these files the package would be broken on install.
Found during pre-publish review.
Pure-Python TMDL folder diff for CI/CD model change reporting.
No Power BI Desktop connection required. Handles direct and
SemanticModel folder layouts, strips lineageTags to avoid false
positives, and keys relationships by fromColumn->toColumn instead
of GUIDs. 18 tests covering all diff scenarios.
Adds page_binding key to the page_get() return dict using data.get("pageBinding"),
returning None for regular pages and the full binding dict for drillthrough pages.
Two new tests in TestPageGet cover both the None and present cases.
Register azureMap in SUPPORTED_VISUAL_TYPES and VISUAL_TYPE_ALIASES
(azure_map, map), add Category+Size data roles and role aliases, default
size 500x400, renderer color/icon, and template. All 4 new tests pass.
Confirmed from Sales_Report.Report Desktop export: kpi visuals have a
third queryState key TrendLine (date/axis column for the sparkline), and
gauge visuals have a second queryState key MaxValue (a measure role).
- kpi.json template: add TrendLine projection slot
- gauge.json template: add MaxValue projection slot
- VISUAL_DATA_ROLES: updated kpi and gauge role lists
- ROLE_ALIASES: added trend_line/trend aliases for kpi, max/max_value/target for gauge
- MEASURE_ROLES: added MaxValue (TrendLine binds to Column, not Measure)
- tests: 6 new tests covering template structure and alias resolution
- Add isinstance(qs["Values"], dict) assertion to card and multiRowCard tests
- Add inline comment on "Fields" in MEASURE_ROLES clarifying it is used by cardNew only
Real Power BI Desktop PBIR exports use "Values" as the queryState role key
for card and multiRowCard visuals. The previous "Fields" key was silently
ignored by Desktop, causing visual_bind to write bindings that had no effect.
Updated templates, VISUAL_DATA_ROLES, and ROLE_ALIASES accordingly. Added
two regression tests to lock in the correct role name.
Registers advancedSlicerVisual with aliases advanced_slicer, adv_slicer,
and tile_slicer. Includes template with Values queryState, data roles,
role aliases, default size (280x280), renderer color/icon, and tests.
- Guard missing 'visual' key in visual_set_container with PbiCliError
- Detect no-op in visual_set_container when no args are provided
- Remove -g shorthand from set-container --page option
- Add is_hidden field to page_list and page_get return dicts
- Validate hex color format in page_set_background before writing
- Add tests for all new validation and behaviour
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
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
- 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