feat: v2.2.0 - add promotional SVG assets and redesign README

Add 12 new SVG graphics showcasing pbi-cli capabilities:
- banner, chat-demo, bulk-operations, dax-debugging
- backup-restore, model-health-check, rls-testing
- token-cost, before-after, skills-hub
- architecture-flow, feature-grid

Rewrite README to be image-driven, replacing verbose text sections
and mermaid diagrams with visual SVGs targeting Power BI developers.
This commit is contained in:
MinaSaad1 2026-03-27 16:56:06 +02:00
parent bd5762bf6c
commit f42d355e34
16 changed files with 956 additions and 237 deletions

344
README.md
View file

@ -1,55 +1,63 @@
<img src="https://raw.githubusercontent.com/MinaSaad1/pbi-cli/master/assets/header.svg" alt="pbi-cli" width="800"/>
<p align="center">
<img src="https://raw.githubusercontent.com/MinaSaad1/pbi-cli/master/assets/banner.svg" alt="pbi-cli — Vibe Modelling" width="850"/>
</p>
**Give Claude Code the Power BI skills it needs.**
Install once, then just ask Claude to work with your semantic models.
<p align="center">
<b>Give Claude Code the Power BI skills it needs.</b><br/>
Install once, then just ask Claude to work with your semantic models.
</p>
<a href="https://pypi.org/project/pbi-cli-tool/"><img src="https://img.shields.io/pypi/pyversions/pbi-cli-tool?style=flat-square&color=3776ab&label=Python" alt="Python"></a>
<a href="https://github.com/MinaSaad1/pbi-cli/actions"><img src="https://img.shields.io/github/actions/workflow/status/MinaSaad1/pbi-cli/ci.yml?branch=master&style=flat-square&label=CI" alt="CI"></a>
<a href="https://github.com/MinaSaad1/pbi-cli/blob/master/LICENSE"><img src="https://img.shields.io/github/license/MinaSaad1/pbi-cli?style=flat-square&color=06d6a0" alt="License"></a>
<p align="center">
<a href="https://pypi.org/project/pbi-cli-tool/"><img src="https://img.shields.io/pypi/pyversions/pbi-cli-tool?style=flat-square&color=3776ab&label=Python" alt="Python"></a>
<a href="https://github.com/MinaSaad1/pbi-cli/actions"><img src="https://img.shields.io/github/actions/workflow/status/MinaSaad1/pbi-cli/ci.yml?branch=master&style=flat-square&label=CI" alt="CI"></a>
<a href="https://github.com/MinaSaad1/pbi-cli/blob/master/LICENSE"><img src="https://img.shields.io/github/license/MinaSaad1/pbi-cli?style=flat-square&color=06d6a0" alt="License"></a>
</p>
[Get Started](#get-started) &bull; [Skills](#skills) &bull; [All Commands](#all-commands) &bull; [REPL Mode](#repl-mode) &bull; [Contributing](#contributing)
<p align="center">
<a href="#why-pbi-cli">Why pbi-cli</a> &bull;
<a href="#get-started">Get Started</a> &bull;
<a href="#just-ask-claude">Just Ask Claude</a> &bull;
<a href="#skills">Skills</a> &bull;
<a href="#all-commands">All Commands</a> &bull;
<a href="#contributing">Contributing</a>
</p>
---
## What is this?
## Why pbi-cli?
pbi-cli gives **Claude Code** (and other AI agents) the ability to manage Power BI semantic models. It ships with 7 skills that Claude discovers automatically. You ask in plain English, Claude uses the right `pbi` commands.
<p align="center">
<img src="https://raw.githubusercontent.com/MinaSaad1/pbi-cli/master/assets/before-after.svg" alt="Why pbi-cli" width="850"/>
</p>
```mermaid
graph LR
A["<b>You</b><br/>'Add a YTD measure<br/>to the Sales table'"] --> B["<b>Claude Code</b><br/>Uses Power BI skills"]
B --> C["<b>pbi-cli</b>"]
C --> D["<b>Power BI</b><br/>Desktop"]
style A fill:#1a1a2e,stroke:#f2c811,color:#fff
style B fill:#16213e,stroke:#4cc9f0,color:#fff
style C fill:#0f3460,stroke:#7b61ff,color:#fff
style D fill:#1a1a2e,stroke:#f2c811,color:#fff
```
<p align="center">
<img src="https://raw.githubusercontent.com/MinaSaad1/pbi-cli/master/assets/token-cost.svg" alt="Token cost comparison" width="850"/>
</p>
---
## Get Started
**Fastest way:** Just give Claude the repo URL and let it handle everything:
```
Install and set up pbi-cli from https://github.com/MinaSaad1/pbi-cli.git
```
**Or install manually (two commands):**
```bash
pipx install pbi-cli-tool # 1. Install (handles PATH automatically)
pbi connect # 2. Auto-detects Power BI Desktop and installs skills
```
That's it. Open Power BI Desktop with a `.pbix` file, run `pbi connect`, and everything is set up automatically. Open Claude Code and start asking.
You can also specify the port manually: `pbi connect -d localhost:54321`
Open Power BI Desktop with a `.pbix` file, run `pbi connect`, and start asking Claude.
> **Requires:** Windows with Python 3.10+ and Power BI Desktop running.
<details>
<summary><b>Alternative: give Claude the repo URL</b></summary>
```
Install and set up pbi-cli from https://github.com/MinaSaad1/pbi-cli.git
```
Claude will clone, install, connect, and set up skills automatically.
</details>
<details>
<summary><b>Using pip instead of pipx?</b></summary>
@ -61,194 +69,105 @@ On Windows, `pip install` often places the `pbi` command in a directory that isn
**Fix: Add the Scripts directory to PATH**
Find the directory:
```bash
python -c "import site; print(site.getusersitepackages().replace('site-packages','Scripts'))"
```
Add the printed path to your system PATH:
```cmd
setx PATH "%PATH%;C:\Users\YourName\AppData\Roaming\Python\PythonXXX\Scripts"
```
Then **restart your terminal**. We recommend `pipx` instead to avoid this entirely.
Add the printed path to your system PATH, then restart your terminal. We recommend `pipx` to avoid this entirely.
</details>
---
## Just Ask Claude
<p align="center">
<img src="https://raw.githubusercontent.com/MinaSaad1/pbi-cli/master/assets/chat-demo.svg" alt="Just Ask Claude" width="850"/>
</p>
### Create measures in bulk
<p align="center">
<img src="https://raw.githubusercontent.com/MinaSaad1/pbi-cli/master/assets/bulk-operations.svg" alt="Bulk operations" width="850"/>
</p>
### Debug broken DAX
<p align="center">
<img src="https://raw.githubusercontent.com/MinaSaad1/pbi-cli/master/assets/dax-debugging.svg" alt="DAX debugging" width="850"/>
</p>
### Snapshot and restore your model
<p align="center">
<img src="https://raw.githubusercontent.com/MinaSaad1/pbi-cli/master/assets/backup-restore.svg" alt="Backup and restore" width="850"/>
</p>
### Audit your model for issues
<p align="center">
<img src="https://raw.githubusercontent.com/MinaSaad1/pbi-cli/master/assets/model-health-check.svg" alt="Model health check" width="850"/>
</p>
### Test row-level security
<p align="center">
<img src="https://raw.githubusercontent.com/MinaSaad1/pbi-cli/master/assets/rls-testing.svg" alt="RLS testing" width="850"/>
</p>
---
## Skills
After running `pbi connect`, Claude Code discovers **7 Power BI skills**. Each skill teaches Claude a different area of Power BI development. You don't need to memorize commands. Just describe what you want.
After running `pbi connect`, Claude Code discovers **7 Power BI skills** automatically. Each skill teaches Claude a different area. You don't need to memorize commands.
```mermaid
graph TD
YOU["You: 'Set up RLS for<br/>regional managers'"] --> CC["Claude Code"]
CC --> SK{"Picks the<br/>right skill"}
SK --> S1["Modeling"]
SK --> S2["DAX"]
SK --> S3["Deployment"]
SK --> S4["Security"]
SK --> S5["Documentation"]
SK --> S6["Diagnostics"]
SK --> S7["Partitions"]
<p align="center">
<img src="https://raw.githubusercontent.com/MinaSaad1/pbi-cli/master/assets/skills-hub.svg" alt="7 Skills" width="850"/>
</p>
style YOU fill:#1a1a2e,stroke:#f2c811,color:#fff
style CC fill:#16213e,stroke:#4cc9f0,color:#fff
style SK fill:#0f3460,stroke:#7b61ff,color:#fff
style S1 fill:#1a1a2e,stroke:#f2c811,color:#fff
style S2 fill:#1a1a2e,stroke:#4cc9f0,color:#fff
style S3 fill:#1a1a2e,stroke:#7b61ff,color:#fff
style S4 fill:#1a1a2e,stroke:#06d6a0,color:#fff
style S5 fill:#1a1a2e,stroke:#ff6b6b,color:#fff
style S6 fill:#1a1a2e,stroke:#ffd166,color:#fff
style S7 fill:#1a1a2e,stroke:#a0c4ff,color:#fff
```
| Skill | What you say | What Claude does |
|-------|-------------|-----------------|
| **DAX** | *"What are the top 10 products by revenue?"* | Writes and executes DAX queries, validates syntax |
| **Modeling** | *"Create a star schema with Sales and Calendar"* | Creates tables, relationships, measures, hierarchies |
| **Deployment** | *"Save a snapshot before I make changes"* | Exports/imports TMDL, manages transactions |
| **Security** | *"Set up RLS for regional managers"* | Creates roles, filters, perspectives |
| **Docs** | *"Document everything in this model"* | Generates data dictionaries, measure inventories |
| **Partitions** | *"Show me the M query for the Sales table"* | Manages partitions, expressions, calendar config |
| **Diagnostics** | *"Why is this query so slow?"* | Traces queries, checks model health, benchmarks |
### Modeling
---
> *"Create a star schema with Sales, Products, and Calendar tables"*
## Architecture
Claude creates the tables, sets up relationships, marks the date table, and adds formatted measures. Covers tables, columns, measures, relationships, hierarchies, and calculation groups.
<p align="center">
<img src="https://raw.githubusercontent.com/MinaSaad1/pbi-cli/master/assets/architecture-flow.svg" alt="Architecture" width="850"/>
</p>
Direct in-process .NET interop from Python to Power BI Desktop. No MCP server, no external binaries, sub-second execution.
<details>
<summary>Example: what Claude runs behind the scenes</summary>
<summary><b>Configuration details</b></summary>
All config lives in `~/.pbi-cli/`:
```bash
pbi table create Sales --mode Import
pbi table create Products --mode Import
pbi table create Calendar --mode Import
pbi relationship create --from-table Sales --from-column ProductKey --to-table Products --to-column ProductKey
pbi relationship create --from-table Sales --from-column DateKey --to-table Calendar --to-column DateKey
pbi table mark-date Calendar --date-column Date
pbi measure create "Total Revenue" -e "SUM(Sales[Revenue])" -t Sales --format-string "$#,##0"
```
</details>
### DAX
> *"What are the top 10 products by revenue this year?"*
Claude writes and executes DAX queries, validates syntax, and creates measures with time intelligence patterns like YTD, previous year, and rolling averages.
<details>
<summary>Example: what Claude runs behind the scenes</summary>
```bash
pbi dax execute "
EVALUATE
TOPN(
10,
ADDCOLUMNS(VALUES(Products[Name]), \"Revenue\", CALCULATE(SUM(Sales[Amount]))),
[Revenue], DESC
)
"
~/.pbi-cli/
config.json # Default connection preference
connections.json # Named connections
repl_history # REPL command history
```
</details>
### Deployment
Bundled DLLs ship inside the Python package (`pbi_cli/dlls/`).
> *"Export the model to Git for version control"*
Claude exports your model as TMDL files for version control and imports them back. Handles transactions for safe multi-step changes.
<details>
<summary>Example: what Claude runs behind the scenes</summary>
```bash
pbi database export-tmdl ./model/
# ... you commit to git ...
pbi database import-tmdl ./model/
```
</details>
### Security
> *"Set up row-level security so regional managers only see their region"*
Claude creates RLS roles with descriptions, sets up perspectives for different user groups, and exports the model for version control.
<details>
<summary>Example: what Claude runs behind the scenes</summary>
```bash
pbi security-role create "Regional Manager" --description "Users see only their region's data"
pbi perspective create "Executive Dashboard"
pbi perspective create "Regional Detail"
pbi database export-tmdl ./model-backup/
```
</details>
### Documentation
> *"Document everything in this model"*
Claude catalogs every table, measure, column, and relationship. Generates data dictionaries, measure inventories, and can export the full model as TMDL for human-readable reference.
<details>
<summary>Example: what Claude runs behind the scenes</summary>
```bash
pbi --json model get
pbi --json model stats
pbi --json table list
pbi --json measure list
pbi --json relationship list
pbi database export-tmdl ./model-docs/
```
</details>
### Diagnostics
> *"Why is this DAX query so slow?"*
Claude traces query execution, clears caches for clean benchmarks, checks model health, and verifies the environment.
<details>
<summary>Example: what Claude runs behind the scenes</summary>
```bash
pbi dax clear-cache
pbi trace start
pbi dax execute "EVALUATE SUMMARIZECOLUMNS(...)" --timeout 300
pbi trace stop
pbi trace export ./trace.json
```
</details>
### Partitions & Expressions
> *"Set up partitions for incremental refresh on the Sales table"*
Claude manages table partitions, shared M/Power Query expressions, and calendar table configuration.
<details>
<summary>Example: what Claude runs behind the scenes</summary>
```bash
pbi partition list --table Sales
pbi partition create "Sales_2024" --table Sales --expression "..." --mode Import
pbi expression create "ServerURL" --expression '"https://api.example.com"'
pbi calendar mark Calendar --date-column Date
```
</details>
---
## All Commands
22 command groups covering the full Power BI Tabular Object Model. You rarely need these directly when using Claude Code, but they're available for scripting, CI/CD, or manual use.
| Category | Commands |
|----------|----------|
| **Queries** | `dax execute`, `dax validate`, `dax clear-cache` |
| **Model** | `table`, `column`, `measure`, `relationship`, `hierarchy`, `calc-group` |
| **Deploy** | `database export-tmdl`, `database import-tmdl`, `database export-tmsl`, `transaction` |
| **Security** | `security-role`, `perspective` |
| **Connect** | `connect`, `disconnect`, `connections list`, `connections last` |
| **Data** | `partition`, `expression`, `calendar`, `advanced culture` |
| **Diagnostics** | `trace start`, `trace stop`, `trace fetch`, `trace export`, `model stats` |
| **Tools** | `setup`, `repl`, `skills install`, `skills list` |
<p align="center">
<img src="https://raw.githubusercontent.com/MinaSaad1/pbi-cli/master/assets/feature-grid.svg" alt="22 Command Groups" width="850"/>
</p>
Use `--json` for machine-readable output (for scripts and AI agents):
@ -263,7 +182,7 @@ Run `pbi <command> --help` for full options.
## REPL Mode
For interactive work, the REPL keeps a persistent connection alive between commands:
For interactive work, the REPL keeps a persistent connection:
```
$ pbi repl
@ -280,49 +199,6 @@ Tab completion, command history, and a dynamic prompt showing your active connec
---
## How It Works
pbi-cli connects directly to Power BI Desktop's Analysis Services engine via pythonnet and the .NET Tabular Object Model (TOM). No external binaries or MCP servers needed. Everything runs in-process for sub-second command execution.
```mermaid
graph TB
subgraph CLI["pbi-cli (Python)"]
A["Click CLI"] --> B["tom_backend / adomd_backend"]
B --> C["pythonnet"]
end
C -->|"in-process .NET"| D["Bundled TOM DLLs"]
D -->|"XMLA"| E["Power BI Desktop<br/>msmdsrv.exe"]
style CLI fill:#16213e,stroke:#4cc9f0,color:#fff
style D fill:#0f3460,stroke:#7b61ff,color:#fff
style E fill:#1a1a2e,stroke:#f2c811,color:#fff
```
**Why a CLI?** When an AI agent uses an MCP server directly, the tool schemas consume ~4,000+ tokens per tool in the context window. A `pbi` command costs ~30 tokens. Same capabilities, 100x less context.
<details>
<summary><b>Configuration details</b></summary>
All config lives in `~/.pbi-cli/`:
```
~/.pbi-cli/
config.json # Default connection preference
connections.json # Named connections
repl_history # REPL command history
```
Bundled DLLs ship inside the Python package (`pbi_cli/dlls/`):
- Microsoft.AnalysisServices.Tabular.dll
- Microsoft.AnalysisServices.AdomdClient.dll
- Microsoft.AnalysisServices.Core.dll
- Microsoft.AnalysisServices.Tabular.Json.dll
- Microsoft.AnalysisServices.dll
</details>
---
## Development
```bash

View file

@ -0,0 +1,51 @@
<svg xmlns="http://www.w3.org/2000/svg" width="850" height="150" viewBox="0 0 850 150">
<rect width="100%" height="100%" fill="#0d1117" rx="8"/>
<!-- Title -->
<text x="425" y="28" font-family="'Segoe UI', Arial, sans-serif" font-size="18" fill="#F2C811" text-anchor="middle" font-weight="bold">Architecture</text>
<!-- Box 1: Claude Code -->
<rect x="15" y="50" width="130" height="75" rx="8" fill="#161b22" stroke="#d97757" stroke-width="2"/>
<text x="80" y="84" font-family="'Segoe UI', Arial, sans-serif" font-size="14" fill="#d97757" text-anchor="middle" font-weight="bold">Claude Code</text>
<text x="80" y="104" font-family="'Courier New', Courier, monospace" font-size="10" fill="#8b949e" text-anchor="middle">AI Agent</text>
<!-- Arrow 1 > 2 -->
<line x1="149" y1="88" x2="185" y2="88" stroke="#F2C811" stroke-width="2" stroke-dasharray="4,3" stroke-opacity="0.5"/>
<polygon points="189,88 182,83 182,93" fill="#F2C811" fill-opacity="0.5"/>
<text x="169" y="78" font-family="'Segoe UI', Arial, sans-serif" font-size="8" fill="#8b949e" text-anchor="middle">CLI</text>
<!-- Box 2: pbi-cli -->
<rect x="193" y="50" width="130" height="75" rx="8" fill="#161b22" stroke="#58a6ff" stroke-width="2"/>
<text x="258" y="84" font-family="'Segoe UI', Arial, sans-serif" font-size="14" fill="#58a6ff" text-anchor="middle" font-weight="bold">pbi-cli</text>
<text x="258" y="104" font-family="'Courier New', Courier, monospace" font-size="10" fill="#8b949e" text-anchor="middle">Python + Click</text>
<!-- Arrow 2 > 3 (wider gap for "in-process" label) -->
<line x1="327" y1="88" x2="393" y2="88" stroke="#F2C811" stroke-width="2" stroke-dasharray="4,3" stroke-opacity="0.5"/>
<polygon points="397,88 390,83 390,93" fill="#F2C811" fill-opacity="0.5"/>
<text x="362" y="78" font-family="'Segoe UI', Arial, sans-serif" font-size="9" fill="#8b949e" text-anchor="middle">in-process</text>
<!-- Box 3: pythonnet -->
<rect x="401" y="50" width="120" height="75" rx="8" fill="#161b22" stroke="#7b61ff" stroke-width="2"/>
<text x="461" y="84" font-family="'Segoe UI', Arial, sans-serif" font-size="14" fill="#7b61ff" text-anchor="middle" font-weight="bold">pythonnet</text>
<text x="461" y="104" font-family="'Courier New', Courier, monospace" font-size="10" fill="#8b949e" text-anchor="middle">CLR Bridge</text>
<!-- Arrow 3 > 4 -->
<line x1="525" y1="88" x2="561" y2="88" stroke="#F2C811" stroke-width="2" stroke-dasharray="4,3" stroke-opacity="0.5"/>
<polygon points="565,88 558,83 558,93" fill="#F2C811" fill-opacity="0.5"/>
<text x="545" y="78" font-family="'Segoe UI', Arial, sans-serif" font-size="8" fill="#8b949e" text-anchor="middle">.NET calls</text>
<!-- Box 4: .NET TOM -->
<rect x="569" y="50" width="130" height="75" rx="8" fill="#161b22" stroke="#F2C811" stroke-width="2"/>
<text x="634" y="84" font-family="'Segoe UI', Arial, sans-serif" font-size="14" fill="#F2C811" text-anchor="middle" font-weight="bold">.NET TOM</text>
<text x="634" y="104" font-family="'Courier New', Courier, monospace" font-size="10" fill="#8b949e" text-anchor="middle">ADOMD.NET</text>
<!-- Arrow 4 > 5 -->
<line x1="703" y1="88" x2="727" y2="88" stroke="#F2C811" stroke-width="2" stroke-dasharray="4,3" stroke-opacity="0.5"/>
<polygon points="731,88 724,83 724,93" fill="#F2C811" fill-opacity="0.5"/>
<text x="717" y="78" font-family="'Segoe UI', Arial, sans-serif" font-size="8" fill="#8b949e" text-anchor="middle">XMLA</text>
<!-- Box 5: Power BI -->
<rect x="735" y="50" width="100" height="75" rx="8" fill="#161b22" stroke="#F2C811" stroke-width="2"/>
<text x="785" y="84" font-family="'Segoe UI', Arial, sans-serif" font-size="14" fill="#F2C811" text-anchor="middle" font-weight="bold">Power BI</text>
<text x="785" y="104" font-family="'Courier New', Courier, monospace" font-size="10" fill="#8b949e" text-anchor="middle">msmdsrv.exe</text>
</svg>

After

Width:  |  Height:  |  Size: 3.8 KiB

57
assets/backup-restore.svg Normal file
View file

@ -0,0 +1,57 @@
<svg xmlns="http://www.w3.org/2000/svg" width="850" height="520" viewBox="0 0 850 520">
<rect width="100%" height="100%" fill="#0d1117" rx="8"/>
<!-- Title -->
<text x="425" y="32" font-family="'Segoe UI', Arial, sans-serif" font-size="18" fill="#F2C811" text-anchor="middle" font-weight="bold">Undo Anything. Instantly.</text>
<text x="425" y="50" font-family="'Segoe UI', Arial, sans-serif" font-size="11" fill="#8b949e" text-anchor="middle">Snapshot your model before risky changes, restore when things go wrong</text>
<!-- Chat container -->
<rect x="40" y="65" width="770" height="420" rx="8" fill="#161b22" stroke="#30363d" stroke-width="1"/>
<!-- Header bar -->
<rect x="40" y="65" width="770" height="30" rx="8" fill="#21262d"/>
<rect x="40" y="87" width="770" height="8" fill="#21262d"/>
<circle cx="62" cy="80" r="5" fill="#ff5f57"/>
<circle cx="78" cy="80" r="5" fill="#febc2e"/>
<circle cx="94" cy="80" r="5" fill="#28c840"/>
<text x="116" y="84" font-family="'Segoe UI', Arial, sans-serif" font-size="11" fill="#d97757" font-weight="bold">Claude Code</text>
<!-- User message 1 -->
<rect x="280" y="106" width="510" height="28" rx="12" fill="#1a3a5c" stroke="#264d73" stroke-width="1"/>
<text x="300" y="125" font-family="'Segoe UI', Arial, sans-serif" font-size="12" fill="#e2e8f0">Save a snapshot of my model before I restructure the Sales tables</text>
<!-- Claude response 1 -->
<rect x="60" y="146" width="520" height="62" rx="12" fill="#1c1c1c" stroke="#30363d" stroke-width="1"/>
<text x="78" y="166" font-family="'Segoe UI', Arial, sans-serif" font-size="11" fill="#8b949e">Running:</text>
<text x="130" y="166" font-family="'Courier New', Courier, monospace" font-size="10" fill="#58a6ff">pbi database export-tmdl ./snapshots/before-restructure/</text>
<text x="78" y="186" font-family="'Segoe UI', Arial, sans-serif" font-size="12" fill="#06d6a0">&#x2713; Snapshot saved: 12 tables, 34 measures, 11 relationships</text>
<text x="78" y="202" font-family="'Segoe UI', Arial, sans-serif" font-size="10" fill="#8b949e">Go ahead and make your changes. You can always roll back.</text>
<!-- Time indicator -->
<rect x="340" y="222" width="170" height="22" rx="11" fill="#21262d"/>
<text x="425" y="237" font-family="'Segoe UI', Arial, sans-serif" font-size="10" fill="#8b949e" text-anchor="middle">30 minutes later...</text>
<!-- User message 2 -->
<rect x="310" y="256" width="480" height="44" rx="12" fill="#1a3a5c" stroke="#264d73" stroke-width="1"/>
<text x="330" y="274" font-family="'Segoe UI', Arial, sans-serif" font-size="12" fill="#e2e8f0">I messed up the relationships and now half my measures are</text>
<text x="330" y="291" font-family="'Segoe UI', Arial, sans-serif" font-size="12" fill="#e2e8f0">showing blank. Can you restore the snapshot?</text>
<!-- Claude response 2 -->
<rect x="60" y="312" width="540" height="80" rx="12" fill="#1c1c1c" stroke="#30363d" stroke-width="1"/>
<text x="78" y="332" font-family="'Segoe UI', Arial, sans-serif" font-size="11" fill="#8b949e">Running:</text>
<text x="130" y="332" font-family="'Courier New', Courier, monospace" font-size="10" fill="#58a6ff">pbi database import-tmdl ./snapshots/before-restructure/</text>
<text x="78" y="352" font-family="'Segoe UI', Arial, sans-serif" font-size="12" fill="#06d6a0">&#x2713; Model restored to pre-restructure state</text>
<text x="78" y="370" font-family="'Segoe UI', Arial, sans-serif" font-size="11" fill="#c9d1d9">All 12 tables, 34 measures, and 11 relationships are back.</text>
<text x="78" y="386" font-family="'Segoe UI', Arial, sans-serif" font-size="10" fill="#8b949e">Your measures should be working again. Refresh Power BI to see the changes.</text>
<!-- User message 3 -->
<rect x="560" y="404" width="230" height="28" rx="12" fill="#1a3a5c" stroke="#264d73" stroke-width="1"/>
<text x="580" y="423" font-family="'Segoe UI', Arial, sans-serif" font-size="12" fill="#e2e8f0">You just saved me 2 hours of work</text>
<!-- Claude response 3 -->
<rect x="60" y="440" width="300" height="32" rx="12" fill="#1c1c1c" stroke="#30363d" stroke-width="1"/>
<text x="78" y="461" font-family="'Segoe UI', Arial, sans-serif" font-size="11" fill="#c9d1d9">That's what snapshots are for. Want to save a new one?</text>
<!-- Footer -->
<text x="425" y="510" font-family="'Segoe UI', Arial, sans-serif" font-size="11" fill="#8b949e" text-anchor="middle">Never lose work again. Snapshot before, restore after.</text>
</svg>

After

Width:  |  Height:  |  Size: 4.4 KiB

89
assets/banner.svg Normal file
View file

@ -0,0 +1,89 @@
<svg xmlns="http://www.w3.org/2000/svg" width="850" height="265" viewBox="0 0 850 265">
<defs>
<linearGradient id="pbi-bar1" x1="50%" y1="0%" x2="50%" y2="100%">
<stop offset="0%" stop-color="#EBBB14"/>
<stop offset="100%" stop-color="#B25400"/>
</linearGradient>
<linearGradient id="pbi-bar2" x1="50%" y1="0%" x2="50%" y2="100%">
<stop offset="0%" stop-color="#F9E583"/>
<stop offset="100%" stop-color="#DE9800"/>
</linearGradient>
<linearGradient id="pbi-bar3" x1="50%" y1="0%" x2="50%" y2="100%">
<stop offset="0%" stop-color="#F9E68B"/>
<stop offset="100%" stop-color="#F3CD32"/>
</linearGradient>
</defs>
<!-- Background -->
<rect width="100%" height="100%" fill="#0d1117" rx="8"/>
<!-- "VIBE MODELLING" block art (shadow layer) -->
<text font-family="'Courier New', Courier, monospace" font-size="9" fill="#7A6508" xml:space="preserve">
<tspan x="104" y="22">██╗ ██╗ ██╗ ██████╗ ███████╗ ███╗ ███╗ ██████╗ ██████╗ ███████╗ ██╗ ██╗ ██╗ ███╗ ██╗ ██████╗ </tspan>
<tspan x="104" y="33">██║ ██║ ██║ ██╔══██╗ ██╔════╝ ████╗ ████║ ██╔═══██╗ ██╔══██╗ ██╔════╝ ██║ ██║ ██║ ████╗ ██║ ██╔════╝ </tspan>
<tspan x="104" y="44">██║ ██║ ██║ ██████╔╝ █████╗ ██╔████╔██║ ██║ ██║ ██║ ██║ █████╗ ██║ ██║ ██║ ██╔██╗ ██║ ██║ ███╗</tspan>
<tspan x="104" y="55">╚██╗ ██╔╝ ██║ ██╔══██╗ ██╔══╝ ██║╚██╔╝██║ ██║ ██║ ██║ ██║ ██╔══╝ ██║ ██║ ██║ ██║╚██╗██║ ██║ ██║</tspan>
<tspan x="104" y="66"> ╚████╔╝ ██║ ██████╔╝ ███████╗ ██║ ╚═╝ ██║ ╚██████╔╝ ██████╔╝ ███████╗ ███████╗ ███████╗ ██║ ██║ ╚████║ ╚██████╔╝</tspan>
<tspan x="104" y="77"> ╚═══╝ ╚═╝ ╚═════╝ ╚══════╝ ╚═╝ ╚═╝ ╚═════╝ ╚═════╝ ╚══════╝ ╚══════╝ ╚══════╝ ╚═╝ ╚═╝ ╚═══╝ ╚═════╝ </tspan>
</text>
<!-- "VIBE MODELLING" block art (main layer) -->
<text font-family="'Courier New', Courier, monospace" font-size="9" fill="#F2C811" xml:space="preserve">
<tspan x="103" y="21">██╗ ██╗ ██╗ ██████╗ ███████╗ ███╗ ███╗ ██████╗ ██████╗ ███████╗ ██╗ ██╗ ██╗ ███╗ ██╗ ██████╗ </tspan>
<tspan x="103" y="32">██║ ██║ ██║ ██╔══██╗ ██╔════╝ ████╗ ████║ ██╔═══██╗ ██╔══██╗ ██╔════╝ ██║ ██║ ██║ ████╗ ██║ ██╔════╝ </tspan>
<tspan x="103" y="43">██║ ██║ ██║ ██████╔╝ █████╗ ██╔████╔██║ ██║ ██║ ██║ ██║ █████╗ ██║ ██║ ██║ ██╔██╗ ██║ ██║ ███╗</tspan>
<tspan x="103" y="54">╚██╗ ██╔╝ ██║ ██╔══██╗ ██╔══╝ ██║╚██╔╝██║ ██║ ██║ ██║ ██║ ██╔══╝ ██║ ██║ ██║ ██║╚██╗██║ ██║ ██║</tspan>
<tspan x="103" y="65"> ╚████╔╝ ██║ ██████╔╝ ███████╗ ██║ ╚═╝ ██║ ╚██████╔╝ ██████╔╝ ███████╗ ███████╗ ███████╗ ██║ ██║ ╚████║ ╚██████╔╝</tspan>
<tspan x="103" y="76"> ╚═══╝ ╚═╝ ╚═════╝ ╚══════╝ ╚═╝ ╚═╝ ╚═════╝ ╚═════╝ ╚══════╝ ╚══════╝ ╚══════╝ ╚═╝ ╚═╝ ╚═══╝ ╚═════╝ </tspan>
</text>
<!-- Separator -->
<line x1="60" y1="95" x2="790" y2="95" stroke="#F2C811" stroke-opacity="0.15" stroke-width="1"/>
<!-- Layout: Claude(130) ~ arrow ~ PBI-CLI(425) ~ arrow ~ PowerBI(720) -->
<!-- Claude AI logo (centered at x=130, y=168), scale=0.075 -> 90x90 -->
<g transform="translate(85, 123) scale(0.075)">
<path fill="#d97757" d="M 233.959793 800.214905 L 468.644287 668.536987 L 472.590637 657.100647 L 468.644287 650.738403 L 457.208069 650.738403 L 417.986633 648.322144 L 283.892639 644.69812 L 167.597321 639.865845 L 54.926208 633.825623 L 26.577238 627.785339 L 3.3e-05 592.751709 L 2.73832 575.27533 L 26.577238 559.248352 L 60.724873 562.228149 L 136.187973 567.382629 L 249.422867 575.194763 L 331.570496 580.026978 L 453.261841 592.671082 L 472.590637 592.671082 L 475.328857 584.859009 L 468.724915 580.026978 L 463.570557 575.194763 L 346.389313 495.785217 L 219.543671 411.865906 L 153.100723 363.543762 L 117.181267 339.060425 L 99.060455 316.107361 L 91.248367 266.01355 L 123.865784 230.093994 L 167.677887 233.073853 L 178.872513 236.053772 L 223.248367 270.201477 L 318.040283 343.570496 L 441.825592 434.738342 L 459.946411 449.798706 L 467.194672 444.64447 L 468.080597 441.020203 L 459.946411 427.409485 L 392.617493 305.718323 L 320.778564 181.932983 L 288.80542 130.630859 L 280.348999 99.865845 C 277.369171 87.221436 275.194641 76.590698 275.194641 63.624268 L 312.322174 13.20813 L 332.8591 6.604126 L 382.389313 13.20813 L 403.248352 31.328979 L 434.013519 101.71814 L 483.865753 212.537048 L 561.181274 363.221497 L 583.812134 407.919434 L 595.892639 449.315491 L 600.40271 461.959839 L 608.214783 461.959839 L 608.214783 454.711609 L 614.577271 369.825623 L 626.335632 265.61084 L 637.771851 131.516846 L 641.718201 93.745117 L 660.402832 48.483276 L 697.530334 24.000122 L 726.52356 37.852417 L 750.362549 72 L 747.060486 94.067139 L 732.886047 186.201416 L 705.100708 330.52356 L 686.979919 427.167847 L 697.530334 427.167847 L 709.61084 415.087341 L 758.496704 350.174561 L 840.644348 247.490051 L 876.885925 206.738342 L 919.167847 161.71814 L 946.308838 140.29541 L 997.61084 140.29541 L 1035.38269 196.429626 L 1018.469849 254.416199 L 965.637634 321.422852 L 921.825562 378.201538 L 859.006714 462.765259 L 819.785278 530.41626 L 823.409424 535.812073 L 832.75177 534.92627 L 974.657776 504.724915 L 1051.328979 490.872559 L 1142.818848 475.167786 L 1184.214844 494.496582 L 1188.724854 514.147644 L 1172.456421 554.335693 L 1074.604126 578.496765 L 959.838989 601.449829 L 788.939636 641.879272 L 786.845764 643.409485 L 789.261841 646.389343 L 866.255127 653.637634 L 899.194702 655.409424 L 979.812134 655.409424 L 1129.932861 666.604187 L 1169.154419 692.537109 L 1192.671265 724.268677 L 1188.724854 748.429688 L 1128.322144 779.194641 L 1046.818848 759.865845 L 856.590759 714.604126 L 791.355774 698.335754 L 782.335693 698.335754 L 782.335693 703.731567 L 836.69812 756.885986 L 936.322205 846.845581 L 1061.073975 962.81897 L 1067.436279 991.490112 L 1051.409424 1014.120911 L 1034.496704 1011.704712 L 924.885986 929.234924 L 882.604126 892.107544 L 786.845764 811.48999 L 780.483276 811.48999 L 780.483276 819.946289 L 802.550415 852.241699 L 919.087341 1027.409424 L 925.127625 1081.127686 L 916.671204 1098.604126 L 886.469849 1109.154419 L 853.288696 1103.114136 L 785.073914 1007.355835 L 714.684631 899.516785 L 657.906067 802.872498 L 650.979858 806.81897 L 617.476624 1167.704834 L 601.771851 1186.147705 L 565.530212 1200 L 535.328857 1177.046997 L 519.302124 1139.919556 L 535.328857 1066.550537 L 554.657776 970.792053 L 570.362488 894.68457 L 584.536926 800.134277 L 592.993347 768.724976 L 592.429626 766.630859 L 585.503479 767.516968 L 514.22821 865.369263 L 405.825531 1011.865906 L 320.053711 1103.677979 L 299.516815 1111.812256 L 263.919525 1093.369263 L 267.221497 1060.429688 L 287.114136 1031.114136 L 405.825531 880.107361 L 477.422913 786.52356 L 523.651062 732.483276 L 523.328918 724.671265 L 520.590698 724.671265 L 205.288605 929.395935 L 149.154434 936.644409 L 124.993355 914.01355 L 127.973183 876.885986 L 139.409409 864.80542 L 234.201385 799.570435 L 233.879227 799.8927 Z"/>
</g>
<text x="130" y="222" font-family="'Segoe UI', Arial, sans-serif" font-size="11" fill="#d97757" text-anchor="middle" font-weight="600">Claude Code</text>
<!-- Left arrow -->
<line x1="190" y1="175" x2="288" y2="175" stroke="#F2C811" stroke-width="2" stroke-dasharray="6,4" stroke-opacity="0.5"/>
<polygon points="292,175 284,170 284,180" fill="#F2C811" fill-opacity="0.5"/>
<!-- PBI-CLI block art (font-size 8, ~240px wide, centered at x=425) -->
<!-- shadow -->
<text font-family="'Courier New', Courier, monospace" font-size="8" fill="#7A6508" xml:space="preserve">
<tspan x="306" y="143">██████╗ ██████╗ ██╗ ██████╗ ██╗ ██╗</tspan>
<tspan x="306" y="155">██╔══██╗ ██╔══██╗ ██║ ██╔════╝ ██║ ██║</tspan>
<tspan x="306" y="167">██████╔╝ ██████╔╝ ██║ ███╗ ██║ ██║ ██║</tspan>
<tspan x="306" y="179">██╔═══╝ ██╔══██╗ ██║ ╚══╝ ██║ ██║ ██║</tspan>
<tspan x="306" y="191">██║ ██████╔╝ ██║ ╚██████╗ ███████╗ ██║</tspan>
<tspan x="306" y="203">╚═╝ ╚═════╝ ╚═╝ ╚═════╝ ╚══════╝ ╚═╝</tspan>
</text>
<!-- main -->
<text font-family="'Courier New', Courier, monospace" font-size="8" fill="#F2C811" xml:space="preserve">
<tspan x="305" y="142">██████╗ ██████╗ ██╗ ██████╗ ██╗ ██╗</tspan>
<tspan x="305" y="154">██╔══██╗ ██╔══██╗ ██║ ██╔════╝ ██║ ██║</tspan>
<tspan x="305" y="166">██████╔╝ ██████╔╝ ██║ ███╗ ██║ ██║ ██║</tspan>
<tspan x="305" y="178">██╔═══╝ ██╔══██╗ ██║ ╚══╝ ██║ ██║ ██║</tspan>
<tspan x="305" y="190">██║ ██████╔╝ ██║ ╚██████╗ ███████╗ ██║</tspan>
<tspan x="305" y="202">╚═╝ ╚═════╝ ╚═╝ ╚═════╝ ╚══════╝ ╚═╝</tspan>
</text>
<!-- Right arrow -->
<line x1="558" y1="175" x2="656" y2="175" stroke="#F2C811" stroke-width="2" stroke-dasharray="6,4" stroke-opacity="0.5"/>
<polygon points="660,175 652,170 652,180" fill="#F2C811" fill-opacity="0.5"/>
<!-- Power BI logo (3-bar chart, centered at x=720) -->
<g transform="translate(685, 125)">
<rect x="40" y="0" width="30" height="90" rx="5" fill="url(#pbi-bar1)"/>
<rect x="20" y="24" width="30" height="66" rx="5" fill="url(#pbi-bar2)"/>
<rect x="0" y="46" width="30" height="44" rx="5" fill="url(#pbi-bar3)"/>
</g>
<text x="720" y="236" font-family="'Segoe UI', Arial, sans-serif" font-size="11" fill="#F2C811" text-anchor="middle" font-weight="600">Power BI</text>
<!-- Install command -->
<text x="425" y="252" font-family="'Courier New', Courier, monospace" font-size="14" fill="#58a6ff" text-anchor="middle" font-weight="bold">pipx install pbi-cli-tool</text>
</svg>

After

Width:  |  Height:  |  Size: 12 KiB

68
assets/before-after.svg Normal file
View file

@ -0,0 +1,68 @@
<svg xmlns="http://www.w3.org/2000/svg" width="850" height="380" viewBox="0 0 850 380">
<rect width="100%" height="100%" fill="#0d1117" rx="8"/>
<!-- Title -->
<text x="425" y="35" font-family="'Segoe UI', Arial, sans-serif" font-size="18" fill="#F2C811" text-anchor="middle" font-weight="bold">Why pbi-cli?</text>
<!-- Left Panel: WITHOUT -->
<rect x="20" y="55" width="395" height="305" rx="8" fill="#161b22" stroke="#ff6b6b" stroke-width="2"/>
<text x="217" y="85" font-family="'Segoe UI', Arial, sans-serif" font-size="15" fill="#ff6b6b" text-anchor="middle" font-weight="bold">WITHOUT pbi-cli</text>
<!-- Pain point 1 -->
<text x="50" y="120" font-family="'Segoe UI', Arial, sans-serif" font-size="14" fill="#ff6b6b">&#x2717;</text>
<text x="70" y="120" font-family="'Segoe UI', Arial, sans-serif" font-size="12" fill="#8b949e">Manual GUI clicking for every change</text>
<!-- Pain point 2 -->
<text x="50" y="155" font-family="'Segoe UI', Arial, sans-serif" font-size="14" fill="#ff6b6b">&#x2717;</text>
<text x="70" y="155" font-family="'Segoe UI', Arial, sans-serif" font-size="12" fill="#8b949e">No version control for models</text>
<!-- Pain point 3 -->
<text x="50" y="190" font-family="'Segoe UI', Arial, sans-serif" font-size="14" fill="#ff6b6b">&#x2717;</text>
<text x="70" y="190" font-family="'Segoe UI', Arial, sans-serif" font-size="12" fill="#8b949e">Copy-paste DAX from documentation</text>
<!-- Pain point 4 -->
<text x="50" y="225" font-family="'Segoe UI', Arial, sans-serif" font-size="14" fill="#ff6b6b">&#x2717;</text>
<text x="70" y="225" font-family="'Segoe UI', Arial, sans-serif" font-size="12" fill="#8b949e">MCP tools cost 4,000+ tokens each</text>
<!-- Pain point 5 -->
<text x="50" y="260" font-family="'Segoe UI', Arial, sans-serif" font-size="14" fill="#ff6b6b">&#x2717;</text>
<text x="70" y="260" font-family="'Segoe UI', Arial, sans-serif" font-size="12" fill="#8b949e">No scripting or CI/CD integration</text>
<!-- Pain point 6 -->
<text x="50" y="295" font-family="'Segoe UI', Arial, sans-serif" font-size="14" fill="#ff6b6b">&#x2717;</text>
<text x="70" y="295" font-family="'Segoe UI', Arial, sans-serif" font-size="12" fill="#8b949e">Context switching between tools</text>
<!-- Left footer -->
<text x="217" y="340" font-family="'Segoe UI', Arial, sans-serif" font-size="11" fill="#ff6b6b" text-anchor="middle" opacity="0.6">Slow, manual, error-prone</text>
<!-- Right Panel: WITH -->
<rect x="435" y="55" width="395" height="305" rx="8" fill="#161b22" stroke="#06d6a0" stroke-width="2"/>
<text x="632" y="85" font-family="'Segoe UI', Arial, sans-serif" font-size="15" fill="#06d6a0" text-anchor="middle" font-weight="bold">WITH pbi-cli</text>
<!-- Solution 1 -->
<text x="465" y="120" font-family="'Segoe UI', Arial, sans-serif" font-size="14" fill="#06d6a0">&#x2713;</text>
<text x="485" y="120" font-family="'Segoe UI', Arial, sans-serif" font-size="12" fill="#c9d1d9">CLI commands from any terminal</text>
<!-- Solution 2 -->
<text x="465" y="155" font-family="'Segoe UI', Arial, sans-serif" font-size="14" fill="#06d6a0">&#x2713;</text>
<text x="485" y="155" font-family="'Segoe UI', Arial, sans-serif" font-size="12" fill="#c9d1d9">TMDL export for full Git support</text>
<!-- Solution 3 -->
<text x="465" y="190" font-family="'Segoe UI', Arial, sans-serif" font-size="14" fill="#06d6a0">&#x2713;</text>
<text x="485" y="190" font-family="'Segoe UI', Arial, sans-serif" font-size="12" fill="#c9d1d9">Claude writes and validates DAX</text>
<!-- Solution 4 -->
<text x="465" y="225" font-family="'Segoe UI', Arial, sans-serif" font-size="14" fill="#06d6a0">&#x2713;</text>
<text x="485" y="225" font-family="'Segoe UI', Arial, sans-serif" font-size="12" fill="#c9d1d9">CLI commands cost ~30 tokens each</text>
<!-- Solution 5 -->
<text x="465" y="260" font-family="'Segoe UI', Arial, sans-serif" font-size="14" fill="#06d6a0">&#x2713;</text>
<text x="485" y="260" font-family="'Segoe UI', Arial, sans-serif" font-size="12" fill="#c9d1d9">Script everything, automate pipelines</text>
<!-- Solution 6 -->
<text x="465" y="295" font-family="'Segoe UI', Arial, sans-serif" font-size="14" fill="#06d6a0">&#x2713;</text>
<text x="485" y="295" font-family="'Segoe UI', Arial, sans-serif" font-size="12" fill="#c9d1d9">One tool, one workflow, one context</text>
<!-- Right footer -->
<text x="632" y="340" font-family="'Segoe UI', Arial, sans-serif" font-size="11" fill="#06d6a0" text-anchor="middle" opacity="0.6">Fast, scriptable, AI-native</text>
</svg>

After

Width:  |  Height:  |  Size: 4.5 KiB

View file

@ -0,0 +1,70 @@
<svg xmlns="http://www.w3.org/2000/svg" width="850" height="480" viewBox="0 0 850 480">
<rect width="100%" height="100%" fill="#0d1117" rx="8"/>
<!-- Title -->
<text x="425" y="32" font-family="'Segoe UI', Arial, sans-serif" font-size="18" fill="#F2C811" text-anchor="middle" font-weight="bold">One Prompt, Five Measures</text>
<text x="425" y="50" font-family="'Segoe UI', Arial, sans-serif" font-size="11" fill="#8b949e" text-anchor="middle">Stop clicking through the GUI for every single measure</text>
<!-- Chat container -->
<rect x="40" y="65" width="770" height="380" rx="8" fill="#161b22" stroke="#30363d" stroke-width="1"/>
<!-- Header bar -->
<rect x="40" y="65" width="770" height="30" rx="8" fill="#21262d"/>
<rect x="40" y="87" width="770" height="8" fill="#21262d"/>
<circle cx="62" cy="80" r="5" fill="#ff5f57"/>
<circle cx="78" cy="80" r="5" fill="#febc2e"/>
<circle cx="94" cy="80" r="5" fill="#28c840"/>
<text x="116" y="84" font-family="'Segoe UI', Arial, sans-serif" font-size="11" fill="#d97757" font-weight="bold">Claude Code</text>
<!-- User message -->
<rect x="220" y="106" width="570" height="44" rx="12" fill="#1a3a5c" stroke="#264d73" stroke-width="1"/>
<text x="240" y="124" font-family="'Segoe UI', Arial, sans-serif" font-size="12" fill="#e2e8f0">Add time intelligence measures to Sales: YTD, QTD, MTD,</text>
<text x="240" y="141" font-family="'Segoe UI', Arial, sans-serif" font-size="12" fill="#e2e8f0">Prior Year, and Year-over-Year growth %</text>
<!-- Claude response -->
<rect x="60" y="162" width="620" height="268" rx="12" fill="#1c1c1c" stroke="#30363d" stroke-width="1"/>
<text x="78" y="182" font-family="'Segoe UI', Arial, sans-serif" font-size="11" fill="#8b949e">Creating 5 measures in Sales table...</text>
<!-- Measure 1 -->
<text x="78" y="206" font-family="'Segoe UI', Arial, sans-serif" font-size="12" fill="#06d6a0">&#x2713;</text>
<text x="95" y="206" font-family="'Segoe UI', Arial, sans-serif" font-size="11" fill="#c9d1d9" font-weight="bold">YTD Revenue</text>
<text x="200" y="206" font-family="'Courier New', Courier, monospace" font-size="10" fill="#d97757">TOTALYTD ( SUM ( Sales[Amount] ), Calendar[Date] )</text>
<!-- Measure 2 -->
<text x="78" y="232" font-family="'Segoe UI', Arial, sans-serif" font-size="12" fill="#06d6a0">&#x2713;</text>
<text x="95" y="232" font-family="'Segoe UI', Arial, sans-serif" font-size="11" fill="#c9d1d9" font-weight="bold">QTD Revenue</text>
<text x="200" y="232" font-family="'Courier New', Courier, monospace" font-size="10" fill="#d97757">TOTALQTD ( SUM ( Sales[Amount] ), Calendar[Date] )</text>
<!-- Measure 3 -->
<text x="78" y="258" font-family="'Segoe UI', Arial, sans-serif" font-size="12" fill="#06d6a0">&#x2713;</text>
<text x="95" y="258" font-family="'Segoe UI', Arial, sans-serif" font-size="11" fill="#c9d1d9" font-weight="bold">MTD Revenue</text>
<text x="200" y="258" font-family="'Courier New', Courier, monospace" font-size="10" fill="#d97757">TOTALMTD ( SUM ( Sales[Amount] ), Calendar[Date] )</text>
<!-- Measure 4 -->
<text x="78" y="284" font-family="'Segoe UI', Arial, sans-serif" font-size="12" fill="#06d6a0">&#x2713;</text>
<text x="95" y="284" font-family="'Segoe UI', Arial, sans-serif" font-size="11" fill="#c9d1d9" font-weight="bold">PY Revenue</text>
<text x="200" y="284" font-family="'Courier New', Courier, monospace" font-size="10" fill="#d97757">CALCULATE ( SUM ( Sales[Amount] ), SAMEPERIODLASTYEAR (... ) )</text>
<!-- Measure 5 -->
<text x="78" y="310" font-family="'Segoe UI', Arial, sans-serif" font-size="12" fill="#06d6a0">&#x2713;</text>
<text x="95" y="310" font-family="'Segoe UI', Arial, sans-serif" font-size="11" fill="#c9d1d9" font-weight="bold">YoY Growth %</text>
<text x="200" y="310" font-family="'Courier New', Courier, monospace" font-size="10" fill="#d97757">DIVIDE ( [YTD Revenue] - [PY Revenue], [PY Revenue] )</text>
<!-- Summary line -->
<line x1="78" y1="325" x2="650" y2="325" stroke="#30363d" stroke-width="1"/>
<text x="78" y="345" font-family="'Segoe UI', Arial, sans-serif" font-size="12" fill="#F2C811" font-weight="bold">5 measures created in 3.2 seconds</text>
<text x="78" y="363" font-family="'Segoe UI', Arial, sans-serif" font-size="10" fill="#8b949e">All formatted, described, and assigned to Sales table display folder</text>
<!-- Comparison callout -->
<rect x="78" y="378" width="200" height="38" rx="6" fill="#161b22" stroke="#ff6b6b" stroke-opacity="0.4"/>
<text x="178" y="397" font-family="'Segoe UI', Arial, sans-serif" font-size="10" fill="#ff6b6b" text-anchor="middle">GUI: ~10 min, 50+ clicks</text>
<text x="178" y="411" font-family="'Segoe UI', Arial, sans-serif" font-size="9" fill="#8b949e" text-anchor="middle">per measure, repeated 5x</text>
<rect x="298" y="378" width="200" height="38" rx="6" fill="#161b22" stroke="#06d6a0" stroke-opacity="0.4"/>
<text x="398" y="397" font-family="'Segoe UI', Arial, sans-serif" font-size="10" fill="#06d6a0" text-anchor="middle">pbi-cli: 3 seconds, 1 prompt</text>
<text x="398" y="411" font-family="'Segoe UI', Arial, sans-serif" font-size="9" fill="#8b949e" text-anchor="middle">all five at once</text>
<!-- Footer -->
<text x="425" y="470" font-family="'Segoe UI', Arial, sans-serif" font-size="11" fill="#8b949e" text-anchor="middle">Batch operations that would take hours in the GUI, done in seconds</text>
</svg>

After

Width:  |  Height:  |  Size: 5.3 KiB

61
assets/chat-demo.svg Normal file
View file

@ -0,0 +1,61 @@
<svg xmlns="http://www.w3.org/2000/svg" width="850" height="520" viewBox="0 0 850 520">
<rect width="100%" height="100%" fill="#0d1117" rx="8"/>
<!-- Title -->
<text x="425" y="32" font-family="'Segoe UI', Arial, sans-serif" font-size="18" fill="#F2C811" text-anchor="middle" font-weight="bold">Just Ask Claude</text>
<text x="425" y="50" font-family="'Segoe UI', Arial, sans-serif" font-size="11" fill="#8b949e" text-anchor="middle">Plain English in, Power BI changes out</text>
<!-- Chat container -->
<rect x="40" y="65" width="770" height="420" rx="8" fill="#161b22" stroke="#30363d" stroke-width="1"/>
<!-- Header bar -->
<rect x="40" y="65" width="770" height="30" rx="8" fill="#21262d"/>
<rect x="40" y="87" width="770" height="8" fill="#21262d"/>
<!-- Traffic lights -->
<circle cx="62" cy="80" r="5" fill="#ff5f57"/>
<circle cx="78" cy="80" r="5" fill="#febc2e"/>
<circle cx="94" cy="80" r="5" fill="#28c840"/>
<text x="116" y="84" font-family="'Segoe UI', Arial, sans-serif" font-size="11" fill="#d97757" font-weight="bold">Claude Code</text>
<text x="205" y="84" font-family="'Segoe UI', Arial, sans-serif" font-size="10" fill="#8b949e">pbi-cli session</text>
<!-- User message 1 -->
<rect x="350" y="110" width="440" height="32" rx="12" fill="#1a3a5c" stroke="#264d73" stroke-width="1"/>
<text x="370" y="131" font-family="'Segoe UI', Arial, sans-serif" font-size="12" fill="#e2e8f0">Connect to my Power BI model and show me the stats</text>
<!-- Claude response 1 -->
<rect x="60" y="152" width="480" height="68" rx="12" fill="#1c1c1c" stroke="#30363d" stroke-width="1"/>
<text x="78" y="171" font-family="'Segoe UI', Arial, sans-serif" font-size="11" fill="#8b949e">Running:</text>
<text x="130" y="171" font-family="'Courier New', Courier, monospace" font-size="11" fill="#58a6ff">pbi connect</text>
<text x="225" y="171" font-family="'Segoe UI', Arial, sans-serif" font-size="11" fill="#8b949e">+</text>
<text x="237" y="171" font-family="'Courier New', Courier, monospace" font-size="11" fill="#58a6ff">pbi model stats</text>
<text x="78" y="192" font-family="'Segoe UI', Arial, sans-serif" font-size="12" fill="#06d6a0">&#x2713; Connected to Adventure Works</text>
<text x="78" y="210" font-family="'Segoe UI', Arial, sans-serif" font-size="11" fill="#c9d1d9">Found 12 tables, 34 measures, 87 columns, 11 relationships</text>
<!-- User message 2 -->
<rect x="280" y="232" width="510" height="32" rx="12" fill="#1a3a5c" stroke="#264d73" stroke-width="1"/>
<text x="300" y="253" font-family="'Segoe UI', Arial, sans-serif" font-size="12" fill="#e2e8f0">Create a YTD Revenue measure in the Sales table using Calendar</text>
<!-- Claude response 2 -->
<rect x="60" y="274" width="530" height="68" rx="12" fill="#1c1c1c" stroke="#30363d" stroke-width="1"/>
<text x="78" y="293" font-family="'Segoe UI', Arial, sans-serif" font-size="11" fill="#8b949e">Running:</text>
<text x="130" y="293" font-family="'Courier New', Courier, monospace" font-size="10" fill="#58a6ff">pbi measure create "YTD Revenue" -t Sales</text>
<text x="78" y="312" font-family="'Segoe UI', Arial, sans-serif" font-size="12" fill="#06d6a0">&#x2713; Created measure YTD Revenue in Sales</text>
<text x="78" y="330" font-family="'Courier New', Courier, monospace" font-size="10" fill="#d97757">TOTALYTD ( SUM ( Sales[Amount] ), Calendar[Date] )</text>
<!-- User message 3 -->
<rect x="430" y="354" width="360" height="32" rx="12" fill="#1a3a5c" stroke="#264d73" stroke-width="1"/>
<text x="450" y="375" font-family="'Segoe UI', Arial, sans-serif" font-size="12" fill="#e2e8f0">What's the current YTD revenue number?</text>
<!-- Claude response 3 -->
<rect x="60" y="396" width="400" height="50" rx="12" fill="#1c1c1c" stroke="#30363d" stroke-width="1"/>
<text x="78" y="415" font-family="'Segoe UI', Arial, sans-serif" font-size="11" fill="#8b949e">Running:</text>
<text x="130" y="415" font-family="'Courier New', Courier, monospace" font-size="10" fill="#58a6ff">pbi dax execute "EVALUATE ROW(..."</text>
<text x="78" y="436" font-family="'Segoe UI', Arial, sans-serif" font-size="13" fill="#F2C811" font-weight="bold">YTD Revenue: $1,245,890</text>
<!-- Input bar at bottom -->
<rect x="60" y="454" width="730" height="26" rx="13" fill="#0d1117" stroke="#484f58" stroke-width="1"/>
<text x="82" y="472" font-family="'Segoe UI', Arial, sans-serif" font-size="11" fill="#484f58">Ask Claude to modify your Power BI model...</text>
<!-- Footer -->
<text x="425" y="508" font-family="'Segoe UI', Arial, sans-serif" font-size="11" fill="#8b949e" text-anchor="middle">No DAX syntax to memorize. No GUI menus to navigate. Just describe what you need.</text>
</svg>

After

Width:  |  Height:  |  Size: 4.6 KiB

63
assets/dax-debugging.svg Normal file
View file

@ -0,0 +1,63 @@
<svg xmlns="http://www.w3.org/2000/svg" width="850" height="520" viewBox="0 0 850 520">
<rect width="100%" height="100%" fill="#0d1117" rx="8"/>
<!-- Title -->
<text x="425" y="32" font-family="'Segoe UI', Arial, sans-serif" font-size="18" fill="#F2C811" text-anchor="middle" font-weight="bold">Debug DAX Like Never Before</text>
<text x="425" y="50" font-family="'Segoe UI', Arial, sans-serif" font-size="11" fill="#8b949e" text-anchor="middle">Describe the problem in plain English, Claude finds and fixes it</text>
<!-- Chat container -->
<rect x="40" y="65" width="770" height="420" rx="8" fill="#161b22" stroke="#30363d" stroke-width="1"/>
<!-- Header bar -->
<rect x="40" y="65" width="770" height="30" rx="8" fill="#21262d"/>
<rect x="40" y="87" width="770" height="8" fill="#21262d"/>
<circle cx="62" cy="80" r="5" fill="#ff5f57"/>
<circle cx="78" cy="80" r="5" fill="#febc2e"/>
<circle cx="94" cy="80" r="5" fill="#28c840"/>
<text x="116" y="84" font-family="'Segoe UI', Arial, sans-serif" font-size="11" fill="#d97757" font-weight="bold">Claude Code</text>
<!-- User message 1 -->
<rect x="280" y="106" width="510" height="44" rx="12" fill="#1a3a5c" stroke="#264d73" stroke-width="1"/>
<text x="300" y="124" font-family="'Segoe UI', Arial, sans-serif" font-size="12" fill="#e2e8f0">My YTD Revenue measure is returning blank for all months.</text>
<text x="300" y="141" font-family="'Segoe UI', Arial, sans-serif" font-size="12" fill="#e2e8f0">It was working last week. Can you figure out what's wrong?</text>
<!-- Claude response 1: Investigation -->
<rect x="60" y="162" width="620" height="120" rx="12" fill="#1c1c1c" stroke="#30363d" stroke-width="1"/>
<text x="78" y="182" font-family="'Segoe UI', Arial, sans-serif" font-size="11" fill="#c9d1d9" font-weight="bold">Investigating...</text>
<text x="78" y="202" font-family="'Segoe UI', Arial, sans-serif" font-size="11" fill="#8b949e">1.</text>
<text x="92" y="202" font-family="'Courier New', Courier, monospace" font-size="10" fill="#58a6ff">pbi measure list -t Sales</text>
<text x="310" y="202" font-family="'Segoe UI', Arial, sans-serif" font-size="10" fill="#06d6a0">Found YTD Revenue</text>
<text x="78" y="222" font-family="'Segoe UI', Arial, sans-serif" font-size="11" fill="#8b949e">2.</text>
<text x="92" y="222" font-family="'Courier New', Courier, monospace" font-size="10" fill="#58a6ff">pbi measure get "YTD Revenue"</text>
<text x="330" y="222" font-family="'Segoe UI', Arial, sans-serif" font-size="10" fill="#06d6a0">DAX syntax OK</text>
<text x="78" y="242" font-family="'Segoe UI', Arial, sans-serif" font-size="11" fill="#8b949e">3.</text>
<text x="92" y="242" font-family="'Courier New', Courier, monospace" font-size="10" fill="#58a6ff">pbi table list</text>
<text x="220" y="242" font-family="'Segoe UI', Arial, sans-serif" font-size="10" fill="#febc2e">&#x26A0; Calendar table exists but...</text>
<text x="78" y="262" font-family="'Segoe UI', Arial, sans-serif" font-size="11" fill="#8b949e">4.</text>
<text x="92" y="262" font-family="'Courier New', Courier, monospace" font-size="10" fill="#58a6ff">pbi calendar check</text>
<text x="245" y="262" font-family="'Segoe UI', Arial, sans-serif" font-size="10" fill="#ff6b6b">&#x2716; Calendar NOT marked as date table</text>
<!-- Claude diagnosis -->
<rect x="60" y="292" width="620" height="68" rx="12" fill="#1c1c1c" stroke="#ff6b6b" stroke-width="1" stroke-opacity="0.4"/>
<text x="78" y="312" font-family="'Segoe UI', Arial, sans-serif" font-size="12" fill="#ff6b6b" font-weight="bold">Root cause found</text>
<text x="78" y="330" font-family="'Segoe UI', Arial, sans-serif" font-size="11" fill="#c9d1d9">Your Calendar table lost its "Mark as Date Table" setting. TOTALYTD needs</text>
<text x="78" y="346" font-family="'Segoe UI', Arial, sans-serif" font-size="11" fill="#c9d1d9">this to work. This can happen after a refresh or schema change.</text>
<!-- User message 2 -->
<rect x="570" y="372" width="220" height="28" rx="12" fill="#1a3a5c" stroke="#264d73" stroke-width="1"/>
<text x="590" y="391" font-family="'Segoe UI', Arial, sans-serif" font-size="12" fill="#e2e8f0">Fix it please</text>
<!-- Claude response 2: Fix -->
<rect x="60" y="410" width="540" height="62" rx="12" fill="#1c1c1c" stroke="#30363d" stroke-width="1"/>
<text x="78" y="430" font-family="'Segoe UI', Arial, sans-serif" font-size="11" fill="#8b949e">Running:</text>
<text x="130" y="430" font-family="'Courier New', Courier, monospace" font-size="10" fill="#58a6ff">pbi calendar mark-as-date-table -t Calendar -c Date</text>
<text x="78" y="450" font-family="'Segoe UI', Arial, sans-serif" font-size="12" fill="#06d6a0">&#x2713; Calendar marked as date table. YTD Revenue should work now.</text>
<text x="78" y="466" font-family="'Segoe UI', Arial, sans-serif" font-size="10" fill="#8b949e">Verified: YTD Revenue = $1,245,890 (no longer blank)</text>
<!-- Footer -->
<text x="425" y="510" font-family="'Segoe UI', Arial, sans-serif" font-size="11" fill="#8b949e" text-anchor="middle">Stop guessing why your DAX is broken. Let Claude trace the problem.</text>
</svg>

After

Width:  |  Height:  |  Size: 5.1 KiB

113
assets/feature-grid.svg Normal file
View file

@ -0,0 +1,113 @@
<svg xmlns="http://www.w3.org/2000/svg" width="850" height="520" viewBox="0 0 850 520">
<rect width="100%" height="100%" fill="#0d1117" rx="8"/>
<!-- Title -->
<text x="425" y="35" font-family="'Segoe UI', Arial, sans-serif" font-size="18" fill="#F2C811" text-anchor="middle" font-weight="bold">22 Command Groups</text>
<text x="425" y="52" font-family="'Segoe UI', Arial, sans-serif" font-size="11" fill="#8b949e" text-anchor="middle">Covering the full Tabular Object Model</text>
<!-- Row 1 -->
<rect x="22" y="68" width="195" height="62" rx="6" fill="#161b22" stroke="#F2C811" stroke-opacity="0.3"/>
<text x="32" y="90" font-family="'Segoe UI', Arial, sans-serif" font-size="13" fill="#F2C811" font-weight="bold">connect</text>
<text x="32" y="118" font-family="'Segoe UI', Arial, sans-serif" font-size="10" fill="#8b949e">Link to Power BI Desktop</text>
<rect x="227" y="68" width="195" height="62" rx="6" fill="#161b22" stroke="#F2C811" stroke-opacity="0.3"/>
<text x="237" y="90" font-family="'Segoe UI', Arial, sans-serif" font-size="13" fill="#F2C811" font-weight="bold">dax</text>
<text x="237" y="118" font-family="'Segoe UI', Arial, sans-serif" font-size="10" fill="#8b949e">Execute and validate DAX queries</text>
<rect x="432" y="68" width="195" height="62" rx="6" fill="#161b22" stroke="#F2C811" stroke-opacity="0.3"/>
<text x="442" y="90" font-family="'Segoe UI', Arial, sans-serif" font-size="13" fill="#F2C811" font-weight="bold">measure</text>
<text x="442" y="118" font-family="'Segoe UI', Arial, sans-serif" font-size="10" fill="#8b949e">Create, update, delete measures</text>
<rect x="637" y="68" width="195" height="62" rx="6" fill="#161b22" stroke="#F2C811" stroke-opacity="0.3"/>
<text x="647" y="90" font-family="'Segoe UI', Arial, sans-serif" font-size="13" fill="#F2C811" font-weight="bold">table</text>
<text x="647" y="118" font-family="'Segoe UI', Arial, sans-serif" font-size="10" fill="#8b949e">Manage tables and schemas</text>
<!-- Row 2 -->
<rect x="22" y="140" width="195" height="62" rx="6" fill="#161b22" stroke="#F2C811" stroke-opacity="0.3"/>
<text x="32" y="162" font-family="'Segoe UI', Arial, sans-serif" font-size="13" fill="#F2C811" font-weight="bold">column</text>
<text x="32" y="190" font-family="'Segoe UI', Arial, sans-serif" font-size="10" fill="#8b949e">Add, rename, hide columns</text>
<rect x="227" y="140" width="195" height="62" rx="6" fill="#161b22" stroke="#F2C811" stroke-opacity="0.3"/>
<text x="237" y="162" font-family="'Segoe UI', Arial, sans-serif" font-size="13" fill="#F2C811" font-weight="bold">relationship</text>
<text x="237" y="190" font-family="'Segoe UI', Arial, sans-serif" font-size="10" fill="#8b949e">Define table joins and cardinality</text>
<rect x="432" y="140" width="195" height="62" rx="6" fill="#161b22" stroke="#F2C811" stroke-opacity="0.3"/>
<text x="442" y="162" font-family="'Segoe UI', Arial, sans-serif" font-size="13" fill="#F2C811" font-weight="bold">model</text>
<text x="442" y="190" font-family="'Segoe UI', Arial, sans-serif" font-size="10" fill="#8b949e">Model metadata and statistics</text>
<rect x="637" y="140" width="195" height="62" rx="6" fill="#161b22" stroke="#F2C811" stroke-opacity="0.3"/>
<text x="647" y="162" font-family="'Segoe UI', Arial, sans-serif" font-size="13" fill="#F2C811" font-weight="bold">database</text>
<text x="647" y="190" font-family="'Segoe UI', Arial, sans-serif" font-size="10" fill="#8b949e">TMDL/TMSL import and export</text>
<!-- Row 3 -->
<rect x="22" y="212" width="195" height="62" rx="6" fill="#161b22" stroke="#F2C811" stroke-opacity="0.3"/>
<text x="32" y="234" font-family="'Segoe UI', Arial, sans-serif" font-size="13" fill="#F2C811" font-weight="bold">security-role</text>
<text x="32" y="262" font-family="'Segoe UI', Arial, sans-serif" font-size="10" fill="#8b949e">Row-level security roles</text>
<rect x="227" y="212" width="195" height="62" rx="6" fill="#161b22" stroke="#F2C811" stroke-opacity="0.3"/>
<text x="237" y="234" font-family="'Segoe UI', Arial, sans-serif" font-size="13" fill="#F2C811" font-weight="bold">calc-group</text>
<text x="237" y="262" font-family="'Segoe UI', Arial, sans-serif" font-size="10" fill="#8b949e">Calculation groups and items</text>
<rect x="432" y="212" width="195" height="62" rx="6" fill="#161b22" stroke="#F2C811" stroke-opacity="0.3"/>
<text x="442" y="234" font-family="'Segoe UI', Arial, sans-serif" font-size="13" fill="#F2C811" font-weight="bold">partition</text>
<text x="442" y="262" font-family="'Segoe UI', Arial, sans-serif" font-size="10" fill="#8b949e">Table partitions and refresh</text>
<rect x="637" y="212" width="195" height="62" rx="6" fill="#161b22" stroke="#F2C811" stroke-opacity="0.3"/>
<text x="647" y="234" font-family="'Segoe UI', Arial, sans-serif" font-size="13" fill="#F2C811" font-weight="bold">perspective</text>
<text x="647" y="262" font-family="'Segoe UI', Arial, sans-serif" font-size="10" fill="#8b949e">User perspectives and views</text>
<!-- Row 4 -->
<rect x="22" y="284" width="195" height="62" rx="6" fill="#161b22" stroke="#F2C811" stroke-opacity="0.3"/>
<text x="32" y="306" font-family="'Segoe UI', Arial, sans-serif" font-size="13" fill="#F2C811" font-weight="bold">hierarchy</text>
<text x="32" y="334" font-family="'Segoe UI', Arial, sans-serif" font-size="10" fill="#8b949e">Column hierarchies and levels</text>
<rect x="227" y="284" width="195" height="62" rx="6" fill="#161b22" stroke="#F2C811" stroke-opacity="0.3"/>
<text x="237" y="306" font-family="'Segoe UI', Arial, sans-serif" font-size="13" fill="#F2C811" font-weight="bold">expression</text>
<text x="237" y="334" font-family="'Segoe UI', Arial, sans-serif" font-size="10" fill="#8b949e">Named M/Power Query sources</text>
<rect x="432" y="284" width="195" height="62" rx="6" fill="#161b22" stroke="#F2C811" stroke-opacity="0.3"/>
<text x="442" y="306" font-family="'Segoe UI', Arial, sans-serif" font-size="13" fill="#F2C811" font-weight="bold">calendar</text>
<text x="442" y="334" font-family="'Segoe UI', Arial, sans-serif" font-size="10" fill="#8b949e">Date table configuration</text>
<rect x="637" y="284" width="195" height="62" rx="6" fill="#161b22" stroke="#F2C811" stroke-opacity="0.3"/>
<text x="647" y="306" font-family="'Segoe UI', Arial, sans-serif" font-size="13" fill="#F2C811" font-weight="bold">trace</text>
<text x="647" y="334" font-family="'Segoe UI', Arial, sans-serif" font-size="10" fill="#8b949e">Query tracing and profiling</text>
<!-- Row 5 -->
<rect x="22" y="356" width="195" height="62" rx="6" fill="#161b22" stroke="#F2C811" stroke-opacity="0.3"/>
<text x="32" y="378" font-family="'Segoe UI', Arial, sans-serif" font-size="13" fill="#F2C811" font-weight="bold">transaction</text>
<text x="32" y="406" font-family="'Segoe UI', Arial, sans-serif" font-size="10" fill="#8b949e">Atomic multi-step changes</text>
<rect x="227" y="356" width="195" height="62" rx="6" fill="#161b22" stroke="#F2C811" stroke-opacity="0.3"/>
<text x="237" y="378" font-family="'Segoe UI', Arial, sans-serif" font-size="13" fill="#F2C811" font-weight="bold">advanced</text>
<text x="237" y="406" font-family="'Segoe UI', Arial, sans-serif" font-size="10" fill="#8b949e">Culture and locale settings</text>
<rect x="432" y="356" width="195" height="62" rx="6" fill="#161b22" stroke="#F2C811" stroke-opacity="0.3"/>
<text x="442" y="378" font-family="'Segoe UI', Arial, sans-serif" font-size="13" fill="#F2C811" font-weight="bold">repl</text>
<text x="442" y="406" font-family="'Segoe UI', Arial, sans-serif" font-size="10" fill="#8b949e">Interactive DAX shell</text>
<rect x="637" y="356" width="195" height="62" rx="6" fill="#161b22" stroke="#F2C811" stroke-opacity="0.3"/>
<text x="647" y="378" font-family="'Segoe UI', Arial, sans-serif" font-size="13" fill="#F2C811" font-weight="bold">skills</text>
<text x="647" y="406" font-family="'Segoe UI', Arial, sans-serif" font-size="10" fill="#8b949e">Claude Code AI skill packs</text>
<!-- Row 6 -->
<rect x="22" y="428" width="195" height="62" rx="6" fill="#161b22" stroke="#F2C811" stroke-opacity="0.3"/>
<text x="32" y="450" font-family="'Segoe UI', Arial, sans-serif" font-size="13" fill="#F2C811" font-weight="bold">disconnect</text>
<text x="32" y="478" font-family="'Segoe UI', Arial, sans-serif" font-size="10" fill="#8b949e">Close active connection</text>
<rect x="227" y="428" width="195" height="62" rx="6" fill="#161b22" stroke="#F2C811" stroke-opacity="0.3"/>
<text x="237" y="450" font-family="'Segoe UI', Arial, sans-serif" font-size="13" fill="#F2C811" font-weight="bold">connections</text>
<text x="237" y="478" font-family="'Segoe UI', Arial, sans-serif" font-size="10" fill="#8b949e">Manage saved sessions</text>
<rect x="432" y="428" width="195" height="62" rx="6" fill="#161b22" stroke="#F2C811" stroke-opacity="0.3"/>
<text x="442" y="450" font-family="'Segoe UI', Arial, sans-serif" font-size="13" fill="#F2C811" font-weight="bold">setup</text>
<text x="442" y="478" font-family="'Segoe UI', Arial, sans-serif" font-size="10" fill="#8b949e">Environment and DLL check</text>
<!-- Summary cell -->
<rect x="637" y="428" width="195" height="62" rx="6" fill="#161b22" stroke="#F2C811" stroke-opacity="0.8"/>
<text x="734" y="456" font-family="'Segoe UI', Arial, sans-serif" font-size="15" fill="#F2C811" text-anchor="middle" font-weight="bold">100+ Subcommands</text>
<text x="734" y="478" font-family="'Segoe UI', Arial, sans-serif" font-size="10" fill="#8b949e" text-anchor="middle">Full TOM coverage</text>
<!-- Footer -->
<text x="425" y="510" font-family="'Courier New', Courier, monospace" font-size="12" fill="#58a6ff" text-anchor="middle" font-weight="bold">pbi &lt;group&gt; &lt;command&gt; [options]</text>
</svg>

After

Width:  |  Height:  |  Size: 9.7 KiB

View file

@ -1,4 +1,4 @@
<svg xmlns="http://www.w3.org/2000/svg" width="650" height="135" viewBox="0 0 650 135">
<svg xmlns="http://www.w3.org/2000/svg" width="475" height="135" viewBox="0 0 475 135">
<rect width="100%" height="100%" fill="#0d1117" rx="8"/>
<text font-family="'Courier New', Courier, monospace" font-size="14.5" fill="#7A6508" xml:space="preserve">
<tspan x="21" y="29">██████╗ ██████╗ ██╗ ██████╗ ██╗ ██╗</tspan>

Before

Width:  |  Height:  |  Size: 2.1 KiB

After

Width:  |  Height:  |  Size: 2.1 KiB

View file

@ -0,0 +1,79 @@
<svg xmlns="http://www.w3.org/2000/svg" width="850" height="490" viewBox="0 0 850 490">
<rect width="100%" height="100%" fill="#0d1117" rx="8"/>
<!-- Title -->
<text x="425" y="32" font-family="'Segoe UI', Arial, sans-serif" font-size="18" fill="#F2C811" text-anchor="middle" font-weight="bold">Model Health Check</text>
<text x="425" y="50" font-family="'Segoe UI', Arial, sans-serif" font-size="11" fill="#8b949e" text-anchor="middle">Ask Claude to audit your semantic model in seconds</text>
<!-- Chat container -->
<rect x="40" y="65" width="770" height="340" rx="8" fill="#161b22" stroke="#30363d" stroke-width="1"/>
<!-- Header bar -->
<rect x="40" y="65" width="770" height="30" rx="8" fill="#21262d"/>
<rect x="40" y="87" width="770" height="8" fill="#21262d"/>
<circle cx="62" cy="80" r="5" fill="#ff5f57"/>
<circle cx="78" cy="80" r="5" fill="#febc2e"/>
<circle cx="94" cy="80" r="5" fill="#28c840"/>
<text x="116" y="84" font-family="'Segoe UI', Arial, sans-serif" font-size="11" fill="#d97757" font-weight="bold">Claude Code</text>
<!-- User message -->
<rect x="380" y="106" width="410" height="28" rx="12" fill="#1a3a5c" stroke="#264d73" stroke-width="1"/>
<text x="398" y="125" font-family="'Segoe UI', Arial, sans-serif" font-size="12" fill="#e2e8f0">Check my model for any issues or improvements</text>
<!-- Claude response -->
<rect x="60" y="146" width="640" height="250" rx="12" fill="#1c1c1c" stroke="#30363d" stroke-width="1"/>
<text x="78" y="168" font-family="'Segoe UI', Arial, sans-serif" font-size="12" fill="#c9d1d9" font-weight="bold">Model Audit Report</text>
<text x="250" y="168" font-family="'Segoe UI', Arial, sans-serif" font-size="10" fill="#8b949e">Adventure Works (12 tables, 34 measures)</text>
<line x1="78" y1="178" x2="680" y2="178" stroke="#30363d" stroke-width="1"/>
<!-- Finding 1: Warning -->
<text x="78" y="198" font-family="'Segoe UI', Arial, sans-serif" font-size="12" fill="#febc2e">&#x26A0;</text>
<text x="98" y="198" font-family="'Segoe UI', Arial, sans-serif" font-size="11" fill="#febc2e" font-weight="bold">3 unused measures</text>
<text x="240" y="198" font-family="'Segoe UI', Arial, sans-serif" font-size="10" fill="#8b949e">Test_Calc, Old_Revenue, Copy_of_Sales not referenced anywhere</text>
<!-- Finding 2: Warning -->
<text x="78" y="224" font-family="'Segoe UI', Arial, sans-serif" font-size="12" fill="#febc2e">&#x26A0;</text>
<text x="98" y="224" font-family="'Segoe UI', Arial, sans-serif" font-size="11" fill="#febc2e" font-weight="bold">Wide table detected</text>
<text x="250" y="224" font-family="'Segoe UI', Arial, sans-serif" font-size="10" fill="#8b949e">Product has 42 columns, consider splitting or hiding unused</text>
<!-- Finding 3: Error -->
<text x="78" y="250" font-family="'Segoe UI', Arial, sans-serif" font-size="12" fill="#ff6b6b">&#x2716;</text>
<text x="98" y="250" font-family="'Segoe UI', Arial, sans-serif" font-size="11" fill="#ff6b6b" font-weight="bold">Missing relationship</text>
<text x="260" y="250" font-family="'Segoe UI', Arial, sans-serif" font-size="10" fill="#8b949e">Budget table has no join to Calendar (Date column exists)</text>
<!-- Finding 4: Error -->
<text x="78" y="276" font-family="'Segoe UI', Arial, sans-serif" font-size="12" fill="#ff6b6b">&#x2716;</text>
<text x="98" y="276" font-family="'Segoe UI', Arial, sans-serif" font-size="11" fill="#ff6b6b" font-weight="bold">Bidirectional filter</text>
<text x="262" y="276" font-family="'Segoe UI', Arial, sans-serif" font-size="10" fill="#8b949e">Sales to Product is bidirectional, may cause ambiguity</text>
<!-- Finding 5: OK -->
<text x="78" y="302" font-family="'Segoe UI', Arial, sans-serif" font-size="12" fill="#06d6a0">&#x2713;</text>
<text x="98" y="302" font-family="'Segoe UI', Arial, sans-serif" font-size="11" fill="#06d6a0" font-weight="bold">Date table configured</text>
<text x="270" y="302" font-family="'Segoe UI', Arial, sans-serif" font-size="10" fill="#8b949e">Calendar marked as date table with proper hierarchy</text>
<!-- Finding 6: OK -->
<text x="78" y="328" font-family="'Segoe UI', Arial, sans-serif" font-size="12" fill="#06d6a0">&#x2713;</text>
<text x="98" y="328" font-family="'Segoe UI', Arial, sans-serif" font-size="11" fill="#06d6a0" font-weight="bold">No circular dependencies</text>
<text x="278" y="328" font-family="'Segoe UI', Arial, sans-serif" font-size="10" fill="#8b949e">All measure references resolve correctly</text>
<!-- Summary -->
<line x1="78" y1="342" x2="680" y2="342" stroke="#30363d" stroke-width="1"/>
<text x="78" y="362" font-family="'Segoe UI', Arial, sans-serif" font-size="11" fill="#c9d1d9">Summary:</text>
<text x="142" y="362" font-family="'Segoe UI', Arial, sans-serif" font-size="11" fill="#ff6b6b">2 errors</text>
<text x="205" y="362" font-family="'Segoe UI', Arial, sans-serif" font-size="11" fill="#febc2e">2 warnings</text>
<text x="290" y="362" font-family="'Segoe UI', Arial, sans-serif" font-size="11" fill="#06d6a0">2 passed</text>
<text x="78" y="382" font-family="'Segoe UI', Arial, sans-serif" font-size="11" fill="#8b949e">Shall I fix the missing relationship and remove the unused measures?</text>
<!-- Comparison (outside chat container, centered) -->
<rect x="225" y="420" width="190" height="32" rx="16" fill="#161b22" stroke="#ff6b6b" stroke-opacity="0.4"/>
<text x="320" y="441" font-family="'Segoe UI', Arial, sans-serif" font-size="10" fill="#ff6b6b" text-anchor="middle">Manual review: 30+ minutes</text>
<rect x="435" y="420" width="190" height="32" rx="16" fill="#161b22" stroke="#06d6a0" stroke-opacity="0.4"/>
<text x="530" y="441" font-family="'Segoe UI', Arial, sans-serif" font-size="10" fill="#06d6a0" text-anchor="middle">pbi-cli: instant audit</text>
<!-- Footer -->
<text x="425" y="480" font-family="'Segoe UI', Arial, sans-serif" font-size="11" fill="#8b949e" text-anchor="middle">Catch model issues before they reach production</text>
</svg>

After

Width:  |  Height:  |  Size: 5.9 KiB

51
assets/rls-testing.svg Normal file
View file

@ -0,0 +1,51 @@
<svg xmlns="http://www.w3.org/2000/svg" width="850" height="460" viewBox="0 0 850 460">
<rect width="100%" height="100%" fill="#0d1117" rx="8"/>
<!-- Title -->
<text x="425" y="32" font-family="'Segoe UI', Arial, sans-serif" font-size="18" fill="#F2C811" text-anchor="middle" font-weight="bold">Test Row-Level Security in Seconds</text>
<text x="425" y="50" font-family="'Segoe UI', Arial, sans-serif" font-size="11" fill="#8b949e" text-anchor="middle">Create, configure, and validate RLS roles without touching the GUI</text>
<!-- Chat container -->
<rect x="40" y="65" width="770" height="360" rx="8" fill="#161b22" stroke="#30363d" stroke-width="1"/>
<!-- Header bar -->
<rect x="40" y="65" width="770" height="30" rx="8" fill="#21262d"/>
<rect x="40" y="87" width="770" height="8" fill="#21262d"/>
<circle cx="62" cy="80" r="5" fill="#ff5f57"/>
<circle cx="78" cy="80" r="5" fill="#febc2e"/>
<circle cx="94" cy="80" r="5" fill="#28c840"/>
<text x="116" y="84" font-family="'Segoe UI', Arial, sans-serif" font-size="11" fill="#d97757" font-weight="bold">Claude Code</text>
<!-- User message 1 -->
<rect x="250" y="106" width="540" height="44" rx="12" fill="#1a3a5c" stroke="#264d73" stroke-width="1"/>
<text x="270" y="124" font-family="'Segoe UI', Arial, sans-serif" font-size="12" fill="#e2e8f0">Create an RLS role called "Europe Sales" that filters the</text>
<text x="270" y="141" font-family="'Segoe UI', Arial, sans-serif" font-size="12" fill="#e2e8f0">Region table to only show European countries</text>
<!-- Claude response 1 -->
<rect x="60" y="162" width="560" height="80" rx="12" fill="#1c1c1c" stroke="#30363d" stroke-width="1"/>
<text x="78" y="182" font-family="'Segoe UI', Arial, sans-serif" font-size="11" fill="#8b949e">Running:</text>
<text x="130" y="182" font-family="'Courier New', Courier, monospace" font-size="10" fill="#58a6ff">pbi security-role create "Europe Sales"</text>
<text x="78" y="200" font-family="'Segoe UI', Arial, sans-serif" font-size="11" fill="#8b949e">Running:</text>
<text x="130" y="200" font-family="'Courier New', Courier, monospace" font-size="10" fill="#58a6ff">pbi security-role add-filter "Europe Sales" -t Region</text>
<text x="78" y="220" font-family="'Segoe UI', Arial, sans-serif" font-size="12" fill="#06d6a0">&#x2713; Role created with filter:</text>
<text x="270" y="220" font-family="'Courier New', Courier, monospace" font-size="10" fill="#d97757">[Region][Continent] = "Europe"</text>
<text x="78" y="236" font-family="'Segoe UI', Arial, sans-serif" font-size="10" fill="#8b949e">Applied to Region table with DAX filter expression</text>
<!-- User message 2 -->
<rect x="370" y="254" width="420" height="28" rx="12" fill="#1a3a5c" stroke="#264d73" stroke-width="1"/>
<text x="390" y="273" font-family="'Segoe UI', Arial, sans-serif" font-size="12" fill="#e2e8f0">Now test it. What does a Europe user see for total sales?</text>
<!-- Claude response 2 -->
<rect x="60" y="294" width="560" height="118" rx="12" fill="#1c1c1c" stroke="#30363d" stroke-width="1"/>
<text x="78" y="314" font-family="'Segoe UI', Arial, sans-serif" font-size="11" fill="#8b949e">Running as role "Europe Sales":</text>
<text x="78" y="332" font-family="'Courier New', Courier, monospace" font-size="10" fill="#58a6ff">pbi dax execute "EVALUATE ROW(\"Sales\", [Total Sales], \"Regions\", COUNTROWS(Region))"</text>
<!-- Result table -->
<line x1="78" y1="342" x2="590" y2="342" stroke="#30363d" stroke-width="1"/>
<text x="78" y="360" font-family="'Courier New', Courier, monospace" font-size="11" fill="#F2C811">| Total Sales | Regions |</text>
<text x="78" y="378" font-family="'Courier New', Courier, monospace" font-size="11" fill="#c9d1d9">| $3,842,150 | 12 |</text>
<text x="78" y="396" font-family="'Segoe UI', Arial, sans-serif" font-size="11" fill="#06d6a0">&#x2713; Filter working: 12 of 48 regions visible (Europe only)</text>
<!-- Footer -->
<text x="425" y="450" font-family="'Segoe UI', Arial, sans-serif" font-size="11" fill="#8b949e" text-anchor="middle">Build and validate security roles entirely from conversation. No Security tab needed.</text>
</svg>

After

Width:  |  Height:  |  Size: 4.1 KiB

72
assets/skills-hub.svg Normal file
View file

@ -0,0 +1,72 @@
<svg xmlns="http://www.w3.org/2000/svg" width="850" height="320" viewBox="0 0 850 320">
<rect width="100%" height="100%" fill="#0d1117" rx="8"/>
<!-- Title -->
<text x="425" y="32" font-family="'Segoe UI', Arial, sans-serif" font-size="18" fill="#F2C811" text-anchor="middle" font-weight="bold">7 Skills That Claude Discovers Automatically</text>
<text x="425" y="50" font-family="'Segoe UI', Arial, sans-serif" font-size="11" fill="#8b949e" text-anchor="middle">Install once, Claude uses the right skill for every task</text>
<!-- Root node: PBI-CLI -->
<rect x="350" y="70" width="150" height="40" rx="8" fill="#161b22" stroke="#F2C811" stroke-width="2"/>
<text x="425" y="95" font-family="'Segoe UI', Arial, sans-serif" font-size="15" fill="#F2C811" text-anchor="middle" font-weight="bold">pbi-cli</text>
<!-- Vertical trunk line -->
<line x1="425" y1="110" x2="425" y2="140" stroke="#F2C811" stroke-width="2" stroke-opacity="0.3"/>
<!-- Horizontal branch line -->
<line x1="75" y1="140" x2="775" y2="140" stroke="#F2C811" stroke-width="2" stroke-opacity="0.3"/>
<!-- Branch drops -->
<line x1="75" y1="140" x2="75" y2="160" stroke="#58a6ff" stroke-width="1.5" stroke-opacity="0.4"/>
<line x1="192" y1="140" x2="192" y2="160" stroke="#F2C811" stroke-width="1.5" stroke-opacity="0.4"/>
<line x1="308" y1="140" x2="308" y2="160" stroke="#7b61ff" stroke-width="1.5" stroke-opacity="0.4"/>
<line x1="425" y1="140" x2="425" y2="160" stroke="#06d6a0" stroke-width="1.5" stroke-opacity="0.4"/>
<line x1="542" y1="140" x2="542" y2="160" stroke="#ff6b6b" stroke-width="1.5" stroke-opacity="0.4"/>
<line x1="658" y1="140" x2="658" y2="160" stroke="#a0c4ff" stroke-width="1.5" stroke-opacity="0.4"/>
<line x1="775" y1="140" x2="775" y2="160" stroke="#ffd166" stroke-width="1.5" stroke-opacity="0.4"/>
<!-- Skill 1: DAX -->
<rect x="25" y="160" width="100" height="34" rx="8" fill="#161b22" stroke="#58a6ff" stroke-width="1.5"/>
<text x="75" y="182" font-family="'Segoe UI', Arial, sans-serif" font-size="12" fill="#58a6ff" text-anchor="middle" font-weight="bold">DAX</text>
<text x="75" y="210" font-family="'Segoe UI', Arial, sans-serif" font-size="10" fill="#8b949e" text-anchor="middle">Queries &amp;</text>
<text x="75" y="224" font-family="'Segoe UI', Arial, sans-serif" font-size="10" fill="#8b949e" text-anchor="middle">Calculations</text>
<!-- Skill 2: Modeling -->
<rect x="142" y="160" width="100" height="34" rx="8" fill="#161b22" stroke="#F2C811" stroke-width="1.5"/>
<text x="192" y="182" font-family="'Segoe UI', Arial, sans-serif" font-size="12" fill="#F2C811" text-anchor="middle" font-weight="bold">Modeling</text>
<text x="192" y="210" font-family="'Segoe UI', Arial, sans-serif" font-size="10" fill="#8b949e" text-anchor="middle">Tables &amp;</text>
<text x="192" y="224" font-family="'Segoe UI', Arial, sans-serif" font-size="10" fill="#8b949e" text-anchor="middle">Relationships</text>
<!-- Skill 3: Deployment -->
<rect x="258" y="160" width="100" height="34" rx="8" fill="#161b22" stroke="#7b61ff" stroke-width="1.5"/>
<text x="308" y="182" font-family="'Segoe UI', Arial, sans-serif" font-size="11" fill="#7b61ff" text-anchor="middle" font-weight="bold">Deployment</text>
<text x="308" y="210" font-family="'Segoe UI', Arial, sans-serif" font-size="10" fill="#8b949e" text-anchor="middle">TMDL &amp;</text>
<text x="308" y="224" font-family="'Segoe UI', Arial, sans-serif" font-size="10" fill="#8b949e" text-anchor="middle">Transactions</text>
<!-- Skill 4: Security -->
<rect x="375" y="160" width="100" height="34" rx="8" fill="#161b22" stroke="#06d6a0" stroke-width="1.5"/>
<text x="425" y="182" font-family="'Segoe UI', Arial, sans-serif" font-size="12" fill="#06d6a0" text-anchor="middle" font-weight="bold">Security</text>
<text x="425" y="210" font-family="'Segoe UI', Arial, sans-serif" font-size="10" fill="#8b949e" text-anchor="middle">RLS &amp;</text>
<text x="425" y="224" font-family="'Segoe UI', Arial, sans-serif" font-size="10" fill="#8b949e" text-anchor="middle">Perspectives</text>
<!-- Skill 5: Docs -->
<rect x="492" y="160" width="100" height="34" rx="8" fill="#161b22" stroke="#ff6b6b" stroke-width="1.5"/>
<text x="542" y="182" font-family="'Segoe UI', Arial, sans-serif" font-size="12" fill="#ff6b6b" text-anchor="middle" font-weight="bold">Docs</text>
<text x="542" y="210" font-family="'Segoe UI', Arial, sans-serif" font-size="10" fill="#8b949e" text-anchor="middle">Data</text>
<text x="542" y="224" font-family="'Segoe UI', Arial, sans-serif" font-size="10" fill="#8b949e" text-anchor="middle">Dictionary</text>
<!-- Skill 6: Partitions -->
<rect x="608" y="160" width="100" height="34" rx="8" fill="#161b22" stroke="#a0c4ff" stroke-width="1.5"/>
<text x="658" y="182" font-family="'Segoe UI', Arial, sans-serif" font-size="11" fill="#a0c4ff" text-anchor="middle" font-weight="bold">Partitions</text>
<text x="658" y="210" font-family="'Segoe UI', Arial, sans-serif" font-size="10" fill="#8b949e" text-anchor="middle">Sources &amp;</text>
<text x="658" y="224" font-family="'Segoe UI', Arial, sans-serif" font-size="10" fill="#8b949e" text-anchor="middle">M Queries</text>
<!-- Skill 7: Diagnostics -->
<rect x="725" y="160" width="100" height="34" rx="8" fill="#161b22" stroke="#ffd166" stroke-width="1.5"/>
<text x="775" y="182" font-family="'Segoe UI', Arial, sans-serif" font-size="10" fill="#ffd166" text-anchor="middle" font-weight="bold">Diagnostics</text>
<text x="775" y="210" font-family="'Segoe UI', Arial, sans-serif" font-size="10" fill="#8b949e" text-anchor="middle">Tracing &amp;</text>
<text x="775" y="224" font-family="'Segoe UI', Arial, sans-serif" font-size="10" fill="#8b949e" text-anchor="middle">Health</text>
<!-- Footer -->
<text x="425" y="265" font-family="'Courier New', Courier, monospace" font-size="14" fill="#58a6ff" text-anchor="middle" font-weight="bold">pbi skills list</text>
<text x="425" y="290" font-family="'Segoe UI', Arial, sans-serif" font-size="12" fill="#8b949e" text-anchor="middle">Claude reads the skill matching your task and knows exactly which commands to use</text>
</svg>

After

Width:  |  Height:  |  Size: 6.1 KiB

69
assets/token-cost.svg Normal file
View file

@ -0,0 +1,69 @@
<svg xmlns="http://www.w3.org/2000/svg" width="850" height="420" viewBox="0 0 850 420">
<rect width="100%" height="100%" fill="#0d1117" rx="8"/>
<!-- Title -->
<text x="425" y="32" font-family="'Segoe UI', Arial, sans-serif" font-size="18" fill="#F2C811" text-anchor="middle" font-weight="bold">100x More Efficient Than MCP</text>
<text x="425" y="50" font-family="'Segoe UI', Arial, sans-serif" font-size="11" fill="#8b949e" text-anchor="middle">Token cost per operation: MCP tool call vs CLI command</text>
<!-- Chart area -->
<rect x="40" y="65" width="770" height="300" rx="8" fill="#161b22" stroke="#30363d" stroke-width="1"/>
<!-- Row 1: connect -->
<text x="120" y="100" font-family="'Segoe UI', Arial, sans-serif" font-size="12" fill="#c9d1d9" text-anchor="end">connect</text>
<!-- MCP bar -->
<rect x="135" y="86" width="600" height="14" rx="3" fill="#ff6b6b" fill-opacity="0.7"/>
<text x="742" y="98" font-family="'Courier New', Courier, monospace" font-size="11" fill="#ff6b6b">4,800</text>
<!-- CLI bar -->
<rect x="135" y="104" width="4" height="14" rx="2" fill="#06d6a0"/>
<text x="146" y="116" font-family="'Courier New', Courier, monospace" font-size="11" fill="#06d6a0">~30</text>
<!-- Row 2: dax query -->
<text x="120" y="155" font-family="'Segoe UI', Arial, sans-serif" font-size="12" fill="#c9d1d9" text-anchor="end">dax query</text>
<!-- MCP bar -->
<rect x="135" y="141" width="575" height="14" rx="3" fill="#ff6b6b" fill-opacity="0.7"/>
<text x="717" y="153" font-family="'Courier New', Courier, monospace" font-size="11" fill="#ff6b6b">4,600</text>
<!-- CLI bar -->
<rect x="135" y="159" width="5" height="14" rx="2" fill="#06d6a0"/>
<text x="147" y="171" font-family="'Courier New', Courier, monospace" font-size="11" fill="#06d6a0">~35</text>
<!-- Row 3: measure -->
<text x="120" y="210" font-family="'Segoe UI', Arial, sans-serif" font-size="12" fill="#c9d1d9" text-anchor="end">measure</text>
<!-- MCP bar -->
<rect x="135" y="196" width="550" height="14" rx="3" fill="#ff6b6b" fill-opacity="0.7"/>
<text x="692" y="208" font-family="'Courier New', Courier, monospace" font-size="11" fill="#ff6b6b">4,400</text>
<!-- CLI bar -->
<rect x="135" y="214" width="4" height="14" rx="2" fill="#06d6a0"/>
<text x="146" y="226" font-family="'Courier New', Courier, monospace" font-size="11" fill="#06d6a0">~28</text>
<!-- Row 4: model stats -->
<text x="120" y="265" font-family="'Segoe UI', Arial, sans-serif" font-size="12" fill="#c9d1d9" text-anchor="end">model</text>
<!-- MCP bar -->
<rect x="135" y="251" width="525" height="14" rx="3" fill="#ff6b6b" fill-opacity="0.7"/>
<text x="667" y="263" font-family="'Courier New', Courier, monospace" font-size="11" fill="#ff6b6b">4,200</text>
<!-- CLI bar -->
<rect x="135" y="269" width="4" height="14" rx="2" fill="#06d6a0"/>
<text x="146" y="281" font-family="'Courier New', Courier, monospace" font-size="11" fill="#06d6a0">~25</text>
<!-- Row 5: export -->
<text x="120" y="320" font-family="'Segoe UI', Arial, sans-serif" font-size="12" fill="#c9d1d9" text-anchor="end">export</text>
<!-- MCP bar -->
<rect x="135" y="306" width="563" height="14" rx="3" fill="#ff6b6b" fill-opacity="0.7"/>
<text x="705" y="318" font-family="'Courier New', Courier, monospace" font-size="11" fill="#ff6b6b">4,500</text>
<!-- CLI bar -->
<rect x="135" y="324" width="4" height="14" rx="2" fill="#06d6a0"/>
<text x="146" y="336" font-family="'Courier New', Courier, monospace" font-size="11" fill="#06d6a0">~32</text>
<!-- Legend -->
<rect x="230" y="378" width="14" height="14" rx="2" fill="#ff6b6b" fill-opacity="0.7"/>
<text x="250" y="390" font-family="'Segoe UI', Arial, sans-serif" font-size="12" fill="#ff6b6b">MCP tool call</text>
<rect x="380" y="378" width="14" height="14" rx="2" fill="#06d6a0"/>
<text x="400" y="390" font-family="'Segoe UI', Arial, sans-serif" font-size="12" fill="#06d6a0">CLI command</text>
<text x="530" y="390" font-family="'Segoe UI', Arial, sans-serif" font-size="12" fill="#8b949e">|</text>
<text x="550" y="390" font-family="'Segoe UI', Arial, sans-serif" font-size="12" fill="#F2C811" font-weight="bold">~130x savings</text>
<!-- Footer -->
<text x="425" y="414" font-family="'Segoe UI', Arial, sans-serif" font-size="11" fill="#8b949e" text-anchor="middle">Same capabilities, fraction of the cost. Your AI budget goes 100x further.</text>
</svg>

After

Width:  |  Height:  |  Size: 4.4 KiB

View file

@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
[project]
name = "pbi-cli-tool"
version = "2.1.1"
version = "2.2.0"
description = "CLI for Power BI semantic models - direct .NET connection for token-efficient AI agent usage"
readme = "README.pypi.md"
license = {text = "MIT"}

View file

@ -1,3 +1,3 @@
"""pbi-cli: CLI for Power BI semantic models via direct .NET interop."""
__version__ = "2.1.1"
__version__ = "2.2.0"