| name | power-bi-deployment |
| description | Import and export TMDL/TMSL formats, manage model lifecycle with transactions, and version-control Power BI semantic models using pbi-cli. Invoke this skill whenever the user mentions "deploy", "export", "import", "TMDL", "TMSL", "version control", "git", "backup", "migrate", "transaction", "commit changes", "rollback", or wants to save/restore model state. |
| tools | pbi-cli |
Power BI Deployment Skill
Manage model lifecycle with TMDL export/import, transactions, and version control.
Prerequisites
pipx install pbi-cli-tool
pbi-cli skills install
pbi connect
Connecting to Targets
pbi connect
pbi connect -d localhost:54321
pbi connect -d localhost:54321 --name dev
pbi connections list
pbi connections last
pbi disconnect
TMDL Export and Import
TMDL (Tabular Model Definition Language) is the text-based format for version-controlling Power BI models.
pbi database export-tmdl ./model-tmdl/
pbi database import-tmdl ./model-tmdl/
TMSL Export
pbi database export-tmsl
TMDL Diff (Compare Snapshots)
Compare two TMDL export folders to see what changed between snapshots.
Useful for CI/CD pipelines ("what did this PR change in the model?").
pbi database diff-tmdl ./model-before/ ./model-after/
pbi --json database diff-tmdl ./baseline/ ./current/
Returns a structured summary:
- tables: added, removed, and changed tables with per-table entity diffs
(measures, columns, partitions, hierarchies added/removed/changed)
- relationships: added, removed, and changed relationships
- model: changed model-level properties (e.g. culture, default power bi dataset version)
- summary: total counts of all changes
LineageTag-only changes (GUID regeneration without real edits) are automatically
filtered out to avoid false positives.
No connection to Power BI Desktop is needed -- works on exported folders.
Database Operations
pbi database list
Transaction Management
Use transactions for atomic multi-step changes:
pbi transaction begin
pbi measure create "New KPI" -e "SUM(Sales[Amount])" -t Sales
pbi measure create "Another KPI" -e "COUNT(Sales[OrderID])" -t Sales
pbi transaction commit
pbi transaction rollback
Table Refresh
pbi table refresh Sales --type Full
pbi table refresh Sales --type Automatic
pbi table refresh Sales --type Calculate
pbi table refresh Sales --type DataOnly
Workflow: Version Control with Git
pbi database export-tmdl ./model/
cd model/
git add .
git commit -m "feat: add new revenue measures"
pbi connect
pbi database import-tmdl ./model/
Workflow: Inspect Model Before Deploy
pbi --json model get
pbi --json model stats
pbi --json table list
pbi --json measure list
pbi --json relationship list
Best Practices
- Always export TMDL before making changes (backup)
- Use transactions for multi-object changes
- Test changes in dev before deploying to production
- Use
--json for scripted deployments
- Store TMDL in git for version history
- Use named connections (
--name) to avoid accidental changes to wrong environment
Gotchas
import-tmdl is not atomic across the whole folder: If one file fails to parse mid-import, partially-applied changes stick in the connected model. Always pbi transaction begin around import-tmdl, or export a backup first so rollback is just a re-import.
diff-tmdl filters out lineageTag-only changes by design: Helpful for noise but it also masks legitimate re-tagging that downstream Power BI Service references depend on (deployment pipelines, perspectives, datamarts). Diff the raw folders with git diff when investigating broken references in Service.
- Named connections persist across pbi-cli sessions:
--name prod survives even after you've closed Desktop. Running a destructive import-tmdl thinking you're on dev is the classic foot-gun. Always pbi connections last before mutating commands.
table refresh --type Full rebuilds calculated columns and relationships: On large tables this triggers a long re-process and locks the model. Prefer --type DataOnly for production refreshes; reserve Full for schema changes.
- TMSL export is JSON; TMDL export is folders of text: The two formats are NOT interchangeable for git diffs — TMSL collapses all measures into one large JSON, killing clean diffs. Use TMDL for version control and reserve TMSL for SSAS/AAS compatibility.
transaction rollback only reverts metadata changes, not data refreshes: If you ran table refresh inside the transaction, the refreshed data stays after rollback. Refreshes commit out-of-band.