Install any skill in seconds. Free to start, no credit card required.
Get Started Free →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.
.claude/skills/minasaad1-power-bi-deployment/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-11 | ✗→✓ | ▲ Improved | -41% | 0% |
| case-01 | ✗→✓ | ▲ Improved | -63% | 0% |
| case-02 | ✗→✓ | ▲ Improved | -44% | 0% |
| case-03 | ✗→✓ | ▲ Improved | -50% | 0% |
| case-04 | ✗→✓ | ▲ Improved | -29% | 0% |
Manage model lifecycle with TMDL export/import, transactions, and version control.
bashpipx install pbi-cli-tool pbi-cli skills install pbi connect
bash# Local Power BI Desktop (auto-detects port) pbi connect # Local with explicit port pbi connect -d localhost:54321 # Named connections for switching pbi connect -d localhost:54321 --name dev pbi connections list pbi connections last pbi disconnect
TMDL (Tabular Model Definition Language) is the text-based format for version-controlling Power BI models.
bash# Export entire model to TMDL folder pbi database export-tmdl ./model-tmdl/ # Import TMDL folder into connected model pbi database import-tmdl ./model-tmdl/
bash# Export as TMSL JSON (for SSAS/AAS compatibility) pbi database export-tmsl
Compare two TMDL export folders to see what changed between snapshots. Useful for CI/CD pipelines ("what did this PR change in the model?").
bash# Compare two exports pbi database diff-tmdl ./model-before/ ./model-after/ # JSON output for CI/CD scripting pbi --json database diff-tmdl ./baseline/ ./current/
Returns a structured summary:
(measures, columns, partitions, hierarchies added/removed/changed)
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.
bash# List databases on the connected server pbi database list
Use transactions for atomic multi-step changes:
bash# Begin a transaction pbi transaction begin # Make changes pbi measure create "New KPI" -e "SUM(Sales[Amount])" -t Sales pbi measure create "Another KPI" -e "COUNT(Sales[OrderID])" -t Sales # Commit all changes atomically pbi transaction commit # Or rollback if something went wrong pbi transaction rollback
bash# Refresh individual tables pbi table refresh Sales --type Full pbi table refresh Sales --type Automatic pbi table refresh Sales --type Calculate pbi table refresh Sales --type DataOnly
bash# 1. Export model to TMDL pbi database export-tmdl ./model/ # 2. Commit to git cd model/ git add . git commit -m "feat: add new revenue measures" # 3. Later, import back into Power BI Desktop pbi connect pbi database import-tmdl ./model/
bash# Get model metadata pbi --json model get # Check model statistics pbi --json model stats # List all objects pbi --json table list pbi --json measure list pbi --json relationship list
--json for scripted deployments--name) to avoid accidental changes to wrong environment| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-11 | fail→pass | 12,588 | 1,917 | -85% | 1 | 1 | 0% | 1,957 | 1,155 | -41% | 0 | 0 | — |
case-01 | fail→pass | 20,220 | 2,582 | -87% | 1 | 1 | 0% | 3,469 | 1,292 | -63% | 0 | 0 | — |
case-02 | fail→pass | 18,620 | 5,113 | -73% | 1 | 1 | 0% | 3,011 | 1,685 | -44% | 0 | 0 | — |
case-03 | fail→pass | 16,020 | 3,089 | -81% | 1 | 1 | 0% | 2,727 | 1,377 | -50% | 0 | 0 | — |
case-04 | fail→pass | 31,409 | 2,978 | -91% | 1 | 1 | 0% | 1,977 | 1,408 | -29% | 0 | 0 | — |
case-05 | fail→pass | 12,567 | 2,127 | -83% | 1 | 1 | 0% | 2,121 | 1,178 | -44% | 0 | 0 | — |
case-06 | fail→pass | 16,282 | 2,314 | -86% | 1 | 1 | 0% | 2,561 | 1,244 | -51% | 0 | 0 | — |
case-07 | fail→pass | 9,889 | 2,398 | -76% | 1 | 1 | 0% | 1,599 | 1,196 | -25% | 0 | 0 | — |
case-08 | fail→pass | 13,289 | 1,941 | -85% | 1 | 1 | 0% | 2,075 | 1,143 | -45% | 0 | 0 | — |
case-09 | fail→pass | 8,462 | 2,019 | -76% | 1 | 1 | 0% | 1,333 | 1,155 | -13% | 0 | 0 | — |
case-10 | fail→pass | 10,449 | 1,713 | -84% | 1 | 1 | 0% | 1,696 | 1,132 | -33% | 0 | 0 | — |
case-12 | fail→pass | 13,306 | 1,970 | -85% | 1 | 1 | 0% | 1,986 | 1,154 | -42% | 0 | 0 | — |
case-13 | fail→pass | 14,851 | 3,860 | -74% | 1 | 1 | 0% | 2,522 | 1,393 | -45% | 0 | 0 | — |
case-14 | fail→pass | 10,242 | 1,839 | -82% | 1 | 1 | 0% | 1,535 | 1,102 | -28% | 0 | 0 | — |
case-15 | fail→pass | 12,920 | 1,743 | -87% | 1 | 1 | 0% | 2,095 | 1,137 | -46% | 0 | 0 | — |
case-16 | fail→pass | 10,411 | 2,314 | -78% | 1 | 1 | 0% | 1,675 | 1,183 | -29% | 0 | 0 | — |
case-17 | fail→pass | 8,301 | 2,442 | -71% | 1 | 1 | 0% | 1,335 | 1,219 | -9% | 0 | 0 | — |
case-18 | fail→pass | 12,872 | 2,848 | -78% | 1 | 1 | 0% | 2,181 | 1,305 | -40% | 0 | 0 | — |
case-19 | fail→pass | 10,827 | 2,071 | -81% | 1 | 1 | 0% | 1,645 | 1,154 | -30% | 0 | 0 | — |
case-20 | fail→pass | 13,544 | 1,989 | -85% | 1 | 1 | 0% | 2,262 | 1,147 | -49% | 0 | 0 | — |
case-21 | fail→pass | 8,848 | 1,506 | -83% | 1 | 1 | 0% | 1,387 | 1,032 | -26% | 0 | 0 | — |
case-22 | pass→pass | 5,871 | 3,800 | -35% | 1 | 1 | 0% | 962 | 1,581 | +64% | 0 | 0 | — |
case-23 | pass→pass | 12,816 | 8,984 | -30% | 1 | 1 | 0% | 2,099 | 2,489 | +19% | 0 | 0 | — |
case-24 | pass→pass | 8,359 | 4,594 | -45% | 1 | 1 | 0% | 1,408 | 1,583 | +12% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 24 cases were attempted, and 23 counted toward the lift figure. The other 1 produced results that are not comparable between the two arms, so they are excluded from the headline rather than averaged into it. The headline lift of +88 percentage points is the difference between those two pass rates over the 23 comparable cases.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
Other measured skills in the registry, with their headline benchmark lift.