feat: v3.10.3 - opt-in Claude integration, dual-license DLL attribution, new pbi-cli entry point

## Claude Code integration now fully opt-in (Fix 3)
- `pbi connect` no longer writes to ~/.claude/ automatically
- New `pbi-cli` entry point: `pbi-cli skills install/uninstall/list`
- `pbi-cli skills install` shows exact paths before writing and requires y/N confirmation
- `pbi connect` prints a one-line tip if skills are not yet installed
- `pbi skills` subgroup removed from the `pbi` entry point

## DLL licensing compliance (Fix 1)
- pyproject.toml updated to PEP 639 SPDX dual expression:
  MIT AND LicenseRef-Microsoft-AS-Client-Libraries
- license-files declaration: LICENSE, THIRD_PARTY_LICENSES.md, NOTICE
- THIRD_PARTY_LICENSES.md: full verbatim MS Analysis Services Client Libraries EULA
- NOTICE: short-form attribution for wheel redistribution
- src/pbi_cli/dlls/README.md: in-directory sentinel for the MS DLLs
- setuptools requirement bumped to >=77.0 for PEP 639 support

## SECURITY.md rewrite (Fix 2)
- Supported versions table updated to 3.10.x
- Architecture section: no MCP server, no subprocess, direct pythonnet interop
- Global Configuration Modifications section updated to reflect opt-in model
- Bundled Binaries section references THIRD_PARTY_LICENSES.md

## Documentation
- README.md, README.pypi.md: corrected 3-step setup flow
- CHANGELOG.md: [3.10.3] entry
- CONTRIBUTING.md: pbi skills -> pbi-cli skills
- All 7 semantic model SKILL.md files: prerequisites updated to 3-step flow
- New SVG/PNG marketing and documentation assets
This commit is contained in:
MinaSaad1 2026-04-05 20:37:05 +02:00
parent 81abf49f37
commit 62680dd060
112 changed files with 7706 additions and 154 deletions

10
.gitignore vendored
View file

@ -32,3 +32,13 @@ Thumbs.db
# pbi-cli specific
~/.pbi-cli/
# Extracted wheel/sdist build directories
pbi_cli_tool-*/
# Demo and scratch Power BI project files
demo.Report/
demo.SemanticModel/
demo.pbip
pbir_desktop_test/
"pbib examples/"

View file

@ -5,6 +5,17 @@ All notable changes to this project will be documented in this file.
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
## [3.10.3] - 2026-04-05
### Changed
- Claude Code integration is now fully opt-in. `pbi connect` no longer writes to `~/.claude/`. Run `pbi-cli skills install` explicitly to register skills with Claude Code. See [SECURITY.md](SECURITY.md) for full details.
- `pbi-cli` is now a dedicated management entry point (`pbi-cli skills install/uninstall/list`). Skills subcommands have been removed from the `pbi` entry point.
### Fixed
- DLL licensing: Microsoft Analysis Services client library DLLs bundled in `src/pbi_cli/dlls/` are now correctly attributed under the Microsoft Software License Terms, not sublicensed under MIT. Full EULA text in `THIRD_PARTY_LICENSES.md`.
- `pyproject.toml` updated to PEP 639 dual SPDX expression (`MIT AND LicenseRef-Microsoft-AS-Client-Libraries`) with `license-files` declaration.
- README.md and README.pypi.md updated to reflect the correct 3-step setup flow: `pipx install``pbi-cli skills install``pbi connect`.
## [3.10.0] - 2026-04-02
### Added

View file

@ -61,7 +61,7 @@ tests/ # Mirrors src/ structure
1. Create `src/pbi_cli/skills/your-skill/SKILL.md`
2. Follow the frontmatter format from existing skills
3. Test with `pbi skills list` and `pbi skills install`
3. Test with `pbi-cli skills list` and `pbi-cli skills install`
## Reporting Issues

7
Claude_AI_symbol.svg Normal file
View file

@ -0,0 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<!-- Generated by Pixelmator Pro 3.6.17 -->
<svg width="1200" height="1200" viewBox="0 0 1200 1200" xmlns="http://www.w3.org/2000/svg">
<g id="g314">
<path id="path147" fill="#d97757" stroke="none" 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>
</svg>

After

Width:  |  Height:  |  Size: 4 KiB

38
NOTICE Normal file
View file

@ -0,0 +1,38 @@
pbi-cli
Copyright (c) 2026 pbi-cli contributors
This product is licensed under the MIT License. See the LICENSE file for
the full text of that license.
This product bundles the following third-party software inside the
`pbi-cli-tool` PyPI distribution. These components are NOT covered by the
MIT License and retain their original license terms. See
THIRD_PARTY_LICENSES.md for the full text of each license.
--------------------------------------------------------------------------
Microsoft Analysis Services Client Libraries
Copyright (c) Microsoft Corporation. All rights reserved.
--------------------------------------------------------------------------
Licensed under the Microsoft Software License Terms - Microsoft Analysis
Management Objects (AMO) and the Microsoft Software License Terms -
Microsoft Analysis Services - ADOMD.NET. The full text of both licenses is
reproduced in THIRD_PARTY_LICENSES.md at the root of this distribution.
Bundled binaries (src/pbi_cli/dlls/):
- Microsoft.AnalysisServices.dll
- Microsoft.AnalysisServices.Core.dll
- Microsoft.AnalysisServices.Tabular.dll
- Microsoft.AnalysisServices.Tabular.Json.dll
- Microsoft.AnalysisServices.AdomdClient.dll
These binaries are redistributed unmodified from the official Microsoft
NuGet packages:
- Microsoft.AnalysisServices.NetCore.retail.amd64
- Microsoft.AnalysisServices.AdomdClient.retail.amd64
By installing `pbi-cli-tool` you agree to the Microsoft license terms
applicable to these bundled binaries in addition to the MIT License that
applies to the rest of the package.

36
New_Power_BI_Logo.svg Normal file
View file

@ -0,0 +1,36 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="630px" height="630px" viewBox="0 0 630 630" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<!-- Generator: Sketch 53.2 (72643) - https://sketchapp.com -->
<title>PBI Logo</title>
<desc>Created with Sketch.</desc>
<defs>
<linearGradient x1="50%" y1="0%" x2="50%" y2="100%" id="linearGradient-1">
<stop stop-color="#EBBB14" offset="0%"></stop>
<stop stop-color="#B25400" offset="100%"></stop>
</linearGradient>
<linearGradient x1="50%" y1="0%" x2="50%" y2="100%" id="linearGradient-2">
<stop stop-color="#F9E583" offset="0%"></stop>
<stop stop-color="#DE9800" offset="100%"></stop>
</linearGradient>
<path d="M346,604 L346,630 L320,630 L153,630 C138.640597,630 127,618.359403 127,604 L127,183 C127,168.640597 138.640597,157 153,157 L320,157 C334.359403,157 346,168.640597 346,183 L346,604 Z" id="path-3"></path>
<filter x="-9.1%" y="-6.3%" width="136.5%" height="116.9%" filterUnits="objectBoundingBox" id="filter-4">
<feOffset dx="20" dy="10" in="SourceAlpha" result="shadowOffsetOuter1"></feOffset>
<feGaussianBlur stdDeviation="10" in="shadowOffsetOuter1" result="shadowBlurOuter1"></feGaussianBlur>
<feColorMatrix values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.0530211976 0" type="matrix" in="shadowBlurOuter1"></feColorMatrix>
</filter>
<linearGradient x1="50%" y1="0%" x2="50%" y2="100%" id="linearGradient-5">
<stop stop-color="#F9E68B" offset="0%"></stop>
<stop stop-color="#F3CD32" offset="100%"></stop>
</linearGradient>
</defs>
<g id="PBI-Logo" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
<g id="Group" transform="translate(77.500000, 0.000000)">
<rect id="Rectangle" fill="url(#linearGradient-1)" x="256" y="0" width="219" height="630" rx="26"></rect>
<g id="Combined-Shape">
<use fill="black" fill-opacity="1" filter="url(#filter-4)" xlink:href="#path-3"></use>
<use fill="url(#linearGradient-2)" fill-rule="evenodd" xlink:href="#path-3"></use>
</g>
<path d="M219,604 L219,630 L193,630 L26,630 C11.6405965,630 1.75851975e-15,618.359403 0,604 L0,341 C-1.75851975e-15,326.640597 11.6405965,315 26,315 L193,315 C207.359403,315 219,326.640597 219,341 L219,604 Z" id="Combined-Shape" fill="url(#linearGradient-5)"></path>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 2.5 KiB

View file

@ -47,10 +47,11 @@
```bash
pipx install pbi-cli-tool # 1. Install (handles PATH automatically)
pbi connect # 2. Auto-detects Power BI Desktop and installs skills
pbi-cli skills install # 2. Register Claude Code skills (one-time setup)
pbi connect # 3. Connect to Power BI Desktop
```
Open Power BI Desktop with a `.pbix` file, run `pbi connect`, and start asking Claude.
Open Power BI Desktop with a `.pbix` file, run the three commands above, and start asking Claude.
> **Requires:** Windows with Python 3.10+ and Power BI Desktop running.
@ -191,7 +192,7 @@ Bundled DLLs ship inside the Python package (`pbi_cli/dlls/`).
## Skills
After running `pbi connect`, Claude Code discovers **12 Power BI skills** automatically. Each skill teaches Claude a different area. You don't need to memorize commands.
After running `pbi-cli skills install`, Claude Code discovers **12 Power BI skills**. Each skill teaches Claude a different area. You don't need to memorize commands.
<p align="center">
<img src="https://raw.githubusercontent.com/MinaSaad1/pbi-cli/master/assets/skills-hub.svg" alt="12 Skills" width="850"/>
@ -289,6 +290,21 @@ pytest -m "not e2e" # Run tests (488 tests)
---
## Bundled third-party software
`pbi-cli-tool` ships with Microsoft Analysis Services client library
assemblies (`Microsoft.AnalysisServices.*.dll`) under `src/pbi_cli/dlls/`.
These binaries are **not** covered by pbi-cli's MIT license. They are
redistributed unmodified under the Microsoft Software License Terms for
Microsoft Analysis Management Objects (AMO) and Microsoft Analysis
Services - ADOMD.NET. Full terms are in
[THIRD_PARTY_LICENSES.md](THIRD_PARTY_LICENSES.md) and the companion
[NOTICE](NOTICE) file. By installing `pbi-cli-tool` you agree to those
terms in addition to the MIT License that applies to the rest of the
package.
---
## Contributing
Contributions are welcome! Please open an issue first to discuss what you'd like to change.
@ -306,5 +322,5 @@ Contributions are welcome! Please open an issue first to discuss what you'd like
</p>
<p align="center">
<sub>MIT License</sub>
<sub>MIT License — bundled Microsoft DLLs are licensed separately, see <a href="THIRD_PARTY_LICENSES.md">THIRD_PARTY_LICENSES.md</a></sub>
</p>

View file

@ -39,10 +39,11 @@ Install and set up pbi-cli from https://github.com/MinaSaad1/pbi-cli.git
```bash
pipx install pbi-cli-tool # 1. Install (handles PATH automatically)
pbi connect # 2. Auto-detects Power BI Desktop and installs skills
pbi-cli skills install # 2. Register Claude Code skills (one-time setup)
pbi connect # 3. Connect to Power BI Desktop
```
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.
Open Power BI Desktop with a `.pbix` file, run the three commands above, and start asking Claude.
> **Requires:** Windows with Python 3.10+ and Power BI Desktop running.
@ -70,7 +71,7 @@ Add the printed path to your system PATH, then restart your terminal. We recomme
## Skills
After running `pbi connect`, Claude Code discovers **12 Power BI skills**. Each skill teaches Claude a different area. You don't need to memorize commands.
After running `pbi-cli skills install`, Claude Code discovers **12 Power BI skills**. Each skill teaches Claude a different area. You don't need to memorize commands.
### Semantic Model (require `pbi connect`)
@ -172,6 +173,21 @@ pytest -m "not e2e" # Run tests (488 tests)
---
## Bundled third-party software
`pbi-cli-tool` ships with Microsoft Analysis Services client library
assemblies (`Microsoft.AnalysisServices.*.dll`) inside the PyPI wheel
under `src/pbi_cli/dlls/`. These binaries are **not** covered by
pbi-cli's MIT license. They are redistributed unmodified under the
Microsoft Software License Terms for Microsoft Analysis Management
Objects (AMO) and Microsoft Analysis Services - ADOMD.NET. Full terms
are in [THIRD_PARTY_LICENSES.md](https://github.com/MinaSaad1/pbi-cli/blob/master/THIRD_PARTY_LICENSES.md)
and the companion [NOTICE](https://github.com/MinaSaad1/pbi-cli/blob/master/NOTICE)
file. By installing `pbi-cli-tool` you agree to those terms in addition
to the MIT License that applies to the rest of the package.
---
## Contributing
Contributions are welcome! Please open an issue first to discuss what you'd like to change.
@ -189,5 +205,5 @@ Contributions are welcome! Please open an issue first to discuss what you'd like
</p>
<p align="center">
<sub>MIT License</sub>
<sub>MIT License — bundled Microsoft DLLs are licensed separately, see <a href="https://github.com/MinaSaad1/pbi-cli/blob/master/THIRD_PARTY_LICENSES.md">THIRD_PARTY_LICENSES.md</a></sub>
</p>

View file

@ -2,18 +2,24 @@
## Supported Versions
| Version | Supported |
|---------|-----------|
| 1.x | Yes |
| < 1.0 | No |
Only the latest 3.x release line receives security fixes. Users on older
major versions should upgrade.
| Version | Supported |
|----------|------------------|
| 3.10.x | Yes |
| 3.9.x | Critical fixes |
| < 3.9 | No |
| 2.x | No |
| 1.x | No |
## Reporting a Vulnerability
If you discover a security vulnerability in pbi-cli, please report it responsibly.
If you discover a security vulnerability in pbi-cli, please report it
responsibly. **Do not open a public issue.**
**Do not open a public issue.**
Instead, email **security@pbi-cli.dev** or use [GitHub private vulnerability reporting](https://github.com/MinaSaad1/pbi-cli/security/advisories/new).
Use [GitHub private vulnerability reporting](https://github.com/MinaSaad1/pbi-cli/security/advisories/new)
to submit the report.
Please include:
@ -24,15 +30,96 @@ Please include:
## Response Timeline
- **Acknowledgment**: Within 48 hours
- **Initial assessment**: Within 1 week
- **Fix release**: As soon as possible, depending on severity
- **Acknowledgment**: within 48 hours
- **Initial assessment**: within 1 week
- **Fix release**: as soon as possible, severity-dependent
## Security Considerations
## Architecture and Trust Boundaries
pbi-cli connects to local Power BI instances via MCP (Model Context Protocol) over stdio. Key security notes:
pbi-cli connects to a locally running Power BI Desktop instance via direct
in-process .NET interop. **There is no MCP server, no subprocess, and no
network listener.** Earlier 1.x releases used a separate
`PBIDesktopMCPServer.exe` subprocess; that architecture was removed in 2.x
and this document reflects the current 3.x behavior.
- **No network exposure**: The MCP server binary communicates over local stdio pipes, not network sockets
- **No credentials stored**: Connection details are saved locally but passwords and tokens are never persisted
- **Local binary execution**: pbi-cli launches `PBIDesktopMCPServer.exe` as a subprocess; ensure the binary is from a trusted source
- **Config file permissions**: Connection store at `~/.pbi-cli/connections.json` should have user-only read/write permissions
- **Direct in-process .NET interop.** pbi-cli loads bundled Microsoft
Analysis Services Tabular Object Model (TOM) and ADOMD.NET client
assemblies into the Python process via `pythonnet` / `clr-loader`. See
`src/pbi_cli/core/dotnet_loader.py` and `src/pbi_cli/core/tom_backend.py`.
The bundled DLLs live in `src/pbi_cli/dlls/` and are Microsoft binaries
redistributed under the Microsoft Software License Terms for Microsoft
Analysis Management Objects (AMO) and Microsoft Analysis Services -
ADOMD.NET. See [`THIRD_PARTY_LICENSES.md`](THIRD_PARTY_LICENSES.md) and
[`NOTICE`](NOTICE) for details.
- **Local-only connection.** pbi-cli connects to Power BI Desktop's
embedded Analysis Services instance over a loopback TCP port that
Desktop binds at launch. pbi-cli does not open any network sockets for
inbound traffic and does not communicate over the public network.
- **No credentials persisted.** Connection metadata (port, workspace
path, model name) is stored at `~/.pbi-cli/connections.json`. No
tokens, passwords, or session credentials are written to disk. The
file should have user-only read/write permissions.
- **Report-layer commands are fully offline.** `pbi report`, `pbi visual`,
`pbi filters`, `pbi bookmarks`, `pbi format`, and `pbi theme` operate on
PBIR JSON files on disk. They do not require `pbi connect` and do not
touch the Power BI Desktop process.
## Global Configuration Modifications
pbi-cli integrates with Claude Code by writing to the user's global Claude
configuration directory. Users should be aware of exactly which files are
modified and when. This section is authoritative; if behavior diverges from
the description below, please file a security advisory.
### Files written
| Path | Written by | Contents |
|--------------------------------|-------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| `~/.claude/CLAUDE.md` | `pbi-cli skills install` | Appends a block wrapped in `<!-- pbi-cli:start -->` / `<!-- pbi-cli:end -->` markers that lists the 12 bundled skills and their trigger conditions. Source: `src/pbi_cli/core/claude_integration.py`. |
| `~/.claude/skills/power-bi-*/` | `pbi-cli skills install` | Copies the 12 bundled `SKILL.md` files from `src/pbi_cli/skills/` so Claude Code discovers them. Source: `src/pbi_cli/commands/skills_cmd.py`. |
No other paths under `~/.claude/` are read or modified. pbi-cli does not
access user conversation history, project memory files, unrelated skills,
or any other Claude Code state.
### When it happens
- **`pbi-cli skills install`** — the explicit install command (3.10.3+).
Before writing anything, the command displays the exact paths it will
modify and requires the user to confirm. Passing `--yes` / `-y` skips
the prompt for non-interactive use.
- **`pbi-cli skills uninstall`** — removes the skill files and, when
removing all skills, cleans up the `CLAUDE.md` block between its
marker comments.
- **`pbi connect`** — connects to Power BI Desktop only. It does **not**
write to `~/.claude/`. On a successful connection it checks whether
skills are installed and, if not, prints a one-line tip:
`Run 'pbi-cli skills install' to register pbi-cli skills with Claude Code.`
### Opt-out
Claude Code integration is fully opt-in as of 3.10.3. Simply do not run
`pbi-cli skills install` and `~/.claude/` is never touched.
To remove a previously installed integration, run:
```
pbi-cli skills uninstall
```
### Why this matters
`~/.claude/CLAUDE.md` is Claude Code's global instruction file and is
loaded into every Claude Code session across every project on the
machine. Modifying it affects Claude's behavior everywhere, not just for
Power BI work. The pbi-cli block is bounded by comment markers so it can
be removed cleanly, but users on multi-tenant or sensitive machines
should be aware of this before running `pbi-cli skills install`.
## Bundled Binaries
`pbi-cli-tool` ships Microsoft Analysis Services client library DLLs
inside the PyPI wheel under `src/pbi_cli/dlls/`. These are unmodified
Microsoft binaries redistributed under Microsoft's own license terms,
**not** under MIT. See [`THIRD_PARTY_LICENSES.md`](THIRD_PARTY_LICENSES.md)
and [`NOTICE`](NOTICE) at the repo root for full terms and attribution.

329
THIRD_PARTY_LICENSES.md Normal file
View file

@ -0,0 +1,329 @@
# Third-Party Licenses
pbi-cli itself is licensed under the MIT License (see [LICENSE](LICENSE)). This
file lists third-party software bundled with the `pbi-cli-tool` PyPI
distribution and the license terms under which each component is
redistributed.
---
## Microsoft Analysis Services Client Libraries
The following assemblies shipped under `src/pbi_cli/dlls/` inside the PyPI
wheel are **not** covered by the MIT License. They are unmodified Microsoft
Corporation binaries redistributed under the *Microsoft Software License
Terms — Microsoft Analysis Management Objects (AMO)* and the materially
identical *Microsoft Software License Terms — Microsoft Analysis Services
ADOMD.NET*:
| File | Governing License | Source NuGet Package |
|--------------------------------------------------|-------------------------------|----------------------------------------------------------------|
| `Microsoft.AnalysisServices.dll` | Microsoft AMO License | `Microsoft.AnalysisServices.NetCore.retail.amd64` |
| `Microsoft.AnalysisServices.Core.dll` | Microsoft AMO License | `Microsoft.AnalysisServices.NetCore.retail.amd64` |
| `Microsoft.AnalysisServices.Tabular.dll` | Microsoft AMO License | `Microsoft.AnalysisServices.NetCore.retail.amd64` |
| `Microsoft.AnalysisServices.Tabular.Json.dll` | Microsoft AMO License | `Microsoft.AnalysisServices.NetCore.retail.amd64` |
| `Microsoft.AnalysisServices.AdomdClient.dll` | Microsoft ADOMD.NET License | `Microsoft.AnalysisServices.AdomdClient.retail.amd64` |
These files are the object code form of code listed on Microsoft's REDIST
list and are therefore distributable under the "DISTRIBUTABLE CODE" section
of the governing license. pbi-cli does not modify, reverse engineer, decompile,
or recompile them.
**Copyright © Microsoft Corporation. All rights reserved.**
By installing `pbi-cli-tool` you agree to the Microsoft license terms
reproduced below in addition to the MIT License that applies to the rest of
the package. If you do not agree to these terms, do not install or use
`pbi-cli-tool`.
### Canonical sources
The original license documents are published by Microsoft at:
- AMO license: <https://go.microsoft.com/fwlink/?linkid=852989> (distributed as
`AMO_Eula.zip`, English text in `Eula/EulaText_1033.rtf`)
- ADOMD.NET license: <https://go.microsoft.com/fwlink/?linkid=852895>
The text below was extracted from the English (locale 1033) RTF file published
by Microsoft. The ADOMD.NET license is materially identical to the AMO license
reproduced here; the only difference is the product name line ("MICROSOFT
ANALYSIS SERVICES ADOMD.NET" instead of "MICROSOFT ANALYSIS MANAGEMENT
OBJECTS (AMO)"). Both licenses apply to their respective bundled binaries as
listed in the table above.
---
## MICROSOFT SOFTWARE LICENSE TERMS
### MICROSOFT ANALYSIS MANAGEMENT OBJECTS (AMO)
IF YOU LIVE IN (OR ARE A BUSINESS WITH A PRINCIPAL PLACE OF BUSINESS IN) THE
UNITED STATES, PLEASE READ THE "BINDING ARBITRATION AND CLASS ACTION WAIVER"
SECTION BELOW. IT AFFECTS HOW DISPUTES ARE RESOLVED.
These license terms are an agreement between you and Microsoft Corporation
(or one of its affiliates). They apply to the software named above and any
Microsoft services or software updates (except to the extent such services or
updates are accompanied by new or additional terms, in which case those
different terms apply prospectively and do not alter your or Microsoft's
rights relating to pre-updated software or services). IF YOU COMPLY WITH
THESE LICENSE TERMS, YOU HAVE THE RIGHTS BELOW. BY USING THE SOFTWARE, YOU
ACCEPT THESE TERMS.
1. **INSTALLATION AND USE RIGHTS.**
a. **General.** You may install and use any number of copies of the
software.
b. **Third Party Software.** The software may include third party
applications that Microsoft, not the third party, licenses to you under
this agreement. Any included notices for third party applications are
for your information only.
c. **Competitive Benchmarking.** If you are a direct competitor, and you
access or use the software for purposes of competitive benchmarking,
analysis, or intelligence gathering, you waive as against Microsoft,
its subsidiaries, and its affiliated companies (including prospectively)
any competitive use, access, and benchmarking test restrictions in the
terms governing your software to the extent your terms of use are, or
purport to be, more restrictive than Microsoft's terms. If you do not
waive any such purported restrictions in the terms governing your
software, you are not allowed to access or use this software, and will
not do so.
2. **DISTRIBUTABLE CODE.** The software may contain code you are permitted to
distribute (i.e. make available for third parties) in applications you
develop, as described in this Section.
a. **Distribution Rights.** The code and test files described below are
distributable if included with the software.
i. **REDIST.TXT Files.** You may copy and distribute the object code
form of code listed on the REDIST list in the software, if any, or
listed at Redist.txt;
ii. **Image Library.** You may copy and distribute images, graphics,
and animations in the Image Library as described in the software
documentation; and
iii. **Third Party Distribution.** You may permit distributors of your
applications to copy and distribute any of this distributable code
you elect to distribute with your applications.
b. **Distribution Requirements.** For any code you distribute, you must:
i. add significant primary functionality to it in your applications;
ii. require distributors and external end users to agree to terms that
protect it and Microsoft at least as much as this agreement; and
iii. indemnify, defend, and hold harmless Microsoft from any claims,
including attorneys' fees, related to the distribution or use of
your applications, except to the extent that any claim is based
solely on the unmodified distributable code.
c. **Distribution Restrictions.** You may not:
i. use Microsoft's trademarks or trade dress in your application in any
way that suggests your application comes from or is endorsed by
Microsoft; or
ii. modify or distribute the source code of any distributable code so
that any part of it becomes subject to any license that requires
that the distributable code, any other part of the software, or any
of Microsoft's other intellectual property be disclosed or
distributed in source code form, or that others have the right to
modify it.
3. **DATA COLLECTION.** The software may collect information about you and
your use of the software and send that to Microsoft. Microsoft may use
this information to provide services and improve Microsoft's products and
services. Your opt-out rights, if any, are described in the product
documentation. Some features in the software may enable collection of data
from users of your applications that access or use the software. If you
use these features to enable data collection in your applications, you
must comply with applicable law, including getting any required user
consent, and maintain a prominent privacy policy that accurately informs
users about how you use, collect, and share their data. You can learn more
about Microsoft's data collection and use in the product documentation and
the Microsoft Privacy Statement at
<https://go.microsoft.com/fwlink/?LinkId=521839>. You agree to comply with
all applicable provisions of the Microsoft Privacy Statement.
4. **SCOPE OF LICENSE.** The software is licensed, not sold. Microsoft
reserves all other rights. Unless applicable law gives you more rights
despite this limitation, you will not (and have no right to):
a. work around any technical limitations in the software that only allow
you to use it in certain ways;
b. reverse engineer, decompile or disassemble the software;
c. remove, minimize, block, or modify any notices of Microsoft or its
suppliers in the software;
d. use the software in any way that is against the law or to create or
propagate malware; or
e. share, publish, distribute, or lend the software (except for any
distributable code, subject to the terms above), provide the software
as a stand-alone hosted solution for others to use, or transfer the
software or this agreement to any third party.
5. **EXPORT RESTRICTIONS.** You must comply with all domestic and
international export laws and regulations that apply to the software,
which include restrictions on destinations, end users, and end use. For
further information on export restrictions, visit <http://aka.ms/exporting>.
6. **SUPPORT SERVICES.** Microsoft is not obligated under this agreement to
provide any support services for the software. Any support provided is
"as is", "with all faults", and without warranty of any kind.
7. **UPDATES.** The software may periodically check for updates, and download
and install them for you. You may obtain updates only from Microsoft or
authorized sources. Microsoft may need to update your system to provide
you with updates. You agree to receive these automatic updates without any
additional notice. Updates may not include or support all existing
software features, services, or peripheral devices.
8. **BINDING ARBITRATION AND CLASS ACTION WAIVER.** This Section applies if
you live in (or, if a business, your principal place of business is in)
the United States. If you and Microsoft have a dispute, you and Microsoft
agree to try for 60 days to resolve it informally. If you and Microsoft
can't, you and Microsoft agree to binding individual arbitration before
the American Arbitration Association under the Federal Arbitration Act
("FAA"), and not to sue in court in front of a judge or jury. Instead, a
neutral arbitrator will decide. Class action lawsuits, class-wide
arbitrations, private attorney-general actions, and any other proceeding
where someone acts in a representative capacity are not allowed; nor is
combining individual proceedings without the consent of all parties. The
complete Arbitration Agreement contains more terms and is at
<http://aka.ms/arb-agreement-1>. You and Microsoft agree to these terms.
9. **ENTIRE AGREEMENT.** This agreement, and any other terms Microsoft may
provide for supplements, updates, or third-party applications, is the
entire agreement for the software.
10. **APPLICABLE LAW AND PLACE TO RESOLVE DISPUTES.** If you acquired the
software in the United States or Canada, the laws of the state or
province where you live (or, if a business, where your principal place of
business is located) govern the interpretation of this agreement, claims
for its breach, and all other claims (including consumer protection,
unfair competition, and tort claims), regardless of conflict of laws
principles, except that the FAA governs everything related to arbitration.
If you acquired the software in any other country, its laws apply, except
that the FAA governs everything related to arbitration. If U.S. federal
jurisdiction exists, you and Microsoft consent to exclusive jurisdiction
and venue in the federal court in King County, Washington for all
disputes heard in court (excluding arbitration). If not, you and
Microsoft consent to exclusive jurisdiction and venue in the Superior
Court of King County, Washington for all disputes heard in court
(excluding arbitration).
11. **CONSUMER RIGHTS; REGIONAL VARIATIONS.** This agreement describes
certain legal rights. You may have other rights, including consumer
rights, under the laws of your state, province, or country. Separate and
apart from your relationship with Microsoft, you may also have rights
with respect to the party from which you acquired the software. This
agreement does not change those other rights if the laws of your state,
province, or country do not permit it to do so. For example, if you
acquired the software in one of the below regions, or mandatory country
law applies, then the following provisions apply to you:
a. **Australia.** You have statutory guarantees under the Australian
Consumer Law and nothing in this agreement is intended to affect those
rights.
b. **Canada.** If you acquired this software in Canada, you may stop
receiving updates by turning off the automatic update feature,
disconnecting your device from the Internet (if and when you
re-connect to the Internet, however, the software will resume checking
for and installing updates), or uninstalling the software. The product
documentation, if any, may also specify how to turn off updates for
your specific device or software.
c. **Germany and Austria.**
i. **Warranty.** The properly licensed software will perform
substantially as described in any Microsoft materials that
accompany the software. However, Microsoft gives no contractual
guarantee in relation to the licensed software.
ii. **Limitation of Liability.** In case of intentional conduct, gross
negligence, claims based on the Product Liability Act, as well as,
in case of death or personal or physical injury, Microsoft is
liable according to the statutory law.
Subject to the foregoing clause ii., Microsoft will only be liable for
slight negligence if Microsoft is in breach of such material
contractual obligations, the fulfillment of which facilitate the due
performance of this agreement, the breach of which would endanger the
purpose of this agreement and the compliance with which a party may
constantly trust in (so-called "cardinal obligations"). In other cases
of slight negligence, Microsoft will not be liable for slight
negligence.
12. **DISCLAIMER OF WARRANTY. THE SOFTWARE IS LICENSED "AS IS." YOU BEAR THE
RISK OF USING IT. MICROSOFT GIVES NO EXPRESS WARRANTIES, GUARANTEES, OR
CONDITIONS. TO THE EXTENT PERMITTED UNDER APPLICABLE LAWS, MICROSOFT
EXCLUDES ALL IMPLIED WARRANTIES, INCLUDING MERCHANTABILITY, FITNESS FOR A
PARTICULAR PURPOSE, AND NON-INFRINGEMENT.**
13. **LIMITATION ON AND EXCLUSION OF DAMAGES. IF YOU HAVE ANY BASIS FOR
RECOVERING DAMAGES DESPITE THE PRECEDING DISCLAIMER OF WARRANTY, YOU CAN
RECOVER FROM MICROSOFT AND ITS SUPPLIERS ONLY DIRECT DAMAGES UP TO U.S.
$5.00. YOU CANNOT RECOVER ANY OTHER DAMAGES, INCLUDING CONSEQUENTIAL,
LOST PROFITS, SPECIAL, INDIRECT OR INCIDENTAL DAMAGES.**
This limitation applies to (a) anything related to the software,
services, content (including code) on third party Internet sites, or
third party applications; and (b) claims for breach of contract, warranty,
guarantee, or condition; strict liability, negligence, or other tort; or
any other claim; in each case to the extent permitted by applicable law.
It also applies even if Microsoft knew or should have known about the
possibility of the damages. The above limitation or exclusion may not
apply to you because your state, province, or country may not allow the
exclusion or limitation of incidental, consequential, or other damages.
---
*Please note: As this software is distributed in Canada, some of the clauses
in this agreement are provided below in French.*
*Remarque: Ce logiciel étant distribué au Canada, certaines des clauses dans
ce contrat sont fournies ci-dessous en français.*
**EXONÉRATION DE GARANTIE.** Le logiciel visé par une licence est offert
« tel quel ». Toute utilisation de ce logiciel est à votre seule risque et
péril. Microsoft n'accorde aucune autre garantie expresse. Vous pouvez
bénéficier de droits additionnels en vertu du droit local sur la protection
des consommateurs, que ce contrat ne peut modifier. La ou elles sont
permises par le droit locale, les garanties implicites de qualité marchande,
d'adéquation à un usage particulier et d'absence de contrefaçon sont exclues.
**LIMITATION DES DOMMAGES-INTÉRÊTS ET EXCLUSION DE RESPONSABILITÉ POUR LES
DOMMAGES.** Vous pouvez obtenir de Microsoft et de ses fournisseurs une
indemnisation en cas de dommages directs uniquement à hauteur de 5,00 $ US.
Vous ne pouvez prétendre à aucune indemnisation pour les autres dommages, y
compris les dommages spéciaux, indirects ou accessoires et pertes de
bénéfices.
Cette limitation concerne:
- tout ce qui est relié au logiciel, aux services ou au contenu (y compris le
code) figurant sur des sites Internet tiers ou dans des programmes tiers; et
- les réclamations au titre de violation de contrat ou de garantie, ou au
titre de responsabilité stricte, de négligence ou d'une autre faute dans la
limite autorisée par la loi en vigueur.
Elle s'applique également, même si Microsoft connaissait ou devrait connaître
l'éventualité d'un tel dommage. Si votre pays n'autorise pas l'exclusion ou
la limitation de responsabilité pour les dommages indirects, accessoires ou
de quelque nature que ce soit, il se peut que la limitation ou l'exclusion
ci-dessus ne s'appliquera pas à votre égard.
**EFFET JURIDIQUE.** Le présent contrat décrit certains droits juridiques.
Vous pourriez avoir d'autres droits prévus par les lois de votre pays. Le
présent contrat ne modifie pas les droits que vous confèrent les lois de
votre pays si celles-ci ne le permettent pas.

View file

@ -0,0 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<!-- Generated by Pixelmator Pro 3.6.17 -->
<svg width="1200" height="1200" viewBox="0 0 1200 1200" xmlns="http://www.w3.org/2000/svg">
<g id="g314">
<path id="path147" fill="#d97757" stroke="none" 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>
</svg>

After

Width:  |  Height:  |  Size: 4 KiB

View file

@ -0,0 +1,36 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="630px" height="630px" viewBox="0 0 630 630" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<!-- Generator: Sketch 53.2 (72643) - https://sketchapp.com -->
<title>PBI Logo</title>
<desc>Created with Sketch.</desc>
<defs>
<linearGradient x1="50%" y1="0%" x2="50%" y2="100%" id="linearGradient-1">
<stop stop-color="#EBBB14" offset="0%"></stop>
<stop stop-color="#B25400" offset="100%"></stop>
</linearGradient>
<linearGradient x1="50%" y1="0%" x2="50%" y2="100%" id="linearGradient-2">
<stop stop-color="#F9E583" offset="0%"></stop>
<stop stop-color="#DE9800" offset="100%"></stop>
</linearGradient>
<path d="M346,604 L346,630 L320,630 L153,630 C138.640597,630 127,618.359403 127,604 L127,183 C127,168.640597 138.640597,157 153,157 L320,157 C334.359403,157 346,168.640597 346,183 L346,604 Z" id="path-3"></path>
<filter x="-9.1%" y="-6.3%" width="136.5%" height="116.9%" filterUnits="objectBoundingBox" id="filter-4">
<feOffset dx="20" dy="10" in="SourceAlpha" result="shadowOffsetOuter1"></feOffset>
<feGaussianBlur stdDeviation="10" in="shadowOffsetOuter1" result="shadowBlurOuter1"></feGaussianBlur>
<feColorMatrix values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.0530211976 0" type="matrix" in="shadowBlurOuter1"></feColorMatrix>
</filter>
<linearGradient x1="50%" y1="0%" x2="50%" y2="100%" id="linearGradient-5">
<stop stop-color="#F9E68B" offset="0%"></stop>
<stop stop-color="#F3CD32" offset="100%"></stop>
</linearGradient>
</defs>
<g id="PBI-Logo" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
<g id="Group" transform="translate(77.500000, 0.000000)">
<rect id="Rectangle" fill="url(#linearGradient-1)" x="256" y="0" width="219" height="630" rx="26"></rect>
<g id="Combined-Shape">
<use fill="black" fill-opacity="1" filter="url(#filter-4)" xlink:href="#path-3"></use>
<use fill="url(#linearGradient-2)" fill-rule="evenodd" xlink:href="#path-3"></use>
</g>
<path d="M219,604 L219,630 L193,630 L26,630 C11.6405965,630 1.75851975e-15,618.359403 0,604 L0,341 C-1.75851975e-15,326.640597 11.6405965,315 26,315 L193,315 C207.359403,315 219,326.640597 219,341 L219,604 Z" id="Combined-Shape" fill="url(#linearGradient-5)"></path>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 2.5 KiB

View file

@ -1,7 +1,122 @@
<svg xmlns="http://www.w3.org/2000/svg" width="850" height="230" viewBox="0 0 850 230">
<rect width="100%" height="100%" fill="#0d1117" rx="8"/>
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="850" height="440" viewBox="0 0 850 440">
<defs>
<linearGradient id="hdr-bar1" x1="50%" y1="0%" x2="50%" y2="100%">
<stop offset="0%" stop-color="#EBBB14"/>
<stop offset="100%" stop-color="#B25400"/>
</linearGradient>
<linearGradient id="hdr-bar2" x1="50%" y1="0%" x2="50%" y2="100%">
<stop offset="0%" stop-color="#F9E583"/>
<stop offset="100%" stop-color="#DE9800"/>
</linearGradient>
<linearGradient id="hdr-bar3" x1="50%" y1="0%" x2="50%" y2="100%">
<stop offset="0%" stop-color="#F9E68B"/>
<stop offset="100%" stop-color="#F3CD32"/>
</linearGradient>
<linearGradient id="pbi-lg1" x1="50%" y1="0%" x2="50%" y2="100%">
<stop offset="0%" stop-color="#EBBB14"/>
<stop offset="100%" stop-color="#B25400"/>
</linearGradient>
<linearGradient id="pbi-lg2" x1="50%" y1="0%" x2="50%" y2="100%">
<stop offset="0%" stop-color="#F9E583"/>
<stop offset="100%" stop-color="#DE9800"/>
</linearGradient>
<linearGradient id="pbi-lg5" x1="50%" y1="0%" x2="50%" y2="100%">
<stop offset="0%" stop-color="#F9E68B"/>
<stop offset="100%" stop-color="#F3CD32"/>
</linearGradient>
</defs>
<!-- Title -->
<!-- Full background -->
<rect width="100%" height="100%" fill="#0d1117"/>
<!-- ==================== VIBE BI HEADER ==================== -->
<!-- "VIBE BI" block art (shadow) -->
<text font-family="'Courier New', Courier, monospace" font-size="9" fill="#7A6508" xml:space="preserve">
<tspan x="296" y="22">██╗ ██╗ ██╗ ██████╗ ███████╗ ██████╗ ██╗</tspan>
<tspan x="296" y="33">██║ ██║ ██║ ██╔══██╗ ██╔════╝ ██╔══██╗ ██║</tspan>
<tspan x="296" y="44">██║ ██║ ██║ ██████╔╝ █████╗ ██████╔╝ ██║</tspan>
<tspan x="296" y="55">╚██╗ ██╔╝ ██║ ██╔══██╗ ██╔══╝ ██╔══██╗ ██║</tspan>
<tspan x="296" y="66"> ╚████╔╝ ██║ ██████╔╝ ███████╗ ██████╔╝ ██║</tspan>
<tspan x="296" y="77"> ╚═══╝ ╚═╝ ╚═════╝ ╚══════╝ ╚═════╝ ╚═╝</tspan>
</text>
<!-- "VIBE BI" block art (main) -->
<text font-family="'Courier New', Courier, monospace" font-size="9" fill="#F2C811" xml:space="preserve">
<tspan x="295" y="21">██╗ ██╗ ██╗ ██████╗ ███████╗ ██████╗ ██╗</tspan>
<tspan x="295" y="32">██║ ██║ ██║ ██╔══██╗ ██╔════╝ ██╔══██╗ ██║</tspan>
<tspan x="295" y="43">██║ ██║ ██║ ██████╔╝ █████╗ ██████╔╝ ██║</tspan>
<tspan x="295" y="54">╚██╗ ██╔╝ ██║ ██╔══██╗ ██╔══╝ ██╔══██╗ ██║</tspan>
<tspan x="295" y="65"> ╚████╔╝ ██║ ██████╔╝ ███████╗ ██████╔╝ ██║</tspan>
<tspan x="295" y="76"> ╚═══╝ ╚═╝ ╚═════╝ ╚══════╝ ╚═════╝ ╚═╝</tspan>
</text>
<!-- Separator -->
<line x1="60" y1="84" x2="790" y2="84" stroke="#F2C811" stroke-opacity="0.15" stroke-width="1"/>
<!-- Tagline -->
<text x="425" y="100" font-family="'Segoe UI', Arial, sans-serif" font-size="13" fill="#e6edf3" text-anchor="middle" font-weight="600">The First CLI for Both Power BI Modeling and Reporting</text>
<!-- ===== Connection Flow: Claude > PBI-CLI > Power BI ===== -->
<!-- Claude AI logo (inline, original 1200x1200, displayed as 50x50, centered at x=110) -->
<svg x="85" y="110" width="50" height="50" viewBox="0 0 1200 1200">
<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"/>
</svg>
<text x="110" y="175" 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="155" y1="135" x2="290" y2="135" stroke="#F2C811" stroke-width="2" stroke-dasharray="6,4" stroke-opacity="0.5"/>
<polygon points="294,135 286,130 286,140" fill="#F2C811" fill-opacity="0.5"/>
<!-- PBI-CLI block art (shadow) -->
<text font-family="'Courier New', Courier, monospace" font-size="7" fill="#7A6508" xml:space="preserve">
<tspan x="316" y="118">██████╗ ██████╗ ██╗ ██████╗ ██╗ ██╗</tspan>
<tspan x="316" y="128">██╔══██╗ ██╔══██╗ ██║ ██╔════╝ ██║ ██║</tspan>
<tspan x="316" y="138">██████╔╝ ██████╔╝ ██║ ███╗ ██║ ██║ ██║</tspan>
<tspan x="316" y="148">██╔═══╝ ██╔══██╗ ██║ ╚══╝ ██║ ██║ ██║</tspan>
<tspan x="316" y="158">██║ ██████╔╝ ██║ ╚██████╗ ███████╗ ██║</tspan>
<tspan x="316" y="168">╚═╝ ╚═════╝ ╚═╝ ╚═════╝ ╚══════╝ ╚═╝</tspan>
</text>
<!-- PBI-CLI block art (main) -->
<text font-family="'Courier New', Courier, monospace" font-size="7" fill="#F2C811" xml:space="preserve">
<tspan x="315" y="117">██████╗ ██████╗ ██╗ ██████╗ ██╗ ██╗</tspan>
<tspan x="315" y="127">██╔══██╗ ██╔══██╗ ██║ ██╔════╝ ██║ ██║</tspan>
<tspan x="315" y="137">██████╔╝ ██████╔╝ ██║ ███╗ ██║ ██║ ██║</tspan>
<tspan x="315" y="147">██╔═══╝ ██╔══██╗ ██║ ╚══╝ ██║ ██║ ██║</tspan>
<tspan x="315" y="157">██║ ██████╔╝ ██║ ╚██████╗ ███████╗ ██║</tspan>
<tspan x="315" y="167">╚═╝ ╚═════╝ ╚═╝ ╚═════╝ ╚══════╝ ╚═╝</tspan>
</text>
<!-- Right arrow -->
<line x1="560" y1="135" x2="655" y2="135" stroke="#F2C811" stroke-width="2" stroke-dasharray="6,4" stroke-opacity="0.5"/>
<polygon points="659,135 651,130 651,140" fill="#F2C811" fill-opacity="0.5"/>
<!-- Power BI logo (inline, original 630x630, displayed as 50x50, centered at x=700) -->
<svg x="675" y="110" width="50" height="50" viewBox="0 0 630 630">
<g transform="translate(77.5, 0)">
<rect fill="url(#pbi-lg1)" x="256" y="0" width="219" height="630" rx="26"/>
<path fill="url(#pbi-lg2)" d="M346,604 L346,630 L320,630 L153,630 C138.64,630 127,618.36 127,604 L127,183 C127,168.64 138.64,157 153,157 L320,157 C334.36,157 346,168.64 346,183 L346,604 Z"/>
<path fill="url(#pbi-lg5)" d="M219,604 L219,630 L193,630 L26,630 C11.64,630 0,618.36 0,604 L0,341 C0,326.64 11.64,315 26,315 L193,315 C207.36,315 219,326.64 219,341 L219,604 Z"/>
</g>
</svg>
<text x="700" y="175" font-family="'Segoe UI', Arial, sans-serif" font-size="11" fill="#F2C811" text-anchor="middle" font-weight="600">Power BI</text>
<!-- Modeling + Reporting pills -->
<rect x="308" y="176" width="100" height="20" rx="10" fill="#58a6ff" fill-opacity="0.1" stroke="#58a6ff" stroke-width="1"/>
<text x="358" y="190" font-family="'Segoe UI', Arial, sans-serif" font-size="10" fill="#58a6ff" text-anchor="middle" font-weight="600">Modeling</text>
<text x="420" y="190" font-family="'Segoe UI', Arial, sans-serif" font-size="10" fill="#8b949e" text-anchor="middle">+</text>
<rect x="432" y="176" width="100" height="20" rx="10" fill="#06d6a0" fill-opacity="0.1" stroke="#06d6a0" stroke-width="1"/>
<text x="482" y="190" font-family="'Segoe UI', Arial, sans-serif" font-size="10" fill="#06d6a0" text-anchor="middle" font-weight="600">Reporting</text>
<!-- Bottom separator -->
<line x1="60" y1="200" x2="790" y2="200" stroke="#F2C811" stroke-opacity="0.25" stroke-width="2"/>
<!-- ==================== END HEADER ==================== -->
<!-- Feature content (shifted down by 210px) -->
<g transform="translate(0, 210)">
<!-- 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: Two Layers, One CLI</text>
<!-- Box 1: Claude Code -->
@ -77,4 +192,6 @@
<!-- Footer -->
<text x="425" y="218" font-family="'Segoe UI', Arial, sans-serif" font-size="13" fill="#8b949e" text-anchor="middle">No MCP server, no external binaries. Sub-second execution.</text>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 6.4 KiB

After

Width:  |  Height:  |  Size: 18 KiB

BIN
assets/auto-sync-ai-v7a.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 MiB

BIN
assets/auto-sync-ai-v7b.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 MiB

BIN
assets/auto-sync-ai.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 MiB

View file

@ -1,15 +1,129 @@
<svg xmlns="http://www.w3.org/2000/svg" width="850" height="380" viewBox="0 0 850 380">
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="850" height="590" viewBox="0 0 850 590">
<defs>
<linearGradient id="sync-glow" x1="0%" y1="0%" x2="100%" y2="0%">
<linearGradient id="hdr-bar1" x1="50%" y1="0%" x2="50%" y2="100%">
<stop offset="0%" stop-color="#EBBB14"/>
<stop offset="100%" stop-color="#B25400"/>
</linearGradient>
<linearGradient id="hdr-bar2" x1="50%" y1="0%" x2="50%" y2="100%">
<stop offset="0%" stop-color="#F9E583"/>
<stop offset="100%" stop-color="#DE9800"/>
</linearGradient>
<linearGradient id="hdr-bar3" x1="50%" y1="0%" x2="50%" y2="100%">
<stop offset="0%" stop-color="#F9E68B"/>
<stop offset="100%" stop-color="#F3CD32"/>
</linearGradient>
<linearGradient id="pbi-lg1" x1="50%" y1="0%" x2="50%" y2="100%">
<stop offset="0%" stop-color="#EBBB14"/>
<stop offset="100%" stop-color="#B25400"/>
</linearGradient>
<linearGradient id="pbi-lg2" x1="50%" y1="0%" x2="50%" y2="100%">
<stop offset="0%" stop-color="#F9E583"/>
<stop offset="100%" stop-color="#DE9800"/>
</linearGradient>
<linearGradient id="pbi-lg5" x1="50%" y1="0%" x2="50%" y2="100%">
<stop offset="0%" stop-color="#F9E68B"/>
<stop offset="100%" stop-color="#F3CD32"/>
</linearGradient>
<linearGradient id="sync-glow" x1="0%" y1="0%" x2="100%" y2="0%">
<stop offset="0%" stop-color="#06d6a0" stop-opacity="0"/>
<stop offset="50%" stop-color="#06d6a0" stop-opacity="0.15"/>
<stop offset="100%" stop-color="#06d6a0" stop-opacity="0"/>
</linearGradient>
</defs>
<rect width="100%" height="100%" fill="#0d1117" rx="8"/>
<!-- Full background -->
<rect width="100%" height="100%" fill="#0d1117"/>
<!-- Title -->
<!-- ==================== VIBE BI HEADER ==================== -->
<!-- "VIBE BI" block art (shadow) -->
<text font-family="'Courier New', Courier, monospace" font-size="9" fill="#7A6508" xml:space="preserve">
<tspan x="296" y="22">██╗ ██╗ ██╗ ██████╗ ███████╗ ██████╗ ██╗</tspan>
<tspan x="296" y="33">██║ ██║ ██║ ██╔══██╗ ██╔════╝ ██╔══██╗ ██║</tspan>
<tspan x="296" y="44">██║ ██║ ██║ ██████╔╝ █████╗ ██████╔╝ ██║</tspan>
<tspan x="296" y="55">╚██╗ ██╔╝ ██║ ██╔══██╗ ██╔══╝ ██╔══██╗ ██║</tspan>
<tspan x="296" y="66"> ╚████╔╝ ██║ ██████╔╝ ███████╗ ██████╔╝ ██║</tspan>
<tspan x="296" y="77"> ╚═══╝ ╚═╝ ╚═════╝ ╚══════╝ ╚═════╝ ╚═╝</tspan>
</text>
<!-- "VIBE BI" block art (main) -->
<text font-family="'Courier New', Courier, monospace" font-size="9" fill="#F2C811" xml:space="preserve">
<tspan x="295" y="21">██╗ ██╗ ██╗ ██████╗ ███████╗ ██████╗ ██╗</tspan>
<tspan x="295" y="32">██║ ██║ ██║ ██╔══██╗ ██╔════╝ ██╔══██╗ ██║</tspan>
<tspan x="295" y="43">██║ ██║ ██║ ██████╔╝ █████╗ ██████╔╝ ██║</tspan>
<tspan x="295" y="54">╚██╗ ██╔╝ ██║ ██╔══██╗ ██╔══╝ ██╔══██╗ ██║</tspan>
<tspan x="295" y="65"> ╚████╔╝ ██║ ██████╔╝ ███████╗ ██████╔╝ ██║</tspan>
<tspan x="295" y="76"> ╚═══╝ ╚═╝ ╚═════╝ ╚══════╝ ╚═════╝ ╚═╝</tspan>
</text>
<!-- Separator -->
<line x1="60" y1="84" x2="790" y2="84" stroke="#F2C811" stroke-opacity="0.15" stroke-width="1"/>
<!-- Tagline -->
<text x="425" y="100" font-family="'Segoe UI', Arial, sans-serif" font-size="13" fill="#e6edf3" text-anchor="middle" font-weight="600">The First CLI for Both Power BI Modeling and Reporting</text>
<!-- ===== Connection Flow: Claude > PBI-CLI > Power BI ===== -->
<!-- Claude AI logo (inline, original 1200x1200, displayed as 50x50, centered at x=110) -->
<svg x="85" y="110" width="50" height="50" viewBox="0 0 1200 1200">
<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"/>
</svg>
<text x="110" y="175" 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="155" y1="135" x2="290" y2="135" stroke="#F2C811" stroke-width="2" stroke-dasharray="6,4" stroke-opacity="0.5"/>
<polygon points="294,135 286,130 286,140" fill="#F2C811" fill-opacity="0.5"/>
<!-- PBI-CLI block art (shadow) -->
<text font-family="'Courier New', Courier, monospace" font-size="7" fill="#7A6508" xml:space="preserve">
<tspan x="316" y="118">██████╗ ██████╗ ██╗ ██████╗ ██╗ ██╗</tspan>
<tspan x="316" y="128">██╔══██╗ ██╔══██╗ ██║ ██╔════╝ ██║ ██║</tspan>
<tspan x="316" y="138">██████╔╝ ██████╔╝ ██║ ███╗ ██║ ██║ ██║</tspan>
<tspan x="316" y="148">██╔═══╝ ██╔══██╗ ██║ ╚══╝ ██║ ██║ ██║</tspan>
<tspan x="316" y="158">██║ ██████╔╝ ██║ ╚██████╗ ███████╗ ██║</tspan>
<tspan x="316" y="168">╚═╝ ╚═════╝ ╚═╝ ╚═════╝ ╚══════╝ ╚═╝</tspan>
</text>
<!-- PBI-CLI block art (main) -->
<text font-family="'Courier New', Courier, monospace" font-size="7" fill="#F2C811" xml:space="preserve">
<tspan x="315" y="117">██████╗ ██████╗ ██╗ ██████╗ ██╗ ██╗</tspan>
<tspan x="315" y="127">██╔══██╗ ██╔══██╗ ██║ ██╔════╝ ██║ ██║</tspan>
<tspan x="315" y="137">██████╔╝ ██████╔╝ ██║ ███╗ ██║ ██║ ██║</tspan>
<tspan x="315" y="147">██╔═══╝ ██╔══██╗ ██║ ╚══╝ ██║ ██║ ██║</tspan>
<tspan x="315" y="157">██║ ██████╔╝ ██║ ╚██████╗ ███████╗ ██║</tspan>
<tspan x="315" y="167">╚═╝ ╚═════╝ ╚═╝ ╚═════╝ ╚══════╝ ╚═╝</tspan>
</text>
<!-- Right arrow -->
<line x1="560" y1="135" x2="655" y2="135" stroke="#F2C811" stroke-width="2" stroke-dasharray="6,4" stroke-opacity="0.5"/>
<polygon points="659,135 651,130 651,140" fill="#F2C811" fill-opacity="0.5"/>
<!-- Power BI logo (inline, original 630x630, displayed as 50x50, centered at x=700) -->
<svg x="675" y="110" width="50" height="50" viewBox="0 0 630 630">
<g transform="translate(77.5, 0)">
<rect fill="url(#pbi-lg1)" x="256" y="0" width="219" height="630" rx="26"/>
<path fill="url(#pbi-lg2)" d="M346,604 L346,630 L320,630 L153,630 C138.64,630 127,618.36 127,604 L127,183 C127,168.64 138.64,157 153,157 L320,157 C334.36,157 346,168.64 346,183 L346,604 Z"/>
<path fill="url(#pbi-lg5)" d="M219,604 L219,630 L193,630 L26,630 C11.64,630 0,618.36 0,604 L0,341 C0,326.64 11.64,315 26,315 L193,315 C207.36,315 219,326.64 219,341 L219,604 Z"/>
</g>
</svg>
<text x="700" y="175" font-family="'Segoe UI', Arial, sans-serif" font-size="11" fill="#F2C811" text-anchor="middle" font-weight="600">Power BI</text>
<!-- Modeling + Reporting pills -->
<rect x="308" y="176" width="100" height="20" rx="10" fill="#58a6ff" fill-opacity="0.1" stroke="#58a6ff" stroke-width="1"/>
<text x="358" y="190" font-family="'Segoe UI', Arial, sans-serif" font-size="10" fill="#58a6ff" text-anchor="middle" font-weight="600">Modeling</text>
<text x="420" y="190" font-family="'Segoe UI', Arial, sans-serif" font-size="10" fill="#8b949e" text-anchor="middle">+</text>
<rect x="432" y="176" width="100" height="20" rx="10" fill="#06d6a0" fill-opacity="0.1" stroke="#06d6a0" stroke-width="1"/>
<text x="482" y="190" font-family="'Segoe UI', Arial, sans-serif" font-size="10" fill="#06d6a0" text-anchor="middle" font-weight="600">Reporting</text>
<!-- Bottom separator -->
<line x1="60" y1="200" x2="790" y2="200" stroke="#F2C811" stroke-opacity="0.25" stroke-width="2"/>
<!-- ==================== END HEADER ==================== -->
<!-- Feature content (shifted down by 210px) -->
<g transform="translate(0, 210)">
<!-- Title -->
<text x="425" y="30" font-family="'Segoe UI', Arial, sans-serif" font-size="20" fill="#06d6a0" text-anchor="middle" font-weight="bold">Desktop Auto-Sync</text>
<text x="425" y="52" font-family="'Segoe UI', Arial, sans-serif" font-size="13" fill="#8b949e" text-anchor="middle">Report changes appear in Desktop automatically. Your modeling work is preserved.</text>
@ -115,4 +229,6 @@
<text x="490" y="324" font-family="'Segoe UI', Arial, sans-serif" font-size="13" fill="#e6edf3">Desktop reopens automatically</text>
<text x="470" y="346" font-family="'Segoe UI', Arial, sans-serif" font-size="15" fill="#06d6a0">&#x2713;</text>
<text x="490" y="346" font-family="'Segoe UI', Arial, sans-serif" font-size="13" fill="#e6edf3">All work preserved -- both layers</text>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 8.6 KiB

After

Width:  |  Height:  |  Size: 21 KiB

View file

@ -1,7 +1,122 @@
<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"/>
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="850" height="730" viewBox="0 0 850 730">
<defs>
<linearGradient id="hdr-bar1" x1="50%" y1="0%" x2="50%" y2="100%">
<stop offset="0%" stop-color="#EBBB14"/>
<stop offset="100%" stop-color="#B25400"/>
</linearGradient>
<linearGradient id="hdr-bar2" x1="50%" y1="0%" x2="50%" y2="100%">
<stop offset="0%" stop-color="#F9E583"/>
<stop offset="100%" stop-color="#DE9800"/>
</linearGradient>
<linearGradient id="hdr-bar3" x1="50%" y1="0%" x2="50%" y2="100%">
<stop offset="0%" stop-color="#F9E68B"/>
<stop offset="100%" stop-color="#F3CD32"/>
</linearGradient>
<linearGradient id="pbi-lg1" x1="50%" y1="0%" x2="50%" y2="100%">
<stop offset="0%" stop-color="#EBBB14"/>
<stop offset="100%" stop-color="#B25400"/>
</linearGradient>
<linearGradient id="pbi-lg2" x1="50%" y1="0%" x2="50%" y2="100%">
<stop offset="0%" stop-color="#F9E583"/>
<stop offset="100%" stop-color="#DE9800"/>
</linearGradient>
<linearGradient id="pbi-lg5" x1="50%" y1="0%" x2="50%" y2="100%">
<stop offset="0%" stop-color="#F9E68B"/>
<stop offset="100%" stop-color="#F3CD32"/>
</linearGradient>
</defs>
<!-- Title -->
<!-- Full background -->
<rect width="100%" height="100%" fill="#0d1117"/>
<!-- ==================== VIBE BI HEADER ==================== -->
<!-- "VIBE BI" block art (shadow) -->
<text font-family="'Courier New', Courier, monospace" font-size="9" fill="#7A6508" xml:space="preserve">
<tspan x="296" y="22">██╗ ██╗ ██╗ ██████╗ ███████╗ ██████╗ ██╗</tspan>
<tspan x="296" y="33">██║ ██║ ██║ ██╔══██╗ ██╔════╝ ██╔══██╗ ██║</tspan>
<tspan x="296" y="44">██║ ██║ ██║ ██████╔╝ █████╗ ██████╔╝ ██║</tspan>
<tspan x="296" y="55">╚██╗ ██╔╝ ██║ ██╔══██╗ ██╔══╝ ██╔══██╗ ██║</tspan>
<tspan x="296" y="66"> ╚████╔╝ ██║ ██████╔╝ ███████╗ ██████╔╝ ██║</tspan>
<tspan x="296" y="77"> ╚═══╝ ╚═╝ ╚═════╝ ╚══════╝ ╚═════╝ ╚═╝</tspan>
</text>
<!-- "VIBE BI" block art (main) -->
<text font-family="'Courier New', Courier, monospace" font-size="9" fill="#F2C811" xml:space="preserve">
<tspan x="295" y="21">██╗ ██╗ ██╗ ██████╗ ███████╗ ██████╗ ██╗</tspan>
<tspan x="295" y="32">██║ ██║ ██║ ██╔══██╗ ██╔════╝ ██╔══██╗ ██║</tspan>
<tspan x="295" y="43">██║ ██║ ██║ ██████╔╝ █████╗ ██████╔╝ ██║</tspan>
<tspan x="295" y="54">╚██╗ ██╔╝ ██║ ██╔══██╗ ██╔══╝ ██╔══██╗ ██║</tspan>
<tspan x="295" y="65"> ╚████╔╝ ██║ ██████╔╝ ███████╗ ██████╔╝ ██║</tspan>
<tspan x="295" y="76"> ╚═══╝ ╚═╝ ╚═════╝ ╚══════╝ ╚═════╝ ╚═╝</tspan>
</text>
<!-- Separator -->
<line x1="60" y1="84" x2="790" y2="84" stroke="#F2C811" stroke-opacity="0.15" stroke-width="1"/>
<!-- Tagline -->
<text x="425" y="100" font-family="'Segoe UI', Arial, sans-serif" font-size="13" fill="#e6edf3" text-anchor="middle" font-weight="600">The First CLI for Both Power BI Modeling and Reporting</text>
<!-- ===== Connection Flow: Claude > PBI-CLI > Power BI ===== -->
<!-- Claude AI logo (inline, original 1200x1200, displayed as 50x50, centered at x=110) -->
<svg x="85" y="110" width="50" height="50" viewBox="0 0 1200 1200">
<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"/>
</svg>
<text x="110" y="175" 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="155" y1="135" x2="290" y2="135" stroke="#F2C811" stroke-width="2" stroke-dasharray="6,4" stroke-opacity="0.5"/>
<polygon points="294,135 286,130 286,140" fill="#F2C811" fill-opacity="0.5"/>
<!-- PBI-CLI block art (shadow) -->
<text font-family="'Courier New', Courier, monospace" font-size="7" fill="#7A6508" xml:space="preserve">
<tspan x="316" y="118">██████╗ ██████╗ ██╗ ██████╗ ██╗ ██╗</tspan>
<tspan x="316" y="128">██╔══██╗ ██╔══██╗ ██║ ██╔════╝ ██║ ██║</tspan>
<tspan x="316" y="138">██████╔╝ ██████╔╝ ██║ ███╗ ██║ ██║ ██║</tspan>
<tspan x="316" y="148">██╔═══╝ ██╔══██╗ ██║ ╚══╝ ██║ ██║ ██║</tspan>
<tspan x="316" y="158">██║ ██████╔╝ ██║ ╚██████╗ ███████╗ ██║</tspan>
<tspan x="316" y="168">╚═╝ ╚═════╝ ╚═╝ ╚═════╝ ╚══════╝ ╚═╝</tspan>
</text>
<!-- PBI-CLI block art (main) -->
<text font-family="'Courier New', Courier, monospace" font-size="7" fill="#F2C811" xml:space="preserve">
<tspan x="315" y="117">██████╗ ██████╗ ██╗ ██████╗ ██╗ ██╗</tspan>
<tspan x="315" y="127">██╔══██╗ ██╔══██╗ ██║ ██╔════╝ ██║ ██║</tspan>
<tspan x="315" y="137">██████╔╝ ██████╔╝ ██║ ███╗ ██║ ██║ ██║</tspan>
<tspan x="315" y="147">██╔═══╝ ██╔══██╗ ██║ ╚══╝ ██║ ██║ ██║</tspan>
<tspan x="315" y="157">██║ ██████╔╝ ██║ ╚██████╗ ███████╗ ██║</tspan>
<tspan x="315" y="167">╚═╝ ╚═════╝ ╚═╝ ╚═════╝ ╚══════╝ ╚═╝</tspan>
</text>
<!-- Right arrow -->
<line x1="560" y1="135" x2="655" y2="135" stroke="#F2C811" stroke-width="2" stroke-dasharray="6,4" stroke-opacity="0.5"/>
<polygon points="659,135 651,130 651,140" fill="#F2C811" fill-opacity="0.5"/>
<!-- Power BI logo (inline, original 630x630, displayed as 50x50, centered at x=700) -->
<svg x="675" y="110" width="50" height="50" viewBox="0 0 630 630">
<g transform="translate(77.5, 0)">
<rect fill="url(#pbi-lg1)" x="256" y="0" width="219" height="630" rx="26"/>
<path fill="url(#pbi-lg2)" d="M346,604 L346,630 L320,630 L153,630 C138.64,630 127,618.36 127,604 L127,183 C127,168.64 138.64,157 153,157 L320,157 C334.36,157 346,168.64 346,183 L346,604 Z"/>
<path fill="url(#pbi-lg5)" d="M219,604 L219,630 L193,630 L26,630 C11.64,630 0,618.36 0,604 L0,341 C0,326.64 11.64,315 26,315 L193,315 C207.36,315 219,326.64 219,341 L219,604 Z"/>
</g>
</svg>
<text x="700" y="175" font-family="'Segoe UI', Arial, sans-serif" font-size="11" fill="#F2C811" text-anchor="middle" font-weight="600">Power BI</text>
<!-- Modeling + Reporting pills -->
<rect x="308" y="176" width="100" height="20" rx="10" fill="#58a6ff" fill-opacity="0.1" stroke="#58a6ff" stroke-width="1"/>
<text x="358" y="190" font-family="'Segoe UI', Arial, sans-serif" font-size="10" fill="#58a6ff" text-anchor="middle" font-weight="600">Modeling</text>
<text x="420" y="190" font-family="'Segoe UI', Arial, sans-serif" font-size="10" fill="#8b949e" text-anchor="middle">+</text>
<rect x="432" y="176" width="100" height="20" rx="10" fill="#06d6a0" fill-opacity="0.1" stroke="#06d6a0" stroke-width="1"/>
<text x="482" y="190" font-family="'Segoe UI', Arial, sans-serif" font-size="10" fill="#06d6a0" text-anchor="middle" font-weight="600">Reporting</text>
<!-- Bottom separator -->
<line x1="60" y1="200" x2="790" y2="200" stroke="#F2C811" stroke-opacity="0.25" stroke-width="2"/>
<!-- ==================== END HEADER ==================== -->
<!-- Feature content (shifted down by 210px) -->
<g transform="translate(0, 210)">
<!-- 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="13" fill="#8b949e" text-anchor="middle">Snapshot your model before risky changes, restore when things go wrong</text>
@ -54,4 +169,6 @@
<!-- Footer -->
<text x="425" y="510" font-family="'Segoe UI', Arial, sans-serif" font-size="13" fill="#8b949e" text-anchor="middle">Never lose work again. Snapshot before, restore after.</text>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 4.4 KiB

After

Width:  |  Height:  |  Size: 17 KiB

View file

@ -1,9 +1,123 @@
<svg xmlns="http://www.w3.org/2000/svg" width="850" height="345" viewBox="0 0 850 345" font-family="'Segoe UI', system-ui, sans-serif">
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="850" height="555" viewBox="0 0 850 555">
<defs>
<linearGradient id="hdr-bar1" x1="50%" y1="0%" x2="50%" y2="100%">
<stop offset="0%" stop-color="#EBBB14"/>
<stop offset="100%" stop-color="#B25400"/>
</linearGradient>
<linearGradient id="hdr-bar2" x1="50%" y1="0%" x2="50%" y2="100%">
<stop offset="0%" stop-color="#F9E583"/>
<stop offset="100%" stop-color="#DE9800"/>
</linearGradient>
<linearGradient id="hdr-bar3" x1="50%" y1="0%" x2="50%" y2="100%">
<stop offset="0%" stop-color="#F9E68B"/>
<stop offset="100%" stop-color="#F3CD32"/>
</linearGradient>
<linearGradient id="pbi-lg1" x1="50%" y1="0%" x2="50%" y2="100%">
<stop offset="0%" stop-color="#EBBB14"/>
<stop offset="100%" stop-color="#B25400"/>
</linearGradient>
<linearGradient id="pbi-lg2" x1="50%" y1="0%" x2="50%" y2="100%">
<stop offset="0%" stop-color="#F9E583"/>
<stop offset="100%" stop-color="#DE9800"/>
</linearGradient>
<linearGradient id="pbi-lg5" 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"/>
<!-- Full background -->
<rect width="100%" height="100%" fill="#0d1117"/>
<!-- Title -->
<!-- ==================== VIBE BI HEADER ==================== -->
<!-- "VIBE BI" block art (shadow) -->
<text font-family="'Courier New', Courier, monospace" font-size="9" fill="#7A6508" xml:space="preserve">
<tspan x="296" y="22">██╗ ██╗ ██╗ ██████╗ ███████╗ ██████╗ ██╗</tspan>
<tspan x="296" y="33">██║ ██║ ██║ ██╔══██╗ ██╔════╝ ██╔══██╗ ██║</tspan>
<tspan x="296" y="44">██║ ██║ ██║ ██████╔╝ █████╗ ██████╔╝ ██║</tspan>
<tspan x="296" y="55">╚██╗ ██╔╝ ██║ ██╔══██╗ ██╔══╝ ██╔══██╗ ██║</tspan>
<tspan x="296" y="66"> ╚████╔╝ ██║ ██████╔╝ ███████╗ ██████╔╝ ██║</tspan>
<tspan x="296" y="77"> ╚═══╝ ╚═╝ ╚═════╝ ╚══════╝ ╚═════╝ ╚═╝</tspan>
</text>
<!-- "VIBE BI" block art (main) -->
<text font-family="'Courier New', Courier, monospace" font-size="9" fill="#F2C811" xml:space="preserve">
<tspan x="295" y="21">██╗ ██╗ ██╗ ██████╗ ███████╗ ██████╗ ██╗</tspan>
<tspan x="295" y="32">██║ ██║ ██║ ██╔══██╗ ██╔════╝ ██╔══██╗ ██║</tspan>
<tspan x="295" y="43">██║ ██║ ██║ ██████╔╝ █████╗ ██████╔╝ ██║</tspan>
<tspan x="295" y="54">╚██╗ ██╔╝ ██║ ██╔══██╗ ██╔══╝ ██╔══██╗ ██║</tspan>
<tspan x="295" y="65"> ╚████╔╝ ██║ ██████╔╝ ███████╗ ██████╔╝ ██║</tspan>
<tspan x="295" y="76"> ╚═══╝ ╚═╝ ╚═════╝ ╚══════╝ ╚═════╝ ╚═╝</tspan>
</text>
<!-- Separator -->
<line x1="60" y1="84" x2="790" y2="84" stroke="#F2C811" stroke-opacity="0.15" stroke-width="1"/>
<!-- Tagline -->
<text x="425" y="100" font-family="'Segoe UI', Arial, sans-serif" font-size="13" fill="#e6edf3" text-anchor="middle" font-weight="600">The First CLI for Both Power BI Modeling and Reporting</text>
<!-- ===== Connection Flow: Claude > PBI-CLI > Power BI ===== -->
<!-- Claude AI logo (inline, original 1200x1200, displayed as 50x50, centered at x=110) -->
<svg x="85" y="110" width="50" height="50" viewBox="0 0 1200 1200">
<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"/>
</svg>
<text x="110" y="175" 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="155" y1="135" x2="290" y2="135" stroke="#F2C811" stroke-width="2" stroke-dasharray="6,4" stroke-opacity="0.5"/>
<polygon points="294,135 286,130 286,140" fill="#F2C811" fill-opacity="0.5"/>
<!-- PBI-CLI block art (shadow) -->
<text font-family="'Courier New', Courier, monospace" font-size="7" fill="#7A6508" xml:space="preserve">
<tspan x="316" y="118">██████╗ ██████╗ ██╗ ██████╗ ██╗ ██╗</tspan>
<tspan x="316" y="128">██╔══██╗ ██╔══██╗ ██║ ██╔════╝ ██║ ██║</tspan>
<tspan x="316" y="138">██████╔╝ ██████╔╝ ██║ ███╗ ██║ ██║ ██║</tspan>
<tspan x="316" y="148">██╔═══╝ ██╔══██╗ ██║ ╚══╝ ██║ ██║ ██║</tspan>
<tspan x="316" y="158">██║ ██████╔╝ ██║ ╚██████╗ ███████╗ ██║</tspan>
<tspan x="316" y="168">╚═╝ ╚═════╝ ╚═╝ ╚═════╝ ╚══════╝ ╚═╝</tspan>
</text>
<!-- PBI-CLI block art (main) -->
<text font-family="'Courier New', Courier, monospace" font-size="7" fill="#F2C811" xml:space="preserve">
<tspan x="315" y="117">██████╗ ██████╗ ██╗ ██████╗ ██╗ ██╗</tspan>
<tspan x="315" y="127">██╔══██╗ ██╔══██╗ ██║ ██╔════╝ ██║ ██║</tspan>
<tspan x="315" y="137">██████╔╝ ██████╔╝ ██║ ███╗ ██║ ██║ ██║</tspan>
<tspan x="315" y="147">██╔═══╝ ██╔══██╗ ██║ ╚══╝ ██║ ██║ ██║</tspan>
<tspan x="315" y="157">██║ ██████╔╝ ██║ ╚██████╗ ███████╗ ██║</tspan>
<tspan x="315" y="167">╚═╝ ╚═════╝ ╚═╝ ╚═════╝ ╚══════╝ ╚═╝</tspan>
</text>
<!-- Right arrow -->
<line x1="560" y1="135" x2="655" y2="135" stroke="#F2C811" stroke-width="2" stroke-dasharray="6,4" stroke-opacity="0.5"/>
<polygon points="659,135 651,130 651,140" fill="#F2C811" fill-opacity="0.5"/>
<!-- Power BI logo (inline, original 630x630, displayed as 50x50, centered at x=700) -->
<svg x="675" y="110" width="50" height="50" viewBox="0 0 630 630">
<g transform="translate(77.5, 0)">
<rect fill="url(#pbi-lg1)" x="256" y="0" width="219" height="630" rx="26"/>
<path fill="url(#pbi-lg2)" d="M346,604 L346,630 L320,630 L153,630 C138.64,630 127,618.36 127,604 L127,183 C127,168.64 138.64,157 153,157 L320,157 C334.36,157 346,168.64 346,183 L346,604 Z"/>
<path fill="url(#pbi-lg5)" d="M219,604 L219,630 L193,630 L26,630 C11.64,630 0,618.36 0,604 L0,341 C0,326.64 11.64,315 26,315 L193,315 C207.36,315 219,326.64 219,341 L219,604 Z"/>
</g>
</svg>
<text x="700" y="175" font-family="'Segoe UI', Arial, sans-serif" font-size="11" fill="#F2C811" text-anchor="middle" font-weight="600">Power BI</text>
<!-- Modeling + Reporting pills -->
<rect x="308" y="176" width="100" height="20" rx="10" fill="#58a6ff" fill-opacity="0.1" stroke="#58a6ff" stroke-width="1"/>
<text x="358" y="190" font-family="'Segoe UI', Arial, sans-serif" font-size="10" fill="#58a6ff" text-anchor="middle" font-weight="600">Modeling</text>
<text x="420" y="190" font-family="'Segoe UI', Arial, sans-serif" font-size="10" fill="#8b949e" text-anchor="middle">+</text>
<rect x="432" y="176" width="100" height="20" rx="10" fill="#06d6a0" fill-opacity="0.1" stroke="#06d6a0" stroke-width="1"/>
<text x="482" y="190" font-family="'Segoe UI', Arial, sans-serif" font-size="10" fill="#06d6a0" text-anchor="middle" font-weight="600">Reporting</text>
<!-- Bottom separator -->
<line x1="60" y1="200" x2="790" y2="200" stroke="#F2C811" stroke-opacity="0.25" stroke-width="2"/>
<!-- ==================== END HEADER ==================== -->
<!-- Feature content (shifted down by 210px) -->
<g transform="translate(0, 210)">
<!-- Background -->
<!-- Title -->
<text x="425" y="36" font-size="19" fill="#F2C811" font-weight="bold" text-anchor="middle">Why pbi-cli?</text>
<!-- LEFT panel -->
@ -108,4 +222,5 @@
<circle cx="425" cy="215" r="28" fill="#0d1117" stroke="#F2C811" stroke-width="2"/>
<text x="425" y="221" font-size="15" fill="#F2C811" font-weight="bold" text-anchor="middle">VS</text>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 6.4 KiB

After

Width:  |  Height:  |  Size: 18 KiB

View file

@ -1,7 +1,122 @@
<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"/>
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="850" height="690" viewBox="0 0 850 690">
<defs>
<linearGradient id="hdr-bar1" x1="50%" y1="0%" x2="50%" y2="100%">
<stop offset="0%" stop-color="#EBBB14"/>
<stop offset="100%" stop-color="#B25400"/>
</linearGradient>
<linearGradient id="hdr-bar2" x1="50%" y1="0%" x2="50%" y2="100%">
<stop offset="0%" stop-color="#F9E583"/>
<stop offset="100%" stop-color="#DE9800"/>
</linearGradient>
<linearGradient id="hdr-bar3" x1="50%" y1="0%" x2="50%" y2="100%">
<stop offset="0%" stop-color="#F9E68B"/>
<stop offset="100%" stop-color="#F3CD32"/>
</linearGradient>
<linearGradient id="pbi-lg1" x1="50%" y1="0%" x2="50%" y2="100%">
<stop offset="0%" stop-color="#EBBB14"/>
<stop offset="100%" stop-color="#B25400"/>
</linearGradient>
<linearGradient id="pbi-lg2" x1="50%" y1="0%" x2="50%" y2="100%">
<stop offset="0%" stop-color="#F9E583"/>
<stop offset="100%" stop-color="#DE9800"/>
</linearGradient>
<linearGradient id="pbi-lg5" x1="50%" y1="0%" x2="50%" y2="100%">
<stop offset="0%" stop-color="#F9E68B"/>
<stop offset="100%" stop-color="#F3CD32"/>
</linearGradient>
</defs>
<!-- Title -->
<!-- Full background -->
<rect width="100%" height="100%" fill="#0d1117"/>
<!-- ==================== VIBE BI HEADER ==================== -->
<!-- "VIBE BI" block art (shadow) -->
<text font-family="'Courier New', Courier, monospace" font-size="9" fill="#7A6508" xml:space="preserve">
<tspan x="296" y="22">██╗ ██╗ ██╗ ██████╗ ███████╗ ██████╗ ██╗</tspan>
<tspan x="296" y="33">██║ ██║ ██║ ██╔══██╗ ██╔════╝ ██╔══██╗ ██║</tspan>
<tspan x="296" y="44">██║ ██║ ██║ ██████╔╝ █████╗ ██████╔╝ ██║</tspan>
<tspan x="296" y="55">╚██╗ ██╔╝ ██║ ██╔══██╗ ██╔══╝ ██╔══██╗ ██║</tspan>
<tspan x="296" y="66"> ╚████╔╝ ██║ ██████╔╝ ███████╗ ██████╔╝ ██║</tspan>
<tspan x="296" y="77"> ╚═══╝ ╚═╝ ╚═════╝ ╚══════╝ ╚═════╝ ╚═╝</tspan>
</text>
<!-- "VIBE BI" block art (main) -->
<text font-family="'Courier New', Courier, monospace" font-size="9" fill="#F2C811" xml:space="preserve">
<tspan x="295" y="21">██╗ ██╗ ██╗ ██████╗ ███████╗ ██████╗ ██╗</tspan>
<tspan x="295" y="32">██║ ██║ ██║ ██╔══██╗ ██╔════╝ ██╔══██╗ ██║</tspan>
<tspan x="295" y="43">██║ ██║ ██║ ██████╔╝ █████╗ ██████╔╝ ██║</tspan>
<tspan x="295" y="54">╚██╗ ██╔╝ ██║ ██╔══██╗ ██╔══╝ ██╔══██╗ ██║</tspan>
<tspan x="295" y="65"> ╚████╔╝ ██║ ██████╔╝ ███████╗ ██████╔╝ ██║</tspan>
<tspan x="295" y="76"> ╚═══╝ ╚═╝ ╚═════╝ ╚══════╝ ╚═════╝ ╚═╝</tspan>
</text>
<!-- Separator -->
<line x1="60" y1="84" x2="790" y2="84" stroke="#F2C811" stroke-opacity="0.15" stroke-width="1"/>
<!-- Tagline -->
<text x="425" y="100" font-family="'Segoe UI', Arial, sans-serif" font-size="13" fill="#e6edf3" text-anchor="middle" font-weight="600">The First CLI for Both Power BI Modeling and Reporting</text>
<!-- ===== Connection Flow: Claude > PBI-CLI > Power BI ===== -->
<!-- Claude AI logo (inline, original 1200x1200, displayed as 50x50, centered at x=110) -->
<svg x="85" y="110" width="50" height="50" viewBox="0 0 1200 1200">
<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"/>
</svg>
<text x="110" y="175" 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="155" y1="135" x2="290" y2="135" stroke="#F2C811" stroke-width="2" stroke-dasharray="6,4" stroke-opacity="0.5"/>
<polygon points="294,135 286,130 286,140" fill="#F2C811" fill-opacity="0.5"/>
<!-- PBI-CLI block art (shadow) -->
<text font-family="'Courier New', Courier, monospace" font-size="7" fill="#7A6508" xml:space="preserve">
<tspan x="316" y="118">██████╗ ██████╗ ██╗ ██████╗ ██╗ ██╗</tspan>
<tspan x="316" y="128">██╔══██╗ ██╔══██╗ ██║ ██╔════╝ ██║ ██║</tspan>
<tspan x="316" y="138">██████╔╝ ██████╔╝ ██║ ███╗ ██║ ██║ ██║</tspan>
<tspan x="316" y="148">██╔═══╝ ██╔══██╗ ██║ ╚══╝ ██║ ██║ ██║</tspan>
<tspan x="316" y="158">██║ ██████╔╝ ██║ ╚██████╗ ███████╗ ██║</tspan>
<tspan x="316" y="168">╚═╝ ╚═════╝ ╚═╝ ╚═════╝ ╚══════╝ ╚═╝</tspan>
</text>
<!-- PBI-CLI block art (main) -->
<text font-family="'Courier New', Courier, monospace" font-size="7" fill="#F2C811" xml:space="preserve">
<tspan x="315" y="117">██████╗ ██████╗ ██╗ ██████╗ ██╗ ██╗</tspan>
<tspan x="315" y="127">██╔══██╗ ██╔══██╗ ██║ ██╔════╝ ██║ ██║</tspan>
<tspan x="315" y="137">██████╔╝ ██████╔╝ ██║ ███╗ ██║ ██║ ██║</tspan>
<tspan x="315" y="147">██╔═══╝ ██╔══██╗ ██║ ╚══╝ ██║ ██║ ██║</tspan>
<tspan x="315" y="157">██║ ██████╔╝ ██║ ╚██████╗ ███████╗ ██║</tspan>
<tspan x="315" y="167">╚═╝ ╚═════╝ ╚═╝ ╚═════╝ ╚══════╝ ╚═╝</tspan>
</text>
<!-- Right arrow -->
<line x1="560" y1="135" x2="655" y2="135" stroke="#F2C811" stroke-width="2" stroke-dasharray="6,4" stroke-opacity="0.5"/>
<polygon points="659,135 651,130 651,140" fill="#F2C811" fill-opacity="0.5"/>
<!-- Power BI logo (inline, original 630x630, displayed as 50x50, centered at x=700) -->
<svg x="675" y="110" width="50" height="50" viewBox="0 0 630 630">
<g transform="translate(77.5, 0)">
<rect fill="url(#pbi-lg1)" x="256" y="0" width="219" height="630" rx="26"/>
<path fill="url(#pbi-lg2)" d="M346,604 L346,630 L320,630 L153,630 C138.64,630 127,618.36 127,604 L127,183 C127,168.64 138.64,157 153,157 L320,157 C334.36,157 346,168.64 346,183 L346,604 Z"/>
<path fill="url(#pbi-lg5)" d="M219,604 L219,630 L193,630 L26,630 C11.64,630 0,618.36 0,604 L0,341 C0,326.64 11.64,315 26,315 L193,315 C207.36,315 219,326.64 219,341 L219,604 Z"/>
</g>
</svg>
<text x="700" y="175" font-family="'Segoe UI', Arial, sans-serif" font-size="11" fill="#F2C811" text-anchor="middle" font-weight="600">Power BI</text>
<!-- Modeling + Reporting pills -->
<rect x="308" y="176" width="100" height="20" rx="10" fill="#58a6ff" fill-opacity="0.1" stroke="#58a6ff" stroke-width="1"/>
<text x="358" y="190" font-family="'Segoe UI', Arial, sans-serif" font-size="10" fill="#58a6ff" text-anchor="middle" font-weight="600">Modeling</text>
<text x="420" y="190" font-family="'Segoe UI', Arial, sans-serif" font-size="10" fill="#8b949e" text-anchor="middle">+</text>
<rect x="432" y="176" width="100" height="20" rx="10" fill="#06d6a0" fill-opacity="0.1" stroke="#06d6a0" stroke-width="1"/>
<text x="482" y="190" font-family="'Segoe UI', Arial, sans-serif" font-size="10" fill="#06d6a0" text-anchor="middle" font-weight="600">Reporting</text>
<!-- Bottom separator -->
<line x1="60" y1="200" x2="790" y2="200" stroke="#F2C811" stroke-opacity="0.25" stroke-width="2"/>
<!-- ==================== END HEADER ==================== -->
<!-- Feature content (shifted down by 210px) -->
<g transform="translate(0, 210)">
<!-- 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="13" fill="#8b949e" text-anchor="middle">Stop clicking through the GUI for every single measure</text>
@ -67,4 +182,6 @@
<!-- Footer -->
<text x="425" y="470" font-family="'Segoe UI', Arial, sans-serif" font-size="13" fill="#8b949e" text-anchor="middle">Batch operations that would take hours in the GUI, done in seconds</text>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 5.3 KiB

After

Width:  |  Height:  |  Size: 18 KiB

View file

@ -1,7 +1,122 @@
<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"/>
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="850" height="730" viewBox="0 0 850 730">
<defs>
<linearGradient id="hdr-bar1" x1="50%" y1="0%" x2="50%" y2="100%">
<stop offset="0%" stop-color="#EBBB14"/>
<stop offset="100%" stop-color="#B25400"/>
</linearGradient>
<linearGradient id="hdr-bar2" x1="50%" y1="0%" x2="50%" y2="100%">
<stop offset="0%" stop-color="#F9E583"/>
<stop offset="100%" stop-color="#DE9800"/>
</linearGradient>
<linearGradient id="hdr-bar3" x1="50%" y1="0%" x2="50%" y2="100%">
<stop offset="0%" stop-color="#F9E68B"/>
<stop offset="100%" stop-color="#F3CD32"/>
</linearGradient>
<linearGradient id="pbi-lg1" x1="50%" y1="0%" x2="50%" y2="100%">
<stop offset="0%" stop-color="#EBBB14"/>
<stop offset="100%" stop-color="#B25400"/>
</linearGradient>
<linearGradient id="pbi-lg2" x1="50%" y1="0%" x2="50%" y2="100%">
<stop offset="0%" stop-color="#F9E583"/>
<stop offset="100%" stop-color="#DE9800"/>
</linearGradient>
<linearGradient id="pbi-lg5" x1="50%" y1="0%" x2="50%" y2="100%">
<stop offset="0%" stop-color="#F9E68B"/>
<stop offset="100%" stop-color="#F3CD32"/>
</linearGradient>
</defs>
<!-- Title -->
<!-- Full background -->
<rect width="100%" height="100%" fill="#0d1117"/>
<!-- ==================== VIBE BI HEADER ==================== -->
<!-- "VIBE BI" block art (shadow) -->
<text font-family="'Courier New', Courier, monospace" font-size="9" fill="#7A6508" xml:space="preserve">
<tspan x="296" y="22">██╗ ██╗ ██╗ ██████╗ ███████╗ ██████╗ ██╗</tspan>
<tspan x="296" y="33">██║ ██║ ██║ ██╔══██╗ ██╔════╝ ██╔══██╗ ██║</tspan>
<tspan x="296" y="44">██║ ██║ ██║ ██████╔╝ █████╗ ██████╔╝ ██║</tspan>
<tspan x="296" y="55">╚██╗ ██╔╝ ██║ ██╔══██╗ ██╔══╝ ██╔══██╗ ██║</tspan>
<tspan x="296" y="66"> ╚████╔╝ ██║ ██████╔╝ ███████╗ ██████╔╝ ██║</tspan>
<tspan x="296" y="77"> ╚═══╝ ╚═╝ ╚═════╝ ╚══════╝ ╚═════╝ ╚═╝</tspan>
</text>
<!-- "VIBE BI" block art (main) -->
<text font-family="'Courier New', Courier, monospace" font-size="9" fill="#F2C811" xml:space="preserve">
<tspan x="295" y="21">██╗ ██╗ ██╗ ██████╗ ███████╗ ██████╗ ██╗</tspan>
<tspan x="295" y="32">██║ ██║ ██║ ██╔══██╗ ██╔════╝ ██╔══██╗ ██║</tspan>
<tspan x="295" y="43">██║ ██║ ██║ ██████╔╝ █████╗ ██████╔╝ ██║</tspan>
<tspan x="295" y="54">╚██╗ ██╔╝ ██║ ██╔══██╗ ██╔══╝ ██╔══██╗ ██║</tspan>
<tspan x="295" y="65"> ╚████╔╝ ██║ ██████╔╝ ███████╗ ██████╔╝ ██║</tspan>
<tspan x="295" y="76"> ╚═══╝ ╚═╝ ╚═════╝ ╚══════╝ ╚═════╝ ╚═╝</tspan>
</text>
<!-- Separator -->
<line x1="60" y1="84" x2="790" y2="84" stroke="#F2C811" stroke-opacity="0.15" stroke-width="1"/>
<!-- Tagline -->
<text x="425" y="100" font-family="'Segoe UI', Arial, sans-serif" font-size="13" fill="#e6edf3" text-anchor="middle" font-weight="600">The First CLI for Both Power BI Modeling and Reporting</text>
<!-- ===== Connection Flow: Claude > PBI-CLI > Power BI ===== -->
<!-- Claude AI logo (inline, original 1200x1200, displayed as 50x50, centered at x=110) -->
<svg x="85" y="110" width="50" height="50" viewBox="0 0 1200 1200">
<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"/>
</svg>
<text x="110" y="175" 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="155" y1="135" x2="290" y2="135" stroke="#F2C811" stroke-width="2" stroke-dasharray="6,4" stroke-opacity="0.5"/>
<polygon points="294,135 286,130 286,140" fill="#F2C811" fill-opacity="0.5"/>
<!-- PBI-CLI block art (shadow) -->
<text font-family="'Courier New', Courier, monospace" font-size="7" fill="#7A6508" xml:space="preserve">
<tspan x="316" y="118">██████╗ ██████╗ ██╗ ██████╗ ██╗ ██╗</tspan>
<tspan x="316" y="128">██╔══██╗ ██╔══██╗ ██║ ██╔════╝ ██║ ██║</tspan>
<tspan x="316" y="138">██████╔╝ ██████╔╝ ██║ ███╗ ██║ ██║ ██║</tspan>
<tspan x="316" y="148">██╔═══╝ ██╔══██╗ ██║ ╚══╝ ██║ ██║ ██║</tspan>
<tspan x="316" y="158">██║ ██████╔╝ ██║ ╚██████╗ ███████╗ ██║</tspan>
<tspan x="316" y="168">╚═╝ ╚═════╝ ╚═╝ ╚═════╝ ╚══════╝ ╚═╝</tspan>
</text>
<!-- PBI-CLI block art (main) -->
<text font-family="'Courier New', Courier, monospace" font-size="7" fill="#F2C811" xml:space="preserve">
<tspan x="315" y="117">██████╗ ██████╗ ██╗ ██████╗ ██╗ ██╗</tspan>
<tspan x="315" y="127">██╔══██╗ ██╔══██╗ ██║ ██╔════╝ ██║ ██║</tspan>
<tspan x="315" y="137">██████╔╝ ██████╔╝ ██║ ███╗ ██║ ██║ ██║</tspan>
<tspan x="315" y="147">██╔═══╝ ██╔══██╗ ██║ ╚══╝ ██║ ██║ ██║</tspan>
<tspan x="315" y="157">██║ ██████╔╝ ██║ ╚██████╗ ███████╗ ██║</tspan>
<tspan x="315" y="167">╚═╝ ╚═════╝ ╚═╝ ╚═════╝ ╚══════╝ ╚═╝</tspan>
</text>
<!-- Right arrow -->
<line x1="560" y1="135" x2="655" y2="135" stroke="#F2C811" stroke-width="2" stroke-dasharray="6,4" stroke-opacity="0.5"/>
<polygon points="659,135 651,130 651,140" fill="#F2C811" fill-opacity="0.5"/>
<!-- Power BI logo (inline, original 630x630, displayed as 50x50, centered at x=700) -->
<svg x="675" y="110" width="50" height="50" viewBox="0 0 630 630">
<g transform="translate(77.5, 0)">
<rect fill="url(#pbi-lg1)" x="256" y="0" width="219" height="630" rx="26"/>
<path fill="url(#pbi-lg2)" d="M346,604 L346,630 L320,630 L153,630 C138.64,630 127,618.36 127,604 L127,183 C127,168.64 138.64,157 153,157 L320,157 C334.36,157 346,168.64 346,183 L346,604 Z"/>
<path fill="url(#pbi-lg5)" d="M219,604 L219,630 L193,630 L26,630 C11.64,630 0,618.36 0,604 L0,341 C0,326.64 11.64,315 26,315 L193,315 C207.36,315 219,326.64 219,341 L219,604 Z"/>
</g>
</svg>
<text x="700" y="175" font-family="'Segoe UI', Arial, sans-serif" font-size="11" fill="#F2C811" text-anchor="middle" font-weight="600">Power BI</text>
<!-- Modeling + Reporting pills -->
<rect x="308" y="176" width="100" height="20" rx="10" fill="#58a6ff" fill-opacity="0.1" stroke="#58a6ff" stroke-width="1"/>
<text x="358" y="190" font-family="'Segoe UI', Arial, sans-serif" font-size="10" fill="#58a6ff" text-anchor="middle" font-weight="600">Modeling</text>
<text x="420" y="190" font-family="'Segoe UI', Arial, sans-serif" font-size="10" fill="#8b949e" text-anchor="middle">+</text>
<rect x="432" y="176" width="100" height="20" rx="10" fill="#06d6a0" fill-opacity="0.1" stroke="#06d6a0" stroke-width="1"/>
<text x="482" y="190" font-family="'Segoe UI', Arial, sans-serif" font-size="10" fill="#06d6a0" text-anchor="middle" font-weight="600">Reporting</text>
<!-- Bottom separator -->
<line x1="60" y1="200" x2="790" y2="200" stroke="#F2C811" stroke-opacity="0.25" stroke-width="2"/>
<!-- ==================== END HEADER ==================== -->
<!-- Feature content (shifted down by 210px) -->
<g transform="translate(0, 210)">
<!-- Title -->
<text x="425" y="32" font-family="'Segoe UI', Arial, sans-serif" font-size="18" fill="#06d6a0" text-anchor="middle" font-weight="bold">Just Ask Claude -- Report Layer</text>
<text x="425" y="50" font-family="'Segoe UI', Arial, sans-serif" font-size="13" fill="#8b949e" text-anchor="middle">Describe the report you want, Claude builds it</text>
@ -56,4 +171,6 @@
<!-- Footer -->
<text x="425" y="508" font-family="'Segoe UI', Arial, sans-serif" font-size="13" fill="#8b949e" text-anchor="middle">No drag-and-drop. No manual binding. Just describe what you want on the page.</text>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 4.6 KiB

After

Width:  |  Height:  |  Size: 17 KiB

View file

@ -1,7 +1,122 @@
<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"/>
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="850" height="730" viewBox="0 0 850 730">
<defs>
<linearGradient id="hdr-bar1" x1="50%" y1="0%" x2="50%" y2="100%">
<stop offset="0%" stop-color="#EBBB14"/>
<stop offset="100%" stop-color="#B25400"/>
</linearGradient>
<linearGradient id="hdr-bar2" x1="50%" y1="0%" x2="50%" y2="100%">
<stop offset="0%" stop-color="#F9E583"/>
<stop offset="100%" stop-color="#DE9800"/>
</linearGradient>
<linearGradient id="hdr-bar3" x1="50%" y1="0%" x2="50%" y2="100%">
<stop offset="0%" stop-color="#F9E68B"/>
<stop offset="100%" stop-color="#F3CD32"/>
</linearGradient>
<linearGradient id="pbi-lg1" x1="50%" y1="0%" x2="50%" y2="100%">
<stop offset="0%" stop-color="#EBBB14"/>
<stop offset="100%" stop-color="#B25400"/>
</linearGradient>
<linearGradient id="pbi-lg2" x1="50%" y1="0%" x2="50%" y2="100%">
<stop offset="0%" stop-color="#F9E583"/>
<stop offset="100%" stop-color="#DE9800"/>
</linearGradient>
<linearGradient id="pbi-lg5" x1="50%" y1="0%" x2="50%" y2="100%">
<stop offset="0%" stop-color="#F9E68B"/>
<stop offset="100%" stop-color="#F3CD32"/>
</linearGradient>
</defs>
<!-- Title -->
<!-- Full background -->
<rect width="100%" height="100%" fill="#0d1117"/>
<!-- ==================== VIBE BI HEADER ==================== -->
<!-- "VIBE BI" block art (shadow) -->
<text font-family="'Courier New', Courier, monospace" font-size="9" fill="#7A6508" xml:space="preserve">
<tspan x="296" y="22">██╗ ██╗ ██╗ ██████╗ ███████╗ ██████╗ ██╗</tspan>
<tspan x="296" y="33">██║ ██║ ██║ ██╔══██╗ ██╔════╝ ██╔══██╗ ██║</tspan>
<tspan x="296" y="44">██║ ██║ ██║ ██████╔╝ █████╗ ██████╔╝ ██║</tspan>
<tspan x="296" y="55">╚██╗ ██╔╝ ██║ ██╔══██╗ ██╔══╝ ██╔══██╗ ██║</tspan>
<tspan x="296" y="66"> ╚████╔╝ ██║ ██████╔╝ ███████╗ ██████╔╝ ██║</tspan>
<tspan x="296" y="77"> ╚═══╝ ╚═╝ ╚═════╝ ╚══════╝ ╚═════╝ ╚═╝</tspan>
</text>
<!-- "VIBE BI" block art (main) -->
<text font-family="'Courier New', Courier, monospace" font-size="9" fill="#F2C811" xml:space="preserve">
<tspan x="295" y="21">██╗ ██╗ ██╗ ██████╗ ███████╗ ██████╗ ██╗</tspan>
<tspan x="295" y="32">██║ ██║ ██║ ██╔══██╗ ██╔════╝ ██╔══██╗ ██║</tspan>
<tspan x="295" y="43">██║ ██║ ██║ ██████╔╝ █████╗ ██████╔╝ ██║</tspan>
<tspan x="295" y="54">╚██╗ ██╔╝ ██║ ██╔══██╗ ██╔══╝ ██╔══██╗ ██║</tspan>
<tspan x="295" y="65"> ╚████╔╝ ██║ ██████╔╝ ███████╗ ██████╔╝ ██║</tspan>
<tspan x="295" y="76"> ╚═══╝ ╚═╝ ╚═════╝ ╚══════╝ ╚═════╝ ╚═╝</tspan>
</text>
<!-- Separator -->
<line x1="60" y1="84" x2="790" y2="84" stroke="#F2C811" stroke-opacity="0.15" stroke-width="1"/>
<!-- Tagline -->
<text x="425" y="100" font-family="'Segoe UI', Arial, sans-serif" font-size="13" fill="#e6edf3" text-anchor="middle" font-weight="600">The First CLI for Both Power BI Modeling and Reporting</text>
<!-- ===== Connection Flow: Claude > PBI-CLI > Power BI ===== -->
<!-- Claude AI logo (inline, original 1200x1200, displayed as 50x50, centered at x=110) -->
<svg x="85" y="110" width="50" height="50" viewBox="0 0 1200 1200">
<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"/>
</svg>
<text x="110" y="175" 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="155" y1="135" x2="290" y2="135" stroke="#F2C811" stroke-width="2" stroke-dasharray="6,4" stroke-opacity="0.5"/>
<polygon points="294,135 286,130 286,140" fill="#F2C811" fill-opacity="0.5"/>
<!-- PBI-CLI block art (shadow) -->
<text font-family="'Courier New', Courier, monospace" font-size="7" fill="#7A6508" xml:space="preserve">
<tspan x="316" y="118">██████╗ ██████╗ ██╗ ██████╗ ██╗ ██╗</tspan>
<tspan x="316" y="128">██╔══██╗ ██╔══██╗ ██║ ██╔════╝ ██║ ██║</tspan>
<tspan x="316" y="138">██████╔╝ ██████╔╝ ██║ ███╗ ██║ ██║ ██║</tspan>
<tspan x="316" y="148">██╔═══╝ ██╔══██╗ ██║ ╚══╝ ██║ ██║ ██║</tspan>
<tspan x="316" y="158">██║ ██████╔╝ ██║ ╚██████╗ ███████╗ ██║</tspan>
<tspan x="316" y="168">╚═╝ ╚═════╝ ╚═╝ ╚═════╝ ╚══════╝ ╚═╝</tspan>
</text>
<!-- PBI-CLI block art (main) -->
<text font-family="'Courier New', Courier, monospace" font-size="7" fill="#F2C811" xml:space="preserve">
<tspan x="315" y="117">██████╗ ██████╗ ██╗ ██████╗ ██╗ ██╗</tspan>
<tspan x="315" y="127">██╔══██╗ ██╔══██╗ ██║ ██╔════╝ ██║ ██║</tspan>
<tspan x="315" y="137">██████╔╝ ██████╔╝ ██║ ███╗ ██║ ██║ ██║</tspan>
<tspan x="315" y="147">██╔═══╝ ██╔══██╗ ██║ ╚══╝ ██║ ██║ ██║</tspan>
<tspan x="315" y="157">██║ ██████╔╝ ██║ ╚██████╗ ███████╗ ██║</tspan>
<tspan x="315" y="167">╚═╝ ╚═════╝ ╚═╝ ╚═════╝ ╚══════╝ ╚═╝</tspan>
</text>
<!-- Right arrow -->
<line x1="560" y1="135" x2="655" y2="135" stroke="#F2C811" stroke-width="2" stroke-dasharray="6,4" stroke-opacity="0.5"/>
<polygon points="659,135 651,130 651,140" fill="#F2C811" fill-opacity="0.5"/>
<!-- Power BI logo (inline, original 630x630, displayed as 50x50, centered at x=700) -->
<svg x="675" y="110" width="50" height="50" viewBox="0 0 630 630">
<g transform="translate(77.5, 0)">
<rect fill="url(#pbi-lg1)" x="256" y="0" width="219" height="630" rx="26"/>
<path fill="url(#pbi-lg2)" d="M346,604 L346,630 L320,630 L153,630 C138.64,630 127,618.36 127,604 L127,183 C127,168.64 138.64,157 153,157 L320,157 C334.36,157 346,168.64 346,183 L346,604 Z"/>
<path fill="url(#pbi-lg5)" d="M219,604 L219,630 L193,630 L26,630 C11.64,630 0,618.36 0,604 L0,341 C0,326.64 11.64,315 26,315 L193,315 C207.36,315 219,326.64 219,341 L219,604 Z"/>
</g>
</svg>
<text x="700" y="175" font-family="'Segoe UI', Arial, sans-serif" font-size="11" fill="#F2C811" text-anchor="middle" font-weight="600">Power BI</text>
<!-- Modeling + Reporting pills -->
<rect x="308" y="176" width="100" height="20" rx="10" fill="#58a6ff" fill-opacity="0.1" stroke="#58a6ff" stroke-width="1"/>
<text x="358" y="190" font-family="'Segoe UI', Arial, sans-serif" font-size="10" fill="#58a6ff" text-anchor="middle" font-weight="600">Modeling</text>
<text x="420" y="190" font-family="'Segoe UI', Arial, sans-serif" font-size="10" fill="#8b949e" text-anchor="middle">+</text>
<rect x="432" y="176" width="100" height="20" rx="10" fill="#06d6a0" fill-opacity="0.1" stroke="#06d6a0" stroke-width="1"/>
<text x="482" y="190" font-family="'Segoe UI', Arial, sans-serif" font-size="10" fill="#06d6a0" text-anchor="middle" font-weight="600">Reporting</text>
<!-- Bottom separator -->
<line x1="60" y1="200" x2="790" y2="200" stroke="#F2C811" stroke-opacity="0.25" stroke-width="2"/>
<!-- ==================== END HEADER ==================== -->
<!-- Feature content (shifted down by 210px) -->
<g transform="translate(0, 210)">
<!-- 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="13" fill="#8b949e" text-anchor="middle">Plain English in, Power BI changes out</text>
@ -58,4 +173,6 @@
<!-- Footer -->
<text x="425" y="508" font-family="'Segoe UI', Arial, sans-serif" font-size="13" fill="#8b949e" text-anchor="middle">No DAX syntax to memorize. No GUI menus to navigate. Just describe what you need.</text>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 4.6 KiB

After

Width:  |  Height:  |  Size: 17 KiB

347
assets/commands.svg Normal file
View file

@ -0,0 +1,347 @@
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="850" height="590" viewBox="0 0 850 590">
<defs>
<linearGradient id="hdr-bar1" x1="50%" y1="0%" x2="50%" y2="100%">
<stop offset="0%" stop-color="#EBBB14"/>
<stop offset="100%" stop-color="#B25400"/>
</linearGradient>
<linearGradient id="hdr-bar2" x1="50%" y1="0%" x2="50%" y2="100%">
<stop offset="0%" stop-color="#F9E583"/>
<stop offset="100%" stop-color="#DE9800"/>
</linearGradient>
<linearGradient id="hdr-bar3" x1="50%" y1="0%" x2="50%" y2="100%">
<stop offset="0%" stop-color="#F9E68B"/>
<stop offset="100%" stop-color="#F3CD32"/>
</linearGradient>
<linearGradient id="pbi-lg1" x1="50%" y1="0%" x2="50%" y2="100%">
<stop offset="0%" stop-color="#EBBB14"/>
<stop offset="100%" stop-color="#B25400"/>
</linearGradient>
<linearGradient id="pbi-lg2" x1="50%" y1="0%" x2="50%" y2="100%">
<stop offset="0%" stop-color="#F9E583"/>
<stop offset="100%" stop-color="#DE9800"/>
</linearGradient>
<linearGradient id="pbi-lg5" x1="50%" y1="0%" x2="50%" y2="100%">
<stop offset="0%" stop-color="#F9E68B"/>
<stop offset="100%" stop-color="#F3CD32"/>
</linearGradient>
</defs>
<!-- Full background -->
<rect width="100%" height="100%" fill="#0d1117"/>
<!-- ==================== VIBE BI HEADER ==================== -->
<!-- "VIBE BI" block art (shadow) -->
<text font-family="'Courier New', Courier, monospace" font-size="9" fill="#7A6508" xml:space="preserve">
<tspan x="296" y="22">██╗ ██╗ ██╗ ██████╗ ███████╗ ██████╗ ██╗</tspan>
<tspan x="296" y="33">██║ ██║ ██║ ██╔══██╗ ██╔════╝ ██╔══██╗ ██║</tspan>
<tspan x="296" y="44">██║ ██║ ██║ ██████╔╝ █████╗ ██████╔╝ ██║</tspan>
<tspan x="296" y="55">╚██╗ ██╔╝ ██║ ██╔══██╗ ██╔══╝ ██╔══██╗ ██║</tspan>
<tspan x="296" y="66"> ╚████╔╝ ██║ ██████╔╝ ███████╗ ██████╔╝ ██║</tspan>
<tspan x="296" y="77"> ╚═══╝ ╚═╝ ╚═════╝ ╚══════╝ ╚═════╝ ╚═╝</tspan>
</text>
<!-- "VIBE BI" block art (main) -->
<text font-family="'Courier New', Courier, monospace" font-size="9" fill="#F2C811" xml:space="preserve">
<tspan x="295" y="21">██╗ ██╗ ██╗ ██████╗ ███████╗ ██████╗ ██╗</tspan>
<tspan x="295" y="32">██║ ██║ ██║ ██╔══██╗ ██╔════╝ ██╔══██╗ ██║</tspan>
<tspan x="295" y="43">██║ ██║ ██║ ██████╔╝ █████╗ ██████╔╝ ██║</tspan>
<tspan x="295" y="54">╚██╗ ██╔╝ ██║ ██╔══██╗ ██╔══╝ ██╔══██╗ ██║</tspan>
<tspan x="295" y="65"> ╚████╔╝ ██║ ██████╔╝ ███████╗ ██████╔╝ ██║</tspan>
<tspan x="295" y="76"> ╚═══╝ ╚═╝ ╚═════╝ ╚══════╝ ╚═════╝ ╚═╝</tspan>
</text>
<!-- Separator -->
<line x1="60" y1="84" x2="790" y2="84" stroke="#F2C811" stroke-opacity="0.15" stroke-width="1"/>
<!-- Tagline -->
<text x="425" y="100" font-family="'Segoe UI', Arial, sans-serif" font-size="13" fill="#e6edf3" text-anchor="middle" font-weight="600">The First CLI for Both Power BI Modeling and Reporting</text>
<!-- ===== Connection Flow: Claude > PBI-CLI > Power BI ===== -->
<!-- Claude AI logo (inline, original 1200x1200, displayed as 50x50, centered at x=110) -->
<svg x="85" y="110" width="50" height="50" viewBox="0 0 1200 1200">
<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"/>
</svg>
<text x="110" y="175" 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="155" y1="135" x2="290" y2="135" stroke="#F2C811" stroke-width="2" stroke-dasharray="6,4" stroke-opacity="0.5"/>
<polygon points="294,135 286,130 286,140" fill="#F2C811" fill-opacity="0.5"/>
<!-- PBI-CLI block art (shadow) -->
<text font-family="'Courier New', Courier, monospace" font-size="7" fill="#7A6508" xml:space="preserve">
<tspan x="316" y="118">██████╗ ██████╗ ██╗ ██████╗ ██╗ ██╗</tspan>
<tspan x="316" y="128">██╔══██╗ ██╔══██╗ ██║ ██╔════╝ ██║ ██║</tspan>
<tspan x="316" y="138">██████╔╝ ██████╔╝ ██║ ███╗ ██║ ██║ ██║</tspan>
<tspan x="316" y="148">██╔═══╝ ██╔══██╗ ██║ ╚══╝ ██║ ██║ ██║</tspan>
<tspan x="316" y="158">██║ ██████╔╝ ██║ ╚██████╗ ███████╗ ██║</tspan>
<tspan x="316" y="168">╚═╝ ╚═════╝ ╚═╝ ╚═════╝ ╚══════╝ ╚═╝</tspan>
</text>
<!-- PBI-CLI block art (main) -->
<text font-family="'Courier New', Courier, monospace" font-size="7" fill="#F2C811" xml:space="preserve">
<tspan x="315" y="117">██████╗ ██████╗ ██╗ ██████╗ ██╗ ██╗</tspan>
<tspan x="315" y="127">██╔══██╗ ██╔══██╗ ██║ ██╔════╝ ██║ ██║</tspan>
<tspan x="315" y="137">██████╔╝ ██████╔╝ ██║ ███╗ ██║ ██║ ██║</tspan>
<tspan x="315" y="147">██╔═══╝ ██╔══██╗ ██║ ╚══╝ ██║ ██║ ██║</tspan>
<tspan x="315" y="157">██║ ██████╔╝ ██║ ╚██████╗ ███████╗ ██║</tspan>
<tspan x="315" y="167">╚═╝ ╚═════╝ ╚═╝ ╚═════╝ ╚══════╝ ╚═╝</tspan>
</text>
<!-- Right arrow -->
<line x1="560" y1="135" x2="655" y2="135" stroke="#F2C811" stroke-width="2" stroke-dasharray="6,4" stroke-opacity="0.5"/>
<polygon points="659,135 651,130 651,140" fill="#F2C811" fill-opacity="0.5"/>
<!-- Power BI logo (inline, original 630x630, displayed as 50x50, centered at x=700) -->
<svg x="675" y="110" width="50" height="50" viewBox="0 0 630 630">
<g transform="translate(77.5, 0)">
<rect fill="url(#pbi-lg1)" x="256" y="0" width="219" height="630" rx="26"/>
<path fill="url(#pbi-lg2)" d="M346,604 L346,630 L320,630 L153,630 C138.64,630 127,618.36 127,604 L127,183 C127,168.64 138.64,157 153,157 L320,157 C334.36,157 346,168.64 346,183 L346,604 Z"/>
<path fill="url(#pbi-lg5)" d="M219,604 L219,630 L193,630 L26,630 C11.64,630 0,618.36 0,604 L0,341 C0,326.64 11.64,315 26,315 L193,315 C207.36,315 219,326.64 219,341 L219,604 Z"/>
</g>
</svg>
<text x="700" y="175" font-family="'Segoe UI', Arial, sans-serif" font-size="11" fill="#F2C811" text-anchor="middle" font-weight="600">Power BI</text>
<!-- Modeling + Reporting pills -->
<rect x="308" y="176" width="100" height="20" rx="10" fill="#58a6ff" fill-opacity="0.1" stroke="#58a6ff" stroke-width="1"/>
<text x="358" y="190" font-family="'Segoe UI', Arial, sans-serif" font-size="10" fill="#58a6ff" text-anchor="middle" font-weight="600">Modeling</text>
<text x="420" y="190" font-family="'Segoe UI', Arial, sans-serif" font-size="10" fill="#8b949e" text-anchor="middle">+</text>
<rect x="432" y="176" width="100" height="20" rx="10" fill="#06d6a0" fill-opacity="0.1" stroke="#06d6a0" stroke-width="1"/>
<text x="482" y="190" font-family="'Segoe UI', Arial, sans-serif" font-size="10" fill="#06d6a0" text-anchor="middle" font-weight="600">Reporting</text>
<!-- Bottom separator -->
<line x1="60" y1="200" x2="790" y2="200" stroke="#F2C811" stroke-opacity="0.25" stroke-width="2"/>
<!-- ==================== END HEADER ==================== -->
<!-- Feature content (shifted down by 210px) -->
<g transform="translate(0, 210)">
<!-- 1. BACKGROUND -->
<!-- 2. TERMINAL CHROME BAR -->
<rect x="0" y="0" width="850" height="46" rx="8" fill="#161b22"/>
<rect x="0" y="30" width="850" height="16" fill="#161b22"/>
<circle cx="28" cy="23" r="6" fill="#ff5f57"/>
<circle cx="48" cy="23" r="6" fill="#febc2e"/>
<circle cx="68" cy="23" r="6" fill="#28c840"/>
<text x="425" y="28" font-family="'Courier New', Courier, monospace" font-size="12" fill="#6e7681" text-anchor="middle">pbi-cli -- command showcase</text>
<!-- 3. VERTICAL COLUMN DIVIDER -->
<line x1="425" y1="46" x2="425" y2="295" stroke="#30363d" stroke-width="1"/>
<!-- 4. COLUMN HEADERS -->
<rect x="35" y="52" width="100" height="21" rx="10" fill="#58a6ff" fill-opacity="0.12" stroke="#58a6ff" stroke-width="1"/>
<text x="85" y="66" font-family="'Segoe UI', Arial, sans-serif" font-size="11" fill="#58a6ff" text-anchor="middle" font-weight="bold">MODELING</text>
<rect x="440" y="52" width="105" height="21" rx="10" fill="#06d6a0" fill-opacity="0.12" stroke="#06d6a0" stroke-width="1"/>
<text x="492" y="66" font-family="'Segoe UI', Arial, sans-serif" font-size="11" fill="#06d6a0" text-anchor="middle" font-weight="bold">REPORTING</text>
<!-- 5. ROW BACKGROUND HIGHLIGHTS -->
<rect x="0" y="84" width="425" height="33" fill="#58a6ff" fill-opacity="0.02"/>
<rect x="425" y="84" width="425" height="33" fill="#58a6ff" fill-opacity="0.02"/>
<rect x="0" y="154" width="425" height="33" fill="#58a6ff" fill-opacity="0.02"/>
<rect x="425" y="154" width="425" height="33" fill="#58a6ff" fill-opacity="0.02"/>
<rect x="0" y="224" width="425" height="33" fill="#58a6ff" fill-opacity="0.02"/>
<rect x="425" y="224" width="425" height="33" fill="#58a6ff" fill-opacity="0.02"/>
<!-- ===== LEFT COLUMN COMMANDS ===== -->
<!-- Row 1 y=102: model export -->
<text x="38" y="102" font-family="'Courier New', Courier, monospace" font-size="12" fill="#6e7681">$</text>
<text x="50" y="102" font-family="'Courier New', Courier, monospace" font-size="12" fill="#F2C811">pbi-cli</text>
<text x="98" y="102" font-family="'Courier New', Courier, monospace" font-size="12" fill="#a5d6ff"> model export</text>
<!-- Row 2 y=137: dax run -->
<text x="38" y="137" font-family="'Courier New', Courier, monospace" font-size="12" fill="#6e7681">$</text>
<text x="50" y="137" font-family="'Courier New', Courier, monospace" font-size="12" fill="#F2C811">pbi-cli</text>
<text x="98" y="137" font-family="'Courier New', Courier, monospace" font-size="12" fill="#a5d6ff"> dax run</text>
<!-- Row 3 y=172: dax add-measure -->
<text x="38" y="172" font-family="'Courier New', Courier, monospace" font-size="12" fill="#6e7681">$</text>
<text x="50" y="172" font-family="'Courier New', Courier, monospace" font-size="12" fill="#F2C811">pbi-cli</text>
<text x="98" y="172" font-family="'Courier New', Courier, monospace" font-size="12" fill="#a5d6ff"> dax add-measure</text>
<!-- Row 4 y=207: table list -->
<text x="38" y="207" font-family="'Courier New', Courier, monospace" font-size="12" fill="#6e7681">$</text>
<text x="50" y="207" font-family="'Courier New', Courier, monospace" font-size="12" fill="#F2C811">pbi-cli</text>
<text x="98" y="207" font-family="'Courier New', Courier, monospace" font-size="12" fill="#a5d6ff"> table list</text>
<!-- Row 5 y=242: relationship list -->
<text x="38" y="242" font-family="'Courier New', Courier, monospace" font-size="12" fill="#6e7681">$</text>
<text x="50" y="242" font-family="'Courier New', Courier, monospace" font-size="12" fill="#F2C811">pbi-cli</text>
<text x="98" y="242" font-family="'Courier New', Courier, monospace" font-size="12" fill="#a5d6ff"> relationship list</text>
<!-- Row 6 y=277: model import -->
<text x="38" y="277" font-family="'Courier New', Courier, monospace" font-size="12" fill="#6e7681">$</text>
<text x="50" y="277" font-family="'Courier New', Courier, monospace" font-size="12" fill="#F2C811">pbi-cli</text>
<text x="98" y="277" font-family="'Courier New', Courier, monospace" font-size="12" fill="#a5d6ff"> model import</text>
<!-- ===== RIGHT COLUMN COMMANDS ===== -->
<!-- Row 1 y=102: report add-visual -->
<text x="443" y="102" font-family="'Courier New', Courier, monospace" font-size="12" fill="#6e7681">$</text>
<text x="455" y="102" font-family="'Courier New', Courier, monospace" font-size="12" fill="#F2C811">pbi-cli</text>
<text x="503" y="102" font-family="'Courier New', Courier, monospace" font-size="12" fill="#7ee787"> report add-visual</text>
<!-- Row 2 y=137: report bind-data -->
<text x="443" y="137" font-family="'Courier New', Courier, monospace" font-size="12" fill="#6e7681">$</text>
<text x="455" y="137" font-family="'Courier New', Courier, monospace" font-size="12" fill="#F2C811">pbi-cli</text>
<text x="503" y="137" font-family="'Courier New', Courier, monospace" font-size="12" fill="#7ee787"> report bind-data</text>
<!-- Row 3 y=172: report add-page -->
<text x="443" y="172" font-family="'Courier New', Courier, monospace" font-size="12" fill="#6e7681">$</text>
<text x="455" y="172" font-family="'Courier New', Courier, monospace" font-size="12" fill="#F2C811">pbi-cli</text>
<text x="503" y="172" font-family="'Courier New', Courier, monospace" font-size="12" fill="#7ee787"> report add-page</text>
<!-- Row 4 y=207: report list-visuals -->
<text x="443" y="207" font-family="'Courier New', Courier, monospace" font-size="12" fill="#6e7681">$</text>
<text x="455" y="207" font-family="'Courier New', Courier, monospace" font-size="12" fill="#F2C811">pbi-cli</text>
<text x="503" y="207" font-family="'Courier New', Courier, monospace" font-size="12" fill="#7ee787"> report list-visuals</text>
<!-- Row 5 y=242: report update-theme -->
<text x="443" y="242" font-family="'Courier New', Courier, monospace" font-size="12" fill="#6e7681">$</text>
<text x="455" y="242" font-family="'Courier New', Courier, monospace" font-size="12" fill="#F2C811">pbi-cli</text>
<text x="503" y="242" font-family="'Courier New', Courier, monospace" font-size="12" fill="#7ee787"> report update-theme</text>
<!-- Row 6 y=277: report export -->
<text x="443" y="277" font-family="'Courier New', Courier, monospace" font-size="12" fill="#6e7681">$</text>
<text x="455" y="277" font-family="'Courier New', Courier, monospace" font-size="12" fill="#F2C811">pbi-cli</text>
<text x="503" y="277" font-family="'Courier New', Courier, monospace" font-size="12" fill="#7ee787"> report export</text>
<!-- ===== LEFT COLUMN VISUAL ICONS (replacing text badges) ===== -->
<!-- Row 1: model export → file with up-arrow (TMDL export) -->
<g transform="translate(373, 91)">
<rect x="0" y="2" width="16" height="14" rx="1.5" fill="#58a6ff" fill-opacity="0.12" stroke="#58a6ff" stroke-width="1"/>
<line x1="8" y1="11" x2="8" y2="5" stroke="#58a6ff" stroke-width="1.5" stroke-linecap="round"/>
<polygon points="8,3 5,7 11,7" fill="#58a6ff"/>
<line x1="3" y1="13" x2="13" y2="13" stroke="#58a6ff" stroke-width="1" opacity="0.5"/>
</g>
<!-- Row 2: dax run → play triangle (DAX execute) -->
<g transform="translate(375, 126)">
<circle cx="8" cy="8" r="8" fill="#F2C811" fill-opacity="0.12" stroke="#F2C811" stroke-width="1"/>
<polygon points="5,4 5,12 13,8" fill="#F2C811" fill-opacity="0.9"/>
</g>
<!-- Row 3: dax add-measure → sparkle / AI star -->
<g transform="translate(377, 161)">
<path d="M8,0 L9.5,6 L16,8 L9.5,10 L8,16 L6.5,10 L0,8 L6.5,6 Z" fill="#c084fc" fill-opacity="0.85"/>
</g>
<!-- Row 4: table list → rows/grid icon -->
<g transform="translate(373, 196)">
<rect x="0" y="0" width="16" height="3" rx="1" fill="#8b949e" fill-opacity="0.8"/>
<rect x="0" y="5" width="16" height="3" rx="1" fill="#8b949e" fill-opacity="0.6"/>
<rect x="0" y="10" width="16" height="3" rx="1" fill="#8b949e" fill-opacity="0.4"/>
<rect x="0" y="15" width="16" height="3" rx="1" fill="#8b949e" fill-opacity="0.25"/>
</g>
<!-- Row 5: relationship list → two nodes with edge -->
<g transform="translate(373, 231)">
<circle cx="4" cy="8" r="4" fill="none" stroke="#8b949e" stroke-width="1.5"/>
<circle cx="16" cy="4" r="4" fill="none" stroke="#8b949e" stroke-width="1.5"/>
<line x1="4" y1="4" x2="16" y2="4" stroke="#8b949e" stroke-width="1.5"/>
<circle cx="4" cy="4" r="1.5" fill="#8b949e"/>
<circle cx="16" cy="4" r="1.5" fill="#8b949e"/>
</g>
<!-- Row 6: model import → file with down-arrow -->
<g transform="translate(373, 266)">
<rect x="0" y="2" width="16" height="14" rx="1.5" fill="#58a6ff" fill-opacity="0.12" stroke="#58a6ff" stroke-width="1"/>
<line x1="8" y1="5" x2="8" y2="11" stroke="#58a6ff" stroke-width="1.5" stroke-linecap="round"/>
<polygon points="8,14 5,9 11,9" fill="#58a6ff"/>
<line x1="3" y1="13" x2="13" y2="13" stroke="#58a6ff" stroke-width="1" opacity="0.5"/>
</g>
<!-- ===== RIGHT COLUMN VISUAL ICONS (replacing text badges) ===== -->
<!-- Row 1: report add-visual → small bar chart in frame -->
<g transform="translate(796, 91)">
<rect x="0" y="0" width="20" height="16" rx="2" fill="none" stroke="#06d6a0" stroke-width="1"/>
<rect x="2" y="8" width="3" height="6" rx="0.5" fill="#06d6a0" fill-opacity="0.6"/>
<rect x="7" y="5" width="3" height="9" rx="0.5" fill="#06d6a0" fill-opacity="0.75"/>
<rect x="12" y="2" width="3" height="12" rx="0.5" fill="#06d6a0" fill-opacity="0.9"/>
<rect x="17" y="4" width="2" height="10" rx="0.5" fill="#06d6a0" fill-opacity="0.8"/>
</g>
<!-- Row 2: report bind-data → link chain -->
<g transform="translate(796, 126)">
<circle cx="5" cy="8" r="5" fill="none" stroke="#06d6a0" stroke-width="1.5"/>
<circle cx="15" cy="8" r="5" fill="none" stroke="#06d6a0" stroke-width="1.5"/>
<rect x="7" y="5" width="6" height="6" rx="2" fill="#06d6a0" fill-opacity="0.35" stroke="#06d6a0" stroke-width="1"/>
</g>
<!-- Row 3: report add-page → page with plus -->
<g transform="translate(796, 161)">
<rect x="0" y="0" width="14" height="18" rx="2" fill="none" stroke="#06d6a0" stroke-width="1.5"/>
<line x1="14" y1="8" x2="20" y2="8" stroke="#06d6a0" stroke-width="1.5" stroke-linecap="round"/>
<line x1="17" y1="5" x2="17" y2="11" stroke="#06d6a0" stroke-width="1.5" stroke-linecap="round"/>
<line x1="3" y1="6" x2="11" y2="6" stroke="#06d6a0" stroke-width="1" opacity="0.4"/>
<line x1="3" y1="9" x2="11" y2="9" stroke="#06d6a0" stroke-width="1" opacity="0.4"/>
<line x1="3" y1="12" x2="9" y2="12" stroke="#06d6a0" stroke-width="1" opacity="0.4"/>
</g>
<!-- Row 4: report list-visuals → eye / view icon -->
<g transform="translate(796, 196)">
<path d="M0,8 C3,2 17,2 20,8 C17,14 3,14 0,8 Z" fill="none" stroke="#8b949e" stroke-width="1.5"/>
<circle cx="10" cy="8" r="3.5" fill="none" stroke="#8b949e" stroke-width="1.5"/>
<circle cx="10" cy="8" r="1.5" fill="#8b949e" fill-opacity="0.7"/>
</g>
<!-- Row 5: report update-theme → palette circle with color dots -->
<g transform="translate(796, 230)">
<circle cx="10" cy="10" r="9" fill="none" stroke="#FF9500" stroke-width="1.5"/>
<circle cx="10" cy="12" r="3" fill="#0d1117" stroke="#FF9500" stroke-width="1"/>
<circle cx="5" cy="5" r="2.5" fill="#06d6a0" fill-opacity="0.9"/>
<circle cx="10" cy="2" r="2.5" fill="#F2C811" fill-opacity="0.9"/>
<circle cx="15" cy="5" r="2.5" fill="#58a6ff" fill-opacity="0.9"/>
<circle cx="17" cy="11" r="2.5" fill="#c084fc" fill-opacity="0.9"/>
</g>
<!-- Row 6: report export → box with up-arrow -->
<g transform="translate(796, 266)">
<rect x="0" y="6" width="20" height="12" rx="2" fill="none" stroke="#58a6ff" stroke-width="1.5"/>
<line x1="10" y1="12" x2="10" y2="2" stroke="#58a6ff" stroke-width="1.5" stroke-linecap="round"/>
<polygon points="10,0 6,5 14,5" fill="#58a6ff"/>
<line x1="4" y1="10" x2="4" y2="18" stroke="#58a6ff" stroke-width="1" opacity="0.3"/>
<line x1="16" y1="10" x2="16" y2="18" stroke="#58a6ff" stroke-width="1" opacity="0.3"/>
</g>
<!-- 7. HORIZONTAL SEPARATOR ABOVE FOOTER -->
<line x1="0" y1="295" x2="850" y2="295" stroke="#30363d" stroke-width="1"/>
<!-- 8. FOOTER BAR -->
<rect x="0" y="295" width="850" height="85" fill="#161b22"/>
<!-- Footer stat badges with visual icons -->
<!-- Badge 1: 30+ commands -->
<rect x="153" y="318" width="120" height="36" rx="14" fill="#58a6ff" fill-opacity="0.1" stroke="#58a6ff" stroke-width="1"/>
<!-- Terminal icon -->
<g transform="translate(163, 327)">
<rect x="0" y="0" width="16" height="12" rx="2" fill="#58a6ff" fill-opacity="0.15" stroke="#58a6ff" stroke-width="1"/>
<text x="2" y="9" font-family="'Courier New', monospace" font-size="7" fill="#58a6ff">$_</text>
</g>
<text x="225" y="338" font-family="'Segoe UI', Arial, sans-serif" font-size="12" fill="#58a6ff" text-anchor="middle" font-weight="bold">30+ commands</text>
<!-- Badge 2: Both layers with icon -->
<rect x="365" y="318" width="120" height="36" rx="14" fill="#F2C811" fill-opacity="0.1" stroke="#F2C811" stroke-width="1"/>
<!-- Stack icon -->
<g transform="translate(375, 327)">
<rect x="0" y="0" width="16" height="4" rx="1" fill="#58a6ff" fill-opacity="0.7"/>
<rect x="0" y="6" width="16" height="4" rx="1" fill="#06d6a0" fill-opacity="0.7"/>
</g>
<text x="425" y="338" font-family="'Segoe UI', Arial, sans-serif" font-size="12" fill="#F2C811" text-anchor="middle" font-weight="bold">Both layers</text>
<!-- Badge 3: AI-native with sparkle icon -->
<rect x="577" y="318" width="120" height="36" rx="14" fill="#c084fc" fill-opacity="0.1" stroke="#c084fc" stroke-width="1"/>
<!-- Sparkle icon -->
<g transform="translate(584, 326)">
<path d="M6,0 L7.2,4.8 L12,6 L7.2,7.2 L6,12 L4.8,7.2 L0,6 L4.8,4.8 Z" fill="#c084fc" fill-opacity="0.85"/>
</g>
<text x="637" y="338" font-family="'Segoe UI', Arial, sans-serif" font-size="12" fill="#c084fc" text-anchor="middle" font-weight="bold">AI-native</text>
<!-- Footer subtext -->
<text x="425" y="368" font-family="'Segoe UI', Arial, sans-serif" font-size="10" fill="#6e7681" text-anchor="middle">pipx install pbi-cli-tool</text>
</g>
</svg>

After

Width:  |  Height:  |  Size: 26 KiB

186
assets/cta-start.svg Normal file
View file

@ -0,0 +1,186 @@
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="850" height="690" viewBox="0 0 850 690">
<defs>
<linearGradient id="hdr-bar1" x1="50%" y1="0%" x2="50%" y2="100%">
<stop offset="0%" stop-color="#EBBB14"/>
<stop offset="100%" stop-color="#B25400"/>
</linearGradient>
<linearGradient id="hdr-bar2" x1="50%" y1="0%" x2="50%" y2="100%">
<stop offset="0%" stop-color="#F9E583"/>
<stop offset="100%" stop-color="#DE9800"/>
</linearGradient>
<linearGradient id="hdr-bar3" x1="50%" y1="0%" x2="50%" y2="100%">
<stop offset="0%" stop-color="#F9E68B"/>
<stop offset="100%" stop-color="#F3CD32"/>
</linearGradient>
<linearGradient id="pbi-lg1" x1="50%" y1="0%" x2="50%" y2="100%">
<stop offset="0%" stop-color="#EBBB14"/>
<stop offset="100%" stop-color="#B25400"/>
</linearGradient>
<linearGradient id="pbi-lg2" x1="50%" y1="0%" x2="50%" y2="100%">
<stop offset="0%" stop-color="#F9E583"/>
<stop offset="100%" stop-color="#DE9800"/>
</linearGradient>
<linearGradient id="pbi-lg5" x1="50%" y1="0%" x2="50%" y2="100%">
<stop offset="0%" stop-color="#F9E68B"/>
<stop offset="100%" stop-color="#F3CD32"/>
</linearGradient>
<style>
@keyframes blink {
0%, 100% { opacity: 1; }
50% { opacity: 0; }
}
.cursor { animation: blink 1s step-end infinite; }
</style>
</defs>
<!-- Full background -->
<rect width="100%" height="100%" fill="#0d1117"/>
<!-- ==================== VIBE BI HEADER ==================== -->
<!-- "VIBE BI" block art (shadow) -->
<text font-family="'Courier New', Courier, monospace" font-size="9" fill="#7A6508" xml:space="preserve">
<tspan x="296" y="22">██╗ ██╗ ██╗ ██████╗ ███████╗ ██████╗ ██╗</tspan>
<tspan x="296" y="33">██║ ██║ ██║ ██╔══██╗ ██╔════╝ ██╔══██╗ ██║</tspan>
<tspan x="296" y="44">██║ ██║ ██║ ██████╔╝ █████╗ ██████╔╝ ██║</tspan>
<tspan x="296" y="55">╚██╗ ██╔╝ ██║ ██╔══██╗ ██╔══╝ ██╔══██╗ ██║</tspan>
<tspan x="296" y="66"> ╚████╔╝ ██║ ██████╔╝ ███████╗ ██████╔╝ ██║</tspan>
<tspan x="296" y="77"> ╚═══╝ ╚═╝ ╚═════╝ ╚══════╝ ╚═════╝ ╚═╝</tspan>
</text>
<!-- "VIBE BI" block art (main) -->
<text font-family="'Courier New', Courier, monospace" font-size="9" fill="#F2C811" xml:space="preserve">
<tspan x="295" y="21">██╗ ██╗ ██╗ ██████╗ ███████╗ ██████╗ ██╗</tspan>
<tspan x="295" y="32">██║ ██║ ██║ ██╔══██╗ ██╔════╝ ██╔══██╗ ██║</tspan>
<tspan x="295" y="43">██║ ██║ ██║ ██████╔╝ █████╗ ██████╔╝ ██║</tspan>
<tspan x="295" y="54">╚██╗ ██╔╝ ██║ ██╔══██╗ ██╔══╝ ██╔══██╗ ██║</tspan>
<tspan x="295" y="65"> ╚████╔╝ ██║ ██████╔╝ ███████╗ ██████╔╝ ██║</tspan>
<tspan x="295" y="76"> ╚═══╝ ╚═╝ ╚═════╝ ╚══════╝ ╚═════╝ ╚═╝</tspan>
</text>
<!-- Separator -->
<line x1="60" y1="84" x2="790" y2="84" stroke="#F2C811" stroke-opacity="0.15" stroke-width="1"/>
<!-- Tagline -->
<text x="425" y="100" font-family="'Segoe UI', Arial, sans-serif" font-size="13" fill="#e6edf3" text-anchor="middle" font-weight="600">The First CLI for Both Power BI Modeling and Reporting</text>
<!-- ===== Connection Flow: Claude > PBI-CLI > Power BI ===== -->
<!-- Claude AI logo (inline, original 1200x1200, displayed as 50x50, centered at x=110) -->
<svg x="85" y="110" width="50" height="50" viewBox="0 0 1200 1200">
<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"/>
</svg>
<text x="110" y="175" 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="155" y1="135" x2="290" y2="135" stroke="#F2C811" stroke-width="2" stroke-dasharray="6,4" stroke-opacity="0.5"/>
<polygon points="294,135 286,130 286,140" fill="#F2C811" fill-opacity="0.5"/>
<!-- PBI-CLI block art (shadow) -->
<text font-family="'Courier New', Courier, monospace" font-size="7" fill="#7A6508" xml:space="preserve">
<tspan x="316" y="118">██████╗ ██████╗ ██╗ ██████╗ ██╗ ██╗</tspan>
<tspan x="316" y="128">██╔══██╗ ██╔══██╗ ██║ ██╔════╝ ██║ ██║</tspan>
<tspan x="316" y="138">██████╔╝ ██████╔╝ ██║ ███╗ ██║ ██║ ██║</tspan>
<tspan x="316" y="148">██╔═══╝ ██╔══██╗ ██║ ╚══╝ ██║ ██║ ██║</tspan>
<tspan x="316" y="158">██║ ██████╔╝ ██║ ╚██████╗ ███████╗ ██║</tspan>
<tspan x="316" y="168">╚═╝ ╚═════╝ ╚═╝ ╚═════╝ ╚══════╝ ╚═╝</tspan>
</text>
<!-- PBI-CLI block art (main) -->
<text font-family="'Courier New', Courier, monospace" font-size="7" fill="#F2C811" xml:space="preserve">
<tspan x="315" y="117">██████╗ ██████╗ ██╗ ██████╗ ██╗ ██╗</tspan>
<tspan x="315" y="127">██╔══██╗ ██╔══██╗ ██║ ██╔════╝ ██║ ██║</tspan>
<tspan x="315" y="137">██████╔╝ ██████╔╝ ██║ ███╗ ██║ ██║ ██║</tspan>
<tspan x="315" y="147">██╔═══╝ ██╔══██╗ ██║ ╚══╝ ██║ ██║ ██║</tspan>
<tspan x="315" y="157">██║ ██████╔╝ ██║ ╚██████╗ ███████╗ ██║</tspan>
<tspan x="315" y="167">╚═╝ ╚═════╝ ╚═╝ ╚═════╝ ╚══════╝ ╚═╝</tspan>
</text>
<!-- Right arrow -->
<line x1="560" y1="135" x2="655" y2="135" stroke="#F2C811" stroke-width="2" stroke-dasharray="6,4" stroke-opacity="0.5"/>
<polygon points="659,135 651,130 651,140" fill="#F2C811" fill-opacity="0.5"/>
<!-- Power BI logo (inline, original 630x630, displayed as 50x50, centered at x=700) -->
<svg x="675" y="110" width="50" height="50" viewBox="0 0 630 630">
<g transform="translate(77.5, 0)">
<rect fill="url(#pbi-lg1)" x="256" y="0" width="219" height="630" rx="26"/>
<path fill="url(#pbi-lg2)" d="M346,604 L346,630 L320,630 L153,630 C138.64,630 127,618.36 127,604 L127,183 C127,168.64 138.64,157 153,157 L320,157 C334.36,157 346,168.64 346,183 L346,604 Z"/>
<path fill="url(#pbi-lg5)" d="M219,604 L219,630 L193,630 L26,630 C11.64,630 0,618.36 0,604 L0,341 C0,326.64 11.64,315 26,315 L193,315 C207.36,315 219,326.64 219,341 L219,604 Z"/>
</g>
</svg>
<text x="700" y="175" font-family="'Segoe UI', Arial, sans-serif" font-size="11" fill="#F2C811" text-anchor="middle" font-weight="600">Power BI</text>
<!-- Modeling + Reporting pills -->
<rect x="308" y="176" width="100" height="20" rx="10" fill="#58a6ff" fill-opacity="0.1" stroke="#58a6ff" stroke-width="1"/>
<text x="358" y="190" font-family="'Segoe UI', Arial, sans-serif" font-size="10" fill="#58a6ff" text-anchor="middle" font-weight="600">Modeling</text>
<text x="420" y="190" font-family="'Segoe UI', Arial, sans-serif" font-size="10" fill="#8b949e" text-anchor="middle">+</text>
<rect x="432" y="176" width="100" height="20" rx="10" fill="#06d6a0" fill-opacity="0.1" stroke="#06d6a0" stroke-width="1"/>
<text x="482" y="190" font-family="'Segoe UI', Arial, sans-serif" font-size="10" fill="#06d6a0" text-anchor="middle" font-weight="600">Reporting</text>
<!-- Bottom separator -->
<line x1="60" y1="200" x2="790" y2="200" stroke="#F2C811" stroke-opacity="0.25" stroke-width="2"/>
<!-- ==================== END HEADER ==================== -->
<!-- Feature content (shifted down by 210px) -->
<g transform="translate(0, 210)">
<!-- Background -->
<!-- Title -->
<text x="425" y="52" text-anchor="middle" font-family="'Segoe UI', Arial, sans-serif" font-size="32" font-weight="bold" fill="#F2C811">Start Vibe Modeling</text>
<!-- Subtitle -->
<text x="425" y="80" text-anchor="middle" font-family="'Segoe UI', Arial, sans-serif" font-size="16" fill="#8b949e">Two commands to transform your Power BI workflow</text>
<!-- Command 1 background -->
<rect x="75" y="105" width="700" height="50" rx="8" ry="8" fill="#161b22" stroke="#30363d" stroke-width="1"/>
<!-- Command 1 text -->
<text y="137" font-family="'Cascadia Code', 'Fira Code', 'Consolas', monospace" font-size="18">
<tspan x="100" fill="#06d6a0">$</tspan>
<tspan fill="#c9d1d9"> pipx install pbi-cli-tool</tspan>
</text>
<!-- Blinking cursor -->
<rect class="cursor" x="407" y="119" width="2" height="20" fill="#F2C811"/>
<!-- Command 2 background -->
<rect x="75" y="175" width="700" height="70" rx="8" ry="8" fill="#161b22" stroke="#30363d" stroke-width="1"/>
<!-- Command 2 line 1 -->
<text y="205" font-family="'Cascadia Code', 'Fira Code', 'Consolas', monospace" font-size="18">
<tspan x="100" fill="#06d6a0">$</tspan>
<tspan fill="#c9d1d9"> pbi connect</tspan>
</text>
<!-- Command 2 line 2: checkmark + status -->
<text y="230" font-family="'Cascadia Code', 'Fira Code', 'Consolas', monospace" font-size="16">
<tspan x="110" fill="#06d6a0">&#x2714; Connected! 7 skills installed.</tspan>
</text>
<!-- Info card background -->
<rect x="75" y="270" width="700" height="120" rx="8" ry="8" fill="#161b22" stroke="#F2C811" stroke-opacity="0.3" stroke-width="1"/>
<!-- LinkedIn row -->
<g transform="translate(425, 300)">
<!-- LinkedIn "in" badge -->
<rect x="-62" y="-14" width="22" height="18" rx="3" ry="3" fill="#0a66c2"/>
<text x="-51" y="1" text-anchor="middle" font-family="'Segoe UI', Arial, sans-serif" font-size="13" font-weight="bold" fill="#ffffff">in</text>
<!-- LinkedIn handle -->
<text x="-30" y="1" font-family="'Segoe UI', Arial, sans-serif" font-size="18" fill="#c9d1d9"> @minasaad1</text>
</g>
<!-- Website -->
<text x="425" y="340" text-anchor="middle" font-family="'Segoe UI', Arial, sans-serif" font-size="20" font-weight="bold" fill="#F2C811">mina-saad.com</text>
<!-- GitHub -->
<text x="425" y="372" text-anchor="middle" font-family="'Segoe UI', Arial, sans-serif" font-size="14" fill="#58a6ff">github.com/MinaSaad1/pbi-cli</text>
<!-- Bottom section -->
<text x="425" y="422" text-anchor="middle" font-family="'Segoe UI', Arial, sans-serif" font-size="16" font-weight="600" fill="#c9d1d9">Open source. MIT License. Star it on GitHub.</text>
<!-- Footer -->
<text x="425" y="456" text-anchor="middle" font-family="'Segoe UI', Arial, sans-serif" font-size="14" fill="#8b949e">Like this? Share it with your Power BI team.</text>
</g>
</svg>

After

Width:  |  Height:  |  Size: 15 KiB

View file

@ -1,7 +1,122 @@
<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"/>
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="850" height="730" viewBox="0 0 850 730">
<defs>
<linearGradient id="hdr-bar1" x1="50%" y1="0%" x2="50%" y2="100%">
<stop offset="0%" stop-color="#EBBB14"/>
<stop offset="100%" stop-color="#B25400"/>
</linearGradient>
<linearGradient id="hdr-bar2" x1="50%" y1="0%" x2="50%" y2="100%">
<stop offset="0%" stop-color="#F9E583"/>
<stop offset="100%" stop-color="#DE9800"/>
</linearGradient>
<linearGradient id="hdr-bar3" x1="50%" y1="0%" x2="50%" y2="100%">
<stop offset="0%" stop-color="#F9E68B"/>
<stop offset="100%" stop-color="#F3CD32"/>
</linearGradient>
<linearGradient id="pbi-lg1" x1="50%" y1="0%" x2="50%" y2="100%">
<stop offset="0%" stop-color="#EBBB14"/>
<stop offset="100%" stop-color="#B25400"/>
</linearGradient>
<linearGradient id="pbi-lg2" x1="50%" y1="0%" x2="50%" y2="100%">
<stop offset="0%" stop-color="#F9E583"/>
<stop offset="100%" stop-color="#DE9800"/>
</linearGradient>
<linearGradient id="pbi-lg5" x1="50%" y1="0%" x2="50%" y2="100%">
<stop offset="0%" stop-color="#F9E68B"/>
<stop offset="100%" stop-color="#F3CD32"/>
</linearGradient>
</defs>
<!-- Title -->
<!-- Full background -->
<rect width="100%" height="100%" fill="#0d1117"/>
<!-- ==================== VIBE BI HEADER ==================== -->
<!-- "VIBE BI" block art (shadow) -->
<text font-family="'Courier New', Courier, monospace" font-size="9" fill="#7A6508" xml:space="preserve">
<tspan x="296" y="22">██╗ ██╗ ██╗ ██████╗ ███████╗ ██████╗ ██╗</tspan>
<tspan x="296" y="33">██║ ██║ ██║ ██╔══██╗ ██╔════╝ ██╔══██╗ ██║</tspan>
<tspan x="296" y="44">██║ ██║ ██║ ██████╔╝ █████╗ ██████╔╝ ██║</tspan>
<tspan x="296" y="55">╚██╗ ██╔╝ ██║ ██╔══██╗ ██╔══╝ ██╔══██╗ ██║</tspan>
<tspan x="296" y="66"> ╚████╔╝ ██║ ██████╔╝ ███████╗ ██████╔╝ ██║</tspan>
<tspan x="296" y="77"> ╚═══╝ ╚═╝ ╚═════╝ ╚══════╝ ╚═════╝ ╚═╝</tspan>
</text>
<!-- "VIBE BI" block art (main) -->
<text font-family="'Courier New', Courier, monospace" font-size="9" fill="#F2C811" xml:space="preserve">
<tspan x="295" y="21">██╗ ██╗ ██╗ ██████╗ ███████╗ ██████╗ ██╗</tspan>
<tspan x="295" y="32">██║ ██║ ██║ ██╔══██╗ ██╔════╝ ██╔══██╗ ██║</tspan>
<tspan x="295" y="43">██║ ██║ ██║ ██████╔╝ █████╗ ██████╔╝ ██║</tspan>
<tspan x="295" y="54">╚██╗ ██╔╝ ██║ ██╔══██╗ ██╔══╝ ██╔══██╗ ██║</tspan>
<tspan x="295" y="65"> ╚████╔╝ ██║ ██████╔╝ ███████╗ ██████╔╝ ██║</tspan>
<tspan x="295" y="76"> ╚═══╝ ╚═╝ ╚═════╝ ╚══════╝ ╚═════╝ ╚═╝</tspan>
</text>
<!-- Separator -->
<line x1="60" y1="84" x2="790" y2="84" stroke="#F2C811" stroke-opacity="0.15" stroke-width="1"/>
<!-- Tagline -->
<text x="425" y="100" font-family="'Segoe UI', Arial, sans-serif" font-size="13" fill="#e6edf3" text-anchor="middle" font-weight="600">The First CLI for Both Power BI Modeling and Reporting</text>
<!-- ===== Connection Flow: Claude > PBI-CLI > Power BI ===== -->
<!-- Claude AI logo (inline, original 1200x1200, displayed as 50x50, centered at x=110) -->
<svg x="85" y="110" width="50" height="50" viewBox="0 0 1200 1200">
<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"/>
</svg>
<text x="110" y="175" 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="155" y1="135" x2="290" y2="135" stroke="#F2C811" stroke-width="2" stroke-dasharray="6,4" stroke-opacity="0.5"/>
<polygon points="294,135 286,130 286,140" fill="#F2C811" fill-opacity="0.5"/>
<!-- PBI-CLI block art (shadow) -->
<text font-family="'Courier New', Courier, monospace" font-size="7" fill="#7A6508" xml:space="preserve">
<tspan x="316" y="118">██████╗ ██████╗ ██╗ ██████╗ ██╗ ██╗</tspan>
<tspan x="316" y="128">██╔══██╗ ██╔══██╗ ██║ ██╔════╝ ██║ ██║</tspan>
<tspan x="316" y="138">██████╔╝ ██████╔╝ ██║ ███╗ ██║ ██║ ██║</tspan>
<tspan x="316" y="148">██╔═══╝ ██╔══██╗ ██║ ╚══╝ ██║ ██║ ██║</tspan>
<tspan x="316" y="158">██║ ██████╔╝ ██║ ╚██████╗ ███████╗ ██║</tspan>
<tspan x="316" y="168">╚═╝ ╚═════╝ ╚═╝ ╚═════╝ ╚══════╝ ╚═╝</tspan>
</text>
<!-- PBI-CLI block art (main) -->
<text font-family="'Courier New', Courier, monospace" font-size="7" fill="#F2C811" xml:space="preserve">
<tspan x="315" y="117">██████╗ ██████╗ ██╗ ██████╗ ██╗ ██╗</tspan>
<tspan x="315" y="127">██╔══██╗ ██╔══██╗ ██║ ██╔════╝ ██║ ██║</tspan>
<tspan x="315" y="137">██████╔╝ ██████╔╝ ██║ ███╗ ██║ ██║ ██║</tspan>
<tspan x="315" y="147">██╔═══╝ ██╔══██╗ ██║ ╚══╝ ██║ ██║ ██║</tspan>
<tspan x="315" y="157">██║ ██████╔╝ ██║ ╚██████╗ ███████╗ ██║</tspan>
<tspan x="315" y="167">╚═╝ ╚═════╝ ╚═╝ ╚═════╝ ╚══════╝ ╚═╝</tspan>
</text>
<!-- Right arrow -->
<line x1="560" y1="135" x2="655" y2="135" stroke="#F2C811" stroke-width="2" stroke-dasharray="6,4" stroke-opacity="0.5"/>
<polygon points="659,135 651,130 651,140" fill="#F2C811" fill-opacity="0.5"/>
<!-- Power BI logo (inline, original 630x630, displayed as 50x50, centered at x=700) -->
<svg x="675" y="110" width="50" height="50" viewBox="0 0 630 630">
<g transform="translate(77.5, 0)">
<rect fill="url(#pbi-lg1)" x="256" y="0" width="219" height="630" rx="26"/>
<path fill="url(#pbi-lg2)" d="M346,604 L346,630 L320,630 L153,630 C138.64,630 127,618.36 127,604 L127,183 C127,168.64 138.64,157 153,157 L320,157 C334.36,157 346,168.64 346,183 L346,604 Z"/>
<path fill="url(#pbi-lg5)" d="M219,604 L219,630 L193,630 L26,630 C11.64,630 0,618.36 0,604 L0,341 C0,326.64 11.64,315 26,315 L193,315 C207.36,315 219,326.64 219,341 L219,604 Z"/>
</g>
</svg>
<text x="700" y="175" font-family="'Segoe UI', Arial, sans-serif" font-size="11" fill="#F2C811" text-anchor="middle" font-weight="600">Power BI</text>
<!-- Modeling + Reporting pills -->
<rect x="308" y="176" width="100" height="20" rx="10" fill="#58a6ff" fill-opacity="0.1" stroke="#58a6ff" stroke-width="1"/>
<text x="358" y="190" font-family="'Segoe UI', Arial, sans-serif" font-size="10" fill="#58a6ff" text-anchor="middle" font-weight="600">Modeling</text>
<text x="420" y="190" font-family="'Segoe UI', Arial, sans-serif" font-size="10" fill="#8b949e" text-anchor="middle">+</text>
<rect x="432" y="176" width="100" height="20" rx="10" fill="#06d6a0" fill-opacity="0.1" stroke="#06d6a0" stroke-width="1"/>
<text x="482" y="190" font-family="'Segoe UI', Arial, sans-serif" font-size="10" fill="#06d6a0" text-anchor="middle" font-weight="600">Reporting</text>
<!-- Bottom separator -->
<line x1="60" y1="200" x2="790" y2="200" stroke="#F2C811" stroke-opacity="0.25" stroke-width="2"/>
<!-- ==================== END HEADER ==================== -->
<!-- Feature content (shifted down by 210px) -->
<g transform="translate(0, 210)">
<!-- 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="13" fill="#8b949e" text-anchor="middle">Describe the problem in plain English, Claude finds and fixes it</text>
@ -60,4 +175,6 @@
<!-- Footer -->
<text x="425" y="510" font-family="'Segoe UI', Arial, sans-serif" font-size="13" fill="#8b949e" text-anchor="middle">Stop guessing why your DAX is broken. Let Claude trace the problem.</text>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 5.1 KiB

After

Width:  |  Height:  |  Size: 17 KiB

202
assets/dax-skill.svg Normal file
View file

@ -0,0 +1,202 @@
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="850" height="790" viewBox="0 0 850 790">
<defs>
<linearGradient id="hdr-bar1" x1="50%" y1="0%" x2="50%" y2="100%">
<stop offset="0%" stop-color="#EBBB14"/>
<stop offset="100%" stop-color="#B25400"/>
</linearGradient>
<linearGradient id="hdr-bar2" x1="50%" y1="0%" x2="50%" y2="100%">
<stop offset="0%" stop-color="#F9E583"/>
<stop offset="100%" stop-color="#DE9800"/>
</linearGradient>
<linearGradient id="hdr-bar3" x1="50%" y1="0%" x2="50%" y2="100%">
<stop offset="0%" stop-color="#F9E68B"/>
<stop offset="100%" stop-color="#F3CD32"/>
</linearGradient>
<linearGradient id="pbi-lg1" x1="50%" y1="0%" x2="50%" y2="100%">
<stop offset="0%" stop-color="#EBBB14"/>
<stop offset="100%" stop-color="#B25400"/>
</linearGradient>
<linearGradient id="pbi-lg2" x1="50%" y1="0%" x2="50%" y2="100%">
<stop offset="0%" stop-color="#F9E583"/>
<stop offset="100%" stop-color="#DE9800"/>
</linearGradient>
<linearGradient id="pbi-lg5" x1="50%" y1="0%" x2="50%" y2="100%">
<stop offset="0%" stop-color="#F9E68B"/>
<stop offset="100%" stop-color="#F3CD32"/>
</linearGradient>
<filter id="shadow" x="-2%" y="-2%" width="104%" height="104%">
<feDropShadow dx="0" dy="2" stdDeviation="4" flood-color="#000000" flood-opacity="0.3"/>
</filter>
</defs>
<!-- Full background -->
<rect width="100%" height="100%" fill="#0d1117"/>
<!-- ==================== VIBE BI HEADER ==================== -->
<!-- "VIBE BI" block art (shadow) -->
<text font-family="'Courier New', Courier, monospace" font-size="9" fill="#7A6508" xml:space="preserve">
<tspan x="296" y="22">██╗ ██╗ ██╗ ██████╗ ███████╗ ██████╗ ██╗</tspan>
<tspan x="296" y="33">██║ ██║ ██║ ██╔══██╗ ██╔════╝ ██╔══██╗ ██║</tspan>
<tspan x="296" y="44">██║ ██║ ██║ ██████╔╝ █████╗ ██████╔╝ ██║</tspan>
<tspan x="296" y="55">╚██╗ ██╔╝ ██║ ██╔══██╗ ██╔══╝ ██╔══██╗ ██║</tspan>
<tspan x="296" y="66"> ╚████╔╝ ██║ ██████╔╝ ███████╗ ██████╔╝ ██║</tspan>
<tspan x="296" y="77"> ╚═══╝ ╚═╝ ╚═════╝ ╚══════╝ ╚═════╝ ╚═╝</tspan>
</text>
<!-- "VIBE BI" block art (main) -->
<text font-family="'Courier New', Courier, monospace" font-size="9" fill="#F2C811" xml:space="preserve">
<tspan x="295" y="21">██╗ ██╗ ██╗ ██████╗ ███████╗ ██████╗ ██╗</tspan>
<tspan x="295" y="32">██║ ██║ ██║ ██╔══██╗ ██╔════╝ ██╔══██╗ ██║</tspan>
<tspan x="295" y="43">██║ ██║ ██║ ██████╔╝ █████╗ ██████╔╝ ██║</tspan>
<tspan x="295" y="54">╚██╗ ██╔╝ ██║ ██╔══██╗ ██╔══╝ ██╔══██╗ ██║</tspan>
<tspan x="295" y="65"> ╚████╔╝ ██║ ██████╔╝ ███████╗ ██████╔╝ ██║</tspan>
<tspan x="295" y="76"> ╚═══╝ ╚═╝ ╚═════╝ ╚══════╝ ╚═════╝ ╚═╝</tspan>
</text>
<!-- Separator -->
<line x1="60" y1="84" x2="790" y2="84" stroke="#F2C811" stroke-opacity="0.15" stroke-width="1"/>
<!-- Tagline -->
<text x="425" y="100" font-family="'Segoe UI', Arial, sans-serif" font-size="13" fill="#e6edf3" text-anchor="middle" font-weight="600">The First CLI for Both Power BI Modeling and Reporting</text>
<!-- ===== Connection Flow: Claude > PBI-CLI > Power BI ===== -->
<!-- Claude AI logo (inline, original 1200x1200, displayed as 50x50, centered at x=110) -->
<svg x="85" y="110" width="50" height="50" viewBox="0 0 1200 1200">
<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"/>
</svg>
<text x="110" y="175" 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="155" y1="135" x2="290" y2="135" stroke="#F2C811" stroke-width="2" stroke-dasharray="6,4" stroke-opacity="0.5"/>
<polygon points="294,135 286,130 286,140" fill="#F2C811" fill-opacity="0.5"/>
<!-- PBI-CLI block art (shadow) -->
<text font-family="'Courier New', Courier, monospace" font-size="7" fill="#7A6508" xml:space="preserve">
<tspan x="316" y="118">██████╗ ██████╗ ██╗ ██████╗ ██╗ ██╗</tspan>
<tspan x="316" y="128">██╔══██╗ ██╔══██╗ ██║ ██╔════╝ ██║ ██║</tspan>
<tspan x="316" y="138">██████╔╝ ██████╔╝ ██║ ███╗ ██║ ██║ ██║</tspan>
<tspan x="316" y="148">██╔═══╝ ██╔══██╗ ██║ ╚══╝ ██║ ██║ ██║</tspan>
<tspan x="316" y="158">██║ ██████╔╝ ██║ ╚██████╗ ███████╗ ██║</tspan>
<tspan x="316" y="168">╚═╝ ╚═════╝ ╚═╝ ╚═════╝ ╚══════╝ ╚═╝</tspan>
</text>
<!-- PBI-CLI block art (main) -->
<text font-family="'Courier New', Courier, monospace" font-size="7" fill="#F2C811" xml:space="preserve">
<tspan x="315" y="117">██████╗ ██████╗ ██╗ ██████╗ ██╗ ██╗</tspan>
<tspan x="315" y="127">██╔══██╗ ██╔══██╗ ██║ ██╔════╝ ██║ ██║</tspan>
<tspan x="315" y="137">██████╔╝ ██████╔╝ ██║ ███╗ ██║ ██║ ██║</tspan>
<tspan x="315" y="147">██╔═══╝ ██╔══██╗ ██║ ╚══╝ ██║ ██║ ██║</tspan>
<tspan x="315" y="157">██║ ██████╔╝ ██║ ╚██████╗ ███████╗ ██║</tspan>
<tspan x="315" y="167">╚═╝ ╚═════╝ ╚═╝ ╚═════╝ ╚══════╝ ╚═╝</tspan>
</text>
<!-- Right arrow -->
<line x1="560" y1="135" x2="655" y2="135" stroke="#F2C811" stroke-width="2" stroke-dasharray="6,4" stroke-opacity="0.5"/>
<polygon points="659,135 651,130 651,140" fill="#F2C811" fill-opacity="0.5"/>
<!-- Power BI logo (inline, original 630x630, displayed as 50x50, centered at x=700) -->
<svg x="675" y="110" width="50" height="50" viewBox="0 0 630 630">
<g transform="translate(77.5, 0)">
<rect fill="url(#pbi-lg1)" x="256" y="0" width="219" height="630" rx="26"/>
<path fill="url(#pbi-lg2)" d="M346,604 L346,630 L320,630 L153,630 C138.64,630 127,618.36 127,604 L127,183 C127,168.64 138.64,157 153,157 L320,157 C334.36,157 346,168.64 346,183 L346,604 Z"/>
<path fill="url(#pbi-lg5)" d="M219,604 L219,630 L193,630 L26,630 C11.64,630 0,618.36 0,604 L0,341 C0,326.64 11.64,315 26,315 L193,315 C207.36,315 219,326.64 219,341 L219,604 Z"/>
</g>
</svg>
<text x="700" y="175" font-family="'Segoe UI', Arial, sans-serif" font-size="11" fill="#F2C811" text-anchor="middle" font-weight="600">Power BI</text>
<!-- Modeling + Reporting pills -->
<rect x="308" y="176" width="100" height="20" rx="10" fill="#58a6ff" fill-opacity="0.1" stroke="#58a6ff" stroke-width="1"/>
<text x="358" y="190" font-family="'Segoe UI', Arial, sans-serif" font-size="10" fill="#58a6ff" text-anchor="middle" font-weight="600">Modeling</text>
<text x="420" y="190" font-family="'Segoe UI', Arial, sans-serif" font-size="10" fill="#8b949e" text-anchor="middle">+</text>
<rect x="432" y="176" width="100" height="20" rx="10" fill="#06d6a0" fill-opacity="0.1" stroke="#06d6a0" stroke-width="1"/>
<text x="482" y="190" font-family="'Segoe UI', Arial, sans-serif" font-size="10" fill="#06d6a0" text-anchor="middle" font-weight="600">Reporting</text>
<!-- Bottom separator -->
<line x1="60" y1="200" x2="790" y2="200" stroke="#F2C811" stroke-opacity="0.25" stroke-width="2"/>
<!-- ==================== END HEADER ==================== -->
<!-- Feature content (shifted down by 210px) -->
<g transform="translate(0, 210)">
<!-- Background -->
<!-- Title Section -->
<text x="425" y="38" font-family="Segoe UI, Arial, sans-serif" font-size="28" font-weight="bold" fill="#58a6ff" text-anchor="middle">DAX Skill</text>
<text x="425" y="62" font-family="Segoe UI, Arial, sans-serif" font-size="16" fill="#8b949e" text-anchor="middle">Ask questions about your data in plain English</text>
<!-- Chat Container -->
<rect x="40" y="80" width="770" height="410" rx="8" ry="8" fill="#161b22" stroke="#30363d" stroke-width="1"/>
<!-- Header Bar -->
<rect x="40" y="80" width="770" height="36" rx="8" ry="8" fill="#161b22"/>
<rect x="40" y="108" width="770" height="8" fill="#161b22"/>
<line x1="40" y1="116" x2="810" y2="116" stroke="#30363d" stroke-width="1"/>
<!-- Traffic Lights -->
<circle cx="64" cy="98" r="6" fill="#ff5f57"/>
<circle cx="84" cy="98" r="6" fill="#febc2e"/>
<circle cx="104" cy="98" r="6" fill="#28c840"/>
<!-- Claude Code Label -->
<text x="130" y="103" font-family="Segoe UI, Arial, sans-serif" font-size="15" fill="#d97757">Claude Code</text>
<!-- User Message Bubble -->
<rect x="60" y="130" width="450" height="42" rx="12" ry="12" fill="#1a3a5c" stroke="#264d73" stroke-width="1"/>
<text x="80" y="156" font-family="Segoe UI, Arial, sans-serif" font-size="16" fill="#c9d1d9">What are the top 5 products by revenue?</text>
<!-- Claude Response 1: Querying -->
<rect x="60" y="186" width="730" height="80" rx="12" ry="12" fill="#1c1c1c" stroke="#30363d" stroke-width="1"/>
<text x="80" y="210" font-family="Segoe UI, Arial, sans-serif" font-size="14" fill="#8b949e">Querying your model...</text>
<!-- Code Block -->
<rect x="76" y="220" width="698" height="34" rx="6" ry="6" fill="#0d1117"/>
<text x="92" y="242" font-family="Cascadia Code, Consolas, monospace" font-size="13" fill="#F2C811">EVALUATE TOPN(5, Products, [Revenue], DESC)</text>
<!-- Claude Response 2: Results Table -->
<rect x="60" y="280" width="730" height="198" rx="12" ry="12" fill="#1c1c1c" stroke="#30363d" stroke-width="1"/>
<text x="80" y="306" font-family="Segoe UI, Arial, sans-serif" font-size="15" fill="#c9d1d9">Here are your results:</text>
<!-- Table Headers -->
<text x="100" y="334" font-family="Segoe UI, Arial, sans-serif" font-size="14" font-weight="bold" fill="#F2C811">Product</text>
<text x="500" y="334" font-family="Segoe UI, Arial, sans-serif" font-size="14" font-weight="bold" fill="#F2C811">Revenue</text>
<!-- Separator Line -->
<line x1="80" y1="342" x2="770" y2="342" stroke="#30363d" stroke-width="1"/>
<!-- Row 1 -->
<text x="100" y="364" font-family="Segoe UI, Arial, sans-serif" font-size="13" fill="#c9d1d9">Adventure Touring Bike</text>
<text x="500" y="364" font-family="Segoe UI, Arial, sans-serif" font-size="13" fill="#06d6a0">$423,000</text>
<!-- Row 2 -->
<text x="100" y="388" font-family="Segoe UI, Arial, sans-serif" font-size="13" fill="#c9d1d9">Mountain Pro Series</text>
<text x="500" y="388" font-family="Segoe UI, Arial, sans-serif" font-size="13" fill="#06d6a0">$312,500</text>
<!-- Row 3 -->
<text x="100" y="412" font-family="Segoe UI, Arial, sans-serif" font-size="13" fill="#c9d1d9">Road Elite Carbon</text>
<text x="500" y="412" font-family="Segoe UI, Arial, sans-serif" font-size="13" fill="#06d6a0">$287,200</text>
<!-- Row 4 -->
<text x="100" y="436" font-family="Segoe UI, Arial, sans-serif" font-size="13" fill="#c9d1d9">Urban Commuter X1</text>
<text x="500" y="436" font-family="Segoe UI, Arial, sans-serif" font-size="13" fill="#06d6a0">$198,400</text>
<!-- Row 5 -->
<text x="100" y="460" font-family="Segoe UI, Arial, sans-serif" font-size="13" fill="#c9d1d9">Trail Explorer 500</text>
<text x="500" y="460" font-family="Segoe UI, Arial, sans-serif" font-size="13" fill="#06d6a0">$156,800</text>
<!-- Capability Pills -->
<rect x="155" y="504" width="150" height="32" rx="16" ry="16" fill="none" stroke="#58a6ff" stroke-width="1.5"/>
<text x="230" y="525" font-family="Segoe UI, Arial, sans-serif" font-size="14" fill="#58a6ff" text-anchor="middle">Execute Queries</text>
<rect x="350" y="504" width="150" height="32" rx="16" ry="16" fill="none" stroke="#F2C811" stroke-width="1.5"/>
<text x="425" y="525" font-family="Segoe UI, Arial, sans-serif" font-size="14" fill="#F2C811" text-anchor="middle">Validate Syntax</text>
<rect x="545" y="504" width="150" height="32" rx="16" ry="16" fill="none" stroke="#06d6a0" stroke-width="1.5"/>
<text x="620" y="525" font-family="Segoe UI, Arial, sans-serif" font-size="14" fill="#06d6a0" text-anchor="middle">Format Results</text>
<!-- Footer -->
<text x="425" y="562" font-family="Segoe UI, Arial, sans-serif" font-size="15" fill="#8b949e" text-anchor="middle">From question to answer in seconds. No DAX syntax required.</text>
</g>
</svg>

After

Width:  |  Height:  |  Size: 17 KiB

267
assets/deploy-secure.svg Normal file
View file

@ -0,0 +1,267 @@
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="850" height="790" viewBox="0 0 850 790">
<defs>
<linearGradient id="hdr-bar1" x1="50%" y1="0%" x2="50%" y2="100%">
<stop offset="0%" stop-color="#EBBB14"/>
<stop offset="100%" stop-color="#B25400"/>
</linearGradient>
<linearGradient id="hdr-bar2" x1="50%" y1="0%" x2="50%" y2="100%">
<stop offset="0%" stop-color="#F9E583"/>
<stop offset="100%" stop-color="#DE9800"/>
</linearGradient>
<linearGradient id="hdr-bar3" x1="50%" y1="0%" x2="50%" y2="100%">
<stop offset="0%" stop-color="#F9E68B"/>
<stop offset="100%" stop-color="#F3CD32"/>
</linearGradient>
<linearGradient id="pbi-lg1" x1="50%" y1="0%" x2="50%" y2="100%">
<stop offset="0%" stop-color="#EBBB14"/>
<stop offset="100%" stop-color="#B25400"/>
</linearGradient>
<linearGradient id="pbi-lg2" x1="50%" y1="0%" x2="50%" y2="100%">
<stop offset="0%" stop-color="#F9E583"/>
<stop offset="100%" stop-color="#DE9800"/>
</linearGradient>
<linearGradient id="pbi-lg5" x1="50%" y1="0%" x2="50%" y2="100%">
<stop offset="0%" stop-color="#F9E68B"/>
<stop offset="100%" stop-color="#F3CD32"/>
</linearGradient>
<marker id="arrowDown" markerWidth="8" markerHeight="8" refX="4" refY="4" orient="auto">
<path d="M1,1 L4,7 L7,1" fill="none" stroke="#7b61ff" stroke-width="1.5"/>
</marker>
<marker id="arrowRollback" markerWidth="8" markerHeight="8" refX="4" refY="4" orient="auto">
<path d="M1,1 L4,7 L7,1" fill="none" stroke="#ff6b6b" stroke-width="1.5"/>
</marker>
<filter id="glow">
<feGaussianBlur stdDeviation="2" result="blur"/>
<feMerge>
<feMergeNode in="blur"/>
<feMergeNode in="SourceGraphic"/>
</feMerge>
</filter>
</defs>
<!-- Full background -->
<rect width="100%" height="100%" fill="#0d1117"/>
<!-- ==================== VIBE BI HEADER ==================== -->
<!-- "VIBE BI" block art (shadow) -->
<text font-family="'Courier New', Courier, monospace" font-size="9" fill="#7A6508" xml:space="preserve">
<tspan x="296" y="22">██╗ ██╗ ██╗ ██████╗ ███████╗ ██████╗ ██╗</tspan>
<tspan x="296" y="33">██║ ██║ ██║ ██╔══██╗ ██╔════╝ ██╔══██╗ ██║</tspan>
<tspan x="296" y="44">██║ ██║ ██║ ██████╔╝ █████╗ ██████╔╝ ██║</tspan>
<tspan x="296" y="55">╚██╗ ██╔╝ ██║ ██╔══██╗ ██╔══╝ ██╔══██╗ ██║</tspan>
<tspan x="296" y="66"> ╚████╔╝ ██║ ██████╔╝ ███████╗ ██████╔╝ ██║</tspan>
<tspan x="296" y="77"> ╚═══╝ ╚═╝ ╚═════╝ ╚══════╝ ╚═════╝ ╚═╝</tspan>
</text>
<!-- "VIBE BI" block art (main) -->
<text font-family="'Courier New', Courier, monospace" font-size="9" fill="#F2C811" xml:space="preserve">
<tspan x="295" y="21">██╗ ██╗ ██╗ ██████╗ ███████╗ ██████╗ ██╗</tspan>
<tspan x="295" y="32">██║ ██║ ██║ ██╔══██╗ ██╔════╝ ██╔══██╗ ██║</tspan>
<tspan x="295" y="43">██║ ██║ ██║ ██████╔╝ █████╗ ██████╔╝ ██║</tspan>
<tspan x="295" y="54">╚██╗ ██╔╝ ██║ ██╔══██╗ ██╔══╝ ██╔══██╗ ██║</tspan>
<tspan x="295" y="65"> ╚████╔╝ ██║ ██████╔╝ ███████╗ ██████╔╝ ██║</tspan>
<tspan x="295" y="76"> ╚═══╝ ╚═╝ ╚═════╝ ╚══════╝ ╚═════╝ ╚═╝</tspan>
</text>
<!-- Separator -->
<line x1="60" y1="84" x2="790" y2="84" stroke="#F2C811" stroke-opacity="0.15" stroke-width="1"/>
<!-- Tagline -->
<text x="425" y="100" font-family="'Segoe UI', Arial, sans-serif" font-size="13" fill="#e6edf3" text-anchor="middle" font-weight="600">The First CLI for Both Power BI Modeling and Reporting</text>
<!-- ===== Connection Flow: Claude > PBI-CLI > Power BI ===== -->
<!-- Claude AI logo (inline, original 1200x1200, displayed as 50x50, centered at x=110) -->
<svg x="85" y="110" width="50" height="50" viewBox="0 0 1200 1200">
<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"/>
</svg>
<text x="110" y="175" 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="155" y1="135" x2="290" y2="135" stroke="#F2C811" stroke-width="2" stroke-dasharray="6,4" stroke-opacity="0.5"/>
<polygon points="294,135 286,130 286,140" fill="#F2C811" fill-opacity="0.5"/>
<!-- PBI-CLI block art (shadow) -->
<text font-family="'Courier New', Courier, monospace" font-size="7" fill="#7A6508" xml:space="preserve">
<tspan x="316" y="118">██████╗ ██████╗ ██╗ ██████╗ ██╗ ██╗</tspan>
<tspan x="316" y="128">██╔══██╗ ██╔══██╗ ██║ ██╔════╝ ██║ ██║</tspan>
<tspan x="316" y="138">██████╔╝ ██████╔╝ ██║ ███╗ ██║ ██║ ██║</tspan>
<tspan x="316" y="148">██╔═══╝ ██╔══██╗ ██║ ╚══╝ ██║ ██║ ██║</tspan>
<tspan x="316" y="158">██║ ██████╔╝ ██║ ╚██████╗ ███████╗ ██║</tspan>
<tspan x="316" y="168">╚═╝ ╚═════╝ ╚═╝ ╚═════╝ ╚══════╝ ╚═╝</tspan>
</text>
<!-- PBI-CLI block art (main) -->
<text font-family="'Courier New', Courier, monospace" font-size="7" fill="#F2C811" xml:space="preserve">
<tspan x="315" y="117">██████╗ ██████╗ ██╗ ██████╗ ██╗ ██╗</tspan>
<tspan x="315" y="127">██╔══██╗ ██╔══██╗ ██║ ██╔════╝ ██║ ██║</tspan>
<tspan x="315" y="137">██████╔╝ ██████╔╝ ██║ ███╗ ██║ ██║ ██║</tspan>
<tspan x="315" y="147">██╔═══╝ ██╔══██╗ ██║ ╚══╝ ██║ ██║ ██║</tspan>
<tspan x="315" y="157">██║ ██████╔╝ ██║ ╚██████╗ ███████╗ ██║</tspan>
<tspan x="315" y="167">╚═╝ ╚═════╝ ╚═╝ ╚═════╝ ╚══════╝ ╚═╝</tspan>
</text>
<!-- Right arrow -->
<line x1="560" y1="135" x2="655" y2="135" stroke="#F2C811" stroke-width="2" stroke-dasharray="6,4" stroke-opacity="0.5"/>
<polygon points="659,135 651,130 651,140" fill="#F2C811" fill-opacity="0.5"/>
<!-- Power BI logo (inline, original 630x630, displayed as 50x50, centered at x=700) -->
<svg x="675" y="110" width="50" height="50" viewBox="0 0 630 630">
<g transform="translate(77.5, 0)">
<rect fill="url(#pbi-lg1)" x="256" y="0" width="219" height="630" rx="26"/>
<path fill="url(#pbi-lg2)" d="M346,604 L346,630 L320,630 L153,630 C138.64,630 127,618.36 127,604 L127,183 C127,168.64 138.64,157 153,157 L320,157 C334.36,157 346,168.64 346,183 L346,604 Z"/>
<path fill="url(#pbi-lg5)" d="M219,604 L219,630 L193,630 L26,630 C11.64,630 0,618.36 0,604 L0,341 C0,326.64 11.64,315 26,315 L193,315 C207.36,315 219,326.64 219,341 L219,604 Z"/>
</g>
</svg>
<text x="700" y="175" font-family="'Segoe UI', Arial, sans-serif" font-size="11" fill="#F2C811" text-anchor="middle" font-weight="600">Power BI</text>
<!-- Modeling + Reporting pills -->
<rect x="308" y="176" width="100" height="20" rx="10" fill="#58a6ff" fill-opacity="0.1" stroke="#58a6ff" stroke-width="1"/>
<text x="358" y="190" font-family="'Segoe UI', Arial, sans-serif" font-size="10" fill="#58a6ff" text-anchor="middle" font-weight="600">Modeling</text>
<text x="420" y="190" font-family="'Segoe UI', Arial, sans-serif" font-size="10" fill="#8b949e" text-anchor="middle">+</text>
<rect x="432" y="176" width="100" height="20" rx="10" fill="#06d6a0" fill-opacity="0.1" stroke="#06d6a0" stroke-width="1"/>
<text x="482" y="190" font-family="'Segoe UI', Arial, sans-serif" font-size="10" fill="#06d6a0" text-anchor="middle" font-weight="600">Reporting</text>
<!-- Bottom separator -->
<line x1="60" y1="200" x2="790" y2="200" stroke="#F2C811" stroke-opacity="0.25" stroke-width="2"/>
<!-- ==================== END HEADER ==================== -->
<!-- Feature content (shifted down by 210px) -->
<g transform="translate(0, 210)">
<!-- Background -->
<!-- Title Section -->
<text x="425" y="40" font-family="Segoe UI, Arial, sans-serif" font-size="28" font-weight="bold" fill="#F2C811" text-anchor="middle">Deploy + Secure</text>
<text x="425" y="65" font-family="Segoe UI, Arial, sans-serif" font-size="16" fill="#8b949e" text-anchor="middle">Snapshot, restore, and lock down your model</text>
<!-- =============================== -->
<!-- LEFT PANEL - Deployment Skill -->
<!-- =============================== -->
<rect x="25" y="85" width="390" height="390" rx="8" fill="#161b22" stroke="#7b61ff" stroke-width="2"/>
<!-- Panel Header -->
<text x="220" y="115" font-family="Segoe UI, Arial, sans-serif" font-size="18" font-weight="bold" fill="#7b61ff" text-anchor="middle">Deployment Skill</text>
<line x1="45" y1="125" x2="395" y2="125" stroke="#30363d" stroke-width="1"/>
<!-- TMDL label -->
<text x="55" y="160" font-family="Segoe UI, Arial, sans-serif" font-size="13" fill="#8b949e">TMDL</text>
<!-- Version History Flow -->
<!-- v1 Baseline -->
<rect x="120" y="145" width="200" height="36" rx="6" fill="#0d1117" stroke="#30363d" stroke-width="1.5"/>
<text x="220" y="168" font-family="Segoe UI, Arial, sans-serif" font-size="14" fill="#c9d1d9" text-anchor="middle">v1 Baseline</text>
<!-- Arrow v1 -> v2 -->
<line x1="220" y1="181" x2="220" y2="205" stroke="#7b61ff" stroke-width="2" marker-end="url(#arrowDown)"/>
<!-- v2 + Measures -->
<rect x="120" y="210" width="200" height="36" rx="6" fill="#0d1117" stroke="#30363d" stroke-width="1.5"/>
<text x="220" y="233" font-family="Segoe UI, Arial, sans-serif" font-size="14" fill="#c9d1d9" text-anchor="middle">v2 + Measures</text>
<!-- Arrow v2 -> v3 -->
<line x1="220" y1="246" x2="220" y2="270" stroke="#7b61ff" stroke-width="2" marker-end="url(#arrowDown)"/>
<!-- v3 + RLS -->
<rect x="120" y="275" width="200" height="36" rx="6" fill="#0d1117" stroke="#30363d" stroke-width="1.5"/>
<text x="220" y="298" font-family="Segoe UI, Arial, sans-serif" font-size="14" fill="#c9d1d9" text-anchor="middle">v3 + RLS</text>
<!-- Rollback curved arrow from v3 back to v1 -->
<path d="M120,293 Q60,293 60,228 Q60,163 120,163" fill="none" stroke="#ff6b6b" stroke-width="2" stroke-dasharray="5,3" marker-end="url(#arrowRollback)"/>
<text x="42" y="232" font-family="Segoe UI, Arial, sans-serif" font-size="12" fill="#ff6b6b" text-anchor="middle" transform="rotate(-90, 42, 232)">Rollback</text>
<!-- Commands -->
<text x="220" y="345" font-family="Consolas, Courier New, monospace" font-size="12" fill="#58a6ff" text-anchor="middle">pbi database export-tmdl</text>
<text x="220" y="365" font-family="Consolas, Courier New, monospace" font-size="12" fill="#58a6ff" text-anchor="middle">pbi database import-tmdl</text>
<!-- Decorative icons for deployment -->
<g transform="translate(340, 145)" opacity="0.4">
<rect x="0" y="0" width="28" height="28" rx="4" fill="none" stroke="#7b61ff" stroke-width="1"/>
<path d="M8,20 L14,8 L20,20 Z" fill="none" stroke="#7b61ff" stroke-width="1.2"/>
</g>
<!-- =============================== -->
<!-- RIGHT PANEL - Security Skill -->
<!-- =============================== -->
<rect x="435" y="85" width="390" height="390" rx="8" fill="#161b22" stroke="#06d6a0" stroke-width="2"/>
<!-- Panel Header -->
<text x="630" y="115" font-family="Segoe UI, Arial, sans-serif" font-size="18" font-weight="bold" fill="#06d6a0" text-anchor="middle">Security Skill</text>
<line x1="455" y1="125" x2="805" y2="125" stroke="#30363d" stroke-width="1"/>
<!-- RLS User Icons -->
<!-- East User -->
<circle cx="510" cy="170" r="22" fill="#1a3a5c" stroke="#58a6ff" stroke-width="1.5"/>
<text x="510" y="176" font-family="Segoe UI, Arial, sans-serif" font-size="16" font-weight="bold" fill="#58a6ff" text-anchor="middle">E</text>
<text x="510" y="205" font-family="Segoe UI, Arial, sans-serif" font-size="12" fill="#8b949e" text-anchor="middle">East</text>
<!-- West User -->
<circle cx="630" cy="170" r="22" fill="#1a3a5c" stroke="#58a6ff" stroke-width="1.5"/>
<text x="630" y="176" font-family="Segoe UI, Arial, sans-serif" font-size="16" font-weight="bold" fill="#58a6ff" text-anchor="middle">W</text>
<text x="630" y="205" font-family="Segoe UI, Arial, sans-serif" font-size="12" fill="#8b949e" text-anchor="middle">West</text>
<!-- Admin User -->
<circle cx="750" cy="170" r="22" fill="#1a3a5c" stroke="#06d6a0" stroke-width="1.5"/>
<text x="750" y="176" font-family="Segoe UI, Arial, sans-serif" font-size="16" font-weight="bold" fill="#06d6a0" text-anchor="middle">A</text>
<text x="750" y="205" font-family="Segoe UI, Arial, sans-serif" font-size="12" fill="#8b949e" text-anchor="middle">Admin</text>
<!-- Arrows from users to Filter -->
<line x1="510" y1="192" x2="555" y2="248" stroke="#30363d" stroke-width="1.5"/>
<line x1="630" y1="192" x2="630" y2="248" stroke="#30363d" stroke-width="1.5"/>
<line x1="750" y1="192" x2="705" y2="248" stroke="#30363d" stroke-width="1.5"/>
<!-- Filter Box -->
<rect x="555" y="248" width="150" height="34" rx="6" fill="#0d1117" stroke="#06d6a0" stroke-width="1.5"/>
<text x="630" y="270" font-family="Segoe UI, Arial, sans-serif" font-size="14" font-weight="bold" fill="#06d6a0" text-anchor="middle">Filter</text>
<!-- Data rows showing different visibility -->
<!-- East sees -->
<rect x="470" y="300" width="100" height="26" rx="4" fill="#0d1117" stroke="#30363d" stroke-width="1"/>
<text x="520" y="317" font-family="Segoe UI, Arial, sans-serif" font-size="11" fill="#58a6ff" text-anchor="middle">East data</text>
<!-- West sees -->
<rect x="580" y="300" width="100" height="26" rx="4" fill="#0d1117" stroke="#30363d" stroke-width="1"/>
<text x="630" y="317" font-family="Segoe UI, Arial, sans-serif" font-size="11" fill="#58a6ff" text-anchor="middle">West data</text>
<!-- Admin sees all -->
<rect x="690" y="300" width="100" height="26" rx="4" fill="#0d1117" stroke="#30363d" stroke-width="1"/>
<text x="740" y="317" font-family="Segoe UI, Arial, sans-serif" font-size="11" fill="#06d6a0" text-anchor="middle">All data</text>
<!-- Filter expression -->
<text x="630" y="355" font-family="Consolas, Courier New, monospace" font-size="12" fill="#d97757" text-anchor="middle">[Region] = "East"</text>
<!-- Commands -->
<text x="630" y="400" font-family="Consolas, Courier New, monospace" font-size="12" fill="#58a6ff" text-anchor="middle">pbi security-role create</text>
<text x="630" y="420" font-family="Consolas, Courier New, monospace" font-size="12" fill="#58a6ff" text-anchor="middle">pbi security-role add-filter</text>
<!-- Decorative lock icon for security -->
<g transform="translate(770, 380)" opacity="0.35">
<rect x="2" y="10" width="20" height="14" rx="3" fill="none" stroke="#06d6a0" stroke-width="1.2"/>
<path d="M7,10 V6 Q7,1 12,1 Q17,1 17,6 V10" fill="none" stroke="#06d6a0" stroke-width="1.2"/>
</g>
<!-- =============================== -->
<!-- CAPABILITY PILLS -->
<!-- =============================== -->
<g transform="translate(0, 495)">
<!-- Pill 1: TMDL Export/Import -->
<rect x="145" y="0" width="170" height="34" rx="17" fill="none" stroke="#7b61ff" stroke-width="1.5"/>
<text x="230" y="22" font-family="Segoe UI, Arial, sans-serif" font-size="14" fill="#7b61ff" text-anchor="middle">TMDL Export/Import</text>
<!-- Pill 2: Transaction Safety -->
<rect x="340" y="0" width="170" height="34" rx="17" fill="none" stroke="#F2C811" stroke-width="1.5"/>
<text x="425" y="22" font-family="Segoe UI, Arial, sans-serif" font-size="14" fill="#F2C811" text-anchor="middle">Transaction Safety</text>
<!-- Pill 3: Role-Based Filters -->
<rect x="535" y="0" width="170" height="34" rx="17" fill="none" stroke="#06d6a0" stroke-width="1.5"/>
<text x="620" y="22" font-family="Segoe UI, Arial, sans-serif" font-size="14" fill="#06d6a0" text-anchor="middle">Role-Based Filters</text>
</g>
<!-- =============================== -->
<!-- FOOTER -->
<!-- =============================== -->
<text x="425" y="560" font-family="Segoe UI, Arial, sans-serif" font-size="15" fill="#8b949e" text-anchor="middle">Version control your models. Secure them with one prompt.</text>
</g>
</svg>

After

Width:  |  Height:  |  Size: 21 KiB

226
assets/docs-diagnostics.svg Normal file
View file

@ -0,0 +1,226 @@
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="850" height="790" viewBox="0 0 850 790">
<defs>
<linearGradient id="hdr-bar1" x1="50%" y1="0%" x2="50%" y2="100%">
<stop offset="0%" stop-color="#EBBB14"/>
<stop offset="100%" stop-color="#B25400"/>
</linearGradient>
<linearGradient id="hdr-bar2" x1="50%" y1="0%" x2="50%" y2="100%">
<stop offset="0%" stop-color="#F9E583"/>
<stop offset="100%" stop-color="#DE9800"/>
</linearGradient>
<linearGradient id="hdr-bar3" x1="50%" y1="0%" x2="50%" y2="100%">
<stop offset="0%" stop-color="#F9E68B"/>
<stop offset="100%" stop-color="#F3CD32"/>
</linearGradient>
<linearGradient id="pbi-lg1" x1="50%" y1="0%" x2="50%" y2="100%">
<stop offset="0%" stop-color="#EBBB14"/>
<stop offset="100%" stop-color="#B25400"/>
</linearGradient>
<linearGradient id="pbi-lg2" x1="50%" y1="0%" x2="50%" y2="100%">
<stop offset="0%" stop-color="#F9E583"/>
<stop offset="100%" stop-color="#DE9800"/>
</linearGradient>
<linearGradient id="pbi-lg5" x1="50%" y1="0%" x2="50%" y2="100%">
<stop offset="0%" stop-color="#F9E68B"/>
<stop offset="100%" stop-color="#F3CD32"/>
</linearGradient>
<style>
@import url('https://fonts.googleapis.com/css2?family=Inter:wght@400;600;700&amp;family=JetBrains+Mono:wght@400;500&amp;display=swap');
.title { font-family: 'Inter', sans-serif; font-weight: 700; }
.subtitle { font-family: 'Inter', sans-serif; font-weight: 400; }
.body { font-family: 'Inter', sans-serif; font-weight: 400; }
.bold { font-family: 'Inter', sans-serif; font-weight: 600; }
.mono { font-family: 'JetBrains Mono', monospace; font-weight: 400; }
</style>
</defs>
<!-- Full background -->
<rect width="100%" height="100%" fill="#0d1117"/>
<!-- ==================== VIBE BI HEADER ==================== -->
<!-- "VIBE BI" block art (shadow) -->
<text font-family="'Courier New', Courier, monospace" font-size="9" fill="#7A6508" xml:space="preserve">
<tspan x="296" y="22">██╗ ██╗ ██╗ ██████╗ ███████╗ ██████╗ ██╗</tspan>
<tspan x="296" y="33">██║ ██║ ██║ ██╔══██╗ ██╔════╝ ██╔══██╗ ██║</tspan>
<tspan x="296" y="44">██║ ██║ ██║ ██████╔╝ █████╗ ██████╔╝ ██║</tspan>
<tspan x="296" y="55">╚██╗ ██╔╝ ██║ ██╔══██╗ ██╔══╝ ██╔══██╗ ██║</tspan>
<tspan x="296" y="66"> ╚████╔╝ ██║ ██████╔╝ ███████╗ ██████╔╝ ██║</tspan>
<tspan x="296" y="77"> ╚═══╝ ╚═╝ ╚═════╝ ╚══════╝ ╚═════╝ ╚═╝</tspan>
</text>
<!-- "VIBE BI" block art (main) -->
<text font-family="'Courier New', Courier, monospace" font-size="9" fill="#F2C811" xml:space="preserve">
<tspan x="295" y="21">██╗ ██╗ ██╗ ██████╗ ███████╗ ██████╗ ██╗</tspan>
<tspan x="295" y="32">██║ ██║ ██║ ██╔══██╗ ██╔════╝ ██╔══██╗ ██║</tspan>
<tspan x="295" y="43">██║ ██║ ██║ ██████╔╝ █████╗ ██████╔╝ ██║</tspan>
<tspan x="295" y="54">╚██╗ ██╔╝ ██║ ██╔══██╗ ██╔══╝ ██╔══██╗ ██║</tspan>
<tspan x="295" y="65"> ╚████╔╝ ██║ ██████╔╝ ███████╗ ██████╔╝ ██║</tspan>
<tspan x="295" y="76"> ╚═══╝ ╚═╝ ╚═════╝ ╚══════╝ ╚═════╝ ╚═╝</tspan>
</text>
<!-- Separator -->
<line x1="60" y1="84" x2="790" y2="84" stroke="#F2C811" stroke-opacity="0.15" stroke-width="1"/>
<!-- Tagline -->
<text x="425" y="100" font-family="'Segoe UI', Arial, sans-serif" font-size="13" fill="#e6edf3" text-anchor="middle" font-weight="600">The First CLI for Both Power BI Modeling and Reporting</text>
<!-- ===== Connection Flow: Claude > PBI-CLI > Power BI ===== -->
<!-- Claude AI logo (inline, original 1200x1200, displayed as 50x50, centered at x=110) -->
<svg x="85" y="110" width="50" height="50" viewBox="0 0 1200 1200">
<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"/>
</svg>
<text x="110" y="175" 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="155" y1="135" x2="290" y2="135" stroke="#F2C811" stroke-width="2" stroke-dasharray="6,4" stroke-opacity="0.5"/>
<polygon points="294,135 286,130 286,140" fill="#F2C811" fill-opacity="0.5"/>
<!-- PBI-CLI block art (shadow) -->
<text font-family="'Courier New', Courier, monospace" font-size="7" fill="#7A6508" xml:space="preserve">
<tspan x="316" y="118">██████╗ ██████╗ ██╗ ██████╗ ██╗ ██╗</tspan>
<tspan x="316" y="128">██╔══██╗ ██╔══██╗ ██║ ██╔════╝ ██║ ██║</tspan>
<tspan x="316" y="138">██████╔╝ ██████╔╝ ██║ ███╗ ██║ ██║ ██║</tspan>
<tspan x="316" y="148">██╔═══╝ ██╔══██╗ ██║ ╚══╝ ██║ ██║ ██║</tspan>
<tspan x="316" y="158">██║ ██████╔╝ ██║ ╚██████╗ ███████╗ ██║</tspan>
<tspan x="316" y="168">╚═╝ ╚═════╝ ╚═╝ ╚═════╝ ╚══════╝ ╚═╝</tspan>
</text>
<!-- PBI-CLI block art (main) -->
<text font-family="'Courier New', Courier, monospace" font-size="7" fill="#F2C811" xml:space="preserve">
<tspan x="315" y="117">██████╗ ██████╗ ██╗ ██████╗ ██╗ ██╗</tspan>
<tspan x="315" y="127">██╔══██╗ ██╔══██╗ ██║ ██╔════╝ ██║ ██║</tspan>
<tspan x="315" y="137">██████╔╝ ██████╔╝ ██║ ███╗ ██║ ██║ ██║</tspan>
<tspan x="315" y="147">██╔═══╝ ██╔══██╗ ██║ ╚══╝ ██║ ██║ ██║</tspan>
<tspan x="315" y="157">██║ ██████╔╝ ██║ ╚██████╗ ███████╗ ██║</tspan>
<tspan x="315" y="167">╚═╝ ╚═════╝ ╚═╝ ╚═════╝ ╚══════╝ ╚═╝</tspan>
</text>
<!-- Right arrow -->
<line x1="560" y1="135" x2="655" y2="135" stroke="#F2C811" stroke-width="2" stroke-dasharray="6,4" stroke-opacity="0.5"/>
<polygon points="659,135 651,130 651,140" fill="#F2C811" fill-opacity="0.5"/>
<!-- Power BI logo (inline, original 630x630, displayed as 50x50, centered at x=700) -->
<svg x="675" y="110" width="50" height="50" viewBox="0 0 630 630">
<g transform="translate(77.5, 0)">
<rect fill="url(#pbi-lg1)" x="256" y="0" width="219" height="630" rx="26"/>
<path fill="url(#pbi-lg2)" d="M346,604 L346,630 L320,630 L153,630 C138.64,630 127,618.36 127,604 L127,183 C127,168.64 138.64,157 153,157 L320,157 C334.36,157 346,168.64 346,183 L346,604 Z"/>
<path fill="url(#pbi-lg5)" d="M219,604 L219,630 L193,630 L26,630 C11.64,630 0,618.36 0,604 L0,341 C0,326.64 11.64,315 26,315 L193,315 C207.36,315 219,326.64 219,341 L219,604 Z"/>
</g>
</svg>
<text x="700" y="175" font-family="'Segoe UI', Arial, sans-serif" font-size="11" fill="#F2C811" text-anchor="middle" font-weight="600">Power BI</text>
<!-- Modeling + Reporting pills -->
<rect x="308" y="176" width="100" height="20" rx="10" fill="#58a6ff" fill-opacity="0.1" stroke="#58a6ff" stroke-width="1"/>
<text x="358" y="190" font-family="'Segoe UI', Arial, sans-serif" font-size="10" fill="#58a6ff" text-anchor="middle" font-weight="600">Modeling</text>
<text x="420" y="190" font-family="'Segoe UI', Arial, sans-serif" font-size="10" fill="#8b949e" text-anchor="middle">+</text>
<rect x="432" y="176" width="100" height="20" rx="10" fill="#06d6a0" fill-opacity="0.1" stroke="#06d6a0" stroke-width="1"/>
<text x="482" y="190" font-family="'Segoe UI', Arial, sans-serif" font-size="10" fill="#06d6a0" text-anchor="middle" font-weight="600">Reporting</text>
<!-- Bottom separator -->
<line x1="60" y1="200" x2="790" y2="200" stroke="#F2C811" stroke-opacity="0.25" stroke-width="2"/>
<!-- ==================== END HEADER ==================== -->
<!-- Feature content (shifted down by 210px) -->
<g transform="translate(0, 210)">
<!-- Background -->
<!-- Title Section -->
<text x="425" y="42" text-anchor="middle" class="title" font-size="28" fill="#F2C811">Docs + Diagnostics</text>
<text x="425" y="68" text-anchor="middle" class="subtitle" font-size="16" fill="#8b949e">Auto-document everything. Find bottlenecks instantly.</text>
<!-- Left Panel - Docs Skill -->
<rect x="25" y="90" width="390" height="380" fill="#161b22" stroke="#ff6b6b" stroke-width="2" rx="8"/>
<text x="220" y="122" text-anchor="middle" class="title" font-size="18" fill="#ff6b6b">Docs Skill</text>
<line x1="45" y1="134" x2="395" y2="134" stroke="#30363d" stroke-width="1"/>
<!-- Data Dictionary Table Header -->
<text x="70" y="162" class="bold" font-size="13" fill="#F2C811">Table</text>
<text x="175" y="162" class="bold" font-size="13" fill="#F2C811">Column</text>
<text x="310" y="162" class="bold" font-size="13" fill="#F2C811">Type</text>
<line x1="45" y1="172" x2="395" y2="172" stroke="#30363d" stroke-width="1" stroke-dasharray="4,3"/>
<!-- Table Rows -->
<text x="70" y="194" class="body" font-size="12" fill="#c9d1d9">Sales</text>
<text x="175" y="194" class="body" font-size="12" fill="#c9d1d9">Amount</text>
<text x="310" y="194" class="body" font-size="12" fill="#c9d1d9">Decimal</text>
<text x="70" y="216" class="body" font-size="12" fill="#c9d1d9">Sales</text>
<text x="175" y="216" class="body" font-size="12" fill="#c9d1d9">OrderDate</text>
<text x="310" y="216" class="body" font-size="12" fill="#c9d1d9">DateTime</text>
<text x="70" y="238" class="body" font-size="12" fill="#c9d1d9">Product</text>
<text x="175" y="238" class="body" font-size="12" fill="#c9d1d9">Name</text>
<text x="310" y="238" class="body" font-size="12" fill="#c9d1d9">String</text>
<text x="70" y="260" class="body" font-size="12" fill="#c9d1d9">Product</text>
<text x="175" y="260" class="body" font-size="12" fill="#c9d1d9">Category</text>
<text x="310" y="260" class="body" font-size="12" fill="#c9d1d9">String</text>
<text x="70" y="282" class="body" font-size="12" fill="#c9d1d9">Calendar</text>
<text x="175" y="282" class="body" font-size="12" fill="#c9d1d9">Date</text>
<text x="310" y="282" class="body" font-size="12" fill="#c9d1d9">DateTime</text>
<text x="70" y="310" class="body" font-size="12" fill="#8b949e">... 82 more columns</text>
<line x1="45" y1="326" x2="395" y2="326" stroke="#30363d" stroke-width="1"/>
<!-- Command and Result -->
<text x="220" y="352" text-anchor="middle" class="mono" font-size="12" fill="#58a6ff">pbi model document</text>
<text x="220" y="376" text-anchor="middle" class="body" font-size="12" fill="#06d6a0">Generated complete data dictionary</text>
<!-- Right Panel - Diagnostics Skill -->
<rect x="435" y="90" width="390" height="380" fill="#161b22" stroke="#ffd166" stroke-width="2" rx="8"/>
<text x="630" y="122" text-anchor="middle" class="title" font-size="18" fill="#ffd166">Diagnostics Skill</text>
<line x1="455" y1="134" x2="805" y2="134" stroke="#30363d" stroke-width="1"/>
<!-- Health Check Results -->
<!-- Check mark - Relationships OK -->
<text x="470" y="164" class="body" font-size="14" fill="#06d6a0">&#x2713;</text>
<text x="492" y="164" class="body" font-size="14" fill="#06d6a0">Relationships OK</text>
<!-- Check mark - No Circular Deps -->
<text x="470" y="190" class="body" font-size="14" fill="#06d6a0">&#x2713;</text>
<text x="492" y="190" class="body" font-size="14" fill="#06d6a0">No Circular Deps</text>
<!-- Warning - 3 Unused Measures -->
<text x="470" y="216" class="body" font-size="14" fill="#febc2e">&#x26A0;</text>
<text x="492" y="216" class="body" font-size="14" fill="#febc2e">3 Unused Measures</text>
<!-- Error - Missing Date Table -->
<text x="470" y="242" class="body" font-size="14" fill="#ff6b6b">&#x2717;</text>
<text x="492" y="242" class="body" font-size="14" fill="#ff6b6b">Missing Date Table</text>
<line x1="455" y1="260" x2="805" y2="260" stroke="#30363d" stroke-width="1"/>
<!-- Query Trace Section -->
<text x="470" y="286" class="bold" font-size="14" fill="#ffd166">Query Trace</text>
<text x="470" y="310" class="mono" font-size="11" fill="#8b949e">SELECT ... FROM Sales</text>
<text x="470" y="334" class="body" font-size="12" fill="#ff6b6b">Duration: 2.4s</text>
<text x="470" y="356" class="body" font-size="12" fill="#06d6a0">Recommendation: Add index</text>
<line x1="455" y1="372" x2="805" y2="372" stroke="#30363d" stroke-width="1"/>
<!-- Command -->
<text x="630" y="398" text-anchor="middle" class="mono" font-size="12" fill="#58a6ff">pbi trace start</text>
<!-- Capability Pills -->
<!-- Data Dictionary pill -->
<rect x="175" y="490" width="140" height="32" rx="16" fill="none" stroke="#ff6b6b" stroke-width="1.5"/>
<text x="245" y="511" text-anchor="middle" class="bold" font-size="14" fill="#ff6b6b">Data Dictionary</text>
<!-- Query Tracing pill -->
<rect x="355" y="490" width="140" height="32" rx="16" fill="none" stroke="#ffd166" stroke-width="1.5"/>
<text x="425" y="511" text-anchor="middle" class="bold" font-size="14" fill="#ffd166">Query Tracing</text>
<!-- Health Check pill -->
<rect x="535" y="490" width="140" height="32" rx="16" fill="none" stroke="#06d6a0" stroke-width="1.5"/>
<text x="605" y="511" text-anchor="middle" class="bold" font-size="14" fill="#06d6a0">Health Check</text>
<!-- Footer -->
<text x="425" y="555" text-anchor="middle" class="subtitle" font-size="15" fill="#8b949e">Know your model inside out. Fix problems before they reach production.</text>
</g>
</svg>

After

Width:  |  Height:  |  Size: 18 KiB

220
assets/dual-layer.svg Normal file
View file

@ -0,0 +1,220 @@
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="850" height="650" viewBox="0 0 850 650">
<defs>
<linearGradient id="hdr-bar1" x1="50%" y1="0%" x2="50%" y2="100%">
<stop offset="0%" stop-color="#EBBB14"/>
<stop offset="100%" stop-color="#B25400"/>
</linearGradient>
<linearGradient id="hdr-bar2" x1="50%" y1="0%" x2="50%" y2="100%">
<stop offset="0%" stop-color="#F9E583"/>
<stop offset="100%" stop-color="#DE9800"/>
</linearGradient>
<linearGradient id="hdr-bar3" x1="50%" y1="0%" x2="50%" y2="100%">
<stop offset="0%" stop-color="#F9E68B"/>
<stop offset="100%" stop-color="#F3CD32"/>
</linearGradient>
<linearGradient id="pbi-lg1" x1="50%" y1="0%" x2="50%" y2="100%">
<stop offset="0%" stop-color="#EBBB14"/>
<stop offset="100%" stop-color="#B25400"/>
</linearGradient>
<linearGradient id="pbi-lg2" x1="50%" y1="0%" x2="50%" y2="100%">
<stop offset="0%" stop-color="#F9E583"/>
<stop offset="100%" stop-color="#DE9800"/>
</linearGradient>
<linearGradient id="pbi-lg5" x1="50%" y1="0%" x2="50%" y2="100%">
<stop offset="0%" stop-color="#F9E68B"/>
<stop offset="100%" stop-color="#F3CD32"/>
</linearGradient>
<linearGradient id="dl-glow" x1="0%" y1="0%" x2="100%" y2="0%">
<stop offset="0%" stop-color="#F2C811" stop-opacity="0"/>
<stop offset="50%" stop-color="#F2C811" stop-opacity="0.15"/>
<stop offset="100%" stop-color="#F2C811" stop-opacity="0"/>
</linearGradient>
<linearGradient id="dl-b1" x1="50%" y1="0%" x2="50%" y2="100%">
<stop offset="0%" stop-color="#EBBB14"/>
<stop offset="100%" stop-color="#B25400"/>
</linearGradient>
<linearGradient id="dl-b2" x1="50%" y1="0%" x2="50%" y2="100%">
<stop offset="0%" stop-color="#F9E583"/>
<stop offset="100%" stop-color="#DE9800"/>
</linearGradient>
<linearGradient id="dl-b3" x1="50%" y1="0%" x2="50%" y2="100%">
<stop offset="0%" stop-color="#F9E68B"/>
<stop offset="100%" stop-color="#F3CD32"/>
</linearGradient>
</defs>
<!-- Full background -->
<rect width="100%" height="100%" fill="#0d1117"/>
<!-- ==================== VIBE BI HEADER ==================== -->
<!-- "VIBE BI" block art (shadow) -->
<text font-family="'Courier New', Courier, monospace" font-size="9" fill="#7A6508" xml:space="preserve">
<tspan x="296" y="22">██╗ ██╗ ██╗ ██████╗ ███████╗ ██████╗ ██╗</tspan>
<tspan x="296" y="33">██║ ██║ ██║ ██╔══██╗ ██╔════╝ ██╔══██╗ ██║</tspan>
<tspan x="296" y="44">██║ ██║ ██║ ██████╔╝ █████╗ ██████╔╝ ██║</tspan>
<tspan x="296" y="55">╚██╗ ██╔╝ ██║ ██╔══██╗ ██╔══╝ ██╔══██╗ ██║</tspan>
<tspan x="296" y="66"> ╚████╔╝ ██║ ██████╔╝ ███████╗ ██████╔╝ ██║</tspan>
<tspan x="296" y="77"> ╚═══╝ ╚═╝ ╚═════╝ ╚══════╝ ╚═════╝ ╚═╝</tspan>
</text>
<!-- "VIBE BI" block art (main) -->
<text font-family="'Courier New', Courier, monospace" font-size="9" fill="#F2C811" xml:space="preserve">
<tspan x="295" y="21">██╗ ██╗ ██╗ ██████╗ ███████╗ ██████╗ ██╗</tspan>
<tspan x="295" y="32">██║ ██║ ██║ ██╔══██╗ ██╔════╝ ██╔══██╗ ██║</tspan>
<tspan x="295" y="43">██║ ██║ ██║ ██████╔╝ █████╗ ██████╔╝ ██║</tspan>
<tspan x="295" y="54">╚██╗ ██╔╝ ██║ ██╔══██╗ ██╔══╝ ██╔══██╗ ██║</tspan>
<tspan x="295" y="65"> ╚████╔╝ ██║ ██████╔╝ ███████╗ ██████╔╝ ██║</tspan>
<tspan x="295" y="76"> ╚═══╝ ╚═╝ ╚═════╝ ╚══════╝ ╚═════╝ ╚═╝</tspan>
</text>
<!-- Separator -->
<line x1="60" y1="84" x2="790" y2="84" stroke="#F2C811" stroke-opacity="0.15" stroke-width="1"/>
<!-- Tagline -->
<text x="425" y="100" font-family="'Segoe UI', Arial, sans-serif" font-size="13" fill="#e6edf3" text-anchor="middle" font-weight="600">The First CLI for Both Power BI Modeling and Reporting</text>
<!-- ===== Connection Flow: Claude > PBI-CLI > Power BI ===== -->
<!-- Claude AI logo (inline, original 1200x1200, displayed as 50x50, centered at x=110) -->
<svg x="85" y="110" width="50" height="50" viewBox="0 0 1200 1200">
<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"/>
</svg>
<text x="110" y="175" 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="155" y1="135" x2="290" y2="135" stroke="#F2C811" stroke-width="2" stroke-dasharray="6,4" stroke-opacity="0.5"/>
<polygon points="294,135 286,130 286,140" fill="#F2C811" fill-opacity="0.5"/>
<!-- PBI-CLI block art (shadow) -->
<text font-family="'Courier New', Courier, monospace" font-size="7" fill="#7A6508" xml:space="preserve">
<tspan x="316" y="118">██████╗ ██████╗ ██╗ ██████╗ ██╗ ██╗</tspan>
<tspan x="316" y="128">██╔══██╗ ██╔══██╗ ██║ ██╔════╝ ██║ ██║</tspan>
<tspan x="316" y="138">██████╔╝ ██████╔╝ ██║ ███╗ ██║ ██║ ██║</tspan>
<tspan x="316" y="148">██╔═══╝ ██╔══██╗ ██║ ╚══╝ ██║ ██║ ██║</tspan>
<tspan x="316" y="158">██║ ██████╔╝ ██║ ╚██████╗ ███████╗ ██║</tspan>
<tspan x="316" y="168">╚═╝ ╚═════╝ ╚═╝ ╚═════╝ ╚══════╝ ╚═╝</tspan>
</text>
<!-- PBI-CLI block art (main) -->
<text font-family="'Courier New', Courier, monospace" font-size="7" fill="#F2C811" xml:space="preserve">
<tspan x="315" y="117">██████╗ ██████╗ ██╗ ██████╗ ██╗ ██╗</tspan>
<tspan x="315" y="127">██╔══██╗ ██╔══██╗ ██║ ██╔════╝ ██║ ██║</tspan>
<tspan x="315" y="137">██████╔╝ ██████╔╝ ██║ ███╗ ██║ ██║ ██║</tspan>
<tspan x="315" y="147">██╔═══╝ ██╔══██╗ ██║ ╚══╝ ██║ ██║ ██║</tspan>
<tspan x="315" y="157">██║ ██████╔╝ ██║ ╚██████╗ ███████╗ ██║</tspan>
<tspan x="315" y="167">╚═╝ ╚═════╝ ╚═╝ ╚═════╝ ╚══════╝ ╚═╝</tspan>
</text>
<!-- Right arrow -->
<line x1="560" y1="135" x2="655" y2="135" stroke="#F2C811" stroke-width="2" stroke-dasharray="6,4" stroke-opacity="0.5"/>
<polygon points="659,135 651,130 651,140" fill="#F2C811" fill-opacity="0.5"/>
<!-- Power BI logo (inline, original 630x630, displayed as 50x50, centered at x=700) -->
<svg x="675" y="110" width="50" height="50" viewBox="0 0 630 630">
<g transform="translate(77.5, 0)">
<rect fill="url(#pbi-lg1)" x="256" y="0" width="219" height="630" rx="26"/>
<path fill="url(#pbi-lg2)" d="M346,604 L346,630 L320,630 L153,630 C138.64,630 127,618.36 127,604 L127,183 C127,168.64 138.64,157 153,157 L320,157 C334.36,157 346,168.64 346,183 L346,604 Z"/>
<path fill="url(#pbi-lg5)" d="M219,604 L219,630 L193,630 L26,630 C11.64,630 0,618.36 0,604 L0,341 C0,326.64 11.64,315 26,315 L193,315 C207.36,315 219,326.64 219,341 L219,604 Z"/>
</g>
</svg>
<text x="700" y="175" font-family="'Segoe UI', Arial, sans-serif" font-size="11" fill="#F2C811" text-anchor="middle" font-weight="600">Power BI</text>
<!-- Modeling + Reporting pills -->
<rect x="308" y="176" width="100" height="20" rx="10" fill="#58a6ff" fill-opacity="0.1" stroke="#58a6ff" stroke-width="1"/>
<text x="358" y="190" font-family="'Segoe UI', Arial, sans-serif" font-size="10" fill="#58a6ff" text-anchor="middle" font-weight="600">Modeling</text>
<text x="420" y="190" font-family="'Segoe UI', Arial, sans-serif" font-size="10" fill="#8b949e" text-anchor="middle">+</text>
<rect x="432" y="176" width="100" height="20" rx="10" fill="#06d6a0" fill-opacity="0.1" stroke="#06d6a0" stroke-width="1"/>
<text x="482" y="190" font-family="'Segoe UI', Arial, sans-serif" font-size="10" fill="#06d6a0" text-anchor="middle" font-weight="600">Reporting</text>
<!-- Bottom separator -->
<line x1="60" y1="200" x2="790" y2="200" stroke="#F2C811" stroke-opacity="0.25" stroke-width="2"/>
<!-- ==================== END HEADER ==================== -->
<!-- Feature content (shifted down by 210px) -->
<g transform="translate(0, 210)">
<!-- Badge -->
<rect x="285" y="12" width="280" height="28" rx="14" fill="#161b22" stroke="#F2C811" stroke-width="1.5"/>
<text x="425" y="31" font-family="'Segoe UI', Arial, sans-serif" font-size="13" fill="#F2C811" text-anchor="middle" font-weight="bold">THE FIRST CLI FOR BOTH LAYERS</text>
<!-- Main title -->
<text x="425" y="72" font-family="'Segoe UI', Arial, sans-serif" font-size="24" fill="#e6edf3" text-anchor="middle" font-weight="bold">One CLI. Two Layers. Complete Control.</text>
<text x="425" y="96" font-family="'Segoe UI', Arial, sans-serif" font-size="14" fill="#8b949e" text-anchor="middle">pbi-cli connects Claude Code to both your semantic model and your report design</text>
<rect x="60" y="110" width="730" height="1" fill="url(#dl-glow)"/>
<!-- ============ LEFT: Semantic Model Layer ============ -->
<rect x="55" y="125" width="340" height="270" rx="10" fill="#161b22" stroke="#58a6ff" stroke-width="1.5"/>
<!-- Layer header -->
<text x="225" y="149" font-family="'Segoe UI', Arial, sans-serif" font-size="15" fill="#58a6ff" text-anchor="middle" font-weight="bold">Semantic Model Layer</text>
<line x1="70" y1="160" x2="380" y2="160" stroke="#58a6ff" stroke-width="1" stroke-opacity="0.2"/>
<!-- Power BI logo centered -->
<g transform="translate(197, 172)">
<rect x="30" y="0" width="16" height="40" rx="3" fill="url(#dl-b1)"/>
<rect x="15" y="12" width="16" height="28" rx="3" fill="url(#dl-b2)"/>
<rect x="0" y="22" width="16" height="18" rx="3" fill="url(#dl-b3)"/>
</g>
<text x="225" y="228" font-family="'Segoe UI', Arial, sans-serif" font-size="14" fill="#58a6ff" text-anchor="middle" font-weight="bold">Live .NET Connection</text>
<text x="225" y="246" font-family="'Segoe UI', Arial, sans-serif" font-size="12" fill="#8b949e" text-anchor="middle">Direct TOM interop via pythonnet</text>
<!-- Commands -->
<circle cx="75" cy="268" r="3" fill="#58a6ff" opacity="0.6"/>
<text x="87" y="272" font-family="'Courier New', Courier, monospace" font-size="12" fill="#e6edf3">pbi measure create</text>
<circle cx="75" cy="288" r="3" fill="#58a6ff" opacity="0.6"/>
<text x="87" y="292" font-family="'Courier New', Courier, monospace" font-size="12" fill="#e6edf3">pbi dax execute</text>
<circle cx="75" cy="308" r="3" fill="#58a6ff" opacity="0.6"/>
<text x="87" y="312" font-family="'Courier New', Courier, monospace" font-size="12" fill="#e6edf3">pbi database export-tmdl</text>
<circle cx="75" cy="328" r="3" fill="#58a6ff" opacity="0.6"/>
<text x="87" y="332" font-family="'Courier New', Courier, monospace" font-size="12" fill="#e6edf3">pbi relationship create</text>
<!-- 7 skills badge -->
<rect x="165" y="360" width="120" height="24" rx="12" fill="#58a6ff" fill-opacity="0.1" stroke="#58a6ff" stroke-width="1"/>
<text x="225" y="376" font-family="'Segoe UI', Arial, sans-serif" font-size="11" fill="#58a6ff" text-anchor="middle" font-weight="600">7 Claude Skills</text>
<!-- ============ RIGHT: Report Layer ============ -->
<rect x="455" y="125" width="340" height="270" rx="10" fill="#161b22" stroke="#06d6a0" stroke-width="1.5"/>
<!-- Layer header -->
<text x="625" y="149" font-family="'Segoe UI', Arial, sans-serif" font-size="15" fill="#06d6a0" text-anchor="middle" font-weight="bold">Report Layer</text>
<line x1="470" y1="160" x2="780" y2="160" stroke="#06d6a0" stroke-width="1" stroke-opacity="0.2"/>
<!-- NEW badge -->
<rect x="730" y="135" width="50" height="20" rx="10" fill="#06d6a0"/>
<text x="755" y="150" font-family="'Segoe UI', Arial, sans-serif" font-size="11" fill="#0d1117" text-anchor="middle" font-weight="bold">NEW</text>
<!-- Report icon centered -->
<g transform="translate(608, 172)">
<rect x="0" y="0" width="34" height="42" rx="4" fill="none" stroke="#06d6a0" stroke-width="1.5"/>
<line x1="5" y1="9" x2="29" y2="9" stroke="#06d6a0" stroke-width="0.8" stroke-opacity="0.3"/>
<rect x="6" y="16" width="6" height="20" rx="1" fill="#06d6a0" opacity="0.4"/>
<rect x="14" y="10" width="6" height="26" rx="1" fill="#06d6a0" opacity="0.6"/>
<rect x="22" y="5" width="6" height="31" rx="1" fill="#06d6a0" opacity="0.8"/>
</g>
<text x="625" y="228" font-family="'Segoe UI', Arial, sans-serif" font-size="14" fill="#06d6a0" text-anchor="middle" font-weight="bold">PBIR File Operations</text>
<text x="625" y="246" font-family="'Segoe UI', Arial, sans-serif" font-size="12" fill="#8b949e" text-anchor="middle">Read/write JSON, no connection</text>
<!-- Commands -->
<circle cx="465" cy="268" r="3" fill="#06d6a0" opacity="0.6"/>
<text x="477" y="272" font-family="'Courier New', Courier, monospace" font-size="12" fill="#e6edf3">pbi visual add --type bar</text>
<circle cx="465" cy="288" r="3" fill="#06d6a0" opacity="0.6"/>
<text x="477" y="292" font-family="'Courier New', Courier, monospace" font-size="12" fill="#e6edf3">pbi visual bind --category</text>
<circle cx="465" cy="308" r="3" fill="#06d6a0" opacity="0.6"/>
<text x="477" y="312" font-family="'Courier New', Courier, monospace" font-size="12" fill="#e6edf3">pbi filters add-topn --n 10</text>
<circle cx="465" cy="328" r="3" fill="#06d6a0" opacity="0.6"/>
<text x="477" y="332" font-family="'Courier New', Courier, monospace" font-size="12" fill="#e6edf3">pbi report set-theme</text>
<!-- 5 skills badge -->
<rect x="565" y="360" width="120" height="24" rx="12" fill="#06d6a0" fill-opacity="0.1" stroke="#06d6a0" stroke-width="1"/>
<text x="625" y="376" font-family="'Segoe UI', Arial, sans-serif" font-size="11" fill="#06d6a0" text-anchor="middle" font-weight="600">5 Claude Skills</text>
<!-- ============ Footer stats ============ -->
<text x="425" y="425" font-family="'Segoe UI', Arial, sans-serif" font-size="13" fill="#8b949e" text-anchor="middle">27 command groups | 125+ subcommands | 32 visual types | 12 Claude skills</text>
</g>
</svg>

After

Width:  |  Height:  |  Size: 19 KiB

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

@ -0,0 +1,230 @@
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="850" height="730" viewBox="0 0 850 730">
<defs>
<linearGradient id="hdr-bar1" x1="50%" y1="0%" x2="50%" y2="100%">
<stop offset="0%" stop-color="#EBBB14"/>
<stop offset="100%" stop-color="#B25400"/>
</linearGradient>
<linearGradient id="hdr-bar2" x1="50%" y1="0%" x2="50%" y2="100%">
<stop offset="0%" stop-color="#F9E583"/>
<stop offset="100%" stop-color="#DE9800"/>
</linearGradient>
<linearGradient id="hdr-bar3" x1="50%" y1="0%" x2="50%" y2="100%">
<stop offset="0%" stop-color="#F9E68B"/>
<stop offset="100%" stop-color="#F3CD32"/>
</linearGradient>
<linearGradient id="pbi-lg1" x1="50%" y1="0%" x2="50%" y2="100%">
<stop offset="0%" stop-color="#EBBB14"/>
<stop offset="100%" stop-color="#B25400"/>
</linearGradient>
<linearGradient id="pbi-lg2" x1="50%" y1="0%" x2="50%" y2="100%">
<stop offset="0%" stop-color="#F9E583"/>
<stop offset="100%" stop-color="#DE9800"/>
</linearGradient>
<linearGradient id="pbi-lg5" x1="50%" y1="0%" x2="50%" y2="100%">
<stop offset="0%" stop-color="#F9E68B"/>
<stop offset="100%" stop-color="#F3CD32"/>
</linearGradient>
</defs>
<!-- Full background -->
<rect width="100%" height="100%" fill="#0d1117"/>
<!-- ==================== VIBE BI HEADER ==================== -->
<!-- "VIBE BI" block art (shadow) -->
<text font-family="'Courier New', Courier, monospace" font-size="9" fill="#7A6508" xml:space="preserve">
<tspan x="296" y="22">██╗ ██╗ ██╗ ██████╗ ███████╗ ██████╗ ██╗</tspan>
<tspan x="296" y="33">██║ ██║ ██║ ██╔══██╗ ██╔════╝ ██╔══██╗ ██║</tspan>
<tspan x="296" y="44">██║ ██║ ██║ ██████╔╝ █████╗ ██████╔╝ ██║</tspan>
<tspan x="296" y="55">╚██╗ ██╔╝ ██║ ██╔══██╗ ██╔══╝ ██╔══██╗ ██║</tspan>
<tspan x="296" y="66"> ╚████╔╝ ██║ ██████╔╝ ███████╗ ██████╔╝ ██║</tspan>
<tspan x="296" y="77"> ╚═══╝ ╚═╝ ╚═════╝ ╚══════╝ ╚═════╝ ╚═╝</tspan>
</text>
<!-- "VIBE BI" block art (main) -->
<text font-family="'Courier New', Courier, monospace" font-size="9" fill="#F2C811" xml:space="preserve">
<tspan x="295" y="21">██╗ ██╗ ██╗ ██████╗ ███████╗ ██████╗ ██╗</tspan>
<tspan x="295" y="32">██║ ██║ ██║ ██╔══██╗ ██╔════╝ ██╔══██╗ ██║</tspan>
<tspan x="295" y="43">██║ ██║ ██║ ██████╔╝ █████╗ ██████╔╝ ██║</tspan>
<tspan x="295" y="54">╚██╗ ██╔╝ ██║ ██╔══██╗ ██╔══╝ ██╔══██╗ ██║</tspan>
<tspan x="295" y="65"> ╚████╔╝ ██║ ██████╔╝ ███████╗ ██████╔╝ ██║</tspan>
<tspan x="295" y="76"> ╚═══╝ ╚═╝ ╚═════╝ ╚══════╝ ╚═════╝ ╚═╝</tspan>
</text>
<!-- Separator -->
<line x1="60" y1="84" x2="790" y2="84" stroke="#F2C811" stroke-opacity="0.15" stroke-width="1"/>
<!-- Tagline -->
<text x="425" y="100" font-family="'Segoe UI', Arial, sans-serif" font-size="13" fill="#e6edf3" text-anchor="middle" font-weight="600">The First CLI for Both Power BI Modeling and Reporting</text>
<!-- ===== Connection Flow: Claude > PBI-CLI > Power BI ===== -->
<!-- Claude AI logo (inline, original 1200x1200, displayed as 50x50, centered at x=110) -->
<svg x="85" y="110" width="50" height="50" viewBox="0 0 1200 1200">
<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"/>
</svg>
<text x="110" y="175" 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="155" y1="135" x2="290" y2="135" stroke="#F2C811" stroke-width="2" stroke-dasharray="6,4" stroke-opacity="0.5"/>
<polygon points="294,135 286,130 286,140" fill="#F2C811" fill-opacity="0.5"/>
<!-- PBI-CLI block art (shadow) -->
<text font-family="'Courier New', Courier, monospace" font-size="7" fill="#7A6508" xml:space="preserve">
<tspan x="316" y="118">██████╗ ██████╗ ██╗ ██████╗ ██╗ ██╗</tspan>
<tspan x="316" y="128">██╔══██╗ ██╔══██╗ ██║ ██╔════╝ ██║ ██║</tspan>
<tspan x="316" y="138">██████╔╝ ██████╔╝ ██║ ███╗ ██║ ██║ ██║</tspan>
<tspan x="316" y="148">██╔═══╝ ██╔══██╗ ██║ ╚══╝ ██║ ██║ ██║</tspan>
<tspan x="316" y="158">██║ ██████╔╝ ██║ ╚██████╗ ███████╗ ██║</tspan>
<tspan x="316" y="168">╚═╝ ╚═════╝ ╚═╝ ╚═════╝ ╚══════╝ ╚═╝</tspan>
</text>
<!-- PBI-CLI block art (main) -->
<text font-family="'Courier New', Courier, monospace" font-size="7" fill="#F2C811" xml:space="preserve">
<tspan x="315" y="117">██████╗ ██████╗ ██╗ ██████╗ ██╗ ██╗</tspan>
<tspan x="315" y="127">██╔══██╗ ██╔══██╗ ██║ ██╔════╝ ██║ ██║</tspan>
<tspan x="315" y="137">██████╔╝ ██████╔╝ ██║ ███╗ ██║ ██║ ██║</tspan>
<tspan x="315" y="147">██╔═══╝ ██╔══██╗ ██║ ╚══╝ ██║ ██║ ██║</tspan>
<tspan x="315" y="157">██║ ██████╔╝ ██║ ╚██████╗ ███████╗ ██║</tspan>
<tspan x="315" y="167">╚═╝ ╚═════╝ ╚═╝ ╚═════╝ ╚══════╝ ╚═╝</tspan>
</text>
<!-- Right arrow -->
<line x1="560" y1="135" x2="655" y2="135" stroke="#F2C811" stroke-width="2" stroke-dasharray="6,4" stroke-opacity="0.5"/>
<polygon points="659,135 651,130 651,140" fill="#F2C811" fill-opacity="0.5"/>
<!-- Power BI logo (inline, original 630x630, displayed as 50x50, centered at x=700) -->
<svg x="675" y="110" width="50" height="50" viewBox="0 0 630 630">
<g transform="translate(77.5, 0)">
<rect fill="url(#pbi-lg1)" x="256" y="0" width="219" height="630" rx="26"/>
<path fill="url(#pbi-lg2)" d="M346,604 L346,630 L320,630 L153,630 C138.64,630 127,618.36 127,604 L127,183 C127,168.64 138.64,157 153,157 L320,157 C334.36,157 346,168.64 346,183 L346,604 Z"/>
<path fill="url(#pbi-lg5)" d="M219,604 L219,630 L193,630 L26,630 C11.64,630 0,618.36 0,604 L0,341 C0,326.64 11.64,315 26,315 L193,315 C207.36,315 219,326.64 219,341 L219,604 Z"/>
</g>
</svg>
<text x="700" y="175" font-family="'Segoe UI', Arial, sans-serif" font-size="11" fill="#F2C811" text-anchor="middle" font-weight="600">Power BI</text>
<!-- Modeling + Reporting pills -->
<rect x="308" y="176" width="100" height="20" rx="10" fill="#58a6ff" fill-opacity="0.1" stroke="#58a6ff" stroke-width="1"/>
<text x="358" y="190" font-family="'Segoe UI', Arial, sans-serif" font-size="10" fill="#58a6ff" text-anchor="middle" font-weight="600">Modeling</text>
<text x="420" y="190" font-family="'Segoe UI', Arial, sans-serif" font-size="10" fill="#8b949e" text-anchor="middle">+</text>
<rect x="432" y="176" width="100" height="20" rx="10" fill="#06d6a0" fill-opacity="0.1" stroke="#06d6a0" stroke-width="1"/>
<text x="482" y="190" font-family="'Segoe UI', Arial, sans-serif" font-size="10" fill="#06d6a0" text-anchor="middle" font-weight="600">Reporting</text>
<!-- Bottom separator -->
<line x1="60" y1="200" x2="790" y2="200" stroke="#F2C811" stroke-opacity="0.25" stroke-width="2"/>
<!-- ==================== END HEADER ==================== -->
<!-- Feature content (shifted down by 210px) -->
<g transform="translate(0, 210)">
<!-- 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="13" 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="12" 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="12" 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="12" 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="12" 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="12" 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="12" 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="12" 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="12" 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="12" 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="12" 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="12" 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="12" 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="12" 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="12" 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="12" 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="12" 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="12" 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="12" 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="12" 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="12" 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="12" 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="12" 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="12" 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="12" 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>
</g>
</svg>

After

Width:  |  Height:  |  Size: 22 KiB

19
assets/header.svg Normal file
View file

@ -0,0 +1,19 @@
<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>
<tspan x="21" y="47">██╔══██╗ ██╔══██╗ ██║ ██╔════╝ ██║ ██║</tspan>
<tspan x="21" y="65">██████╔╝ ██████╔╝ ██║ ███╗ ██║ ██║ ██║</tspan>
<tspan x="21" y="83">██╔═══╝ ██╔══██╗ ██║ ╚══╝ ██║ ██║ ██║</tspan>
<tspan x="21" y="101">██║ ██████╔╝ ██║ ╚██████╗ ███████╗ ██║</tspan>
<tspan x="21" y="119">╚═╝ ╚═════╝ ╚═╝ ╚═════╝ ╚══════╝ ╚═╝</tspan>
</text>
<text font-family="'Courier New', Courier, monospace" font-size="14.5" fill="#F2C811" xml:space="preserve">
<tspan x="20" y="28">██████╗ ██████╗ ██╗ ██████╗ ██╗ ██╗</tspan>
<tspan x="20" y="46">██╔══██╗ ██╔══██╗ ██║ ██╔════╝ ██║ ██║</tspan>
<tspan x="20" y="64">██████╔╝ ██████╔╝ ██║ ███╗ ██║ ██║ ██║</tspan>
<tspan x="20" y="82">██╔═══╝ ██╔══██╗ ██║ ╚══╝ ██║ ██║ ██║</tspan>
<tspan x="20" y="100">██║ ██████╔╝ ██║ ╚██████╗ ███████╗ ██║</tspan>
<tspan x="20" y="118">╚═╝ ╚═════╝ ╚═╝ ╚═════╝ ╚══════╝ ╚═╝</tspan>
</text>
</svg>

After

Width:  |  Height:  |  Size: 2.1 KiB

228
assets/how-it-works.svg Normal file
View file

@ -0,0 +1,228 @@
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="850" height="690" viewBox="0 0 850 690">
<defs>
<linearGradient id="hdr-bar1" x1="50%" y1="0%" x2="50%" y2="100%">
<stop offset="0%" stop-color="#EBBB14"/>
<stop offset="100%" stop-color="#B25400"/>
</linearGradient>
<linearGradient id="hdr-bar2" x1="50%" y1="0%" x2="50%" y2="100%">
<stop offset="0%" stop-color="#F9E583"/>
<stop offset="100%" stop-color="#DE9800"/>
</linearGradient>
<linearGradient id="hdr-bar3" x1="50%" y1="0%" x2="50%" y2="100%">
<stop offset="0%" stop-color="#F9E68B"/>
<stop offset="100%" stop-color="#F3CD32"/>
</linearGradient>
<linearGradient id="pbi-lg1" x1="50%" y1="0%" x2="50%" y2="100%">
<stop offset="0%" stop-color="#EBBB14"/>
<stop offset="100%" stop-color="#B25400"/>
</linearGradient>
<linearGradient id="pbi-lg2" x1="50%" y1="0%" x2="50%" y2="100%">
<stop offset="0%" stop-color="#F9E583"/>
<stop offset="100%" stop-color="#DE9800"/>
</linearGradient>
<linearGradient id="pbi-lg5" x1="50%" y1="0%" x2="50%" y2="100%">
<stop offset="0%" stop-color="#F9E68B"/>
<stop offset="100%" stop-color="#F3CD32"/>
</linearGradient>
<marker id="arrowhead" markerWidth="10" markerHeight="7" refX="10" refY="3.5" orient="auto">
<polygon points="0 0, 10 3.5, 0 7" fill="#F2C811" fill-opacity="0.4"/>
</marker>
</defs>
<!-- Full background -->
<rect width="100%" height="100%" fill="#0d1117"/>
<!-- ==================== VIBE BI HEADER ==================== -->
<!-- "VIBE BI" block art (shadow) -->
<text font-family="'Courier New', Courier, monospace" font-size="9" fill="#7A6508" xml:space="preserve">
<tspan x="296" y="22">██╗ ██╗ ██╗ ██████╗ ███████╗ ██████╗ ██╗</tspan>
<tspan x="296" y="33">██║ ██║ ██║ ██╔══██╗ ██╔════╝ ██╔══██╗ ██║</tspan>
<tspan x="296" y="44">██║ ██║ ██║ ██████╔╝ █████╗ ██████╔╝ ██║</tspan>
<tspan x="296" y="55">╚██╗ ██╔╝ ██║ ██╔══██╗ ██╔══╝ ██╔══██╗ ██║</tspan>
<tspan x="296" y="66"> ╚████╔╝ ██║ ██████╔╝ ███████╗ ██████╔╝ ██║</tspan>
<tspan x="296" y="77"> ╚═══╝ ╚═╝ ╚═════╝ ╚══════╝ ╚═════╝ ╚═╝</tspan>
</text>
<!-- "VIBE BI" block art (main) -->
<text font-family="'Courier New', Courier, monospace" font-size="9" fill="#F2C811" xml:space="preserve">
<tspan x="295" y="21">██╗ ██╗ ██╗ ██████╗ ███████╗ ██████╗ ██╗</tspan>
<tspan x="295" y="32">██║ ██║ ██║ ██╔══██╗ ██╔════╝ ██╔══██╗ ██║</tspan>
<tspan x="295" y="43">██║ ██║ ██║ ██████╔╝ █████╗ ██████╔╝ ██║</tspan>
<tspan x="295" y="54">╚██╗ ██╔╝ ██║ ██╔══██╗ ██╔══╝ ██╔══██╗ ██║</tspan>
<tspan x="295" y="65"> ╚████╔╝ ██║ ██████╔╝ ███████╗ ██████╔╝ ██║</tspan>
<tspan x="295" y="76"> ╚═══╝ ╚═╝ ╚═════╝ ╚══════╝ ╚═════╝ ╚═╝</tspan>
</text>
<!-- Separator -->
<line x1="60" y1="84" x2="790" y2="84" stroke="#F2C811" stroke-opacity="0.15" stroke-width="1"/>
<!-- Tagline -->
<text x="425" y="100" font-family="'Segoe UI', Arial, sans-serif" font-size="13" fill="#e6edf3" text-anchor="middle" font-weight="600">The First CLI for Both Power BI Modeling and Reporting</text>
<!-- ===== Connection Flow: Claude > PBI-CLI > Power BI ===== -->
<!-- Claude AI logo (inline, original 1200x1200, displayed as 50x50, centered at x=110) -->
<svg x="85" y="110" width="50" height="50" viewBox="0 0 1200 1200">
<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"/>
</svg>
<text x="110" y="175" 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="155" y1="135" x2="290" y2="135" stroke="#F2C811" stroke-width="2" stroke-dasharray="6,4" stroke-opacity="0.5"/>
<polygon points="294,135 286,130 286,140" fill="#F2C811" fill-opacity="0.5"/>
<!-- PBI-CLI block art (shadow) -->
<text font-family="'Courier New', Courier, monospace" font-size="7" fill="#7A6508" xml:space="preserve">
<tspan x="316" y="118">██████╗ ██████╗ ██╗ ██████╗ ██╗ ██╗</tspan>
<tspan x="316" y="128">██╔══██╗ ██╔══██╗ ██║ ██╔════╝ ██║ ██║</tspan>
<tspan x="316" y="138">██████╔╝ ██████╔╝ ██║ ███╗ ██║ ██║ ██║</tspan>
<tspan x="316" y="148">██╔═══╝ ██╔══██╗ ██║ ╚══╝ ██║ ██║ ██║</tspan>
<tspan x="316" y="158">██║ ██████╔╝ ██║ ╚██████╗ ███████╗ ██║</tspan>
<tspan x="316" y="168">╚═╝ ╚═════╝ ╚═╝ ╚═════╝ ╚══════╝ ╚═╝</tspan>
</text>
<!-- PBI-CLI block art (main) -->
<text font-family="'Courier New', Courier, monospace" font-size="7" fill="#F2C811" xml:space="preserve">
<tspan x="315" y="117">██████╗ ██████╗ ██╗ ██████╗ ██╗ ██╗</tspan>
<tspan x="315" y="127">██╔══██╗ ██╔══██╗ ██║ ██╔════╝ ██║ ██║</tspan>
<tspan x="315" y="137">██████╔╝ ██████╔╝ ██║ ███╗ ██║ ██║ ██║</tspan>
<tspan x="315" y="147">██╔═══╝ ██╔══██╗ ██║ ╚══╝ ██║ ██║ ██║</tspan>
<tspan x="315" y="157">██║ ██████╔╝ ██║ ╚██████╗ ███████╗ ██║</tspan>
<tspan x="315" y="167">╚═╝ ╚═════╝ ╚═╝ ╚═════╝ ╚══════╝ ╚═╝</tspan>
</text>
<!-- Right arrow -->
<line x1="560" y1="135" x2="655" y2="135" stroke="#F2C811" stroke-width="2" stroke-dasharray="6,4" stroke-opacity="0.5"/>
<polygon points="659,135 651,130 651,140" fill="#F2C811" fill-opacity="0.5"/>
<!-- Power BI logo (inline, original 630x630, displayed as 50x50, centered at x=700) -->
<svg x="675" y="110" width="50" height="50" viewBox="0 0 630 630">
<g transform="translate(77.5, 0)">
<rect fill="url(#pbi-lg1)" x="256" y="0" width="219" height="630" rx="26"/>
<path fill="url(#pbi-lg2)" d="M346,604 L346,630 L320,630 L153,630 C138.64,630 127,618.36 127,604 L127,183 C127,168.64 138.64,157 153,157 L320,157 C334.36,157 346,168.64 346,183 L346,604 Z"/>
<path fill="url(#pbi-lg5)" d="M219,604 L219,630 L193,630 L26,630 C11.64,630 0,618.36 0,604 L0,341 C0,326.64 11.64,315 26,315 L193,315 C207.36,315 219,326.64 219,341 L219,604 Z"/>
</g>
</svg>
<text x="700" y="175" font-family="'Segoe UI', Arial, sans-serif" font-size="11" fill="#F2C811" text-anchor="middle" font-weight="600">Power BI</text>
<!-- Modeling + Reporting pills -->
<rect x="308" y="176" width="100" height="20" rx="10" fill="#58a6ff" fill-opacity="0.1" stroke="#58a6ff" stroke-width="1"/>
<text x="358" y="190" font-family="'Segoe UI', Arial, sans-serif" font-size="10" fill="#58a6ff" text-anchor="middle" font-weight="600">Modeling</text>
<text x="420" y="190" font-family="'Segoe UI', Arial, sans-serif" font-size="10" fill="#8b949e" text-anchor="middle">+</text>
<rect x="432" y="176" width="100" height="20" rx="10" fill="#06d6a0" fill-opacity="0.1" stroke="#06d6a0" stroke-width="1"/>
<text x="482" y="190" font-family="'Segoe UI', Arial, sans-serif" font-size="10" fill="#06d6a0" text-anchor="middle" font-weight="600">Reporting</text>
<!-- Bottom separator -->
<line x1="60" y1="200" x2="790" y2="200" stroke="#F2C811" stroke-opacity="0.25" stroke-width="2"/>
<!-- ==================== END HEADER ==================== -->
<!-- Feature content (shifted down by 210px) -->
<g transform="translate(0, 210)">
<!-- Background -->
<!-- Title -->
<text x="425" y="42" text-anchor="middle" font-family="Segoe UI, Arial, sans-serif" font-size="28" font-weight="bold" fill="#F2C811">How It Works</text>
<!-- Subtitle -->
<text x="425" y="68" text-anchor="middle" font-family="Segoe UI, Arial, sans-serif" font-size="16" fill="#8b949e">Two commands. That is all.</text>
<!-- ==================== STEP 1 - INSTALL ==================== -->
<g transform="translate(142, 0)">
<!-- Step number circle -->
<circle cx="0" cy="105" r="18" fill="#F2C811"/>
<text x="0" y="111" text-anchor="middle" font-family="Segoe UI, Arial, sans-serif" font-size="18" font-weight="bold" fill="#0d1117">1</text>
<!-- Card -->
<rect x="-100" y="135" width="200" height="180" rx="8" fill="#161b22" stroke="#F2C811" stroke-opacity="0.4" stroke-width="1"/>
<!-- Terminal header bar -->
<rect x="-88" y="147" width="176" height="24" rx="4" fill="#21262d"/>
<!-- Traffic light dots -->
<circle cx="-74" cy="159" r="4" fill="#ff5f56"/>
<circle cx="-60" cy="159" r="4" fill="#ffbd2e"/>
<circle cx="-46" cy="159" r="4" fill="#27c93f"/>
<!-- Terminal text -->
<text x="-78" y="198" font-family="Consolas, Monaco, monospace" font-size="13" fill="#06d6a0">$ pipx install</text>
<text x="-78" y="218" font-family="Consolas, Monaco, monospace" font-size="13" fill="#06d6a0"> pbi-cli-tool</text>
<text x="-78" y="252" font-family="Consolas, Monaco, monospace" font-size="13" fill="#06d6a0">&#x2713; Installed!</text>
<!-- Label -->
<text x="0" y="340" text-anchor="middle" font-family="Segoe UI, Arial, sans-serif" font-size="18" font-weight="bold" fill="#F2C811">INSTALL</text>
<!-- Sublabel -->
<text x="0" y="360" text-anchor="middle" font-family="Segoe UI, Arial, sans-serif" font-size="13" fill="#8b949e">One-line install via pipx</text>
</g>
<!-- ==================== ARROW 1 to 2 ==================== -->
<line x1="260" y1="225" x2="305" y2="225" stroke="#F2C811" stroke-opacity="0.4" stroke-width="2" stroke-dasharray="6,4" marker-end="url(#arrowhead)"/>
<!-- ==================== STEP 2 - CONNECT ==================== -->
<g transform="translate(425, 0)">
<!-- Step number circle -->
<circle cx="0" cy="105" r="18" fill="#F2C811"/>
<text x="0" y="111" text-anchor="middle" font-family="Segoe UI, Arial, sans-serif" font-size="18" font-weight="bold" fill="#0d1117">2</text>
<!-- Card -->
<rect x="-100" y="135" width="200" height="180" rx="8" fill="#161b22" stroke="#F2C811" stroke-opacity="0.4" stroke-width="1"/>
<!-- Terminal header bar -->
<rect x="-88" y="147" width="176" height="24" rx="4" fill="#21262d"/>
<!-- Traffic light dots -->
<circle cx="-74" cy="159" r="4" fill="#ff5f56"/>
<circle cx="-60" cy="159" r="4" fill="#ffbd2e"/>
<circle cx="-46" cy="159" r="4" fill="#27c93f"/>
<!-- Terminal text -->
<text x="-78" y="198" font-family="Consolas, Monaco, monospace" font-size="13" fill="#58a6ff">$ pbi connect</text>
<text x="-78" y="220" font-family="Consolas, Monaco, monospace" font-size="13" fill="#8b949e">Scanning for Power BI...</text>
<text x="-78" y="248" font-family="Consolas, Monaco, monospace" font-size="13" fill="#06d6a0">&#x2713; Connected to</text>
<text x="-78" y="264" font-family="Consolas, Monaco, monospace" font-size="13" fill="#06d6a0"> Adventure Works</text>
<text x="-78" y="290" font-family="Consolas, Monaco, monospace" font-size="13" fill="#F2C811"> 7 skills installed</text>
<!-- Label -->
<text x="0" y="340" text-anchor="middle" font-family="Segoe UI, Arial, sans-serif" font-size="18" font-weight="bold" fill="#F2C811">CONNECT</text>
<!-- Sublabel -->
<text x="0" y="360" text-anchor="middle" font-family="Segoe UI, Arial, sans-serif" font-size="13" fill="#8b949e">Auto-detects Power BI Desktop</text>
</g>
<!-- ==================== ARROW 2 to 3 ==================== -->
<line x1="543" y1="225" x2="588" y2="225" stroke="#F2C811" stroke-opacity="0.4" stroke-width="2" stroke-dasharray="6,4" marker-end="url(#arrowhead)"/>
<!-- ==================== STEP 3 - CHAT ==================== -->
<g transform="translate(708, 0)">
<!-- Step number circle -->
<circle cx="0" cy="105" r="18" fill="#F2C811"/>
<text x="0" y="111" text-anchor="middle" font-family="Segoe UI, Arial, sans-serif" font-size="18" font-weight="bold" fill="#0d1117">3</text>
<!-- Card -->
<rect x="-100" y="135" width="200" height="180" rx="8" fill="#161b22" stroke="#F2C811" stroke-opacity="0.4" stroke-width="1"/>
<!-- Chat header -->
<rect x="-88" y="147" width="176" height="24" rx="4" fill="#21262d"/>
<text x="-74" y="163" font-family="Segoe UI, Arial, sans-serif" font-size="11" font-weight="bold" fill="#8b949e">Claude Code</text>
<!-- User chat bubble -->
<rect x="-82" y="182" width="164" height="30" rx="6" fill="#1a3a5c"/>
<text x="-72" y="201" font-family="Segoe UI, Arial, sans-serif" font-size="12" fill="#c9d1d9">Create a date table</text>
<!-- Claude response bubble -->
<rect x="-82" y="222" width="164" height="44" rx="6" fill="#1c1c1c"/>
<text x="-72" y="240" font-family="Consolas, Monaco, monospace" font-size="11" fill="#8b949e">Running:</text>
<text x="-72" y="256" font-family="Consolas, Monaco, monospace" font-size="11" fill="#58a6ff">pbi calendar generate</text>
<!-- Check result -->
<text x="-78" y="290" font-family="Consolas, Monaco, monospace" font-size="13" fill="#06d6a0">&#x2713; Date table created</text>
<!-- Label -->
<text x="0" y="340" text-anchor="middle" font-family="Segoe UI, Arial, sans-serif" font-size="18" font-weight="bold" fill="#F2C811">CHAT</text>
<!-- Sublabel -->
<text x="0" y="360" text-anchor="middle" font-family="Segoe UI, Arial, sans-serif" font-size="13" fill="#8b949e">Claude picks the right skill</text>
</g>
<!-- ==================== FOOTER ==================== -->
<text x="425" y="440" text-anchor="middle" font-family="Segoe UI, Arial, sans-serif" font-size="15" fill="#8b949e">Claude auto-discovers 7 Power BI skills. No commands to memorize.</text>
</g>
</svg>

After

Width:  |  Height:  |  Size: 18 KiB

View file

@ -1,7 +1,122 @@
<svg xmlns="http://www.w3.org/2000/svg" width="850" height="440" viewBox="0 0 850 440">
<rect width="100%" height="100%" fill="#0d1117" rx="8"/>
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="850" height="650" viewBox="0 0 850 650">
<defs>
<linearGradient id="hdr-bar1" x1="50%" y1="0%" x2="50%" y2="100%">
<stop offset="0%" stop-color="#EBBB14"/>
<stop offset="100%" stop-color="#B25400"/>
</linearGradient>
<linearGradient id="hdr-bar2" x1="50%" y1="0%" x2="50%" y2="100%">
<stop offset="0%" stop-color="#F9E583"/>
<stop offset="100%" stop-color="#DE9800"/>
</linearGradient>
<linearGradient id="hdr-bar3" x1="50%" y1="0%" x2="50%" y2="100%">
<stop offset="0%" stop-color="#F9E68B"/>
<stop offset="100%" stop-color="#F3CD32"/>
</linearGradient>
<linearGradient id="pbi-lg1" x1="50%" y1="0%" x2="50%" y2="100%">
<stop offset="0%" stop-color="#EBBB14"/>
<stop offset="100%" stop-color="#B25400"/>
</linearGradient>
<linearGradient id="pbi-lg2" x1="50%" y1="0%" x2="50%" y2="100%">
<stop offset="0%" stop-color="#F9E583"/>
<stop offset="100%" stop-color="#DE9800"/>
</linearGradient>
<linearGradient id="pbi-lg5" x1="50%" y1="0%" x2="50%" y2="100%">
<stop offset="0%" stop-color="#F9E68B"/>
<stop offset="100%" stop-color="#F3CD32"/>
</linearGradient>
</defs>
<!-- Title -->
<!-- Full background -->
<rect width="100%" height="100%" fill="#0d1117"/>
<!-- ==================== VIBE BI HEADER ==================== -->
<!-- "VIBE BI" block art (shadow) -->
<text font-family="'Courier New', Courier, monospace" font-size="9" fill="#7A6508" xml:space="preserve">
<tspan x="296" y="22">██╗ ██╗ ██╗ ██████╗ ███████╗ ██████╗ ██╗</tspan>
<tspan x="296" y="33">██║ ██║ ██║ ██╔══██╗ ██╔════╝ ██╔══██╗ ██║</tspan>
<tspan x="296" y="44">██║ ██║ ██║ ██████╔╝ █████╗ ██████╔╝ ██║</tspan>
<tspan x="296" y="55">╚██╗ ██╔╝ ██║ ██╔══██╗ ██╔══╝ ██╔══██╗ ██║</tspan>
<tspan x="296" y="66"> ╚████╔╝ ██║ ██████╔╝ ███████╗ ██████╔╝ ██║</tspan>
<tspan x="296" y="77"> ╚═══╝ ╚═╝ ╚═════╝ ╚══════╝ ╚═════╝ ╚═╝</tspan>
</text>
<!-- "VIBE BI" block art (main) -->
<text font-family="'Courier New', Courier, monospace" font-size="9" fill="#F2C811" xml:space="preserve">
<tspan x="295" y="21">██╗ ██╗ ██╗ ██████╗ ███████╗ ██████╗ ██╗</tspan>
<tspan x="295" y="32">██║ ██║ ██║ ██╔══██╗ ██╔════╝ ██╔══██╗ ██║</tspan>
<tspan x="295" y="43">██║ ██║ ██║ ██████╔╝ █████╗ ██████╔╝ ██║</tspan>
<tspan x="295" y="54">╚██╗ ██╔╝ ██║ ██╔══██╗ ██╔══╝ ██╔══██╗ ██║</tspan>
<tspan x="295" y="65"> ╚████╔╝ ██║ ██████╔╝ ███████╗ ██████╔╝ ██║</tspan>
<tspan x="295" y="76"> ╚═══╝ ╚═╝ ╚═════╝ ╚══════╝ ╚═════╝ ╚═╝</tspan>
</text>
<!-- Separator -->
<line x1="60" y1="84" x2="790" y2="84" stroke="#F2C811" stroke-opacity="0.15" stroke-width="1"/>
<!-- Tagline -->
<text x="425" y="100" font-family="'Segoe UI', Arial, sans-serif" font-size="13" fill="#e6edf3" text-anchor="middle" font-weight="600">The First CLI for Both Power BI Modeling and Reporting</text>
<!-- ===== Connection Flow: Claude > PBI-CLI > Power BI ===== -->
<!-- Claude AI logo (inline, original 1200x1200, displayed as 50x50, centered at x=110) -->
<svg x="85" y="110" width="50" height="50" viewBox="0 0 1200 1200">
<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"/>
</svg>
<text x="110" y="175" 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="155" y1="135" x2="290" y2="135" stroke="#F2C811" stroke-width="2" stroke-dasharray="6,4" stroke-opacity="0.5"/>
<polygon points="294,135 286,130 286,140" fill="#F2C811" fill-opacity="0.5"/>
<!-- PBI-CLI block art (shadow) -->
<text font-family="'Courier New', Courier, monospace" font-size="7" fill="#7A6508" xml:space="preserve">
<tspan x="316" y="118">██████╗ ██████╗ ██╗ ██████╗ ██╗ ██╗</tspan>
<tspan x="316" y="128">██╔══██╗ ██╔══██╗ ██║ ██╔════╝ ██║ ██║</tspan>
<tspan x="316" y="138">██████╔╝ ██████╔╝ ██║ ███╗ ██║ ██║ ██║</tspan>
<tspan x="316" y="148">██╔═══╝ ██╔══██╗ ██║ ╚══╝ ██║ ██║ ██║</tspan>
<tspan x="316" y="158">██║ ██████╔╝ ██║ ╚██████╗ ███████╗ ██║</tspan>
<tspan x="316" y="168">╚═╝ ╚═════╝ ╚═╝ ╚═════╝ ╚══════╝ ╚═╝</tspan>
</text>
<!-- PBI-CLI block art (main) -->
<text font-family="'Courier New', Courier, monospace" font-size="7" fill="#F2C811" xml:space="preserve">
<tspan x="315" y="117">██████╗ ██████╗ ██╗ ██████╗ ██╗ ██╗</tspan>
<tspan x="315" y="127">██╔══██╗ ██╔══██╗ ██║ ██╔════╝ ██║ ██║</tspan>
<tspan x="315" y="137">██████╔╝ ██████╔╝ ██║ ███╗ ██║ ██║ ██║</tspan>
<tspan x="315" y="147">██╔═══╝ ██╔══██╗ ██║ ╚══╝ ██║ ██║ ██║</tspan>
<tspan x="315" y="157">██║ ██████╔╝ ██║ ╚██████╗ ███████╗ ██║</tspan>
<tspan x="315" y="167">╚═╝ ╚═════╝ ╚═╝ ╚═════╝ ╚══════╝ ╚═╝</tspan>
</text>
<!-- Right arrow -->
<line x1="560" y1="135" x2="655" y2="135" stroke="#F2C811" stroke-width="2" stroke-dasharray="6,4" stroke-opacity="0.5"/>
<polygon points="659,135 651,130 651,140" fill="#F2C811" fill-opacity="0.5"/>
<!-- Power BI logo (inline, original 630x630, displayed as 50x50, centered at x=700) -->
<svg x="675" y="110" width="50" height="50" viewBox="0 0 630 630">
<g transform="translate(77.5, 0)">
<rect fill="url(#pbi-lg1)" x="256" y="0" width="219" height="630" rx="26"/>
<path fill="url(#pbi-lg2)" d="M346,604 L346,630 L320,630 L153,630 C138.64,630 127,618.36 127,604 L127,183 C127,168.64 138.64,157 153,157 L320,157 C334.36,157 346,168.64 346,183 L346,604 Z"/>
<path fill="url(#pbi-lg5)" d="M219,604 L219,630 L193,630 L26,630 C11.64,630 0,618.36 0,604 L0,341 C0,326.64 11.64,315 26,315 L193,315 C207.36,315 219,326.64 219,341 L219,604 Z"/>
</g>
</svg>
<text x="700" y="175" font-family="'Segoe UI', Arial, sans-serif" font-size="11" fill="#F2C811" text-anchor="middle" font-weight="600">Power BI</text>
<!-- Modeling + Reporting pills -->
<rect x="308" y="176" width="100" height="20" rx="10" fill="#58a6ff" fill-opacity="0.1" stroke="#58a6ff" stroke-width="1"/>
<text x="358" y="190" font-family="'Segoe UI', Arial, sans-serif" font-size="10" fill="#58a6ff" text-anchor="middle" font-weight="600">Modeling</text>
<text x="420" y="190" font-family="'Segoe UI', Arial, sans-serif" font-size="10" fill="#8b949e" text-anchor="middle">+</text>
<rect x="432" y="176" width="100" height="20" rx="10" fill="#06d6a0" fill-opacity="0.1" stroke="#06d6a0" stroke-width="1"/>
<text x="482" y="190" font-family="'Segoe UI', Arial, sans-serif" font-size="10" fill="#06d6a0" text-anchor="middle" font-weight="600">Reporting</text>
<!-- Bottom separator -->
<line x1="60" y1="200" x2="790" y2="200" stroke="#F2C811" stroke-opacity="0.25" stroke-width="2"/>
<!-- ==================== END HEADER ==================== -->
<!-- Feature content (shifted down by 210px) -->
<g transform="translate(0, 210)">
<!-- Title -->
<text x="425" y="32" font-family="'Segoe UI', Arial, sans-serif" font-size="16" fill="#F2C811" text-anchor="middle" font-weight="bold">Dual-Layer Architecture</text>
<!-- ===== MODELING BAND y=48-188 ===== -->
@ -156,4 +271,5 @@
</g>
<text x="675" y="388" font-family="'Segoe UI', Arial, sans-serif" font-size="12" fill="#7ee787" text-anchor="middle" font-weight="600">Theme Engine</text>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 13 KiB

After

Width:  |  Height:  |  Size: 25 KiB

View file

@ -1,7 +1,122 @@
<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"/>
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="850" height="700" viewBox="0 0 850 700">
<defs>
<linearGradient id="hdr-bar1" x1="50%" y1="0%" x2="50%" y2="100%">
<stop offset="0%" stop-color="#EBBB14"/>
<stop offset="100%" stop-color="#B25400"/>
</linearGradient>
<linearGradient id="hdr-bar2" x1="50%" y1="0%" x2="50%" y2="100%">
<stop offset="0%" stop-color="#F9E583"/>
<stop offset="100%" stop-color="#DE9800"/>
</linearGradient>
<linearGradient id="hdr-bar3" x1="50%" y1="0%" x2="50%" y2="100%">
<stop offset="0%" stop-color="#F9E68B"/>
<stop offset="100%" stop-color="#F3CD32"/>
</linearGradient>
<linearGradient id="pbi-lg1" x1="50%" y1="0%" x2="50%" y2="100%">
<stop offset="0%" stop-color="#EBBB14"/>
<stop offset="100%" stop-color="#B25400"/>
</linearGradient>
<linearGradient id="pbi-lg2" x1="50%" y1="0%" x2="50%" y2="100%">
<stop offset="0%" stop-color="#F9E583"/>
<stop offset="100%" stop-color="#DE9800"/>
</linearGradient>
<linearGradient id="pbi-lg5" x1="50%" y1="0%" x2="50%" y2="100%">
<stop offset="0%" stop-color="#F9E68B"/>
<stop offset="100%" stop-color="#F3CD32"/>
</linearGradient>
</defs>
<!-- Title -->
<!-- Full background -->
<rect width="100%" height="100%" fill="#0d1117"/>
<!-- ==================== VIBE BI HEADER ==================== -->
<!-- "VIBE BI" block art (shadow) -->
<text font-family="'Courier New', Courier, monospace" font-size="9" fill="#7A6508" xml:space="preserve">
<tspan x="296" y="22">██╗ ██╗ ██╗ ██████╗ ███████╗ ██████╗ ██╗</tspan>
<tspan x="296" y="33">██║ ██║ ██║ ██╔══██╗ ██╔════╝ ██╔══██╗ ██║</tspan>
<tspan x="296" y="44">██║ ██║ ██║ ██████╔╝ █████╗ ██████╔╝ ██║</tspan>
<tspan x="296" y="55">╚██╗ ██╔╝ ██║ ██╔══██╗ ██╔══╝ ██╔══██╗ ██║</tspan>
<tspan x="296" y="66"> ╚████╔╝ ██║ ██████╔╝ ███████╗ ██████╔╝ ██║</tspan>
<tspan x="296" y="77"> ╚═══╝ ╚═╝ ╚═════╝ ╚══════╝ ╚═════╝ ╚═╝</tspan>
</text>
<!-- "VIBE BI" block art (main) -->
<text font-family="'Courier New', Courier, monospace" font-size="9" fill="#F2C811" xml:space="preserve">
<tspan x="295" y="21">██╗ ██╗ ██╗ ██████╗ ███████╗ ██████╗ ██╗</tspan>
<tspan x="295" y="32">██║ ██║ ██║ ██╔══██╗ ██╔════╝ ██╔══██╗ ██║</tspan>
<tspan x="295" y="43">██║ ██║ ██║ ██████╔╝ █████╗ ██████╔╝ ██║</tspan>
<tspan x="295" y="54">╚██╗ ██╔╝ ██║ ██╔══██╗ ██╔══╝ ██╔══██╗ ██║</tspan>
<tspan x="295" y="65"> ╚████╔╝ ██║ ██████╔╝ ███████╗ ██████╔╝ ██║</tspan>
<tspan x="295" y="76"> ╚═══╝ ╚═╝ ╚═════╝ ╚══════╝ ╚═════╝ ╚═╝</tspan>
</text>
<!-- Separator -->
<line x1="60" y1="84" x2="790" y2="84" stroke="#F2C811" stroke-opacity="0.15" stroke-width="1"/>
<!-- Tagline -->
<text x="425" y="100" font-family="'Segoe UI', Arial, sans-serif" font-size="13" fill="#e6edf3" text-anchor="middle" font-weight="600">The First CLI for Both Power BI Modeling and Reporting</text>
<!-- ===== Connection Flow: Claude > PBI-CLI > Power BI ===== -->
<!-- Claude AI logo (inline, original 1200x1200, displayed as 50x50, centered at x=110) -->
<svg x="85" y="110" width="50" height="50" viewBox="0 0 1200 1200">
<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"/>
</svg>
<text x="110" y="175" 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="155" y1="135" x2="290" y2="135" stroke="#F2C811" stroke-width="2" stroke-dasharray="6,4" stroke-opacity="0.5"/>
<polygon points="294,135 286,130 286,140" fill="#F2C811" fill-opacity="0.5"/>
<!-- PBI-CLI block art (shadow) -->
<text font-family="'Courier New', Courier, monospace" font-size="7" fill="#7A6508" xml:space="preserve">
<tspan x="316" y="118">██████╗ ██████╗ ██╗ ██████╗ ██╗ ██╗</tspan>
<tspan x="316" y="128">██╔══██╗ ██╔══██╗ ██║ ██╔════╝ ██║ ██║</tspan>
<tspan x="316" y="138">██████╔╝ ██████╔╝ ██║ ███╗ ██║ ██║ ██║</tspan>
<tspan x="316" y="148">██╔═══╝ ██╔══██╗ ██║ ╚══╝ ██║ ██║ ██║</tspan>
<tspan x="316" y="158">██║ ██████╔╝ ██║ ╚██████╗ ███████╗ ██║</tspan>
<tspan x="316" y="168">╚═╝ ╚═════╝ ╚═╝ ╚═════╝ ╚══════╝ ╚═╝</tspan>
</text>
<!-- PBI-CLI block art (main) -->
<text font-family="'Courier New', Courier, monospace" font-size="7" fill="#F2C811" xml:space="preserve">
<tspan x="315" y="117">██████╗ ██████╗ ██╗ ██████╗ ██╗ ██╗</tspan>
<tspan x="315" y="127">██╔══██╗ ██╔══██╗ ██║ ██╔════╝ ██║ ██║</tspan>
<tspan x="315" y="137">██████╔╝ ██████╔╝ ██║ ███╗ ██║ ██║ ██║</tspan>
<tspan x="315" y="147">██╔═══╝ ██╔══██╗ ██║ ╚══╝ ██║ ██║ ██║</tspan>
<tspan x="315" y="157">██║ ██████╔╝ ██║ ╚██████╗ ███████╗ ██║</tspan>
<tspan x="315" y="167">╚═╝ ╚═════╝ ╚═╝ ╚═════╝ ╚══════╝ ╚═╝</tspan>
</text>
<!-- Right arrow -->
<line x1="560" y1="135" x2="655" y2="135" stroke="#F2C811" stroke-width="2" stroke-dasharray="6,4" stroke-opacity="0.5"/>
<polygon points="659,135 651,130 651,140" fill="#F2C811" fill-opacity="0.5"/>
<!-- Power BI logo (inline, original 630x630, displayed as 50x50, centered at x=700) -->
<svg x="675" y="110" width="50" height="50" viewBox="0 0 630 630">
<g transform="translate(77.5, 0)">
<rect fill="url(#pbi-lg1)" x="256" y="0" width="219" height="630" rx="26"/>
<path fill="url(#pbi-lg2)" d="M346,604 L346,630 L320,630 L153,630 C138.64,630 127,618.36 127,604 L127,183 C127,168.64 138.64,157 153,157 L320,157 C334.36,157 346,168.64 346,183 L346,604 Z"/>
<path fill="url(#pbi-lg5)" d="M219,604 L219,630 L193,630 L26,630 C11.64,630 0,618.36 0,604 L0,341 C0,326.64 11.64,315 26,315 L193,315 C207.36,315 219,326.64 219,341 L219,604 Z"/>
</g>
</svg>
<text x="700" y="175" font-family="'Segoe UI', Arial, sans-serif" font-size="11" fill="#F2C811" text-anchor="middle" font-weight="600">Power BI</text>
<!-- Modeling + Reporting pills -->
<rect x="308" y="176" width="100" height="20" rx="10" fill="#58a6ff" fill-opacity="0.1" stroke="#58a6ff" stroke-width="1"/>
<text x="358" y="190" font-family="'Segoe UI', Arial, sans-serif" font-size="10" fill="#58a6ff" text-anchor="middle" font-weight="600">Modeling</text>
<text x="420" y="190" font-family="'Segoe UI', Arial, sans-serif" font-size="10" fill="#8b949e" text-anchor="middle">+</text>
<rect x="432" y="176" width="100" height="20" rx="10" fill="#06d6a0" fill-opacity="0.1" stroke="#06d6a0" stroke-width="1"/>
<text x="482" y="190" font-family="'Segoe UI', Arial, sans-serif" font-size="10" fill="#06d6a0" text-anchor="middle" font-weight="600">Reporting</text>
<!-- Bottom separator -->
<line x1="60" y1="200" x2="790" y2="200" stroke="#F2C811" stroke-opacity="0.25" stroke-width="2"/>
<!-- ==================== END HEADER ==================== -->
<!-- Feature content (shifted down by 210px) -->
<g transform="translate(0, 210)">
<!-- 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="13" fill="#8b949e" text-anchor="middle">Ask Claude to audit your semantic model in seconds</text>
@ -76,4 +191,6 @@
<!-- Footer -->
<text x="425" y="480" font-family="'Segoe UI', Arial, sans-serif" font-size="13" fill="#8b949e" text-anchor="middle">Catch model issues before they reach production</text>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 5.9 KiB

After

Width:  |  Height:  |  Size: 18 KiB

220
assets/modeling-skill.svg Normal file
View file

@ -0,0 +1,220 @@
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="850" height="770" viewBox="0 0 850 770">
<defs>
<linearGradient id="hdr-bar1" x1="50%" y1="0%" x2="50%" y2="100%">
<stop offset="0%" stop-color="#EBBB14"/>
<stop offset="100%" stop-color="#B25400"/>
</linearGradient>
<linearGradient id="hdr-bar2" x1="50%" y1="0%" x2="50%" y2="100%">
<stop offset="0%" stop-color="#F9E583"/>
<stop offset="100%" stop-color="#DE9800"/>
</linearGradient>
<linearGradient id="hdr-bar3" x1="50%" y1="0%" x2="50%" y2="100%">
<stop offset="0%" stop-color="#F9E68B"/>
<stop offset="100%" stop-color="#F3CD32"/>
</linearGradient>
<linearGradient id="pbi-lg1" x1="50%" y1="0%" x2="50%" y2="100%">
<stop offset="0%" stop-color="#EBBB14"/>
<stop offset="100%" stop-color="#B25400"/>
</linearGradient>
<linearGradient id="pbi-lg2" x1="50%" y1="0%" x2="50%" y2="100%">
<stop offset="0%" stop-color="#F9E583"/>
<stop offset="100%" stop-color="#DE9800"/>
</linearGradient>
<linearGradient id="pbi-lg5" x1="50%" y1="0%" x2="50%" y2="100%">
<stop offset="0%" stop-color="#F9E68B"/>
<stop offset="100%" stop-color="#F3CD32"/>
</linearGradient>
<filter id="shadow" x="-2%" y="-2%" width="104%" height="104%">
<feDropShadow dx="0" dy="2" stdDeviation="4" flood-color="#000000" flood-opacity="0.3"/>
</filter>
</defs>
<!-- Full background -->
<rect width="100%" height="100%" fill="#0d1117"/>
<!-- ==================== VIBE BI HEADER ==================== -->
<!-- "VIBE BI" block art (shadow) -->
<text font-family="'Courier New', Courier, monospace" font-size="9" fill="#7A6508" xml:space="preserve">
<tspan x="296" y="22">██╗ ██╗ ██╗ ██████╗ ███████╗ ██████╗ ██╗</tspan>
<tspan x="296" y="33">██║ ██║ ██║ ██╔══██╗ ██╔════╝ ██╔══██╗ ██║</tspan>
<tspan x="296" y="44">██║ ██║ ██║ ██████╔╝ █████╗ ██████╔╝ ██║</tspan>
<tspan x="296" y="55">╚██╗ ██╔╝ ██║ ██╔══██╗ ██╔══╝ ██╔══██╗ ██║</tspan>
<tspan x="296" y="66"> ╚████╔╝ ██║ ██████╔╝ ███████╗ ██████╔╝ ██║</tspan>
<tspan x="296" y="77"> ╚═══╝ ╚═╝ ╚═════╝ ╚══════╝ ╚═════╝ ╚═╝</tspan>
</text>
<!-- "VIBE BI" block art (main) -->
<text font-family="'Courier New', Courier, monospace" font-size="9" fill="#F2C811" xml:space="preserve">
<tspan x="295" y="21">██╗ ██╗ ██╗ ██████╗ ███████╗ ██████╗ ██╗</tspan>
<tspan x="295" y="32">██║ ██║ ██║ ██╔══██╗ ██╔════╝ ██╔══██╗ ██║</tspan>
<tspan x="295" y="43">██║ ██║ ██║ ██████╔╝ █████╗ ██████╔╝ ██║</tspan>
<tspan x="295" y="54">╚██╗ ██╔╝ ██║ ██╔══██╗ ██╔══╝ ██╔══██╗ ██║</tspan>
<tspan x="295" y="65"> ╚████╔╝ ██║ ██████╔╝ ███████╗ ██████╔╝ ██║</tspan>
<tspan x="295" y="76"> ╚═══╝ ╚═╝ ╚═════╝ ╚══════╝ ╚═════╝ ╚═╝</tspan>
</text>
<!-- Separator -->
<line x1="60" y1="84" x2="790" y2="84" stroke="#F2C811" stroke-opacity="0.15" stroke-width="1"/>
<!-- Tagline -->
<text x="425" y="100" font-family="'Segoe UI', Arial, sans-serif" font-size="13" fill="#e6edf3" text-anchor="middle" font-weight="600">The First CLI for Both Power BI Modeling and Reporting</text>
<!-- ===== Connection Flow: Claude > PBI-CLI > Power BI ===== -->
<!-- Claude AI logo (inline, original 1200x1200, displayed as 50x50, centered at x=110) -->
<svg x="85" y="110" width="50" height="50" viewBox="0 0 1200 1200">
<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"/>
</svg>
<text x="110" y="175" 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="155" y1="135" x2="290" y2="135" stroke="#F2C811" stroke-width="2" stroke-dasharray="6,4" stroke-opacity="0.5"/>
<polygon points="294,135 286,130 286,140" fill="#F2C811" fill-opacity="0.5"/>
<!-- PBI-CLI block art (shadow) -->
<text font-family="'Courier New', Courier, monospace" font-size="7" fill="#7A6508" xml:space="preserve">
<tspan x="316" y="118">██████╗ ██████╗ ██╗ ██████╗ ██╗ ██╗</tspan>
<tspan x="316" y="128">██╔══██╗ ██╔══██╗ ██║ ██╔════╝ ██║ ██║</tspan>
<tspan x="316" y="138">██████╔╝ ██████╔╝ ██║ ███╗ ██║ ██║ ██║</tspan>
<tspan x="316" y="148">██╔═══╝ ██╔══██╗ ██║ ╚══╝ ██║ ██║ ██║</tspan>
<tspan x="316" y="158">██║ ██████╔╝ ██║ ╚██████╗ ███████╗ ██║</tspan>
<tspan x="316" y="168">╚═╝ ╚═════╝ ╚═╝ ╚═════╝ ╚══════╝ ╚═╝</tspan>
</text>
<!-- PBI-CLI block art (main) -->
<text font-family="'Courier New', Courier, monospace" font-size="7" fill="#F2C811" xml:space="preserve">
<tspan x="315" y="117">██████╗ ██████╗ ██╗ ██████╗ ██╗ ██╗</tspan>
<tspan x="315" y="127">██╔══██╗ ██╔══██╗ ██║ ██╔════╝ ██║ ██║</tspan>
<tspan x="315" y="137">██████╔╝ ██████╔╝ ██║ ███╗ ██║ ██║ ██║</tspan>
<tspan x="315" y="147">██╔═══╝ ██╔══██╗ ██║ ╚══╝ ██║ ██║ ██║</tspan>
<tspan x="315" y="157">██║ ██████╔╝ ██║ ╚██████╗ ███████╗ ██║</tspan>
<tspan x="315" y="167">╚═╝ ╚═════╝ ╚═╝ ╚═════╝ ╚══════╝ ╚═╝</tspan>
</text>
<!-- Right arrow -->
<line x1="560" y1="135" x2="655" y2="135" stroke="#F2C811" stroke-width="2" stroke-dasharray="6,4" stroke-opacity="0.5"/>
<polygon points="659,135 651,130 651,140" fill="#F2C811" fill-opacity="0.5"/>
<!-- Power BI logo (inline, original 630x630, displayed as 50x50, centered at x=700) -->
<svg x="675" y="110" width="50" height="50" viewBox="0 0 630 630">
<g transform="translate(77.5, 0)">
<rect fill="url(#pbi-lg1)" x="256" y="0" width="219" height="630" rx="26"/>
<path fill="url(#pbi-lg2)" d="M346,604 L346,630 L320,630 L153,630 C138.64,630 127,618.36 127,604 L127,183 C127,168.64 138.64,157 153,157 L320,157 C334.36,157 346,168.64 346,183 L346,604 Z"/>
<path fill="url(#pbi-lg5)" d="M219,604 L219,630 L193,630 L26,630 C11.64,630 0,618.36 0,604 L0,341 C0,326.64 11.64,315 26,315 L193,315 C207.36,315 219,326.64 219,341 L219,604 Z"/>
</g>
</svg>
<text x="700" y="175" font-family="'Segoe UI', Arial, sans-serif" font-size="11" fill="#F2C811" text-anchor="middle" font-weight="600">Power BI</text>
<!-- Modeling + Reporting pills -->
<rect x="308" y="176" width="100" height="20" rx="10" fill="#58a6ff" fill-opacity="0.1" stroke="#58a6ff" stroke-width="1"/>
<text x="358" y="190" font-family="'Segoe UI', Arial, sans-serif" font-size="10" fill="#58a6ff" text-anchor="middle" font-weight="600">Modeling</text>
<text x="420" y="190" font-family="'Segoe UI', Arial, sans-serif" font-size="10" fill="#8b949e" text-anchor="middle">+</text>
<rect x="432" y="176" width="100" height="20" rx="10" fill="#06d6a0" fill-opacity="0.1" stroke="#06d6a0" stroke-width="1"/>
<text x="482" y="190" font-family="'Segoe UI', Arial, sans-serif" font-size="10" fill="#06d6a0" text-anchor="middle" font-weight="600">Reporting</text>
<!-- Bottom separator -->
<line x1="60" y1="200" x2="790" y2="200" stroke="#F2C811" stroke-opacity="0.25" stroke-width="2"/>
<!-- ==================== END HEADER ==================== -->
<!-- Feature content (shifted down by 210px) -->
<g transform="translate(0, 210)">
<!-- Background -->
<!-- Title section -->
<text x="425" y="40" font-family="Segoe UI, Arial, sans-serif" font-size="28" font-weight="bold" fill="#F2C811" text-anchor="middle">Modeling Skill</text>
<text x="425" y="64" font-family="Segoe UI, Arial, sans-serif" font-size="16" fill="#8b949e" text-anchor="middle">Describe your schema. Claude builds it.</text>
<!-- Chat container -->
<rect x="40" y="84" width="770" height="396" rx="8" ry="8" fill="#161b22" stroke="#30363d" stroke-width="1"/>
<!-- Header bar -->
<rect x="40" y="84" width="770" height="36" rx="8" ry="8" fill="#161b22"/>
<rect x="40" y="104" width="770" height="16" fill="#161b22"/>
<line x1="40" y1="120" x2="810" y2="120" stroke="#30363d" stroke-width="1"/>
<!-- Traffic lights -->
<circle cx="64" cy="102" r="6" fill="#ff5f57"/>
<circle cx="84" cy="102" r="6" fill="#febc2e"/>
<circle cx="104" cy="102" r="6" fill="#28c840"/>
<!-- Claude Code label -->
<text x="130" y="107" font-family="Segoe UI, Arial, sans-serif" font-size="15" fill="#d97757">Claude Code</text>
<!-- User message -->
<rect x="70" y="134" width="600" height="56" rx="12" ry="12" fill="#1a3a5c"/>
<text x="88" y="157" font-family="Segoe UI, Arial, sans-serif" font-size="16" fill="#c9d1d9">Create a star schema with Sales as the fact table,</text>
<text x="88" y="178" font-family="Segoe UI, Arial, sans-serif" font-size="16" fill="#c9d1d9">linked to Products, Calendar, Customers, and Store</text>
<!-- Claude response -->
<rect x="70" y="204" width="710" height="262" rx="12" ry="12" fill="#1c1c1c"/>
<!-- "Building star schema..." -->
<text x="88" y="230" font-family="Segoe UI, Arial, sans-serif" font-size="14" fill="#8b949e">Building star schema...</text>
<!-- Check item 1: Sales (fact) -->
<text x="88" y="258" font-family="Segoe UI, Arial, sans-serif" font-size="14" fill="#06d6a0">&#x2714;</text>
<text x="108" y="258" font-family="Segoe UI, Arial, sans-serif" font-size="14" fill="#c9d1d9">Created table </text>
<text x="201" y="258" font-family="Segoe UI, Arial, sans-serif" font-size="14" font-weight="bold" fill="#06d6a0">Sales</text>
<text x="240" y="258" font-family="Segoe UI, Arial, sans-serif" font-size="14" fill="#8b949e"> (fact)</text>
<!-- Check item 2: Products -->
<text x="88" y="284" font-family="Segoe UI, Arial, sans-serif" font-size="14" fill="#06d6a0">&#x2714;</text>
<text x="108" y="284" font-family="Segoe UI, Arial, sans-serif" font-size="14" fill="#c9d1d9">Created table </text>
<text x="201" y="284" font-family="Segoe UI, Arial, sans-serif" font-size="14" font-weight="bold" fill="#06d6a0">Products</text>
<text x="265" y="284" font-family="Segoe UI, Arial, sans-serif" font-size="14" fill="#8b949e"> linked to Sales</text>
<!-- Check item 3: Calendar -->
<text x="88" y="310" font-family="Segoe UI, Arial, sans-serif" font-size="14" fill="#06d6a0">&#x2714;</text>
<text x="108" y="310" font-family="Segoe UI, Arial, sans-serif" font-size="14" fill="#c9d1d9">Created table </text>
<text x="201" y="310" font-family="Segoe UI, Arial, sans-serif" font-size="14" font-weight="bold" fill="#06d6a0">Calendar</text>
<text x="264" y="310" font-family="Segoe UI, Arial, sans-serif" font-size="14" fill="#8b949e"> linked to Sales</text>
<!-- Check item 4: Customers -->
<text x="88" y="336" font-family="Segoe UI, Arial, sans-serif" font-size="14" fill="#06d6a0">&#x2714;</text>
<text x="108" y="336" font-family="Segoe UI, Arial, sans-serif" font-size="14" fill="#c9d1d9">Created table </text>
<text x="201" y="336" font-family="Segoe UI, Arial, sans-serif" font-size="14" font-weight="bold" fill="#06d6a0">Customers</text>
<text x="276" y="336" font-family="Segoe UI, Arial, sans-serif" font-size="14" fill="#8b949e"> linked to Sales</text>
<!-- Check item 5: Store -->
<text x="88" y="362" font-family="Segoe UI, Arial, sans-serif" font-size="14" fill="#06d6a0">&#x2714;</text>
<text x="108" y="362" font-family="Segoe UI, Arial, sans-serif" font-size="14" fill="#c9d1d9">Created table </text>
<text x="201" y="362" font-family="Segoe UI, Arial, sans-serif" font-size="14" font-weight="bold" fill="#06d6a0">Store</text>
<text x="237" y="362" font-family="Segoe UI, Arial, sans-serif" font-size="14" fill="#8b949e"> linked to Sales</text>
<!-- Separator line -->
<line x1="88" y1="380" x2="760" y2="380" stroke="#30363d" stroke-width="1"/>
<!-- Summary: "5 tables, 4 relationships created" -->
<text x="88" y="404" font-family="Segoe UI, Arial, sans-serif" font-size="16" font-weight="bold" fill="#F2C811">5 tables, 4 relationships created</text>
<!-- Sub-summary -->
<text x="88" y="424" font-family="Segoe UI, Arial, sans-serif" font-size="13" fill="#8b949e">All relationships are one-to-many, single direction</text>
<!-- Capability pills -->
<!-- Total width of 4 pills: 4 pills with padding. Let's center them. -->
<!-- Pill widths: Tables ~90, Relationships ~130, Measures ~100, Date Tables ~115 -->
<!-- Total ~435 + 3*16 gaps = 483. Start x = (850-483)/2 = 183.5 -->
<!-- Pill: Tables -->
<rect x="148" y="494" width="90" height="30" rx="15" ry="15" fill="none" stroke="#F2C811" stroke-width="1.5"/>
<text x="193" y="514" font-family="Segoe UI, Arial, sans-serif" font-size="14" fill="#F2C811" text-anchor="middle">Tables</text>
<!-- Pill: Relationships -->
<rect x="254" y="494" width="130" height="30" rx="15" ry="15" fill="none" stroke="#7b61ff" stroke-width="1.5"/>
<text x="319" y="514" font-family="Segoe UI, Arial, sans-serif" font-size="14" fill="#7b61ff" text-anchor="middle">Relationships</text>
<!-- Pill: Measures -->
<rect x="400" y="494" width="100" height="30" rx="15" ry="15" fill="none" stroke="#06d6a0" stroke-width="1.5"/>
<text x="450" y="514" font-family="Segoe UI, Arial, sans-serif" font-size="14" fill="#06d6a0" text-anchor="middle">Measures</text>
<!-- Pill: Date Tables -->
<rect x="516" y="494" width="115" height="30" rx="15" ry="15" fill="none" stroke="#58a6ff" stroke-width="1.5"/>
<text x="573.5" y="514" font-family="Segoe UI, Arial, sans-serif" font-size="14" fill="#58a6ff" text-anchor="middle">Date Tables</text>
<!-- Footer -->
<text x="425" y="550" font-family="Segoe UI, Arial, sans-serif" font-size="15" fill="#8b949e" text-anchor="middle">From description to working schema in one prompt.</text>
</g>
</svg>

After

Width:  |  Height:  |  Size: 19 KiB

BIN
assets/release-vibe-bi.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.4 MiB

301
assets/release-vibe-bi.svg Normal file
View file

@ -0,0 +1,301 @@
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="850" height="690" viewBox="0 0 850 690">
<defs>
<linearGradient id="hdr-bar1" x1="50%" y1="0%" x2="50%" y2="100%">
<stop offset="0%" stop-color="#EBBB14"/>
<stop offset="100%" stop-color="#B25400"/>
</linearGradient>
<linearGradient id="hdr-bar2" x1="50%" y1="0%" x2="50%" y2="100%">
<stop offset="0%" stop-color="#F9E583"/>
<stop offset="100%" stop-color="#DE9800"/>
</linearGradient>
<linearGradient id="hdr-bar3" x1="50%" y1="0%" x2="50%" y2="100%">
<stop offset="0%" stop-color="#F9E68B"/>
<stop offset="100%" stop-color="#F3CD32"/>
</linearGradient>
<linearGradient id="pbi-lg1" x1="50%" y1="0%" x2="50%" y2="100%">
<stop offset="0%" stop-color="#EBBB14"/>
<stop offset="100%" stop-color="#B25400"/>
</linearGradient>
<linearGradient id="pbi-lg2" x1="50%" y1="0%" x2="50%" y2="100%">
<stop offset="0%" stop-color="#F9E583"/>
<stop offset="100%" stop-color="#DE9800"/>
</linearGradient>
<linearGradient id="pbi-lg5" x1="50%" y1="0%" x2="50%" y2="100%">
<stop offset="0%" stop-color="#F9E68B"/>
<stop offset="100%" stop-color="#F3CD32"/>
</linearGradient>
<linearGradient id="rel-glow" x1="0%" y1="0%" x2="100%" y2="100%">
<stop offset="0%" stop-color="#F2C811" stop-opacity="0.08"/>
<stop offset="50%" stop-color="#F2C811" stop-opacity="0.02"/>
<stop offset="100%" stop-color="#06d6a0" stop-opacity="0.06"/>
</linearGradient>
<linearGradient id="rel-bar1" x1="50%" y1="0%" x2="50%" y2="100%">
<stop offset="0%" stop-color="#EBBB14"/>
<stop offset="100%" stop-color="#B25400"/>
</linearGradient>
<linearGradient id="rel-bar2" x1="50%" y1="0%" x2="50%" y2="100%">
<stop offset="0%" stop-color="#F9E583"/>
<stop offset="100%" stop-color="#DE9800"/>
</linearGradient>
<linearGradient id="rel-bar3" x1="50%" y1="0%" x2="50%" y2="100%">
<stop offset="0%" stop-color="#F9E68B"/>
<stop offset="100%" stop-color="#F3CD32"/>
</linearGradient>
</defs>
<!-- Full background -->
<rect width="100%" height="100%" fill="#0d1117"/>
<!-- ==================== VIBE BI HEADER ==================== -->
<!-- "VIBE BI" block art (shadow) -->
<text font-family="'Courier New', Courier, monospace" font-size="9" fill="#7A6508" xml:space="preserve">
<tspan x="296" y="22">██╗ ██╗ ██╗ ██████╗ ███████╗ ██████╗ ██╗</tspan>
<tspan x="296" y="33">██║ ██║ ██║ ██╔══██╗ ██╔════╝ ██╔══██╗ ██║</tspan>
<tspan x="296" y="44">██║ ██║ ██║ ██████╔╝ █████╗ ██████╔╝ ██║</tspan>
<tspan x="296" y="55">╚██╗ ██╔╝ ██║ ██╔══██╗ ██╔══╝ ██╔══██╗ ██║</tspan>
<tspan x="296" y="66"> ╚████╔╝ ██║ ██████╔╝ ███████╗ ██████╔╝ ██║</tspan>
<tspan x="296" y="77"> ╚═══╝ ╚═╝ ╚═════╝ ╚══════╝ ╚═════╝ ╚═╝</tspan>
</text>
<!-- "VIBE BI" block art (main) -->
<text font-family="'Courier New', Courier, monospace" font-size="9" fill="#F2C811" xml:space="preserve">
<tspan x="295" y="21">██╗ ██╗ ██╗ ██████╗ ███████╗ ██████╗ ██╗</tspan>
<tspan x="295" y="32">██║ ██║ ██║ ██╔══██╗ ██╔════╝ ██╔══██╗ ██║</tspan>
<tspan x="295" y="43">██║ ██║ ██║ ██████╔╝ █████╗ ██████╔╝ ██║</tspan>
<tspan x="295" y="54">╚██╗ ██╔╝ ██║ ██╔══██╗ ██╔══╝ ██╔══██╗ ██║</tspan>
<tspan x="295" y="65"> ╚████╔╝ ██║ ██████╔╝ ███████╗ ██████╔╝ ██║</tspan>
<tspan x="295" y="76"> ╚═══╝ ╚═╝ ╚═════╝ ╚══════╝ ╚═════╝ ╚═╝</tspan>
</text>
<!-- Separator -->
<line x1="60" y1="84" x2="790" y2="84" stroke="#F2C811" stroke-opacity="0.15" stroke-width="1"/>
<!-- Tagline -->
<text x="425" y="100" font-family="'Segoe UI', Arial, sans-serif" font-size="13" fill="#e6edf3" text-anchor="middle" font-weight="600">The First CLI for Both Power BI Modeling and Reporting</text>
<!-- ===== Connection Flow: Claude > PBI-CLI > Power BI ===== -->
<!-- Claude AI logo (inline, original 1200x1200, displayed as 50x50, centered at x=110) -->
<svg x="85" y="110" width="50" height="50" viewBox="0 0 1200 1200">
<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"/>
</svg>
<text x="110" y="175" 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="155" y1="135" x2="290" y2="135" stroke="#F2C811" stroke-width="2" stroke-dasharray="6,4" stroke-opacity="0.5"/>
<polygon points="294,135 286,130 286,140" fill="#F2C811" fill-opacity="0.5"/>
<!-- PBI-CLI block art (shadow) -->
<text font-family="'Courier New', Courier, monospace" font-size="7" fill="#7A6508" xml:space="preserve">
<tspan x="316" y="118">██████╗ ██████╗ ██╗ ██████╗ ██╗ ██╗</tspan>
<tspan x="316" y="128">██╔══██╗ ██╔══██╗ ██║ ██╔════╝ ██║ ██║</tspan>
<tspan x="316" y="138">██████╔╝ ██████╔╝ ██║ ███╗ ██║ ██║ ██║</tspan>
<tspan x="316" y="148">██╔═══╝ ██╔══██╗ ██║ ╚══╝ ██║ ██║ ██║</tspan>
<tspan x="316" y="158">██║ ██████╔╝ ██║ ╚██████╗ ███████╗ ██║</tspan>
<tspan x="316" y="168">╚═╝ ╚═════╝ ╚═╝ ╚═════╝ ╚══════╝ ╚═╝</tspan>
</text>
<!-- PBI-CLI block art (main) -->
<text font-family="'Courier New', Courier, monospace" font-size="7" fill="#F2C811" xml:space="preserve">
<tspan x="315" y="117">██████╗ ██████╗ ██╗ ██████╗ ██╗ ██╗</tspan>
<tspan x="315" y="127">██╔══██╗ ██╔══██╗ ██║ ██╔════╝ ██║ ██║</tspan>
<tspan x="315" y="137">██████╔╝ ██████╔╝ ██║ ███╗ ██║ ██║ ██║</tspan>
<tspan x="315" y="147">██╔═══╝ ██╔══██╗ ██║ ╚══╝ ██║ ██║ ██║</tspan>
<tspan x="315" y="157">██║ ██████╔╝ ██║ ╚██████╗ ███████╗ ██║</tspan>
<tspan x="315" y="167">╚═╝ ╚═════╝ ╚═╝ ╚═════╝ ╚══════╝ ╚═╝</tspan>
</text>
<!-- Right arrow -->
<line x1="560" y1="135" x2="655" y2="135" stroke="#F2C811" stroke-width="2" stroke-dasharray="6,4" stroke-opacity="0.5"/>
<polygon points="659,135 651,130 651,140" fill="#F2C811" fill-opacity="0.5"/>
<!-- Power BI logo (inline, original 630x630, displayed as 50x50, centered at x=700) -->
<svg x="675" y="110" width="50" height="50" viewBox="0 0 630 630">
<g transform="translate(77.5, 0)">
<rect fill="url(#pbi-lg1)" x="256" y="0" width="219" height="630" rx="26"/>
<path fill="url(#pbi-lg2)" d="M346,604 L346,630 L320,630 L153,630 C138.64,630 127,618.36 127,604 L127,183 C127,168.64 138.64,157 153,157 L320,157 C334.36,157 346,168.64 346,183 L346,604 Z"/>
<path fill="url(#pbi-lg5)" d="M219,604 L219,630 L193,630 L26,630 C11.64,630 0,618.36 0,604 L0,341 C0,326.64 11.64,315 26,315 L193,315 C207.36,315 219,326.64 219,341 L219,604 Z"/>
</g>
</svg>
<text x="700" y="175" font-family="'Segoe UI', Arial, sans-serif" font-size="11" fill="#F2C811" text-anchor="middle" font-weight="600">Power BI</text>
<!-- Modeling + Reporting pills -->
<rect x="308" y="176" width="100" height="20" rx="10" fill="#58a6ff" fill-opacity="0.1" stroke="#58a6ff" stroke-width="1"/>
<text x="358" y="190" font-family="'Segoe UI', Arial, sans-serif" font-size="10" fill="#58a6ff" text-anchor="middle" font-weight="600">Modeling</text>
<text x="420" y="190" font-family="'Segoe UI', Arial, sans-serif" font-size="10" fill="#8b949e" text-anchor="middle">+</text>
<rect x="432" y="176" width="100" height="20" rx="10" fill="#06d6a0" fill-opacity="0.1" stroke="#06d6a0" stroke-width="1"/>
<text x="482" y="190" font-family="'Segoe UI', Arial, sans-serif" font-size="10" fill="#06d6a0" text-anchor="middle" font-weight="600">Reporting</text>
<!-- Bottom separator -->
<line x1="60" y1="200" x2="790" y2="200" stroke="#F2C811" stroke-opacity="0.25" stroke-width="2"/>
<!-- ==================== END HEADER ==================== -->
<!-- Feature content (shifted down by 210px) -->
<g transform="translate(0, 210)">
<!-- Background -->
<!-- Subtle radial glow behind center -->
<rect width="100%" height="100%" fill="url(#rel-glow)" rx="8"/>
<!-- Decorative corner accents -->
<line x1="15" y1="15" x2="55" y2="15" stroke="#F2C811" stroke-width="2" stroke-opacity="0.4"/>
<line x1="15" y1="15" x2="15" y2="55" stroke="#F2C811" stroke-width="2" stroke-opacity="0.4"/>
<line x1="835" y1="15" x2="795" y2="15" stroke="#F2C811" stroke-width="2" stroke-opacity="0.4"/>
<line x1="835" y1="15" x2="835" y2="55" stroke="#F2C811" stroke-width="2" stroke-opacity="0.4"/>
<line x1="15" y1="465" x2="55" y2="465" stroke="#06d6a0" stroke-width="2" stroke-opacity="0.4"/>
<line x1="15" y1="465" x2="15" y2="425" stroke="#06d6a0" stroke-width="2" stroke-opacity="0.4"/>
<line x1="835" y1="465" x2="795" y2="465" stroke="#06d6a0" stroke-width="2" stroke-opacity="0.4"/>
<line x1="835" y1="465" x2="835" y2="425" stroke="#06d6a0" stroke-width="2" stroke-opacity="0.4"/>
<!-- ===== "VIBE BI" block art (shadow) ===== -->
<text font-family="'Courier New', Courier, monospace" font-size="10" fill="#7A6508" xml:space="preserve">
<tspan x="246" y="44">██╗ ██╗ ██╗ ██████╗ ███████╗ ██████╗ ██╗</tspan>
<tspan x="246" y="56">██║ ██║ ██║ ██╔══██╗ ██╔════╝ ██╔══██╗ ██║</tspan>
<tspan x="246" y="68">██║ ██║ ██║ ██████╔╝ █████╗ ██████╔╝ ██║</tspan>
<tspan x="246" y="80">╚██╗ ██╔╝ ██║ ██╔══██╗ ██╔══╝ ██╔══██╗ ██║</tspan>
<tspan x="246" y="92"> ╚████╔╝ ██║ ██████╔╝ ███████╗ ██████╔╝ ██║</tspan>
<tspan x="246" y="104"> ╚═══╝ ╚═╝ ╚═════╝ ╚══════╝ ╚═════╝ ╚═╝</tspan>
</text>
<!-- "VIBE BI" block art (main) -->
<text font-family="'Courier New', Courier, monospace" font-size="10" fill="#F2C811" xml:space="preserve">
<tspan x="245" y="43">██╗ ██╗ ██╗ ██████╗ ███████╗ ██████╗ ██╗</tspan>
<tspan x="245" y="55">██║ ██║ ██║ ██╔══██╗ ██╔════╝ ██╔══██╗ ██║</tspan>
<tspan x="245" y="67">██║ ██║ ██║ ██████╔╝ █████╗ ██████╔╝ ██║</tspan>
<tspan x="245" y="79">╚██╗ ██╔╝ ██║ ██╔══██╗ ██╔══╝ ██╔══██╗ ██║</tspan>
<tspan x="245" y="91"> ╚████╔╝ ██║ ██████╔╝ ███████╗ ██████╔╝ ██║</tspan>
<tspan x="245" y="103"> ╚═══╝ ╚═╝ ╚═════╝ ╚══════╝ ╚═════╝ ╚═╝</tspan>
</text>
<!-- Separator -->
<line x1="100" y1="115" x2="750" y2="115" stroke="#F2C811" stroke-opacity="0.15" stroke-width="1"/>
<!-- Tagline -->
<text x="425" y="140" font-family="'Segoe UI', Arial, sans-serif" font-size="13" fill="#8b949e" text-anchor="middle">Vibe-Driven Business Intelligence</text>
<!-- ===== PBI-CLI block art (shadow) ===== -->
<text font-family="'Courier New', Courier, monospace" font-size="9" fill="#7A6508" xml:space="preserve">
<tspan x="248" y="168">██████╗ ██████╗ ██╗ ██████╗ ██╗ ██╗</tspan>
<tspan x="248" y="179">██╔══██╗ ██╔══██╗ ██║ ██╔════╝ ██║ ██║</tspan>
<tspan x="248" y="190">██████╔╝ ██████╔╝ ██║ ███╗ ██║ ██║ ██║</tspan>
<tspan x="248" y="201">██╔═══╝ ██╔══██╗ ██║ ╚══╝ ██║ ██║ ██║</tspan>
<tspan x="248" y="212">██║ ██████╔╝ ██║ ╚██████╗ ███████╗ ██║</tspan>
<tspan x="248" y="223">╚═╝ ╚═════╝ ╚═╝ ╚═════╝ ╚══════╝ ╚═╝</tspan>
</text>
<!-- PBI-CLI block art (main) -->
<text font-family="'Courier New', Courier, monospace" font-size="9" fill="#F2C811" xml:space="preserve">
<tspan x="247" y="167">██████╗ ██████╗ ██╗ ██████╗ ██╗ ██╗</tspan>
<tspan x="247" y="178">██╔══██╗ ██╔══██╗ ██║ ██╔════╝ ██║ ██║</tspan>
<tspan x="247" y="189">██████╔╝ ██████╔╝ ██║ ███╗ ██║ ██║ ██║</tspan>
<tspan x="247" y="200">██╔═══╝ ██╔══██╗ ██║ ╚══╝ ██║ ██║ ██║</tspan>
<tspan x="247" y="211">██║ ██████╔╝ ██║ ╚██████╗ ███████╗ ██║</tspan>
<tspan x="247" y="222">╚═╝ ╚═════╝ ╚═╝ ╚═════╝ ╚══════╝ ╚═╝</tspan>
</text>
<!-- Version badge -->
<rect x="370" y="234" width="110" height="28" rx="14" fill="#F2C811" fill-opacity="0.12" stroke="#F2C811" stroke-width="1.5"/>
<text x="425" y="253" font-family="'Courier New', Courier, monospace" font-size="14" fill="#F2C811" text-anchor="middle" font-weight="bold">v3.10.1</text>
<!-- ===== EVOLUTION ARROW: Before -> After ===== -->
<!-- "Was" side -->
<rect x="60" y="285" width="280" height="140" rx="10" fill="#161b22" stroke="#8b949e" stroke-width="1" stroke-opacity="0.4"/>
<!-- Crossed out old label -->
<text x="200" y="312" font-family="'Segoe UI', Arial, sans-serif" font-size="12" fill="#8b949e" text-anchor="middle" opacity="0.5">Previously</text>
<text x="200" y="348" font-family="'Segoe UI', Arial, sans-serif" font-size="22" fill="#8b949e" text-anchor="middle" opacity="0.4">Vibe Modeling</text>
<line x1="110" y1="345" x2="290" y2="345" stroke="#ff4444" stroke-width="2" stroke-opacity="0.6"/>
<!-- Only modeling pill -->
<rect x="148" y="368" width="104" height="24" rx="12" fill="#58a6ff" fill-opacity="0.1" stroke="#58a6ff" stroke-width="1" stroke-opacity="0.4"/>
<text x="200" y="384" font-family="'Segoe UI', Arial, sans-serif" font-size="11" fill="#58a6ff" text-anchor="middle" opacity="0.5">Modeling only</text>
<!-- Arrow connecting them -->
<g transform="translate(360, 340)">
<line x1="0" y1="0" x2="60" y2="0" stroke="#F2C811" stroke-width="3" stroke-linecap="round"/>
<polygon points="65,0 55,-6 55,6" fill="#F2C811"/>
<!-- Sparkle on arrow -->
<path d="M30,-12 L31.5,-6 L38,-4 L31.5,-2 L30,4 L28.5,-2 L22,-4 L28.5,-6 Z" fill="#F2C811" fill-opacity="0.7"/>
</g>
<!-- "Now" side -->
<rect x="445" y="285" width="345" height="140" rx="10" fill="#161b22" stroke="#F2C811" stroke-width="2"/>
<!-- Glow effect on Now card -->
<rect x="445" y="285" width="345" height="140" rx="10" fill="#F2C811" fill-opacity="0.03"/>
<text x="617" y="312" font-family="'Segoe UI', Arial, sans-serif" font-size="12" fill="#F2C811" text-anchor="middle" font-weight="600">Now</text>
<text x="617" y="348" font-family="'Segoe UI', Arial, sans-serif" font-size="22" fill="#F2C811" text-anchor="middle" font-weight="bold">VIBE BI</text>
<!-- Both layer pills -->
<rect x="498" y="362" width="100" height="24" rx="12" fill="#58a6ff" fill-opacity="0.15" stroke="#58a6ff" stroke-width="1"/>
<!-- Database icon in pill -->
<g transform="translate(505, 367)">
<ellipse cx="6" cy="3" rx="5" ry="3" fill="none" stroke="#58a6ff" stroke-width="1"/>
<line x1="1" y1="3" x2="1" y2="10" stroke="#58a6ff" stroke-width="1"/>
<line x1="11" y1="3" x2="11" y2="10" stroke="#58a6ff" stroke-width="1"/>
<ellipse cx="6" cy="10" rx="5" ry="3" fill="none" stroke="#58a6ff" stroke-width="1"/>
</g>
<text x="558" y="379" font-family="'Segoe UI', Arial, sans-serif" font-size="11" fill="#58a6ff" text-anchor="middle" font-weight="600">Modeling</text>
<text x="607" y="379" font-family="'Segoe UI', Arial, sans-serif" font-size="13" fill="#F2C811" text-anchor="middle" font-weight="bold">+</text>
<rect x="618" y="362" width="108" height="24" rx="12" fill="#06d6a0" fill-opacity="0.15" stroke="#06d6a0" stroke-width="1"/>
<!-- Bar chart icon in pill -->
<g transform="translate(625, 367)">
<rect x="0" y="8" width="4" height="6" rx="1" fill="#06d6a0" fill-opacity="0.7"/>
<rect x="5" y="4" width="4" height="10" rx="1" fill="#06d6a0" fill-opacity="0.8"/>
<rect x="10" y="0" width="4" height="14" rx="1" fill="#06d6a0" fill-opacity="0.9"/>
</g>
<text x="682" y="379" font-family="'Segoe UI', Arial, sans-serif" font-size="11" fill="#06d6a0" text-anchor="middle" font-weight="600">Reporting</text>
<!-- Power BI bars icon in Now card -->
<g transform="translate(752, 300)">
<rect x="16" y="0" width="10" height="22" rx="2" fill="url(#rel-bar1)"/>
<rect x="8" y="6" width="10" height="16" rx="2" fill="url(#rel-bar2)"/>
<rect x="0" y="11" width="10" height="11" rx="2" fill="url(#rel-bar3)"/>
</g>
<!-- ===== BOTTOM STATS ROW ===== -->
<!-- Stat 1: Commands -->
<g transform="translate(110, 445)">
<text x="0" y="0" font-family="'Segoe UI', Arial, sans-serif" font-size="24" fill="#58a6ff" font-weight="bold">30+</text>
<text x="0" y="16" font-family="'Segoe UI', Arial, sans-serif" font-size="10" fill="#8b949e">commands</text>
</g>
<!-- Separator dot -->
<circle cx="230" cy="440" r="2.5" fill="#F2C811" fill-opacity="0.4"/>
<!-- Stat 2: Visuals -->
<g transform="translate(280, 445)">
<text x="0" y="0" font-family="'Segoe UI', Arial, sans-serif" font-size="24" fill="#06d6a0" font-weight="bold">32</text>
<text x="0" y="16" font-family="'Segoe UI', Arial, sans-serif" font-size="10" fill="#8b949e">visual types</text>
</g>
<!-- Separator dot -->
<circle cx="390" cy="440" r="2.5" fill="#F2C811" fill-opacity="0.4"/>
<!-- Stat 3: Skills -->
<g transform="translate(435, 445)">
<text x="0" y="0" font-family="'Segoe UI', Arial, sans-serif" font-size="24" fill="#F2C811" font-weight="bold">12</text>
<text x="0" y="16" font-family="'Segoe UI', Arial, sans-serif" font-size="10" fill="#8b949e">Claude skills</text>
</g>
<!-- Separator dot -->
<circle cx="545" cy="440" r="2.5" fill="#F2C811" fill-opacity="0.4"/>
<!-- Stat 4: Tokens -->
<g transform="translate(590, 445)">
<text x="0" y="0" font-family="'Segoe UI', Arial, sans-serif" font-size="24" fill="#d97757" font-weight="bold">~30</text>
<text x="0" y="16" font-family="'Segoe UI', Arial, sans-serif" font-size="10" fill="#8b949e">tokens/call</text>
</g>
<!-- Separator dot -->
<circle cx="710" cy="440" r="2.5" fill="#F2C811" fill-opacity="0.4"/>
<!-- Stat 5: Tests -->
<g transform="translate(750, 445)">
<text x="0" y="0" font-family="'Segoe UI', Arial, sans-serif" font-size="24" fill="#c084fc" font-weight="bold">488</text>
<text x="0" y="16" font-family="'Segoe UI', Arial, sans-serif" font-size="10" fill="#8b949e">tests</text>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 24 KiB

View file

@ -1,15 +1,129 @@
<svg xmlns="http://www.w3.org/2000/svg" width="850" height="350" viewBox="0 0 850 350">
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="850" height="560" viewBox="0 0 850 560">
<defs>
<linearGradient id="rl-glow" x1="0%" y1="0%" x2="100%" y2="0%">
<linearGradient id="hdr-bar1" x1="50%" y1="0%" x2="50%" y2="100%">
<stop offset="0%" stop-color="#EBBB14"/>
<stop offset="100%" stop-color="#B25400"/>
</linearGradient>
<linearGradient id="hdr-bar2" x1="50%" y1="0%" x2="50%" y2="100%">
<stop offset="0%" stop-color="#F9E583"/>
<stop offset="100%" stop-color="#DE9800"/>
</linearGradient>
<linearGradient id="hdr-bar3" x1="50%" y1="0%" x2="50%" y2="100%">
<stop offset="0%" stop-color="#F9E68B"/>
<stop offset="100%" stop-color="#F3CD32"/>
</linearGradient>
<linearGradient id="pbi-lg1" x1="50%" y1="0%" x2="50%" y2="100%">
<stop offset="0%" stop-color="#EBBB14"/>
<stop offset="100%" stop-color="#B25400"/>
</linearGradient>
<linearGradient id="pbi-lg2" x1="50%" y1="0%" x2="50%" y2="100%">
<stop offset="0%" stop-color="#F9E583"/>
<stop offset="100%" stop-color="#DE9800"/>
</linearGradient>
<linearGradient id="pbi-lg5" x1="50%" y1="0%" x2="50%" y2="100%">
<stop offset="0%" stop-color="#F9E68B"/>
<stop offset="100%" stop-color="#F3CD32"/>
</linearGradient>
<linearGradient id="rl-glow" x1="0%" y1="0%" x2="100%" y2="0%">
<stop offset="0%" stop-color="#06d6a0" stop-opacity="0"/>
<stop offset="50%" stop-color="#06d6a0" stop-opacity="0.12"/>
<stop offset="100%" stop-color="#06d6a0" stop-opacity="0"/>
</linearGradient>
</defs>
<rect width="100%" height="100%" fill="#0d1117" rx="8"/>
<!-- Full background -->
<rect width="100%" height="100%" fill="#0d1117"/>
<!-- Title -->
<!-- ==================== VIBE BI HEADER ==================== -->
<!-- "VIBE BI" block art (shadow) -->
<text font-family="'Courier New', Courier, monospace" font-size="9" fill="#7A6508" xml:space="preserve">
<tspan x="296" y="22">██╗ ██╗ ██╗ ██████╗ ███████╗ ██████╗ ██╗</tspan>
<tspan x="296" y="33">██║ ██║ ██║ ██╔══██╗ ██╔════╝ ██╔══██╗ ██║</tspan>
<tspan x="296" y="44">██║ ██║ ██║ ██████╔╝ █████╗ ██████╔╝ ██║</tspan>
<tspan x="296" y="55">╚██╗ ██╔╝ ██║ ██╔══██╗ ██╔══╝ ██╔══██╗ ██║</tspan>
<tspan x="296" y="66"> ╚████╔╝ ██║ ██████╔╝ ███████╗ ██████╔╝ ██║</tspan>
<tspan x="296" y="77"> ╚═══╝ ╚═╝ ╚═════╝ ╚══════╝ ╚═════╝ ╚═╝</tspan>
</text>
<!-- "VIBE BI" block art (main) -->
<text font-family="'Courier New', Courier, monospace" font-size="9" fill="#F2C811" xml:space="preserve">
<tspan x="295" y="21">██╗ ██╗ ██╗ ██████╗ ███████╗ ██████╗ ██╗</tspan>
<tspan x="295" y="32">██║ ██║ ██║ ██╔══██╗ ██╔════╝ ██╔══██╗ ██║</tspan>
<tspan x="295" y="43">██║ ██║ ██║ ██████╔╝ █████╗ ██████╔╝ ██║</tspan>
<tspan x="295" y="54">╚██╗ ██╔╝ ██║ ██╔══██╗ ██╔══╝ ██╔══██╗ ██║</tspan>
<tspan x="295" y="65"> ╚████╔╝ ██║ ██████╔╝ ███████╗ ██████╔╝ ██║</tspan>
<tspan x="295" y="76"> ╚═══╝ ╚═╝ ╚═════╝ ╚══════╝ ╚═════╝ ╚═╝</tspan>
</text>
<!-- Separator -->
<line x1="60" y1="84" x2="790" y2="84" stroke="#F2C811" stroke-opacity="0.15" stroke-width="1"/>
<!-- Tagline -->
<text x="425" y="100" font-family="'Segoe UI', Arial, sans-serif" font-size="13" fill="#e6edf3" text-anchor="middle" font-weight="600">The First CLI for Both Power BI Modeling and Reporting</text>
<!-- ===== Connection Flow: Claude > PBI-CLI > Power BI ===== -->
<!-- Claude AI logo (inline, original 1200x1200, displayed as 50x50, centered at x=110) -->
<svg x="85" y="110" width="50" height="50" viewBox="0 0 1200 1200">
<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"/>
</svg>
<text x="110" y="175" 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="155" y1="135" x2="290" y2="135" stroke="#F2C811" stroke-width="2" stroke-dasharray="6,4" stroke-opacity="0.5"/>
<polygon points="294,135 286,130 286,140" fill="#F2C811" fill-opacity="0.5"/>
<!-- PBI-CLI block art (shadow) -->
<text font-family="'Courier New', Courier, monospace" font-size="7" fill="#7A6508" xml:space="preserve">
<tspan x="316" y="118">██████╗ ██████╗ ██╗ ██████╗ ██╗ ██╗</tspan>
<tspan x="316" y="128">██╔══██╗ ██╔══██╗ ██║ ██╔════╝ ██║ ██║</tspan>
<tspan x="316" y="138">██████╔╝ ██████╔╝ ██║ ███╗ ██║ ██║ ██║</tspan>
<tspan x="316" y="148">██╔═══╝ ██╔══██╗ ██║ ╚══╝ ██║ ██║ ██║</tspan>
<tspan x="316" y="158">██║ ██████╔╝ ██║ ╚██████╗ ███████╗ ██║</tspan>
<tspan x="316" y="168">╚═╝ ╚═════╝ ╚═╝ ╚═════╝ ╚══════╝ ╚═╝</tspan>
</text>
<!-- PBI-CLI block art (main) -->
<text font-family="'Courier New', Courier, monospace" font-size="7" fill="#F2C811" xml:space="preserve">
<tspan x="315" y="117">██████╗ ██████╗ ██╗ ██████╗ ██╗ ██╗</tspan>
<tspan x="315" y="127">██╔══██╗ ██╔══██╗ ██║ ██╔════╝ ██║ ██║</tspan>
<tspan x="315" y="137">██████╔╝ ██████╔╝ ██║ ███╗ ██║ ██║ ██║</tspan>
<tspan x="315" y="147">██╔═══╝ ██╔══██╗ ██║ ╚══╝ ██║ ██║ ██║</tspan>
<tspan x="315" y="157">██║ ██████╔╝ ██║ ╚██████╗ ███████╗ ██║</tspan>
<tspan x="315" y="167">╚═╝ ╚═════╝ ╚═╝ ╚═════╝ ╚══════╝ ╚═╝</tspan>
</text>
<!-- Right arrow -->
<line x1="560" y1="135" x2="655" y2="135" stroke="#F2C811" stroke-width="2" stroke-dasharray="6,4" stroke-opacity="0.5"/>
<polygon points="659,135 651,130 651,140" fill="#F2C811" fill-opacity="0.5"/>
<!-- Power BI logo (inline, original 630x630, displayed as 50x50, centered at x=700) -->
<svg x="675" y="110" width="50" height="50" viewBox="0 0 630 630">
<g transform="translate(77.5, 0)">
<rect fill="url(#pbi-lg1)" x="256" y="0" width="219" height="630" rx="26"/>
<path fill="url(#pbi-lg2)" d="M346,604 L346,630 L320,630 L153,630 C138.64,630 127,618.36 127,604 L127,183 C127,168.64 138.64,157 153,157 L320,157 C334.36,157 346,168.64 346,183 L346,604 Z"/>
<path fill="url(#pbi-lg5)" d="M219,604 L219,630 L193,630 L26,630 C11.64,630 0,618.36 0,604 L0,341 C0,326.64 11.64,315 26,315 L193,315 C207.36,315 219,326.64 219,341 L219,604 Z"/>
</g>
</svg>
<text x="700" y="175" font-family="'Segoe UI', Arial, sans-serif" font-size="11" fill="#F2C811" text-anchor="middle" font-weight="600">Power BI</text>
<!-- Modeling + Reporting pills -->
<rect x="308" y="176" width="100" height="20" rx="10" fill="#58a6ff" fill-opacity="0.1" stroke="#58a6ff" stroke-width="1"/>
<text x="358" y="190" font-family="'Segoe UI', Arial, sans-serif" font-size="10" fill="#58a6ff" text-anchor="middle" font-weight="600">Modeling</text>
<text x="420" y="190" font-family="'Segoe UI', Arial, sans-serif" font-size="10" fill="#8b949e" text-anchor="middle">+</text>
<rect x="432" y="176" width="100" height="20" rx="10" fill="#06d6a0" fill-opacity="0.1" stroke="#06d6a0" stroke-width="1"/>
<text x="482" y="190" font-family="'Segoe UI', Arial, sans-serif" font-size="10" fill="#06d6a0" text-anchor="middle" font-weight="600">Reporting</text>
<!-- Bottom separator -->
<line x1="60" y1="200" x2="790" y2="200" stroke="#F2C811" stroke-opacity="0.25" stroke-width="2"/>
<!-- ==================== END HEADER ==================== -->
<!-- Feature content (shifted down by 210px) -->
<g transform="translate(0, 210)">
<!-- Title -->
<text x="425" y="30" font-family="'Segoe UI', Arial, sans-serif" font-size="20" fill="#06d6a0" text-anchor="middle" font-weight="bold">Report Layer</text>
<text x="425" y="50" font-family="'Segoe UI', Arial, sans-serif" font-size="13" fill="#8b949e" text-anchor="middle">Build entire Power BI reports from the command line</text>
@ -123,4 +237,6 @@
<circle cx="630" cy="315" r="4" fill="#06d6a0"/>
<text x="642" y="319" font-family="'Segoe UI', Arial, sans-serif" font-size="12" fill="#e6edf3">Git-friendly PBIR</text>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 7.8 KiB

After

Width:  |  Height:  |  Size: 20 KiB

View file

@ -1,15 +1,129 @@
<svg xmlns="http://www.w3.org/2000/svg" width="850" height="280" viewBox="0 0 850 280">
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="850" height="490" viewBox="0 0 850 490">
<defs>
<linearGradient id="rw-glow" x1="0%" y1="0%" x2="100%" y2="0%">
<linearGradient id="hdr-bar1" x1="50%" y1="0%" x2="50%" y2="100%">
<stop offset="0%" stop-color="#EBBB14"/>
<stop offset="100%" stop-color="#B25400"/>
</linearGradient>
<linearGradient id="hdr-bar2" x1="50%" y1="0%" x2="50%" y2="100%">
<stop offset="0%" stop-color="#F9E583"/>
<stop offset="100%" stop-color="#DE9800"/>
</linearGradient>
<linearGradient id="hdr-bar3" x1="50%" y1="0%" x2="50%" y2="100%">
<stop offset="0%" stop-color="#F9E68B"/>
<stop offset="100%" stop-color="#F3CD32"/>
</linearGradient>
<linearGradient id="pbi-lg1" x1="50%" y1="0%" x2="50%" y2="100%">
<stop offset="0%" stop-color="#EBBB14"/>
<stop offset="100%" stop-color="#B25400"/>
</linearGradient>
<linearGradient id="pbi-lg2" x1="50%" y1="0%" x2="50%" y2="100%">
<stop offset="0%" stop-color="#F9E583"/>
<stop offset="100%" stop-color="#DE9800"/>
</linearGradient>
<linearGradient id="pbi-lg5" x1="50%" y1="0%" x2="50%" y2="100%">
<stop offset="0%" stop-color="#F9E68B"/>
<stop offset="100%" stop-color="#F3CD32"/>
</linearGradient>
<linearGradient id="rw-glow" x1="0%" y1="0%" x2="100%" y2="0%">
<stop offset="0%" stop-color="#06d6a0" stop-opacity="0"/>
<stop offset="50%" stop-color="#06d6a0" stop-opacity="0.12"/>
<stop offset="100%" stop-color="#06d6a0" stop-opacity="0"/>
</linearGradient>
</defs>
<rect width="100%" height="100%" fill="#0d1117" rx="8"/>
<!-- Full background -->
<rect width="100%" height="100%" fill="#0d1117"/>
<!-- Title -->
<!-- ==================== VIBE BI HEADER ==================== -->
<!-- "VIBE BI" block art (shadow) -->
<text font-family="'Courier New', Courier, monospace" font-size="9" fill="#7A6508" xml:space="preserve">
<tspan x="296" y="22">██╗ ██╗ ██╗ ██████╗ ███████╗ ██████╗ ██╗</tspan>
<tspan x="296" y="33">██║ ██║ ██║ ██╔══██╗ ██╔════╝ ██╔══██╗ ██║</tspan>
<tspan x="296" y="44">██║ ██║ ██║ ██████╔╝ █████╗ ██████╔╝ ██║</tspan>
<tspan x="296" y="55">╚██╗ ██╔╝ ██║ ██╔══██╗ ██╔══╝ ██╔══██╗ ██║</tspan>
<tspan x="296" y="66"> ╚████╔╝ ██║ ██████╔╝ ███████╗ ██████╔╝ ██║</tspan>
<tspan x="296" y="77"> ╚═══╝ ╚═╝ ╚═════╝ ╚══════╝ ╚═════╝ ╚═╝</tspan>
</text>
<!-- "VIBE BI" block art (main) -->
<text font-family="'Courier New', Courier, monospace" font-size="9" fill="#F2C811" xml:space="preserve">
<tspan x="295" y="21">██╗ ██╗ ██╗ ██████╗ ███████╗ ██████╗ ██╗</tspan>
<tspan x="295" y="32">██║ ██║ ██║ ██╔══██╗ ██╔════╝ ██╔══██╗ ██║</tspan>
<tspan x="295" y="43">██║ ██║ ██║ ██████╔╝ █████╗ ██████╔╝ ██║</tspan>
<tspan x="295" y="54">╚██╗ ██╔╝ ██║ ██╔══██╗ ██╔══╝ ██╔══██╗ ██║</tspan>
<tspan x="295" y="65"> ╚████╔╝ ██║ ██████╔╝ ███████╗ ██████╔╝ ██║</tspan>
<tspan x="295" y="76"> ╚═══╝ ╚═╝ ╚═════╝ ╚══════╝ ╚═════╝ ╚═╝</tspan>
</text>
<!-- Separator -->
<line x1="60" y1="84" x2="790" y2="84" stroke="#F2C811" stroke-opacity="0.15" stroke-width="1"/>
<!-- Tagline -->
<text x="425" y="100" font-family="'Segoe UI', Arial, sans-serif" font-size="13" fill="#e6edf3" text-anchor="middle" font-weight="600">The First CLI for Both Power BI Modeling and Reporting</text>
<!-- ===== Connection Flow: Claude > PBI-CLI > Power BI ===== -->
<!-- Claude AI logo (inline, original 1200x1200, displayed as 50x50, centered at x=110) -->
<svg x="85" y="110" width="50" height="50" viewBox="0 0 1200 1200">
<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"/>
</svg>
<text x="110" y="175" 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="155" y1="135" x2="290" y2="135" stroke="#F2C811" stroke-width="2" stroke-dasharray="6,4" stroke-opacity="0.5"/>
<polygon points="294,135 286,130 286,140" fill="#F2C811" fill-opacity="0.5"/>
<!-- PBI-CLI block art (shadow) -->
<text font-family="'Courier New', Courier, monospace" font-size="7" fill="#7A6508" xml:space="preserve">
<tspan x="316" y="118">██████╗ ██████╗ ██╗ ██████╗ ██╗ ██╗</tspan>
<tspan x="316" y="128">██╔══██╗ ██╔══██╗ ██║ ██╔════╝ ██║ ██║</tspan>
<tspan x="316" y="138">██████╔╝ ██████╔╝ ██║ ███╗ ██║ ██║ ██║</tspan>
<tspan x="316" y="148">██╔═══╝ ██╔══██╗ ██║ ╚══╝ ██║ ██║ ██║</tspan>
<tspan x="316" y="158">██║ ██████╔╝ ██║ ╚██████╗ ███████╗ ██║</tspan>
<tspan x="316" y="168">╚═╝ ╚═════╝ ╚═╝ ╚═════╝ ╚══════╝ ╚═╝</tspan>
</text>
<!-- PBI-CLI block art (main) -->
<text font-family="'Courier New', Courier, monospace" font-size="7" fill="#F2C811" xml:space="preserve">
<tspan x="315" y="117">██████╗ ██████╗ ██╗ ██████╗ ██╗ ██╗</tspan>
<tspan x="315" y="127">██╔══██╗ ██╔══██╗ ██║ ██╔════╝ ██║ ██║</tspan>
<tspan x="315" y="137">██████╔╝ ██████╔╝ ██║ ███╗ ██║ ██║ ██║</tspan>
<tspan x="315" y="147">██╔═══╝ ██╔══██╗ ██║ ╚══╝ ██║ ██║ ██║</tspan>
<tspan x="315" y="157">██║ ██████╔╝ ██║ ╚██████╗ ███████╗ ██║</tspan>
<tspan x="315" y="167">╚═╝ ╚═════╝ ╚═╝ ╚═════╝ ╚══════╝ ╚═╝</tspan>
</text>
<!-- Right arrow -->
<line x1="560" y1="135" x2="655" y2="135" stroke="#F2C811" stroke-width="2" stroke-dasharray="6,4" stroke-opacity="0.5"/>
<polygon points="659,135 651,130 651,140" fill="#F2C811" fill-opacity="0.5"/>
<!-- Power BI logo (inline, original 630x630, displayed as 50x50, centered at x=700) -->
<svg x="675" y="110" width="50" height="50" viewBox="0 0 630 630">
<g transform="translate(77.5, 0)">
<rect fill="url(#pbi-lg1)" x="256" y="0" width="219" height="630" rx="26"/>
<path fill="url(#pbi-lg2)" d="M346,604 L346,630 L320,630 L153,630 C138.64,630 127,618.36 127,604 L127,183 C127,168.64 138.64,157 153,157 L320,157 C334.36,157 346,168.64 346,183 L346,604 Z"/>
<path fill="url(#pbi-lg5)" d="M219,604 L219,630 L193,630 L26,630 C11.64,630 0,618.36 0,604 L0,341 C0,326.64 11.64,315 26,315 L193,315 C207.36,315 219,326.64 219,341 L219,604 Z"/>
</g>
</svg>
<text x="700" y="175" font-family="'Segoe UI', Arial, sans-serif" font-size="11" fill="#F2C811" text-anchor="middle" font-weight="600">Power BI</text>
<!-- Modeling + Reporting pills -->
<rect x="308" y="176" width="100" height="20" rx="10" fill="#58a6ff" fill-opacity="0.1" stroke="#58a6ff" stroke-width="1"/>
<text x="358" y="190" font-family="'Segoe UI', Arial, sans-serif" font-size="10" fill="#58a6ff" text-anchor="middle" font-weight="600">Modeling</text>
<text x="420" y="190" font-family="'Segoe UI', Arial, sans-serif" font-size="10" fill="#8b949e" text-anchor="middle">+</text>
<rect x="432" y="176" width="100" height="20" rx="10" fill="#06d6a0" fill-opacity="0.1" stroke="#06d6a0" stroke-width="1"/>
<text x="482" y="190" font-family="'Segoe UI', Arial, sans-serif" font-size="10" fill="#06d6a0" text-anchor="middle" font-weight="600">Reporting</text>
<!-- Bottom separator -->
<line x1="60" y1="200" x2="790" y2="200" stroke="#F2C811" stroke-opacity="0.25" stroke-width="2"/>
<!-- ==================== END HEADER ==================== -->
<!-- Feature content (shifted down by 210px) -->
<g transform="translate(0, 210)">
<!-- Title -->
<text x="425" y="28" font-family="'Segoe UI', Arial, sans-serif" font-size="20" fill="#06d6a0" text-anchor="middle" font-weight="bold">Build a Report in 6 Steps</text>
<text x="425" y="48" font-family="'Segoe UI', Arial, sans-serif" font-size="13" fill="#8b949e" text-anchor="middle">From empty folder to a complete, themed report with visuals and filters</text>
@ -121,4 +235,6 @@
<text x="425" y="250" font-family="'Courier New', Courier, monospace" font-size="12" fill="#58a6ff" text-anchor="middle">pbi visual add --type bar --page overview &amp;&amp; pbi visual bind --category --value</text>
<text x="425" y="275" font-family="'Segoe UI', Arial, sans-serif" font-size="12" fill="#8b949e" text-anchor="middle">All steps work offline on PBIR files. Desktop auto-syncs when it's open.</text>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 8.1 KiB

After

Width:  |  Height:  |  Size: 20 KiB

View file

@ -1,7 +1,122 @@
<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"/>
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="850" height="670" viewBox="0 0 850 670">
<defs>
<linearGradient id="hdr-bar1" x1="50%" y1="0%" x2="50%" y2="100%">
<stop offset="0%" stop-color="#EBBB14"/>
<stop offset="100%" stop-color="#B25400"/>
</linearGradient>
<linearGradient id="hdr-bar2" x1="50%" y1="0%" x2="50%" y2="100%">
<stop offset="0%" stop-color="#F9E583"/>
<stop offset="100%" stop-color="#DE9800"/>
</linearGradient>
<linearGradient id="hdr-bar3" x1="50%" y1="0%" x2="50%" y2="100%">
<stop offset="0%" stop-color="#F9E68B"/>
<stop offset="100%" stop-color="#F3CD32"/>
</linearGradient>
<linearGradient id="pbi-lg1" x1="50%" y1="0%" x2="50%" y2="100%">
<stop offset="0%" stop-color="#EBBB14"/>
<stop offset="100%" stop-color="#B25400"/>
</linearGradient>
<linearGradient id="pbi-lg2" x1="50%" y1="0%" x2="50%" y2="100%">
<stop offset="0%" stop-color="#F9E583"/>
<stop offset="100%" stop-color="#DE9800"/>
</linearGradient>
<linearGradient id="pbi-lg5" x1="50%" y1="0%" x2="50%" y2="100%">
<stop offset="0%" stop-color="#F9E68B"/>
<stop offset="100%" stop-color="#F3CD32"/>
</linearGradient>
</defs>
<!-- Title -->
<!-- Full background -->
<rect width="100%" height="100%" fill="#0d1117"/>
<!-- ==================== VIBE BI HEADER ==================== -->
<!-- "VIBE BI" block art (shadow) -->
<text font-family="'Courier New', Courier, monospace" font-size="9" fill="#7A6508" xml:space="preserve">
<tspan x="296" y="22">██╗ ██╗ ██╗ ██████╗ ███████╗ ██████╗ ██╗</tspan>
<tspan x="296" y="33">██║ ██║ ██║ ██╔══██╗ ██╔════╝ ██╔══██╗ ██║</tspan>
<tspan x="296" y="44">██║ ██║ ██║ ██████╔╝ █████╗ ██████╔╝ ██║</tspan>
<tspan x="296" y="55">╚██╗ ██╔╝ ██║ ██╔══██╗ ██╔══╝ ██╔══██╗ ██║</tspan>
<tspan x="296" y="66"> ╚████╔╝ ██║ ██████╔╝ ███████╗ ██████╔╝ ██║</tspan>
<tspan x="296" y="77"> ╚═══╝ ╚═╝ ╚═════╝ ╚══════╝ ╚═════╝ ╚═╝</tspan>
</text>
<!-- "VIBE BI" block art (main) -->
<text font-family="'Courier New', Courier, monospace" font-size="9" fill="#F2C811" xml:space="preserve">
<tspan x="295" y="21">██╗ ██╗ ██╗ ██████╗ ███████╗ ██████╗ ██╗</tspan>
<tspan x="295" y="32">██║ ██║ ██║ ██╔══██╗ ██╔════╝ ██╔══██╗ ██║</tspan>
<tspan x="295" y="43">██║ ██║ ██║ ██████╔╝ █████╗ ██████╔╝ ██║</tspan>
<tspan x="295" y="54">╚██╗ ██╔╝ ██║ ██╔══██╗ ██╔══╝ ██╔══██╗ ██║</tspan>
<tspan x="295" y="65"> ╚████╔╝ ██║ ██████╔╝ ███████╗ ██████╔╝ ██║</tspan>
<tspan x="295" y="76"> ╚═══╝ ╚═╝ ╚═════╝ ╚══════╝ ╚═════╝ ╚═╝</tspan>
</text>
<!-- Separator -->
<line x1="60" y1="84" x2="790" y2="84" stroke="#F2C811" stroke-opacity="0.15" stroke-width="1"/>
<!-- Tagline -->
<text x="425" y="100" font-family="'Segoe UI', Arial, sans-serif" font-size="13" fill="#e6edf3" text-anchor="middle" font-weight="600">The First CLI for Both Power BI Modeling and Reporting</text>
<!-- ===== Connection Flow: Claude > PBI-CLI > Power BI ===== -->
<!-- Claude AI logo (inline, original 1200x1200, displayed as 50x50, centered at x=110) -->
<svg x="85" y="110" width="50" height="50" viewBox="0 0 1200 1200">
<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"/>
</svg>
<text x="110" y="175" 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="155" y1="135" x2="290" y2="135" stroke="#F2C811" stroke-width="2" stroke-dasharray="6,4" stroke-opacity="0.5"/>
<polygon points="294,135 286,130 286,140" fill="#F2C811" fill-opacity="0.5"/>
<!-- PBI-CLI block art (shadow) -->
<text font-family="'Courier New', Courier, monospace" font-size="7" fill="#7A6508" xml:space="preserve">
<tspan x="316" y="118">██████╗ ██████╗ ██╗ ██████╗ ██╗ ██╗</tspan>
<tspan x="316" y="128">██╔══██╗ ██╔══██╗ ██║ ██╔════╝ ██║ ██║</tspan>
<tspan x="316" y="138">██████╔╝ ██████╔╝ ██║ ███╗ ██║ ██║ ██║</tspan>
<tspan x="316" y="148">██╔═══╝ ██╔══██╗ ██║ ╚══╝ ██║ ██║ ██║</tspan>
<tspan x="316" y="158">██║ ██████╔╝ ██║ ╚██████╗ ███████╗ ██║</tspan>
<tspan x="316" y="168">╚═╝ ╚═════╝ ╚═╝ ╚═════╝ ╚══════╝ ╚═╝</tspan>
</text>
<!-- PBI-CLI block art (main) -->
<text font-family="'Courier New', Courier, monospace" font-size="7" fill="#F2C811" xml:space="preserve">
<tspan x="315" y="117">██████╗ ██████╗ ██╗ ██████╗ ██╗ ██╗</tspan>
<tspan x="315" y="127">██╔══██╗ ██╔══██╗ ██║ ██╔════╝ ██║ ██║</tspan>
<tspan x="315" y="137">██████╔╝ ██████╔╝ ██║ ███╗ ██║ ██║ ██║</tspan>
<tspan x="315" y="147">██╔═══╝ ██╔══██╗ ██║ ╚══╝ ██║ ██║ ██║</tspan>
<tspan x="315" y="157">██║ ██████╔╝ ██║ ╚██████╗ ███████╗ ██║</tspan>
<tspan x="315" y="167">╚═╝ ╚═════╝ ╚═╝ ╚═════╝ ╚══════╝ ╚═╝</tspan>
</text>
<!-- Right arrow -->
<line x1="560" y1="135" x2="655" y2="135" stroke="#F2C811" stroke-width="2" stroke-dasharray="6,4" stroke-opacity="0.5"/>
<polygon points="659,135 651,130 651,140" fill="#F2C811" fill-opacity="0.5"/>
<!-- Power BI logo (inline, original 630x630, displayed as 50x50, centered at x=700) -->
<svg x="675" y="110" width="50" height="50" viewBox="0 0 630 630">
<g transform="translate(77.5, 0)">
<rect fill="url(#pbi-lg1)" x="256" y="0" width="219" height="630" rx="26"/>
<path fill="url(#pbi-lg2)" d="M346,604 L346,630 L320,630 L153,630 C138.64,630 127,618.36 127,604 L127,183 C127,168.64 138.64,157 153,157 L320,157 C334.36,157 346,168.64 346,183 L346,604 Z"/>
<path fill="url(#pbi-lg5)" d="M219,604 L219,630 L193,630 L26,630 C11.64,630 0,618.36 0,604 L0,341 C0,326.64 11.64,315 26,315 L193,315 C207.36,315 219,326.64 219,341 L219,604 Z"/>
</g>
</svg>
<text x="700" y="175" font-family="'Segoe UI', Arial, sans-serif" font-size="11" fill="#F2C811" text-anchor="middle" font-weight="600">Power BI</text>
<!-- Modeling + Reporting pills -->
<rect x="308" y="176" width="100" height="20" rx="10" fill="#58a6ff" fill-opacity="0.1" stroke="#58a6ff" stroke-width="1"/>
<text x="358" y="190" font-family="'Segoe UI', Arial, sans-serif" font-size="10" fill="#58a6ff" text-anchor="middle" font-weight="600">Modeling</text>
<text x="420" y="190" font-family="'Segoe UI', Arial, sans-serif" font-size="10" fill="#8b949e" text-anchor="middle">+</text>
<rect x="432" y="176" width="100" height="20" rx="10" fill="#06d6a0" fill-opacity="0.1" stroke="#06d6a0" stroke-width="1"/>
<text x="482" y="190" font-family="'Segoe UI', Arial, sans-serif" font-size="10" fill="#06d6a0" text-anchor="middle" font-weight="600">Reporting</text>
<!-- Bottom separator -->
<line x1="60" y1="200" x2="790" y2="200" stroke="#F2C811" stroke-opacity="0.25" stroke-width="2"/>
<!-- ==================== END HEADER ==================== -->
<!-- Feature content (shifted down by 210px) -->
<g transform="translate(0, 210)">
<!-- 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="13" fill="#8b949e" text-anchor="middle">Create, configure, and validate RLS roles without touching the GUI</text>
@ -48,4 +163,6 @@
<!-- Footer -->
<text x="425" y="450" font-family="'Segoe UI', Arial, sans-serif" font-size="13" fill="#8b949e" text-anchor="middle">Build and validate security roles entirely from conversation. No Security tab needed.</text>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 4.1 KiB

After

Width:  |  Height:  |  Size: 16 KiB

View file

@ -1,15 +1,129 @@
<svg xmlns="http://www.w3.org/2000/svg" width="850" height="480" viewBox="0 0 850 480">
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="850" height="690" viewBox="0 0 850 690">
<defs>
<linearGradient id="glow-line" x1="0%" y1="0%" x2="100%" y2="0%">
<linearGradient id="hdr-bar1" x1="50%" y1="0%" x2="50%" y2="100%">
<stop offset="0%" stop-color="#EBBB14"/>
<stop offset="100%" stop-color="#B25400"/>
</linearGradient>
<linearGradient id="hdr-bar2" x1="50%" y1="0%" x2="50%" y2="100%">
<stop offset="0%" stop-color="#F9E583"/>
<stop offset="100%" stop-color="#DE9800"/>
</linearGradient>
<linearGradient id="hdr-bar3" x1="50%" y1="0%" x2="50%" y2="100%">
<stop offset="0%" stop-color="#F9E68B"/>
<stop offset="100%" stop-color="#F3CD32"/>
</linearGradient>
<linearGradient id="pbi-lg1" x1="50%" y1="0%" x2="50%" y2="100%">
<stop offset="0%" stop-color="#EBBB14"/>
<stop offset="100%" stop-color="#B25400"/>
</linearGradient>
<linearGradient id="pbi-lg2" x1="50%" y1="0%" x2="50%" y2="100%">
<stop offset="0%" stop-color="#F9E583"/>
<stop offset="100%" stop-color="#DE9800"/>
</linearGradient>
<linearGradient id="pbi-lg5" x1="50%" y1="0%" x2="50%" y2="100%">
<stop offset="0%" stop-color="#F9E68B"/>
<stop offset="100%" stop-color="#F3CD32"/>
</linearGradient>
<linearGradient id="glow-line" x1="0%" y1="0%" x2="100%" y2="0%">
<stop offset="0%" stop-color="#F2C811" stop-opacity="0"/>
<stop offset="50%" stop-color="#F2C811" stop-opacity="0.2"/>
<stop offset="100%" stop-color="#F2C811" stop-opacity="0"/>
</linearGradient>
</defs>
<rect width="100%" height="100%" fill="#0d1117" rx="8"/>
<!-- Full background -->
<rect width="100%" height="100%" fill="#0d1117"/>
<!-- Title -->
<!-- ==================== VIBE BI HEADER ==================== -->
<!-- "VIBE BI" block art (shadow) -->
<text font-family="'Courier New', Courier, monospace" font-size="9" fill="#7A6508" xml:space="preserve">
<tspan x="296" y="22">██╗ ██╗ ██╗ ██████╗ ███████╗ ██████╗ ██╗</tspan>
<tspan x="296" y="33">██║ ██║ ██║ ██╔══██╗ ██╔════╝ ██╔══██╗ ██║</tspan>
<tspan x="296" y="44">██║ ██║ ██║ ██████╔╝ █████╗ ██████╔╝ ██║</tspan>
<tspan x="296" y="55">╚██╗ ██╔╝ ██║ ██╔══██╗ ██╔══╝ ██╔══██╗ ██║</tspan>
<tspan x="296" y="66"> ╚████╔╝ ██║ ██████╔╝ ███████╗ ██████╔╝ ██║</tspan>
<tspan x="296" y="77"> ╚═══╝ ╚═╝ ╚═════╝ ╚══════╝ ╚═════╝ ╚═╝</tspan>
</text>
<!-- "VIBE BI" block art (main) -->
<text font-family="'Courier New', Courier, monospace" font-size="9" fill="#F2C811" xml:space="preserve">
<tspan x="295" y="21">██╗ ██╗ ██╗ ██████╗ ███████╗ ██████╗ ██╗</tspan>
<tspan x="295" y="32">██║ ██║ ██║ ██╔══██╗ ██╔════╝ ██╔══██╗ ██║</tspan>
<tspan x="295" y="43">██║ ██║ ██║ ██████╔╝ █████╗ ██████╔╝ ██║</tspan>
<tspan x="295" y="54">╚██╗ ██╔╝ ██║ ██╔══██╗ ██╔══╝ ██╔══██╗ ██║</tspan>
<tspan x="295" y="65"> ╚████╔╝ ██║ ██████╔╝ ███████╗ ██████╔╝ ██║</tspan>
<tspan x="295" y="76"> ╚═══╝ ╚═╝ ╚═════╝ ╚══════╝ ╚═════╝ ╚═╝</tspan>
</text>
<!-- Separator -->
<line x1="60" y1="84" x2="790" y2="84" stroke="#F2C811" stroke-opacity="0.15" stroke-width="1"/>
<!-- Tagline -->
<text x="425" y="100" font-family="'Segoe UI', Arial, sans-serif" font-size="13" fill="#e6edf3" text-anchor="middle" font-weight="600">The First CLI for Both Power BI Modeling and Reporting</text>
<!-- ===== Connection Flow: Claude > PBI-CLI > Power BI ===== -->
<!-- Claude AI logo (inline, original 1200x1200, displayed as 50x50, centered at x=110) -->
<svg x="85" y="110" width="50" height="50" viewBox="0 0 1200 1200">
<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"/>
</svg>
<text x="110" y="175" 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="155" y1="135" x2="290" y2="135" stroke="#F2C811" stroke-width="2" stroke-dasharray="6,4" stroke-opacity="0.5"/>
<polygon points="294,135 286,130 286,140" fill="#F2C811" fill-opacity="0.5"/>
<!-- PBI-CLI block art (shadow) -->
<text font-family="'Courier New', Courier, monospace" font-size="7" fill="#7A6508" xml:space="preserve">
<tspan x="316" y="118">██████╗ ██████╗ ██╗ ██████╗ ██╗ ██╗</tspan>
<tspan x="316" y="128">██╔══██╗ ██╔══██╗ ██║ ██╔════╝ ██║ ██║</tspan>
<tspan x="316" y="138">██████╔╝ ██████╔╝ ██║ ███╗ ██║ ██║ ██║</tspan>
<tspan x="316" y="148">██╔═══╝ ██╔══██╗ ██║ ╚══╝ ██║ ██║ ██║</tspan>
<tspan x="316" y="158">██║ ██████╔╝ ██║ ╚██████╗ ███████╗ ██║</tspan>
<tspan x="316" y="168">╚═╝ ╚═════╝ ╚═╝ ╚═════╝ ╚══════╝ ╚═╝</tspan>
</text>
<!-- PBI-CLI block art (main) -->
<text font-family="'Courier New', Courier, monospace" font-size="7" fill="#F2C811" xml:space="preserve">
<tspan x="315" y="117">██████╗ ██████╗ ██╗ ██████╗ ██╗ ██╗</tspan>
<tspan x="315" y="127">██╔══██╗ ██╔══██╗ ██║ ██╔════╝ ██║ ██║</tspan>
<tspan x="315" y="137">██████╔╝ ██████╔╝ ██║ ███╗ ██║ ██║ ██║</tspan>
<tspan x="315" y="147">██╔═══╝ ██╔══██╗ ██║ ╚══╝ ██║ ██║ ██║</tspan>
<tspan x="315" y="157">██║ ██████╔╝ ██║ ╚██████╗ ███████╗ ██║</tspan>
<tspan x="315" y="167">╚═╝ ╚═════╝ ╚═╝ ╚═════╝ ╚══════╝ ╚═╝</tspan>
</text>
<!-- Right arrow -->
<line x1="560" y1="135" x2="655" y2="135" stroke="#F2C811" stroke-width="2" stroke-dasharray="6,4" stroke-opacity="0.5"/>
<polygon points="659,135 651,130 651,140" fill="#F2C811" fill-opacity="0.5"/>
<!-- Power BI logo (inline, original 630x630, displayed as 50x50, centered at x=700) -->
<svg x="675" y="110" width="50" height="50" viewBox="0 0 630 630">
<g transform="translate(77.5, 0)">
<rect fill="url(#pbi-lg1)" x="256" y="0" width="219" height="630" rx="26"/>
<path fill="url(#pbi-lg2)" d="M346,604 L346,630 L320,630 L153,630 C138.64,630 127,618.36 127,604 L127,183 C127,168.64 138.64,157 153,157 L320,157 C334.36,157 346,168.64 346,183 L346,604 Z"/>
<path fill="url(#pbi-lg5)" d="M219,604 L219,630 L193,630 L26,630 C11.64,630 0,618.36 0,604 L0,341 C0,326.64 11.64,315 26,315 L193,315 C207.36,315 219,326.64 219,341 L219,604 Z"/>
</g>
</svg>
<text x="700" y="175" font-family="'Segoe UI', Arial, sans-serif" font-size="11" fill="#F2C811" text-anchor="middle" font-weight="600">Power BI</text>
<!-- Modeling + Reporting pills -->
<rect x="308" y="176" width="100" height="20" rx="10" fill="#58a6ff" fill-opacity="0.1" stroke="#58a6ff" stroke-width="1"/>
<text x="358" y="190" font-family="'Segoe UI', Arial, sans-serif" font-size="10" fill="#58a6ff" text-anchor="middle" font-weight="600">Modeling</text>
<text x="420" y="190" font-family="'Segoe UI', Arial, sans-serif" font-size="10" fill="#8b949e" text-anchor="middle">+</text>
<rect x="432" y="176" width="100" height="20" rx="10" fill="#06d6a0" fill-opacity="0.1" stroke="#06d6a0" stroke-width="1"/>
<text x="482" y="190" font-family="'Segoe UI', Arial, sans-serif" font-size="10" fill="#06d6a0" text-anchor="middle" font-weight="600">Reporting</text>
<!-- Bottom separator -->
<line x1="60" y1="200" x2="790" y2="200" stroke="#F2C811" stroke-opacity="0.25" stroke-width="2"/>
<!-- ==================== END HEADER ==================== -->
<!-- Feature content (shifted down by 210px) -->
<g transform="translate(0, 210)">
<!-- Title -->
<text x="425" y="32" font-family="'Segoe UI', Arial, sans-serif" font-size="20" fill="#F2C811" text-anchor="middle" font-weight="bold">12 Skills That Claude Discovers Automatically</text>
<text x="425" y="54" font-family="'Segoe UI', Arial, sans-serif" font-size="13" fill="#8b949e" text-anchor="middle">Two layers, one CLI. Claude picks the right skill for every task.</text>
@ -137,4 +251,6 @@
<!-- Footer -->
<text x="425" y="465" font-family="'Courier New', Courier, monospace" font-size="15" fill="#58a6ff" text-anchor="middle" font-weight="bold">pbi skills list</text>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 12 KiB

After

Width:  |  Height:  |  Size: 24 KiB

View file

@ -1,9 +1,123 @@
<svg xmlns="http://www.w3.org/2000/svg" width="850" height="300" viewBox="0 0 850 300">
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="850" height="510" viewBox="0 0 850 510">
<defs>
<linearGradient id="hdr-bar1" x1="50%" y1="0%" x2="50%" y2="100%">
<stop offset="0%" stop-color="#EBBB14"/>
<stop offset="100%" stop-color="#B25400"/>
</linearGradient>
<linearGradient id="hdr-bar2" x1="50%" y1="0%" x2="50%" y2="100%">
<stop offset="0%" stop-color="#F9E583"/>
<stop offset="100%" stop-color="#DE9800"/>
</linearGradient>
<linearGradient id="hdr-bar3" x1="50%" y1="0%" x2="50%" y2="100%">
<stop offset="0%" stop-color="#F9E68B"/>
<stop offset="100%" stop-color="#F3CD32"/>
</linearGradient>
<linearGradient id="pbi-lg1" x1="50%" y1="0%" x2="50%" y2="100%">
<stop offset="0%" stop-color="#EBBB14"/>
<stop offset="100%" stop-color="#B25400"/>
</linearGradient>
<linearGradient id="pbi-lg2" x1="50%" y1="0%" x2="50%" y2="100%">
<stop offset="0%" stop-color="#F9E583"/>
<stop offset="100%" stop-color="#DE9800"/>
</linearGradient>
<linearGradient id="pbi-lg5" 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"/>
<!-- Full background -->
<rect width="100%" height="100%" fill="#0d1117"/>
<!-- TITLE -->
<!-- ==================== VIBE BI HEADER ==================== -->
<!-- "VIBE BI" block art (shadow) -->
<text font-family="'Courier New', Courier, monospace" font-size="9" fill="#7A6508" xml:space="preserve">
<tspan x="296" y="22">██╗ ██╗ ██╗ ██████╗ ███████╗ ██████╗ ██╗</tspan>
<tspan x="296" y="33">██║ ██║ ██║ ██╔══██╗ ██╔════╝ ██╔══██╗ ██║</tspan>
<tspan x="296" y="44">██║ ██║ ██║ ██████╔╝ █████╗ ██████╔╝ ██║</tspan>
<tspan x="296" y="55">╚██╗ ██╔╝ ██║ ██╔══██╗ ██╔══╝ ██╔══██╗ ██║</tspan>
<tspan x="296" y="66"> ╚████╔╝ ██║ ██████╔╝ ███████╗ ██████╔╝ ██║</tspan>
<tspan x="296" y="77"> ╚═══╝ ╚═╝ ╚═════╝ ╚══════╝ ╚═════╝ ╚═╝</tspan>
</text>
<!-- "VIBE BI" block art (main) -->
<text font-family="'Courier New', Courier, monospace" font-size="9" fill="#F2C811" xml:space="preserve">
<tspan x="295" y="21">██╗ ██╗ ██╗ ██████╗ ███████╗ ██████╗ ██╗</tspan>
<tspan x="295" y="32">██║ ██║ ██║ ██╔══██╗ ██╔════╝ ██╔══██╗ ██║</tspan>
<tspan x="295" y="43">██║ ██║ ██║ ██████╔╝ █████╗ ██████╔╝ ██║</tspan>
<tspan x="295" y="54">╚██╗ ██╔╝ ██║ ██╔══██╗ ██╔══╝ ██╔══██╗ ██║</tspan>
<tspan x="295" y="65"> ╚████╔╝ ██║ ██████╔╝ ███████╗ ██████╔╝ ██║</tspan>
<tspan x="295" y="76"> ╚═══╝ ╚═╝ ╚═════╝ ╚══════╝ ╚═════╝ ╚═╝</tspan>
</text>
<!-- Separator -->
<line x1="60" y1="84" x2="790" y2="84" stroke="#F2C811" stroke-opacity="0.15" stroke-width="1"/>
<!-- Tagline -->
<text x="425" y="100" font-family="'Segoe UI', Arial, sans-serif" font-size="13" fill="#e6edf3" text-anchor="middle" font-weight="600">The First CLI for Both Power BI Modeling and Reporting</text>
<!-- ===== Connection Flow: Claude > PBI-CLI > Power BI ===== -->
<!-- Claude AI logo (inline, original 1200x1200, displayed as 50x50, centered at x=110) -->
<svg x="85" y="110" width="50" height="50" viewBox="0 0 1200 1200">
<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"/>
</svg>
<text x="110" y="175" 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="155" y1="135" x2="290" y2="135" stroke="#F2C811" stroke-width="2" stroke-dasharray="6,4" stroke-opacity="0.5"/>
<polygon points="294,135 286,130 286,140" fill="#F2C811" fill-opacity="0.5"/>
<!-- PBI-CLI block art (shadow) -->
<text font-family="'Courier New', Courier, monospace" font-size="7" fill="#7A6508" xml:space="preserve">
<tspan x="316" y="118">██████╗ ██████╗ ██╗ ██████╗ ██╗ ██╗</tspan>
<tspan x="316" y="128">██╔══██╗ ██╔══██╗ ██║ ██╔════╝ ██║ ██║</tspan>
<tspan x="316" y="138">██████╔╝ ██████╔╝ ██║ ███╗ ██║ ██║ ██║</tspan>
<tspan x="316" y="148">██╔═══╝ ██╔══██╗ ██║ ╚══╝ ██║ ██║ ██║</tspan>
<tspan x="316" y="158">██║ ██████╔╝ ██║ ╚██████╗ ███████╗ ██║</tspan>
<tspan x="316" y="168">╚═╝ ╚═════╝ ╚═╝ ╚═════╝ ╚══════╝ ╚═╝</tspan>
</text>
<!-- PBI-CLI block art (main) -->
<text font-family="'Courier New', Courier, monospace" font-size="7" fill="#F2C811" xml:space="preserve">
<tspan x="315" y="117">██████╗ ██████╗ ██╗ ██████╗ ██╗ ██╗</tspan>
<tspan x="315" y="127">██╔══██╗ ██╔══██╗ ██║ ██╔════╝ ██║ ██║</tspan>
<tspan x="315" y="137">██████╔╝ ██████╔╝ ██║ ███╗ ██║ ██║ ██║</tspan>
<tspan x="315" y="147">██╔═══╝ ██╔══██╗ ██║ ╚══╝ ██║ ██║ ██║</tspan>
<tspan x="315" y="157">██║ ██████╔╝ ██║ ╚██████╗ ███████╗ ██║</tspan>
<tspan x="315" y="167">╚═╝ ╚═════╝ ╚═╝ ╚═════╝ ╚══════╝ ╚═╝</tspan>
</text>
<!-- Right arrow -->
<line x1="560" y1="135" x2="655" y2="135" stroke="#F2C811" stroke-width="2" stroke-dasharray="6,4" stroke-opacity="0.5"/>
<polygon points="659,135 651,130 651,140" fill="#F2C811" fill-opacity="0.5"/>
<!-- Power BI logo (inline, original 630x630, displayed as 50x50, centered at x=700) -->
<svg x="675" y="110" width="50" height="50" viewBox="0 0 630 630">
<g transform="translate(77.5, 0)">
<rect fill="url(#pbi-lg1)" x="256" y="0" width="219" height="630" rx="26"/>
<path fill="url(#pbi-lg2)" d="M346,604 L346,630 L320,630 L153,630 C138.64,630 127,618.36 127,604 L127,183 C127,168.64 138.64,157 153,157 L320,157 C334.36,157 346,168.64 346,183 L346,604 Z"/>
<path fill="url(#pbi-lg5)" d="M219,604 L219,630 L193,630 L26,630 C11.64,630 0,618.36 0,604 L0,341 C0,326.64 11.64,315 26,315 L193,315 C207.36,315 219,326.64 219,341 L219,604 Z"/>
</g>
</svg>
<text x="700" y="175" font-family="'Segoe UI', Arial, sans-serif" font-size="11" fill="#F2C811" text-anchor="middle" font-weight="600">Power BI</text>
<!-- Modeling + Reporting pills -->
<rect x="308" y="176" width="100" height="20" rx="10" fill="#58a6ff" fill-opacity="0.1" stroke="#58a6ff" stroke-width="1"/>
<text x="358" y="190" font-family="'Segoe UI', Arial, sans-serif" font-size="10" fill="#58a6ff" text-anchor="middle" font-weight="600">Modeling</text>
<text x="420" y="190" font-family="'Segoe UI', Arial, sans-serif" font-size="10" fill="#8b949e" text-anchor="middle">+</text>
<rect x="432" y="176" width="100" height="20" rx="10" fill="#06d6a0" fill-opacity="0.1" stroke="#06d6a0" stroke-width="1"/>
<text x="482" y="190" font-family="'Segoe UI', Arial, sans-serif" font-size="10" fill="#06d6a0" text-anchor="middle" font-weight="600">Reporting</text>
<!-- Bottom separator -->
<line x1="60" y1="200" x2="790" y2="200" stroke="#F2C811" stroke-opacity="0.25" stroke-width="2"/>
<!-- ==================== END HEADER ==================== -->
<!-- Feature content (shifted down by 210px) -->
<g transform="translate(0, 210)">
<!-- BACKGROUND -->
<!-- TITLE -->
<text x="425" y="33" font-family="'Segoe UI', Arial, sans-serif" font-size="17" fill="#F2C811" text-anchor="middle" font-weight="bold">pbi-cli at a Glance</text>
<!-- ===================== CELL 1: 30+ CLI Commands (blue) top-left ===================== -->
@ -84,4 +198,5 @@
<rect x="760" y="199" width="55" height="12" rx="3" fill="#06d6a0" fill-opacity="0.5"/>
<text x="787" y="209" font-family="'Segoe UI', Arial, sans-serif" font-size="7" fill="#06d6a0" text-anchor="middle">REPORTING</text>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 5.2 KiB

After

Width:  |  Height:  |  Size: 17 KiB

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

@ -0,0 +1,186 @@
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="850" height="630" viewBox="0 0 850 630">
<defs>
<linearGradient id="hdr-bar1" x1="50%" y1="0%" x2="50%" y2="100%">
<stop offset="0%" stop-color="#EBBB14"/>
<stop offset="100%" stop-color="#B25400"/>
</linearGradient>
<linearGradient id="hdr-bar2" x1="50%" y1="0%" x2="50%" y2="100%">
<stop offset="0%" stop-color="#F9E583"/>
<stop offset="100%" stop-color="#DE9800"/>
</linearGradient>
<linearGradient id="hdr-bar3" x1="50%" y1="0%" x2="50%" y2="100%">
<stop offset="0%" stop-color="#F9E68B"/>
<stop offset="100%" stop-color="#F3CD32"/>
</linearGradient>
<linearGradient id="pbi-lg1" x1="50%" y1="0%" x2="50%" y2="100%">
<stop offset="0%" stop-color="#EBBB14"/>
<stop offset="100%" stop-color="#B25400"/>
</linearGradient>
<linearGradient id="pbi-lg2" x1="50%" y1="0%" x2="50%" y2="100%">
<stop offset="0%" stop-color="#F9E583"/>
<stop offset="100%" stop-color="#DE9800"/>
</linearGradient>
<linearGradient id="pbi-lg5" x1="50%" y1="0%" x2="50%" y2="100%">
<stop offset="0%" stop-color="#F9E68B"/>
<stop offset="100%" stop-color="#F3CD32"/>
</linearGradient>
</defs>
<!-- Full background -->
<rect width="100%" height="100%" fill="#0d1117"/>
<!-- ==================== VIBE BI HEADER ==================== -->
<!-- "VIBE BI" block art (shadow) -->
<text font-family="'Courier New', Courier, monospace" font-size="9" fill="#7A6508" xml:space="preserve">
<tspan x="296" y="22">██╗ ██╗ ██╗ ██████╗ ███████╗ ██████╗ ██╗</tspan>
<tspan x="296" y="33">██║ ██║ ██║ ██╔══██╗ ██╔════╝ ██╔══██╗ ██║</tspan>
<tspan x="296" y="44">██║ ██║ ██║ ██████╔╝ █████╗ ██████╔╝ ██║</tspan>
<tspan x="296" y="55">╚██╗ ██╔╝ ██║ ██╔══██╗ ██╔══╝ ██╔══██╗ ██║</tspan>
<tspan x="296" y="66"> ╚████╔╝ ██║ ██████╔╝ ███████╗ ██████╔╝ ██║</tspan>
<tspan x="296" y="77"> ╚═══╝ ╚═╝ ╚═════╝ ╚══════╝ ╚═════╝ ╚═╝</tspan>
</text>
<!-- "VIBE BI" block art (main) -->
<text font-family="'Courier New', Courier, monospace" font-size="9" fill="#F2C811" xml:space="preserve">
<tspan x="295" y="21">██╗ ██╗ ██╗ ██████╗ ███████╗ ██████╗ ██╗</tspan>
<tspan x="295" y="32">██║ ██║ ██║ ██╔══██╗ ██╔════╝ ██╔══██╗ ██║</tspan>
<tspan x="295" y="43">██║ ██║ ██║ ██████╔╝ █████╗ ██████╔╝ ██║</tspan>
<tspan x="295" y="54">╚██╗ ██╔╝ ██║ ██╔══██╗ ██╔══╝ ██╔══██╗ ██║</tspan>
<tspan x="295" y="65"> ╚████╔╝ ██║ ██████╔╝ ███████╗ ██████╔╝ ██║</tspan>
<tspan x="295" y="76"> ╚═══╝ ╚═╝ ╚═════╝ ╚══════╝ ╚═════╝ ╚═╝</tspan>
</text>
<!-- Separator -->
<line x1="60" y1="84" x2="790" y2="84" stroke="#F2C811" stroke-opacity="0.15" stroke-width="1"/>
<!-- Tagline -->
<text x="425" y="100" font-family="'Segoe UI', Arial, sans-serif" font-size="13" fill="#e6edf3" text-anchor="middle" font-weight="600">The First CLI for Both Power BI Modeling and Reporting</text>
<!-- ===== Connection Flow: Claude > PBI-CLI > Power BI ===== -->
<!-- Claude AI logo (inline, original 1200x1200, displayed as 50x50, centered at x=110) -->
<svg x="85" y="110" width="50" height="50" viewBox="0 0 1200 1200">
<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"/>
</svg>
<text x="110" y="175" 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="155" y1="135" x2="290" y2="135" stroke="#F2C811" stroke-width="2" stroke-dasharray="6,4" stroke-opacity="0.5"/>
<polygon points="294,135 286,130 286,140" fill="#F2C811" fill-opacity="0.5"/>
<!-- PBI-CLI block art (shadow) -->
<text font-family="'Courier New', Courier, monospace" font-size="7" fill="#7A6508" xml:space="preserve">
<tspan x="316" y="118">██████╗ ██████╗ ██╗ ██████╗ ██╗ ██╗</tspan>
<tspan x="316" y="128">██╔══██╗ ██╔══██╗ ██║ ██╔════╝ ██║ ██║</tspan>
<tspan x="316" y="138">██████╔╝ ██████╔╝ ██║ ███╗ ██║ ██║ ██║</tspan>
<tspan x="316" y="148">██╔═══╝ ██╔══██╗ ██║ ╚══╝ ██║ ██║ ██║</tspan>
<tspan x="316" y="158">██║ ██████╔╝ ██║ ╚██████╗ ███████╗ ██║</tspan>
<tspan x="316" y="168">╚═╝ ╚═════╝ ╚═╝ ╚═════╝ ╚══════╝ ╚═╝</tspan>
</text>
<!-- PBI-CLI block art (main) -->
<text font-family="'Courier New', Courier, monospace" font-size="7" fill="#F2C811" xml:space="preserve">
<tspan x="315" y="117">██████╗ ██████╗ ██╗ ██████╗ ██╗ ██╗</tspan>
<tspan x="315" y="127">██╔══██╗ ██╔══██╗ ██║ ██╔════╝ ██║ ██║</tspan>
<tspan x="315" y="137">██████╔╝ ██████╔╝ ██║ ███╗ ██║ ██║ ██║</tspan>
<tspan x="315" y="147">██╔═══╝ ██╔══██╗ ██║ ╚══╝ ██║ ██║ ██║</tspan>
<tspan x="315" y="157">██║ ██████╔╝ ██║ ╚██████╗ ███████╗ ██║</tspan>
<tspan x="315" y="167">╚═╝ ╚═════╝ ╚═╝ ╚═════╝ ╚══════╝ ╚═╝</tspan>
</text>
<!-- Right arrow -->
<line x1="560" y1="135" x2="655" y2="135" stroke="#F2C811" stroke-width="2" stroke-dasharray="6,4" stroke-opacity="0.5"/>
<polygon points="659,135 651,130 651,140" fill="#F2C811" fill-opacity="0.5"/>
<!-- Power BI logo (inline, original 630x630, displayed as 50x50, centered at x=700) -->
<svg x="675" y="110" width="50" height="50" viewBox="0 0 630 630">
<g transform="translate(77.5, 0)">
<rect fill="url(#pbi-lg1)" x="256" y="0" width="219" height="630" rx="26"/>
<path fill="url(#pbi-lg2)" d="M346,604 L346,630 L320,630 L153,630 C138.64,630 127,618.36 127,604 L127,183 C127,168.64 138.64,157 153,157 L320,157 C334.36,157 346,168.64 346,183 L346,604 Z"/>
<path fill="url(#pbi-lg5)" d="M219,604 L219,630 L193,630 L26,630 C11.64,630 0,618.36 0,604 L0,341 C0,326.64 11.64,315 26,315 L193,315 C207.36,315 219,326.64 219,341 L219,604 Z"/>
</g>
</svg>
<text x="700" y="175" font-family="'Segoe UI', Arial, sans-serif" font-size="11" fill="#F2C811" text-anchor="middle" font-weight="600">Power BI</text>
<!-- Modeling + Reporting pills -->
<rect x="308" y="176" width="100" height="20" rx="10" fill="#58a6ff" fill-opacity="0.1" stroke="#58a6ff" stroke-width="1"/>
<text x="358" y="190" font-family="'Segoe UI', Arial, sans-serif" font-size="10" fill="#58a6ff" text-anchor="middle" font-weight="600">Modeling</text>
<text x="420" y="190" font-family="'Segoe UI', Arial, sans-serif" font-size="10" fill="#8b949e" text-anchor="middle">+</text>
<rect x="432" y="176" width="100" height="20" rx="10" fill="#06d6a0" fill-opacity="0.1" stroke="#06d6a0" stroke-width="1"/>
<text x="482" y="190" font-family="'Segoe UI', Arial, sans-serif" font-size="10" fill="#06d6a0" text-anchor="middle" font-weight="600">Reporting</text>
<!-- Bottom separator -->
<line x1="60" y1="200" x2="790" y2="200" stroke="#F2C811" stroke-opacity="0.25" stroke-width="2"/>
<!-- ==================== END HEADER ==================== -->
<!-- Feature content (shifted down by 210px) -->
<g transform="translate(0, 210)">
<!-- 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>
</g>
</svg>

After

Width:  |  Height:  |  Size: 16 KiB

View file

@ -1,7 +1,122 @@
<svg xmlns="http://www.w3.org/2000/svg" width="850" height="440" viewBox="0 0 850 440">
<rect width="100%" height="100%" fill="#0d1117" rx="8"/>
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="850" height="650" viewBox="0 0 850 650">
<defs>
<linearGradient id="hdr-bar1" x1="50%" y1="0%" x2="50%" y2="100%">
<stop offset="0%" stop-color="#EBBB14"/>
<stop offset="100%" stop-color="#B25400"/>
</linearGradient>
<linearGradient id="hdr-bar2" x1="50%" y1="0%" x2="50%" y2="100%">
<stop offset="0%" stop-color="#F9E583"/>
<stop offset="100%" stop-color="#DE9800"/>
</linearGradient>
<linearGradient id="hdr-bar3" x1="50%" y1="0%" x2="50%" y2="100%">
<stop offset="0%" stop-color="#F9E68B"/>
<stop offset="100%" stop-color="#F3CD32"/>
</linearGradient>
<linearGradient id="pbi-lg1" x1="50%" y1="0%" x2="50%" y2="100%">
<stop offset="0%" stop-color="#EBBB14"/>
<stop offset="100%" stop-color="#B25400"/>
</linearGradient>
<linearGradient id="pbi-lg2" x1="50%" y1="0%" x2="50%" y2="100%">
<stop offset="0%" stop-color="#F9E583"/>
<stop offset="100%" stop-color="#DE9800"/>
</linearGradient>
<linearGradient id="pbi-lg5" x1="50%" y1="0%" x2="50%" y2="100%">
<stop offset="0%" stop-color="#F9E68B"/>
<stop offset="100%" stop-color="#F3CD32"/>
</linearGradient>
</defs>
<!-- Title -->
<!-- Full background -->
<rect width="100%" height="100%" fill="#0d1117"/>
<!-- ==================== VIBE BI HEADER ==================== -->
<!-- "VIBE BI" block art (shadow) -->
<text font-family="'Courier New', Courier, monospace" font-size="9" fill="#7A6508" xml:space="preserve">
<tspan x="296" y="22">██╗ ██╗ ██╗ ██████╗ ███████╗ ██████╗ ██╗</tspan>
<tspan x="296" y="33">██║ ██║ ██║ ██╔══██╗ ██╔════╝ ██╔══██╗ ██║</tspan>
<tspan x="296" y="44">██║ ██║ ██║ ██████╔╝ █████╗ ██████╔╝ ██║</tspan>
<tspan x="296" y="55">╚██╗ ██╔╝ ██║ ██╔══██╗ ██╔══╝ ██╔══██╗ ██║</tspan>
<tspan x="296" y="66"> ╚████╔╝ ██║ ██████╔╝ ███████╗ ██████╔╝ ██║</tspan>
<tspan x="296" y="77"> ╚═══╝ ╚═╝ ╚═════╝ ╚══════╝ ╚═════╝ ╚═╝</tspan>
</text>
<!-- "VIBE BI" block art (main) -->
<text font-family="'Courier New', Courier, monospace" font-size="9" fill="#F2C811" xml:space="preserve">
<tspan x="295" y="21">██╗ ██╗ ██╗ ██████╗ ███████╗ ██████╗ ██╗</tspan>
<tspan x="295" y="32">██║ ██║ ██║ ██╔══██╗ ██╔════╝ ██╔══██╗ ██║</tspan>
<tspan x="295" y="43">██║ ██║ ██║ ██████╔╝ █████╗ ██████╔╝ ██║</tspan>
<tspan x="295" y="54">╚██╗ ██╔╝ ██║ ██╔══██╗ ██╔══╝ ██╔══██╗ ██║</tspan>
<tspan x="295" y="65"> ╚████╔╝ ██║ ██████╔╝ ███████╗ ██████╔╝ ██║</tspan>
<tspan x="295" y="76"> ╚═══╝ ╚═╝ ╚═════╝ ╚══════╝ ╚═════╝ ╚═╝</tspan>
</text>
<!-- Separator -->
<line x1="60" y1="84" x2="790" y2="84" stroke="#F2C811" stroke-opacity="0.15" stroke-width="1"/>
<!-- Tagline -->
<text x="425" y="100" font-family="'Segoe UI', Arial, sans-serif" font-size="13" fill="#e6edf3" text-anchor="middle" font-weight="600">The First CLI for Both Power BI Modeling and Reporting</text>
<!-- ===== Connection Flow: Claude > PBI-CLI > Power BI ===== -->
<!-- Claude AI logo (inline, original 1200x1200, displayed as 50x50, centered at x=110) -->
<svg x="85" y="110" width="50" height="50" viewBox="0 0 1200 1200">
<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"/>
</svg>
<text x="110" y="175" 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="155" y1="135" x2="290" y2="135" stroke="#F2C811" stroke-width="2" stroke-dasharray="6,4" stroke-opacity="0.5"/>
<polygon points="294,135 286,130 286,140" fill="#F2C811" fill-opacity="0.5"/>
<!-- PBI-CLI block art (shadow) -->
<text font-family="'Courier New', Courier, monospace" font-size="7" fill="#7A6508" xml:space="preserve">
<tspan x="316" y="118">██████╗ ██████╗ ██╗ ██████╗ ██╗ ██╗</tspan>
<tspan x="316" y="128">██╔══██╗ ██╔══██╗ ██║ ██╔════╝ ██║ ██║</tspan>
<tspan x="316" y="138">██████╔╝ ██████╔╝ ██║ ███╗ ██║ ██║ ██║</tspan>
<tspan x="316" y="148">██╔═══╝ ██╔══██╗ ██║ ╚══╝ ██║ ██║ ██║</tspan>
<tspan x="316" y="158">██║ ██████╔╝ ██║ ╚██████╗ ███████╗ ██║</tspan>
<tspan x="316" y="168">╚═╝ ╚═════╝ ╚═╝ ╚═════╝ ╚══════╝ ╚═╝</tspan>
</text>
<!-- PBI-CLI block art (main) -->
<text font-family="'Courier New', Courier, monospace" font-size="7" fill="#F2C811" xml:space="preserve">
<tspan x="315" y="117">██████╗ ██████╗ ██╗ ██████╗ ██╗ ██╗</tspan>
<tspan x="315" y="127">██╔══██╗ ██╔══██╗ ██║ ██╔════╝ ██║ ██║</tspan>
<tspan x="315" y="137">██████╔╝ ██████╔╝ ██║ ███╗ ██║ ██║ ██║</tspan>
<tspan x="315" y="147">██╔═══╝ ██╔══██╗ ██║ ╚══╝ ██║ ██║ ██║</tspan>
<tspan x="315" y="157">██║ ██████╔╝ ██║ ╚██████╗ ███████╗ ██║</tspan>
<tspan x="315" y="167">╚═╝ ╚═════╝ ╚═╝ ╚═════╝ ╚══════╝ ╚═╝</tspan>
</text>
<!-- Right arrow -->
<line x1="560" y1="135" x2="655" y2="135" stroke="#F2C811" stroke-width="2" stroke-dasharray="6,4" stroke-opacity="0.5"/>
<polygon points="659,135 651,130 651,140" fill="#F2C811" fill-opacity="0.5"/>
<!-- Power BI logo (inline, original 630x630, displayed as 50x50, centered at x=700) -->
<svg x="675" y="110" width="50" height="50" viewBox="0 0 630 630">
<g transform="translate(77.5, 0)">
<rect fill="url(#pbi-lg1)" x="256" y="0" width="219" height="630" rx="26"/>
<path fill="url(#pbi-lg2)" d="M346,604 L346,630 L320,630 L153,630 C138.64,630 127,618.36 127,604 L127,183 C127,168.64 138.64,157 153,157 L320,157 C334.36,157 346,168.64 346,183 L346,604 Z"/>
<path fill="url(#pbi-lg5)" d="M219,604 L219,630 L193,630 L26,630 C11.64,630 0,618.36 0,604 L0,341 C0,326.64 11.64,315 26,315 L193,315 C207.36,315 219,326.64 219,341 L219,604 Z"/>
</g>
</svg>
<text x="700" y="175" font-family="'Segoe UI', Arial, sans-serif" font-size="11" fill="#F2C811" text-anchor="middle" font-weight="600">Power BI</text>
<!-- Modeling + Reporting pills -->
<rect x="308" y="176" width="100" height="20" rx="10" fill="#58a6ff" fill-opacity="0.1" stroke="#58a6ff" stroke-width="1"/>
<text x="358" y="190" font-family="'Segoe UI', Arial, sans-serif" font-size="10" fill="#58a6ff" text-anchor="middle" font-weight="600">Modeling</text>
<text x="420" y="190" font-family="'Segoe UI', Arial, sans-serif" font-size="10" fill="#8b949e" text-anchor="middle">+</text>
<rect x="432" y="176" width="100" height="20" rx="10" fill="#06d6a0" fill-opacity="0.1" stroke="#06d6a0" stroke-width="1"/>
<text x="482" y="190" font-family="'Segoe UI', Arial, sans-serif" font-size="10" fill="#06d6a0" text-anchor="middle" font-weight="600">Reporting</text>
<!-- Bottom separator -->
<line x1="60" y1="200" x2="790" y2="200" stroke="#F2C811" stroke-opacity="0.25" stroke-width="2"/>
<!-- ==================== END HEADER ==================== -->
<!-- Feature content (shifted down by 210px) -->
<g transform="translate(0, 210)">
<!-- Title -->
<text x="425" y="30" font-family="'Segoe UI', Arial, sans-serif" font-size="20" fill="#F2C811" text-anchor="middle" font-weight="bold">32 Visual Types, All from CLI</text>
<text x="425" y="50" font-family="'Segoe UI', Arial, sans-serif" font-size="13" fill="#8b949e" text-anchor="middle">pbi visual add --type &lt;alias&gt; -- use friendly names, pbi-cli handles the rest</text>
@ -242,4 +357,6 @@
<text x="425" y="410" font-family="'Segoe UI', Arial, sans-serif" font-size="13" fill="#8b949e" text-anchor="middle">card_new, multi_row_card, shape, action_button, page_navigator, and more</text>
<text x="425" y="435" font-family="'Courier New', Courier, monospace" font-size="14" fill="#58a6ff" text-anchor="middle" font-weight="bold">pbi visual add --type bar --page overview --name my_chart</text>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 16 KiB

After

Width:  |  Height:  |  Size: 28 KiB

244
assets/workflow.svg Normal file
View file

@ -0,0 +1,244 @@
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="850" height="600" viewBox="0 0 850 600">
<defs>
<linearGradient id="hdr-bar1" x1="50%" y1="0%" x2="50%" y2="100%">
<stop offset="0%" stop-color="#EBBB14"/>
<stop offset="100%" stop-color="#B25400"/>
</linearGradient>
<linearGradient id="hdr-bar2" x1="50%" y1="0%" x2="50%" y2="100%">
<stop offset="0%" stop-color="#F9E583"/>
<stop offset="100%" stop-color="#DE9800"/>
</linearGradient>
<linearGradient id="hdr-bar3" x1="50%" y1="0%" x2="50%" y2="100%">
<stop offset="0%" stop-color="#F9E68B"/>
<stop offset="100%" stop-color="#F3CD32"/>
</linearGradient>
<linearGradient id="pbi-lg1" x1="50%" y1="0%" x2="50%" y2="100%">
<stop offset="0%" stop-color="#EBBB14"/>
<stop offset="100%" stop-color="#B25400"/>
</linearGradient>
<linearGradient id="pbi-lg2" x1="50%" y1="0%" x2="50%" y2="100%">
<stop offset="0%" stop-color="#F9E583"/>
<stop offset="100%" stop-color="#DE9800"/>
</linearGradient>
<linearGradient id="pbi-lg5" x1="50%" y1="0%" x2="50%" y2="100%">
<stop offset="0%" stop-color="#F9E68B"/>
<stop offset="100%" stop-color="#F3CD32"/>
</linearGradient>
<linearGradient id="wf-bar1" x1="50%" y1="0%" x2="50%" y2="100%">
<stop offset="0%" stop-color="#EBBB14"/>
<stop offset="100%" stop-color="#B25400"/>
</linearGradient>
<linearGradient id="wf-bar2" x1="50%" y1="0%" x2="50%" y2="100%">
<stop offset="0%" stop-color="#F9E583"/>
<stop offset="100%" stop-color="#DE9800"/>
</linearGradient>
<linearGradient id="wf-bar3" x1="50%" y1="0%" x2="50%" y2="100%">
<stop offset="0%" stop-color="#F9E68B"/>
<stop offset="100%" stop-color="#F3CD32"/>
</linearGradient>
</defs>
<!-- Full background -->
<rect width="100%" height="100%" fill="#0d1117"/>
<!-- ==================== VIBE BI HEADER ==================== -->
<!-- "VIBE BI" block art (shadow) -->
<text font-family="'Courier New', Courier, monospace" font-size="9" fill="#7A6508" xml:space="preserve">
<tspan x="296" y="22">██╗ ██╗ ██╗ ██████╗ ███████╗ ██████╗ ██╗</tspan>
<tspan x="296" y="33">██║ ██║ ██║ ██╔══██╗ ██╔════╝ ██╔══██╗ ██║</tspan>
<tspan x="296" y="44">██║ ██║ ██║ ██████╔╝ █████╗ ██████╔╝ ██║</tspan>
<tspan x="296" y="55">╚██╗ ██╔╝ ██║ ██╔══██╗ ██╔══╝ ██╔══██╗ ██║</tspan>
<tspan x="296" y="66"> ╚████╔╝ ██║ ██████╔╝ ███████╗ ██████╔╝ ██║</tspan>
<tspan x="296" y="77"> ╚═══╝ ╚═╝ ╚═════╝ ╚══════╝ ╚═════╝ ╚═╝</tspan>
</text>
<!-- "VIBE BI" block art (main) -->
<text font-family="'Courier New', Courier, monospace" font-size="9" fill="#F2C811" xml:space="preserve">
<tspan x="295" y="21">██╗ ██╗ ██╗ ██████╗ ███████╗ ██████╗ ██╗</tspan>
<tspan x="295" y="32">██║ ██║ ██║ ██╔══██╗ ██╔════╝ ██╔══██╗ ██║</tspan>
<tspan x="295" y="43">██║ ██║ ██║ ██████╔╝ █████╗ ██████╔╝ ██║</tspan>
<tspan x="295" y="54">╚██╗ ██╔╝ ██║ ██╔══██╗ ██╔══╝ ██╔══██╗ ██║</tspan>
<tspan x="295" y="65"> ╚████╔╝ ██║ ██████╔╝ ███████╗ ██████╔╝ ██║</tspan>
<tspan x="295" y="76"> ╚═══╝ ╚═╝ ╚═════╝ ╚══════╝ ╚═════╝ ╚═╝</tspan>
</text>
<!-- Separator -->
<line x1="60" y1="84" x2="790" y2="84" stroke="#F2C811" stroke-opacity="0.15" stroke-width="1"/>
<!-- Tagline -->
<text x="425" y="100" font-family="'Segoe UI', Arial, sans-serif" font-size="13" fill="#e6edf3" text-anchor="middle" font-weight="600">The First CLI for Both Power BI Modeling and Reporting</text>
<!-- ===== Connection Flow: Claude > PBI-CLI > Power BI ===== -->
<!-- Claude AI logo (inline, original 1200x1200, displayed as 50x50, centered at x=110) -->
<svg x="85" y="110" width="50" height="50" viewBox="0 0 1200 1200">
<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"/>
</svg>
<text x="110" y="175" 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="155" y1="135" x2="290" y2="135" stroke="#F2C811" stroke-width="2" stroke-dasharray="6,4" stroke-opacity="0.5"/>
<polygon points="294,135 286,130 286,140" fill="#F2C811" fill-opacity="0.5"/>
<!-- PBI-CLI block art (shadow) -->
<text font-family="'Courier New', Courier, monospace" font-size="7" fill="#7A6508" xml:space="preserve">
<tspan x="316" y="118">██████╗ ██████╗ ██╗ ██████╗ ██╗ ██╗</tspan>
<tspan x="316" y="128">██╔══██╗ ██╔══██╗ ██║ ██╔════╝ ██║ ██║</tspan>
<tspan x="316" y="138">██████╔╝ ██████╔╝ ██║ ███╗ ██║ ██║ ██║</tspan>
<tspan x="316" y="148">██╔═══╝ ██╔══██╗ ██║ ╚══╝ ██║ ██║ ██║</tspan>
<tspan x="316" y="158">██║ ██████╔╝ ██║ ╚██████╗ ███████╗ ██║</tspan>
<tspan x="316" y="168">╚═╝ ╚═════╝ ╚═╝ ╚═════╝ ╚══════╝ ╚═╝</tspan>
</text>
<!-- PBI-CLI block art (main) -->
<text font-family="'Courier New', Courier, monospace" font-size="7" fill="#F2C811" xml:space="preserve">
<tspan x="315" y="117">██████╗ ██████╗ ██╗ ██████╗ ██╗ ██╗</tspan>
<tspan x="315" y="127">██╔══██╗ ██╔══██╗ ██║ ██╔════╝ ██║ ██║</tspan>
<tspan x="315" y="137">██████╔╝ ██████╔╝ ██║ ███╗ ██║ ██║ ██║</tspan>
<tspan x="315" y="147">██╔═══╝ ██╔══██╗ ██║ ╚══╝ ██║ ██║ ██║</tspan>
<tspan x="315" y="157">██║ ██████╔╝ ██║ ╚██████╗ ███████╗ ██║</tspan>
<tspan x="315" y="167">╚═╝ ╚═════╝ ╚═╝ ╚═════╝ ╚══════╝ ╚═╝</tspan>
</text>
<!-- Right arrow -->
<line x1="560" y1="135" x2="655" y2="135" stroke="#F2C811" stroke-width="2" stroke-dasharray="6,4" stroke-opacity="0.5"/>
<polygon points="659,135 651,130 651,140" fill="#F2C811" fill-opacity="0.5"/>
<!-- Power BI logo (inline, original 630x630, displayed as 50x50, centered at x=700) -->
<svg x="675" y="110" width="50" height="50" viewBox="0 0 630 630">
<g transform="translate(77.5, 0)">
<rect fill="url(#pbi-lg1)" x="256" y="0" width="219" height="630" rx="26"/>
<path fill="url(#pbi-lg2)" d="M346,604 L346,630 L320,630 L153,630 C138.64,630 127,618.36 127,604 L127,183 C127,168.64 138.64,157 153,157 L320,157 C334.36,157 346,168.64 346,183 L346,604 Z"/>
<path fill="url(#pbi-lg5)" d="M219,604 L219,630 L193,630 L26,630 C11.64,630 0,618.36 0,604 L0,341 C0,326.64 11.64,315 26,315 L193,315 C207.36,315 219,326.64 219,341 L219,604 Z"/>
</g>
</svg>
<text x="700" y="175" font-family="'Segoe UI', Arial, sans-serif" font-size="11" fill="#F2C811" text-anchor="middle" font-weight="600">Power BI</text>
<!-- Modeling + Reporting pills -->
<rect x="308" y="176" width="100" height="20" rx="10" fill="#58a6ff" fill-opacity="0.1" stroke="#58a6ff" stroke-width="1"/>
<text x="358" y="190" font-family="'Segoe UI', Arial, sans-serif" font-size="10" fill="#58a6ff" text-anchor="middle" font-weight="600">Modeling</text>
<text x="420" y="190" font-family="'Segoe UI', Arial, sans-serif" font-size="10" fill="#8b949e" text-anchor="middle">+</text>
<rect x="432" y="176" width="100" height="20" rx="10" fill="#06d6a0" fill-opacity="0.1" stroke="#06d6a0" stroke-width="1"/>
<text x="482" y="190" font-family="'Segoe UI', Arial, sans-serif" font-size="10" fill="#06d6a0" text-anchor="middle" font-weight="600">Reporting</text>
<!-- Bottom separator -->
<line x1="60" y1="200" x2="790" y2="200" stroke="#F2C811" stroke-opacity="0.25" stroke-width="2"/>
<!-- ==================== END HEADER ==================== -->
<!-- Feature content (shifted down by 210px) -->
<g transform="translate(0, 210)">
<!-- Background -->
<!-- Title -->
<text x="425" y="32" font-family="'Segoe UI', Arial, sans-serif" font-size="18" fill="#F2C811" text-anchor="middle" font-weight="bold">The VIBE BI Workflow</text>
<!-- ==================== NODE 1: Claude Code ==================== -->
<!-- Step badge -->
<circle cx="130" cy="61" r="13" fill="#d97757" fill-opacity="0.2" stroke="#d97757" stroke-width="1.5"/>
<text x="130" y="66" font-family="'Segoe UI', Arial, sans-serif" font-size="13" fill="#d97757" font-weight="bold" text-anchor="middle">1</text>
<!-- Card -->
<rect x="30" y="75" width="200" height="190" rx="10" fill="#161b22" stroke="#d97757" stroke-width="1.5"/>
<!-- Header band -->
<path d="M 40,75 L 220,75 A 10,10 0 0,1 230,85 L 230,127 L 30,127 L 30,85 A 10,10 0 0,1 40,75 Z" fill="#d97757" fill-opacity="0.12"/>
<!-- Claude starburst icon -->
<g transform="translate(130,101)">
<line x1="0" y1="-12" x2="0" y2="12" stroke="#d97757" stroke-width="2.5"/>
<line x1="-12" y1="0" x2="12" y2="0" stroke="#d97757" stroke-width="2.5"/>
<line x1="-8.5" y1="-8.5" x2="8.5" y2="8.5" stroke="#d97757" stroke-width="2"/>
<line x1="8.5" y1="-8.5" x2="-8.5" y2="8.5" stroke="#d97757" stroke-width="2"/>
<line x1="-5" y1="-11" x2="5" y2="11" stroke="#d97757" stroke-width="1.5" opacity="0.6"/>
<line x1="11" y1="-5" x2="-11" y2="5" stroke="#d97757" stroke-width="1.5" opacity="0.6"/>
<line x1="5" y1="-11" x2="-5" y2="11" stroke="#d97757" stroke-width="1.5" opacity="0.6"/>
<line x1="-11" y1="-5" x2="11" y2="5" stroke="#d97757" stroke-width="1.5" opacity="0.6"/>
</g>
<!-- Node name and subtitle -->
<text x="130" y="142" font-family="'Segoe UI', Arial, sans-serif" font-size="13" fill="#d97757" font-weight="bold" text-anchor="middle">Claude Code</text>
<text x="130" y="157" font-family="'Segoe UI', Arial, sans-serif" font-size="10" fill="#8b949e" text-anchor="middle">AI Assistant</text>
<!-- Divider -->
<line x1="45" y1="165" x2="215" y2="165" stroke="#d97757" stroke-opacity="0.2" stroke-width="1"/>
<!-- Bullets -->
<circle cx="52" cy="175.5" r="2.5" fill="#d97757" opacity="0.7"/>
<text x="62" y="179" font-family="'Segoe UI', Arial, sans-serif" font-size="10.5" fill="#8b949e">Reads TMDL + PBIR source files</text>
<circle cx="52" cy="192.5" r="2.5" fill="#d97757" opacity="0.7"/>
<text x="62" y="196" font-family="'Segoe UI', Arial, sans-serif" font-size="10.5" fill="#8b949e">Understands model + report state</text>
<circle cx="52" cy="209.5" r="2.5" fill="#d97757" opacity="0.7"/>
<text x="62" y="213" font-family="'Segoe UI', Arial, sans-serif" font-size="10.5" fill="#8b949e">Plans and executes changes</text>
<!-- ==================== NODE 2: pbi-cli ==================== -->
<!-- Step badge -->
<circle cx="425" cy="61" r="13" fill="#F2C811" fill-opacity="0.2" stroke="#F2C811" stroke-width="1.5"/>
<text x="425" y="66" font-family="'Segoe UI', Arial, sans-serif" font-size="13" fill="#F2C811" font-weight="bold" text-anchor="middle">2</text>
<!-- Card -->
<rect x="325" y="75" width="200" height="190" rx="10" fill="#161b22" stroke="#F2C811" stroke-width="1.5"/>
<!-- Header band -->
<path d="M 335,75 L 515,75 A 10,10 0 0,1 525,85 L 525,127 L 325,127 L 325,85 A 10,10 0 0,1 335,75 Z" fill="#F2C811" fill-opacity="0.12"/>
<!-- Terminal icon -->
<g transform="translate(401,87)">
<rect x="0" y="0" width="48" height="28" rx="4" fill="#F2C811" fill-opacity="0.1" stroke="#F2C811" stroke-width="1.5"/>
<text font-family="'Courier New', Courier, monospace" font-size="11" fill="#F2C811" x="5" y="19">$ pbi-cli</text>
</g>
<!-- Node name and subtitle -->
<text x="425" y="142" font-family="'Segoe UI', Arial, sans-serif" font-size="13" fill="#F2C811" font-weight="bold" text-anchor="middle">pbi-cli</text>
<text x="425" y="157" font-family="'Segoe UI', Arial, sans-serif" font-size="10" fill="#8b949e" text-anchor="middle">The Bridge</text>
<!-- Divider -->
<line x1="340" y1="165" x2="510" y2="165" stroke="#F2C811" stroke-opacity="0.2" stroke-width="1"/>
<!-- Bullets -->
<circle cx="347" cy="175.5" r="2.5" fill="#F2C811" opacity="0.7"/>
<text x="357" y="179" font-family="'Segoe UI', Arial, sans-serif" font-size="10.5" fill="#8b949e">Runs targeted CLI commands</text>
<circle cx="347" cy="192.5" r="2.5" fill="#F2C811" opacity="0.7"/>
<text x="357" y="196" font-family="'Segoe UI', Arial, sans-serif" font-size="10.5" fill="#8b949e">Writes TMDL + PBIR files</text>
<circle cx="347" cy="209.5" r="2.5" fill="#F2C811" opacity="0.7"/>
<text x="357" y="213" font-family="'Segoe UI', Arial, sans-serif" font-size="10.5" fill="#8b949e">~30 tokens per operation</text>
<!-- ==================== NODE 3: Power BI Desktop ==================== -->
<!-- Step badge -->
<circle cx="720" cy="61" r="13" fill="#EBBB14" fill-opacity="0.2" stroke="#EBBB14" stroke-width="1.5"/>
<text x="720" y="66" font-family="'Segoe UI', Arial, sans-serif" font-size="13" fill="#EBBB14" font-weight="bold" text-anchor="middle">3</text>
<!-- Card -->
<rect x="620" y="75" width="200" height="190" rx="10" fill="#161b22" stroke="#EBBB14" stroke-width="1.5"/>
<!-- Header band -->
<path d="M 630,75 L 810,75 A 10,10 0 0,1 820,85 L 820,127 L 620,127 L 620,85 A 10,10 0 0,1 630,75 Z" fill="#EBBB14" fill-opacity="0.12"/>
<!-- Power BI bars icon -->
<rect x="724" y="83" width="16" height="34" rx="3" fill="url(#wf-bar1)"/>
<rect x="712" y="92" width="16" height="25" rx="3" fill="url(#wf-bar2)"/>
<rect x="700" y="101" width="16" height="16" rx="3" fill="url(#wf-bar3)"/>
<!-- Node name and subtitle -->
<text x="720" y="142" font-family="'Segoe UI', Arial, sans-serif" font-size="13" fill="#EBBB14" font-weight="bold" text-anchor="middle">Power BI Desktop</text>
<text x="720" y="157" font-family="'Segoe UI', Arial, sans-serif" font-size="10" fill="#8b949e" text-anchor="middle">Live Preview</text>
<!-- Divider -->
<line x1="635" y1="165" x2="805" y2="165" stroke="#EBBB14" stroke-opacity="0.2" stroke-width="1"/>
<!-- Bullets -->
<circle cx="642" cy="175.5" r="2.5" fill="#EBBB14" opacity="0.7"/>
<text x="652" y="179" font-family="'Segoe UI', Arial, sans-serif" font-size="10.5" fill="#8b949e">Detects file changes instantly</text>
<circle cx="642" cy="192.5" r="2.5" fill="#EBBB14" opacity="0.7"/>
<text x="652" y="196" font-family="'Segoe UI', Arial, sans-serif" font-size="10.5" fill="#8b949e">Refreshes model live</text>
<circle cx="642" cy="209.5" r="2.5" fill="#EBBB14" opacity="0.7"/>
<text x="652" y="213" font-family="'Segoe UI', Arial, sans-serif" font-size="10.5" fill="#8b949e">Report updates in real time</text>
<!-- ==================== FORWARD ARROW 1: Node 1 to Node 2 ==================== -->
<line x1="234" y1="170" x2="317" y2="170" stroke="#F2C811" stroke-width="2" stroke-dasharray="6,4" stroke-opacity="0.6"/>
<polygon points="321,170 313,165 313,175" fill="#F2C811" fill-opacity="0.6"/>
<text x="277" y="158" font-family="'Segoe UI', Arial, sans-serif" font-size="10" fill="#F2C811" text-anchor="middle" fill-opacity="0.9">CLI commands</text>
<rect x="247" y="174" width="60" height="14" rx="7" fill="#06d6a0" fill-opacity="0.12" stroke="#06d6a0" stroke-width="0.8"/>
<text x="277" y="184" font-family="'Segoe UI', Arial, sans-serif" font-size="9" fill="#06d6a0" text-anchor="middle">~30 tokens</text>
<!-- ==================== FORWARD ARROW 2: Node 2 to Node 3 ==================== -->
<line x1="529" y1="170" x2="612" y2="170" stroke="#F2C811" stroke-width="2" stroke-dasharray="6,4" stroke-opacity="0.6"/>
<polygon points="616,170 608,165 608,175" fill="#F2C811" fill-opacity="0.6"/>
<text x="572" y="158" font-family="'Segoe UI', Arial, sans-serif" font-size="10" fill="#F2C811" text-anchor="middle" fill-opacity="0.9">TMDL + PBIR files</text>
<rect x="537" y="174" width="70" height="14" rx="7" fill="#58a6ff" fill-opacity="0.12" stroke="#58a6ff" stroke-width="0.8"/>
<text x="572" y="184" font-family="'Segoe UI', Arial, sans-serif" font-size="9" fill="#58a6ff" text-anchor="middle">auto-detected</text>
<!-- ==================== RETURN LOOP ARROW ==================== -->
<path d="M 820,255 C 820,305 720,320 425,320 C 130,320 30,305 30,255"
fill="none" stroke="#F2C811" stroke-width="1.5" stroke-dasharray="6,4" stroke-opacity="0.4"/>
<polygon points="30,255 25,265 35,265" fill="#F2C811" fill-opacity="0.4"/>
<text x="425" y="338" font-family="'Segoe UI', Arial, sans-serif" font-size="11" fill="#F2C811" text-anchor="middle" fill-opacity="0.6">reads updated model + report · loop continues</text>
<!-- ==================== VIBE BI BADGE ==================== -->
<text x="425" y="375" font-family="'Segoe UI', Arial, sans-serif" font-size="10" fill="#8b949e" text-anchor="middle">Powered by VIBE BI · Vibe-Driven Business Intelligence</text>
</g>
</svg>

After

Width:  |  Height:  |  Size: 22 KiB

View file

@ -0,0 +1,958 @@
# Tier 1 Gap-Fill: cardVisual, actionButton, Page Properties, Container Objects
> **For agentic workers:** REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (`- [ ]`) syntax for tracking.
**Goal:** Add the four highest-priority features discovered from Supply Chain Analytics .pbip export: `cardVisual` and `actionButton` visual types, page background/visibility controls, and `visualContainerObjects` setters for border/background/title.
**Architecture:** All changes follow the existing pure-function pattern -- `fn(definition_path: Path, ...) -> dict[str, Any]`. Visual types extend `pbir_models.py` and `visual_backend.py` plus add JSON templates and preview renderer entries. Page and container props are new functions in `report_backend.py` and `visual_backend.py` respectively, each wired to a Click subcommand.
**Tech Stack:** Python 3.10+, pytest, ruff, click, JSON file I/O (no new dependencies).
---
## File Map
| File | Change |
|------|--------|
| `src/pbi_cli/core/pbir_models.py` | Add `cardVisual`, `actionButton` to `SUPPORTED_VISUAL_TYPES` and `VISUAL_TYPE_ALIASES` |
| `src/pbi_cli/core/visual_backend.py` | Add entries for both types to `VISUAL_DATA_ROLES`, `MEASURE_ROLES`, `ROLE_ALIASES`, `DEFAULT_SIZES`; add `visual_set_container()` |
| `src/pbi_cli/templates/visuals/cardVisual.json` | **New** template with `queryState.Data` + `sortDefinition` + `visualContainerObjects` |
| `src/pbi_cli/templates/visuals/actionButton.json` | **New** template with no `queryState`, top-level `howCreated` |
| `src/pbi_cli/preview/renderer.py` | Add color/icon entries for both types |
| `src/pbi_cli/core/report_backend.py` | Add `page_set_background()` and `page_set_visibility()` |
| `src/pbi_cli/commands/report.py` | Add `set-background` and `set-visibility` subcommands |
| `src/pbi_cli/commands/visual.py` | Add `set-container` subcommand |
| `tests/test_visual_backend.py` | New tests for new types and `visual_set_container` |
| `tests/test_report_backend.py` | New tests for `page_set_background` and `page_set_visibility` |
| `src/pbi_cli/__init__.py` | Bump version `3.3.0``3.4.0` |
| `pyproject.toml` | Bump version `3.3.0``3.4.0` |
---
## Task 1: Add cardVisual and actionButton Visual Types
### What to know
From the real Desktop export of Supply Chain Analytics:
- **cardVisual** (25 occurrences) is the modern card. Its queryState uses a `"Data"` role (not `"Fields"`). It also has a top-level `sortDefinition` in `query` and a `visualContainerObjects` key alongside `visual.objects`.
- **actionButton** (25 occurrences) is a navigation/action button. It has **no `query`/`queryState`** at all. It requires a top-level `"howCreated": "InsertVisualButton"` field.
- Both types were previously absent from `SUPPORTED_VISUAL_TYPES`, causing `visual_add cardVisual` to raise `VisualTypeError`.
**Files:**
- Modify: `src/pbi_cli/core/pbir_models.py`
- Modify: `src/pbi_cli/core/visual_backend.py`
- Create: `src/pbi_cli/templates/visuals/cardVisual.json`
- Create: `src/pbi_cli/templates/visuals/actionButton.json`
- Modify: `src/pbi_cli/preview/renderer.py`
- Modify: `tests/test_visual_backend.py`
---
- [ ] **Step 1a: Write failing tests for cardVisual and actionButton**
Add these tests at the bottom of `tests/test_visual_backend.py` (after the existing imports, extend the import list to include nothing new -- `visual_add` and `visual_list` are already imported):
```python
# ---------------------------------------------------------------------------
# Task 1 tests -- cardVisual and actionButton
# ---------------------------------------------------------------------------
def test_visual_add_card_visual(report_with_page: Path) -> None:
result = visual_add(
report_with_page, "test_page", "cardVisual", x=10, y=10
)
assert result["status"] == "created"
assert result["visual_type"] == "cardVisual"
vdir = report_with_page / "pages" / "test_page" / "visuals" / result["name"]
vfile = vdir / "visual.json"
data = json.loads(vfile.read_text())
assert data["visual"]["visualType"] == "cardVisual"
assert "Data" in data["visual"]["query"]["queryState"]
assert "sortDefinition" in data["visual"]["query"]
assert "visualContainerObjects" in data["visual"]
def test_visual_add_card_visual_alias(report_with_page: Path) -> None:
result = visual_add(
report_with_page, "test_page", "card_visual", x=10, y=10
)
assert result["visual_type"] == "cardVisual"
def test_visual_add_action_button(report_with_page: Path) -> None:
result = visual_add(
report_with_page, "test_page", "actionButton", x=0, y=0
)
assert result["status"] == "created"
assert result["visual_type"] == "actionButton"
vdir = report_with_page / "pages" / "test_page" / "visuals" / result["name"]
data = json.loads((vdir / "visual.json").read_text())
assert data["visual"]["visualType"] == "actionButton"
# No queryState on actionButton
assert "query" not in data["visual"]
assert data.get("howCreated") == "InsertVisualButton"
def test_visual_add_action_button_aliases(report_with_page: Path) -> None:
for alias in ("action_button", "button"):
result = visual_add(
report_with_page, "test_page", alias, x=0, y=0
)
assert result["visual_type"] == "actionButton"
```
- [ ] **Step 1b: Run tests to verify they fail**
```bash
cd "e:/Coding Projects/Open Source/pbi-cli"
python -m pytest tests/test_visual_backend.py::test_visual_add_card_visual tests/test_visual_backend.py::test_visual_add_action_button -v
```
Expected: FAIL with `VisualTypeError` (type not in SUPPORTED_VISUAL_TYPES).
- [ ] **Step 1c: Update pbir_models.py**
In `src/pbi_cli/core/pbir_models.py`:
Add `"cardVisual"` and `"actionButton"` to the `SUPPORTED_VISUAL_TYPES` frozenset (in the v3.1.0 additions block or add a new `# v3.4.0 additions` comment):
```python
# v3.4.0 additions
"cardVisual",
"actionButton",
```
Add to `VISUAL_TYPE_ALIASES` dict:
```python
# v3.4.0 additions
"card_visual": "cardVisual",
"modern_card": "cardVisual",
"action_button": "actionButton",
"button": "actionButton",
```
- [ ] **Step 1d: Update visual_backend.py**
In `src/pbi_cli/core/visual_backend.py`:
Add to `VISUAL_DATA_ROLES`:
```python
# v3.4.0 additions
"cardVisual": ["Data"],
"actionButton": [],
```
Add `"Data"` to `MEASURE_ROLES` frozenset (cardVisual's Data role accepts measures):
```python
MEASURE_ROLES: frozenset[str] = frozenset({
"Y", "Values", "Fields", "Indicator", "Goal",
# v3.1.0 additions
"ColumnY", "LineY", "X", "Size",
# v3.4.0 additions
"Data",
})
```
Add to `ROLE_ALIASES`:
```python
# v3.4.0 additions
"cardVisual": {"field": "Data", "value": "Data"},
"actionButton": {},
```
Add to `DEFAULT_SIZES`:
```python
# v3.4.0 additions -- sizes from real Desktop export
"cardVisual": (217, 87),
"actionButton": (51, 22),
```
- [ ] **Step 1e: Create cardVisual.json template**
Create `src/pbi_cli/templates/visuals/cardVisual.json`:
```json
{
"$schema": "https://developer.microsoft.com/json-schemas/fabric/item/report/definition/visualContainer/1.5.0/schema.json",
"name": "__VISUAL_NAME__",
"position": {
"x": __X__,
"y": __Y__,
"z": __Z__,
"height": __HEIGHT__,
"width": __WIDTH__,
"tabOrder": __TAB_ORDER__
},
"visual": {
"visualType": "cardVisual",
"query": {
"queryState": {
"Data": {
"projections": []
}
},
"sortDefinition": {
"sort": [],
"isDefaultSort": true
}
},
"objects": {},
"visualContainerObjects": {},
"drillFilterOtherVisuals": true
}
}
```
- [ ] **Step 1f: Create actionButton.json template**
Create `src/pbi_cli/templates/visuals/actionButton.json`:
```json
{
"$schema": "https://developer.microsoft.com/json-schemas/fabric/item/report/definition/visualContainer/1.5.0/schema.json",
"name": "__VISUAL_NAME__",
"position": {
"x": __X__,
"y": __Y__,
"z": __Z__,
"height": __HEIGHT__,
"width": __WIDTH__,
"tabOrder": __TAB_ORDER__
},
"visual": {
"visualType": "actionButton",
"objects": {},
"visualContainerObjects": {},
"drillFilterOtherVisuals": true
},
"howCreated": "InsertVisualButton"
}
```
- [ ] **Step 1g: Update preview renderer**
In `src/pbi_cli/preview/renderer.py`, add to `_VISUAL_COLORS` after the v3.1.0 block:
```python
# v3.4.0 additions
"cardVisual": "#767171",
"actionButton": "#E8832A",
```
Add to `_VISUAL_ICONS` after the v3.1.0 block:
```python
# v3.4.0 additions
"cardVisual": "&#9632;",
"actionButton": "&#9654;",
```
- [ ] **Step 1h: Run tests to verify they pass**
```bash
python -m pytest tests/test_visual_backend.py::test_visual_add_card_visual tests/test_visual_backend.py::test_visual_add_card_visual_alias tests/test_visual_backend.py::test_visual_add_action_button tests/test_visual_backend.py::test_visual_add_action_button_aliases -v
```
Expected: all PASS.
- [ ] **Step 1i: Run full test suite and ruff**
```bash
python -m pytest -m "not e2e" -q
python -m ruff check src/ tests/
```
Expected: zero failures, zero ruff errors.
- [ ] **Step 1j: Commit**
```bash
cd "e:/Coding Projects/Open Source/pbi-cli"
git add src/pbi_cli/core/pbir_models.py src/pbi_cli/core/visual_backend.py
git add src/pbi_cli/templates/visuals/cardVisual.json src/pbi_cli/templates/visuals/actionButton.json
git add src/pbi_cli/preview/renderer.py tests/test_visual_backend.py
git commit -m "feat: add cardVisual and actionButton visual types (v3.4.0)"
```
---
## Task 2: page_set_background
### What to know
`page.json` has an optional top-level `"objects"` key. When a background color is set in Desktop, it writes:
```json
"objects": {
"background": [
{
"properties": {
"color": {
"solid": {
"color": {
"expr": {
"Literal": {"Value": "'#F8F9FA'"}
}
}
}
}
}
}
]
}
```
The function merges this into the existing `objects` dict (preserving any other object properties like `outspace`).
**Files:**
- Modify: `src/pbi_cli/core/report_backend.py`
- Modify: `src/pbi_cli/commands/report.py`
- Modify: `tests/test_report_backend.py`
---
- [ ] **Step 2a: Write failing tests**
Add to the imports in `tests/test_report_backend.py`:
```python
from pbi_cli.core.report_backend import (
page_set_background,
page_set_visibility,
... # keep existing imports
)
```
Add tests:
```python
# ---------------------------------------------------------------------------
# Task 2 -- page_set_background
# ---------------------------------------------------------------------------
def test_page_set_background_writes_color(sample_report: Path) -> None:
# sample_report fixture already has a page named "page1"
result = page_set_background(sample_report, "page1", "#F8F9FA")
assert result["status"] == "updated"
assert result["background_color"] == "#F8F9FA"
page_data = _read(sample_report / "pages" / "page1" / "page.json")
bg = page_data["objects"]["background"][0]["properties"]["color"]
assert bg["solid"]["color"]["expr"]["Literal"]["Value"] == "'#F8F9FA'"
def test_page_set_background_preserves_other_objects(sample_report: Path) -> None:
# Manually set an existing object key first
page_json = sample_report / "pages" / "page1" / "page.json"
data = _read(page_json)
data["objects"] = {"outspace": [{"properties": {"color": {}}}]}
page_json.write_text(json.dumps(data, indent=2), encoding="utf-8")
page_set_background(sample_report, "page1", "#FFFFFF")
updated = _read(page_json)
assert "outspace" in updated["objects"]
assert "background" in updated["objects"]
def test_page_set_background_overrides_existing_background(sample_report: Path) -> None:
page_set_background(sample_report, "page1", "#111111")
page_set_background(sample_report, "page1", "#AABBCC")
data = _read(sample_report / "pages" / "page1" / "page.json")
bg = data["objects"]["background"][0]["properties"]["color"]
assert bg["solid"]["color"]["expr"]["Literal"]["Value"] == "'#AABBCC'"
def test_page_set_background_raises_for_missing_page(sample_report: Path) -> None:
with pytest.raises(PbiCliError, match="not found"):
page_set_background(sample_report, "no_such_page", "#000000")
```
- [ ] **Step 2b: Run to verify tests fail**
```bash
python -m pytest tests/test_report_backend.py::test_page_set_background_writes_color -v
```
Expected: FAIL with `ImportError` (function not yet defined).
- [ ] **Step 2c: Implement page_set_background in report_backend.py**
Add after `page_get()`:
```python
def page_set_background(
definition_path: Path,
page_name: str,
color: str,
) -> dict[str, Any]:
"""Set the background color of a page.
Updates the ``objects.background`` property in ``page.json``.
The color must be a hex string, e.g. ``'#F8F9FA'``.
"""
page_dir = get_page_dir(definition_path, page_name)
page_json_path = page_dir / "page.json"
if not page_json_path.exists():
raise PbiCliError(f"Page '{page_name}' not found.")
page_data = _read_json(page_json_path)
background_entry = {
"properties": {
"color": {
"solid": {
"color": {
"expr": {
"Literal": {"Value": f"'{color}'"}
}
}
}
}
}
}
objects = {**page_data.get("objects", {}), "background": [background_entry]}
_write_json(page_json_path, {**page_data, "objects": objects})
return {"status": "updated", "page": page_name, "background_color": color}
```
- [ ] **Step 2d: Add set-background CLI command in report.py**
Add after the `diff_theme` command:
```python
@report.command(name="set-background")
@click.argument("page_name")
@click.option("--color", "-c", required=True, help="Hex color e.g. '#F8F9FA'.")
@click.pass_context
@pass_context
def set_background(
ctx: PbiContext, click_ctx: click.Context, page_name: str, color: str
) -> None:
"""Set the background color of a page."""
from pbi_cli.core.pbir_path import resolve_report_path
from pbi_cli.core.report_backend import page_set_background
report_path = click_ctx.parent.obj.get("report_path") if click_ctx.parent else None
definition_path = resolve_report_path(report_path)
run_command(
ctx,
page_set_background,
definition_path=definition_path,
page_name=page_name,
color=color,
)
```
- [ ] **Step 2e: Run tests to verify they pass**
```bash
python -m pytest tests/test_report_backend.py -k "background" -v
```
Expected: all 4 PASS.
- [ ] **Step 2f: Run full suite + ruff**
```bash
python -m pytest -m "not e2e" -q && python -m ruff check src/ tests/
```
- [ ] **Step 2g: Commit**
```bash
git add src/pbi_cli/core/report_backend.py src/pbi_cli/commands/report.py tests/test_report_backend.py
git commit -m "feat: add page_set_background and pbi report set-background command"
```
---
## Task 3: page_set_visibility
### What to know
Hidden pages in Desktop write a top-level `"visibility": "HiddenInViewMode"` key in `page.json`. To unhide, the key is simply removed. The real Supply Chain report has one hidden page (`definition` folder was confirmed to have `"visibility": "HiddenInViewMode"` on that page).
**Files:**
- Modify: `src/pbi_cli/core/report_backend.py` (add function, add to import in test)
- Modify: `src/pbi_cli/commands/report.py` (add subcommand)
- Modify: `tests/test_report_backend.py` (add tests)
---
- [ ] **Step 3a: Write failing tests**
```python
# ---------------------------------------------------------------------------
# Task 3 -- page_set_visibility
# ---------------------------------------------------------------------------
def test_page_set_visibility_hidden(sample_report: Path) -> None:
result = page_set_visibility(sample_report, "page1", hidden=True)
assert result["status"] == "updated"
assert result["hidden"] is True
data = _read(sample_report / "pages" / "page1" / "page.json")
assert data.get("visibility") == "HiddenInViewMode"
def test_page_set_visibility_visible(sample_report: Path) -> None:
# First hide, then show
page_json = sample_report / "pages" / "page1" / "page.json"
data = _read(page_json)
page_json.write_text(
json.dumps({**data, "visibility": "HiddenInViewMode"}, indent=2),
encoding="utf-8",
)
result = page_set_visibility(sample_report, "page1", hidden=False)
assert result["hidden"] is False
updated = _read(page_json)
assert "visibility" not in updated
def test_page_set_visibility_idempotent_visible(sample_report: Path) -> None:
# Calling visible on an already-visible page should not add visibility key
page_set_visibility(sample_report, "page1", hidden=False)
data = _read(sample_report / "pages" / "page1" / "page.json")
assert "visibility" not in data
def test_page_set_visibility_raises_for_missing_page(sample_report: Path) -> None:
with pytest.raises(PbiCliError, match="not found"):
page_set_visibility(sample_report, "ghost_page", hidden=True)
```
- [ ] **Step 3b: Run to verify failure**
```bash
python -m pytest tests/test_report_backend.py::test_page_set_visibility_hidden -v
```
Expected: FAIL with `ImportError`.
- [ ] **Step 3c: Implement page_set_visibility in report_backend.py**
Add after `page_set_background()`:
```python
def page_set_visibility(
definition_path: Path,
page_name: str,
hidden: bool,
) -> dict[str, Any]:
"""Show or hide a page in the report navigation.
Setting ``hidden=True`` writes ``"visibility": "HiddenInViewMode"`` to
``page.json``. Setting ``hidden=False`` removes the key if present.
"""
page_dir = get_page_dir(definition_path, page_name)
page_json_path = page_dir / "page.json"
if not page_json_path.exists():
raise PbiCliError(f"Page '{page_name}' not found.")
page_data = _read_json(page_json_path)
if hidden:
updated = {**page_data, "visibility": "HiddenInViewMode"}
else:
updated = {k: v for k, v in page_data.items() if k != "visibility"}
_write_json(page_json_path, updated)
return {"status": "updated", "page": page_name, "hidden": hidden}
```
- [ ] **Step 3d: Add set-visibility CLI command in report.py**
Add after `set_background`:
```python
@report.command(name="set-visibility")
@click.argument("page_name")
@click.option(
"--hidden/--visible",
default=True,
help="Hide or show the page in navigation.",
)
@click.pass_context
@pass_context
def set_visibility(
ctx: PbiContext, click_ctx: click.Context, page_name: str, hidden: bool
) -> None:
"""Hide or show a page in the report navigation."""
from pbi_cli.core.pbir_path import resolve_report_path
from pbi_cli.core.report_backend import page_set_visibility
report_path = click_ctx.parent.obj.get("report_path") if click_ctx.parent else None
definition_path = resolve_report_path(report_path)
run_command(
ctx,
page_set_visibility,
definition_path=definition_path,
page_name=page_name,
hidden=hidden,
)
```
- [ ] **Step 3e: Run tests**
```bash
python -m pytest tests/test_report_backend.py -k "visibility" -v
```
Expected: all 4 PASS.
- [ ] **Step 3f: Run full suite + ruff**
```bash
python -m pytest -m "not e2e" -q && python -m ruff check src/ tests/
```
- [ ] **Step 3g: Commit**
```bash
git add src/pbi_cli/core/report_backend.py src/pbi_cli/commands/report.py tests/test_report_backend.py
git commit -m "feat: add page_set_visibility and pbi report set-visibility command"
```
---
## Task 4: visual_set_container (visualContainerObjects)
### What to know
`visual.json` contains a `visual.visualContainerObjects` dict that controls border, background, title, and padding at the *container* level (separate from `visual.objects` which controls visual-internal formatting). From the real Desktop export, the schema is:
```json
"visualContainerObjects": {
"border": [{"properties": {"show": {"expr": {"Literal": {"Value": "false"}}}}}],
"background": [{"properties": {"show": {"expr": {"Literal": {"Value": "false"}}}}}],
"title": [{"properties": {"text": {"expr": {"Literal": {"Value": "'My Title'"}}}}}]
}
```
The function accepts keyword arguments for `border_show`, `background_show`, and `title`. It merges only the provided keys into the existing `visualContainerObjects`, leaving others unchanged. All updates are immutable (build new dicts, never mutate).
**Files:**
- Modify: `src/pbi_cli/core/visual_backend.py` (add function)
- Modify: `src/pbi_cli/commands/visual.py` (add subcommand)
- Modify: `tests/test_visual_backend.py` (add tests)
---
- [ ] **Step 4a: Write failing tests**
Add to `tests/test_visual_backend.py` imports:
```python
from pbi_cli.core.visual_backend import (
visual_add,
visual_bind,
visual_delete,
visual_get,
visual_list,
visual_set_container,
visual_update,
)
```
Add tests:
```python
# ---------------------------------------------------------------------------
# Task 4 -- visual_set_container
# ---------------------------------------------------------------------------
@pytest.fixture
def page_with_bar_visual(report_with_page: Path) -> tuple[Path, str]:
"""Returns (definition_path, visual_name) for a barChart visual."""
result = visual_add(report_with_page, "test_page", "barChart", x=0, y=0)
return report_with_page, result["name"]
def test_visual_set_container_border_hide(
page_with_bar_visual: tuple[Path, str],
) -> None:
defn, vname = page_with_bar_visual
result = visual_set_container(defn, "test_page", vname, border_show=False)
assert result["status"] == "updated"
vfile = defn / "pages" / "test_page" / "visuals" / vname / "visual.json"
data = json.loads(vfile.read_text())
border = data["visual"]["visualContainerObjects"]["border"]
val = border[0]["properties"]["show"]["expr"]["Literal"]["Value"]
assert val == "false"
def test_visual_set_container_background_hide(
page_with_bar_visual: tuple[Path, str],
) -> None:
defn, vname = page_with_bar_visual
visual_set_container(defn, "test_page", vname, background_show=False)
vfile = defn / "pages" / "test_page" / "visuals" / vname / "visual.json"
data = json.loads(vfile.read_text())
bg = data["visual"]["visualContainerObjects"]["background"]
val = bg[0]["properties"]["show"]["expr"]["Literal"]["Value"]
assert val == "false"
def test_visual_set_container_title_text(
page_with_bar_visual: tuple[Path, str],
) -> None:
defn, vname = page_with_bar_visual
visual_set_container(defn, "test_page", vname, title="Revenue by Month")
vfile = defn / "pages" / "test_page" / "visuals" / vname / "visual.json"
data = json.loads(vfile.read_text())
title = data["visual"]["visualContainerObjects"]["title"]
val = title[0]["properties"]["text"]["expr"]["Literal"]["Value"]
assert val == "'Revenue by Month'"
def test_visual_set_container_preserves_other_keys(
page_with_bar_visual: tuple[Path, str],
) -> None:
defn, vname = page_with_bar_visual
visual_set_container(defn, "test_page", vname, border_show=False)
visual_set_container(defn, "test_page", vname, title="My Chart")
vfile = defn / "pages" / "test_page" / "visuals" / vname / "visual.json"
data = json.loads(vfile.read_text())
vco = data["visual"]["visualContainerObjects"]
assert "border" in vco
assert "title" in vco
def test_visual_set_container_border_show(
page_with_bar_visual: tuple[Path, str],
) -> None:
defn, vname = page_with_bar_visual
visual_set_container(defn, "test_page", vname, border_show=True)
vfile = defn / "pages" / "test_page" / "visuals" / vname / "visual.json"
data = json.loads(vfile.read_text())
val = data["visual"]["visualContainerObjects"]["border"][0][
"properties"]["show"]["expr"]["Literal"]["Value"]
assert val == "true"
def test_visual_set_container_raises_for_missing_visual(
report_with_page: Path,
) -> None:
with pytest.raises(PbiCliError):
visual_set_container(
report_with_page, "test_page", "nonexistent_visual", border_show=False
)
```
- [ ] **Step 4b: Run to verify failure**
```bash
python -m pytest tests/test_visual_backend.py::test_visual_set_container_border_hide -v
```
Expected: FAIL with `ImportError`.
- [ ] **Step 4c: Implement visual_set_container in visual_backend.py**
Add after `visual_update()`:
```python
def visual_set_container(
definition_path: Path,
page_name: str,
visual_name: str,
border_show: bool | None = None,
background_show: bool | None = None,
title: str | None = None,
) -> dict[str, Any]:
"""Set container-level properties (border, background, title) on a visual.
Only the keyword arguments that are provided (not None) are updated.
Other ``visualContainerObjects`` keys are preserved unchanged.
The ``visualContainerObjects`` key is separate from ``visual.objects`` --
it controls the container chrome (border, background, header title) rather
than the visual's own formatting.
"""
visual_dir = get_visual_dir(definition_path, page_name, visual_name)
visual_json_path = visual_dir / "visual.json"
if not visual_json_path.exists():
raise PbiCliError(
f"Visual '{visual_name}' not found on page '{page_name}'."
)
data = _read_json(visual_json_path)
visual = data["visual"]
vco: dict[str, Any] = dict(visual.get("visualContainerObjects", {}))
def _bool_entry(value: bool) -> list[dict[str, Any]]:
return [{
"properties": {
"show": {
"expr": {"Literal": {"Value": str(value).lower()}}
}
}
}]
if border_show is not None:
vco = {**vco, "border": _bool_entry(border_show)}
if background_show is not None:
vco = {**vco, "background": _bool_entry(background_show)}
if title is not None:
vco = {**vco, "title": [{
"properties": {
"text": {
"expr": {"Literal": {"Value": f"'{title}'"}}
}
}
}]}
updated_visual = {**visual, "visualContainerObjects": vco}
_write_json(visual_json_path, {**data, "visual": updated_visual})
return {
"status": "updated",
"visual": visual_name,
"page": page_name,
"border_show": border_show,
"background_show": background_show,
"title": title,
}
```
- [ ] **Step 4d: Add set-container CLI command in visual.py**
Look at the existing pattern in `src/pbi_cli/commands/visual.py` for how commands use `--page` and a `NAME` argument. Add:
```python
@visual.command(name="set-container")
@click.argument("name")
@click.option("--page", "-g", required=True, help="Page name or display name.")
@click.option(
"--border-show/--border-hide",
default=None,
is_flag=False,
flag_value=None,
help="Show or hide the visual border.",
)
@click.option(
"--background-show/--background-hide",
default=None,
is_flag=False,
flag_value=None,
help="Show or hide the visual background.",
)
@click.option("--title", default=None, help="Set container title text.")
@pass_context
def set_container(
ctx: PbiContext,
name: str,
page: str,
border_show: bool | None,
background_show: bool | None,
title: str | None,
) -> None:
"""Set container-level border, background, or title on a visual."""
from pbi_cli.core.pbir_path import resolve_report_path
from pbi_cli.core.visual_backend import visual_set_container
definition_path = resolve_report_path(None)
run_command(
ctx,
visual_set_container,
definition_path=definition_path,
page_name=page,
visual_name=name,
border_show=border_show,
background_show=background_show,
title=title,
)
```
Note: Click's `--flag/--no-flag` with `default=None` requires a small workaround. Check how the existing `visual.py` handles similar boolean flags (e.g. `--hidden/--visible` in `visual_update`). Mirror that pattern exactly.
- [ ] **Step 4e: Run tests**
```bash
python -m pytest tests/test_visual_backend.py -k "container" -v
```
Expected: all 6 PASS.
- [ ] **Step 4f: Run full suite + ruff**
```bash
python -m pytest -m "not e2e" -q && python -m ruff check src/ tests/
```
- [ ] **Step 4g: Commit**
```bash
git add src/pbi_cli/core/visual_backend.py src/pbi_cli/commands/visual.py tests/test_visual_backend.py
git commit -m "feat: add visual_set_container and pbi visual set-container command"
```
---
## Task 5: Version Bump to 3.4.0
**Files:**
- Modify: `src/pbi_cli/__init__.py`
- Modify: `pyproject.toml`
---
- [ ] **Step 5a: Bump versions**
In `src/pbi_cli/__init__.py`, change:
```python
__version__ = "3.3.0"
```
to:
```python
__version__ = "3.4.0"
```
In `pyproject.toml`, change:
```toml
version = "3.3.0"
```
to:
```toml
version = "3.4.0"
```
- [ ] **Step 5b: Verify final test count and coverage**
```bash
python -m pytest -m "not e2e" -v --tb=short 2>&1 | tail -20
```
Expected: 420+ tests passing (397 before + ~23 new), zero failures.
- [ ] **Step 5c: Final ruff check**
```bash
python -m ruff check src/ tests/
```
Expected: no output (clean).
- [ ] **Step 5d: Commit**
```bash
git add src/pbi_cli/__init__.py pyproject.toml
git commit -m "chore: bump version to 3.4.0"
```
---
## Verification Summary
After all tasks complete:
```bash
# All tests pass
python -m pytest -m "not e2e" -q
# CLI smoke tests
pbi visual add cardVisual --page p1 --x 10 --y 10 # succeeds
pbi visual add actionButton --page p1 --x 0 --y 0 # succeeds, no query
pbi report set-background page1 --color '#F8F9FA' # updates objects.background
pbi report set-visibility page1 --hidden # adds visibility key
pbi report set-visibility page1 --visible # removes visibility key
pbi visual set-container Chart1 --page p1 --border-hide # sets border show=false
pbi visual set-container Chart1 --page p1 --title "Revenue" # sets title text
```

View file

@ -0,0 +1,187 @@
"""
Generate 4K marketing PNG images for pbi-cli.
Each feature SVG already has the Vibe BI header baked in.
This script:
1. Reads each feature SVG as-is
2. Adds a footer with mina-saad.com/pbi-cli
3. Renders at 4K width (3840px) via Playwright
4. Saves as PNG to marketing/images/
"""
import re
from pathlib import Path
from playwright.sync_api import sync_playwright
ASSETS_DIR = Path(__file__).parent.parent / "assets"
OUTPUT_DIR = Path(__file__).parent / "images"
TARGET_WIDTH = 3840 # 4K width
# Feature SVGs to process (filename -> output name)
FEATURE_SVGS = {
"before-after.svg": "before-after",
"architecture-flow.svg": "architecture-flow",
"backup-restore.svg": "backup-restore",
"bulk-operations.svg": "bulk-operations",
"chat-demo.svg": "chat-demo",
"dax-debugging.svg": "dax-debugging",
"feature-grid.svg": "feature-grid",
"model-health-check.svg": "model-health-check",
"rls-testing.svg": "rls-testing",
"skills-hub.svg": "skills-hub",
"token-cost.svg": "token-cost",
"how-it-works.svg": "how-it-works",
"dax-skill.svg": "dax-skill",
"modeling-skill.svg": "modeling-skill",
"deploy-secure.svg": "deploy-secure",
"docs-diagnostics.svg": "docs-diagnostics",
"cta-start.svg": "cta-start",
# Report layer (v3)
"report-layer.svg": "report-layer",
"dual-layer.svg": "dual-layer",
"visual-types.svg": "visual-types",
"report-workflow.svg": "report-workflow",
"auto-sync.svg": "auto-sync",
"chat-demo-report.svg": "chat-demo-report",
# Additional assets
"commands.svg": "commands",
"layers.svg": "layers",
"release-vibe-bi.svg": "release-vibe-bi",
"stats.svg": "stats",
"workflow.svg": "workflow",
}
FOOTER_HEIGHT = 60
SVG_WIDTH = 850
def read_svg_content(filepath: Path) -> str:
return filepath.read_text(encoding="utf-8")
def get_svg_height(svg_text: str) -> int:
"""Extract height from SVG viewBox or height attribute."""
match = re.search(r'viewBox="0 0 \d+ (\d+)"', svg_text)
if match:
return int(match.group(1))
match = re.search(r'height="(\d+)"', svg_text)
if match:
return int(match.group(1))
return 400
def extract_svg_inner(svg_text: str) -> str:
"""Extract everything between <svg ...> and </svg> tags."""
inner = re.sub(r"<\?xml[^>]*\?>\s*", "", svg_text)
inner = re.sub(r"<svg[^>]*>", "", inner, count=1)
inner = re.sub(r"</svg>\s*$", "", inner)
return inner
def extract_defs(svg_text: str) -> str:
"""Extract <defs>...</defs> block if present."""
match = re.search(r"<defs>.*?</defs>", svg_text, re.DOTALL)
return match.group(0) if match else ""
def build_final_svg(feature_svg: str, feature_height: int) -> str:
"""Build final SVG: feature content (with baked header) + footer."""
total_height = feature_height + FOOTER_HEIGHT
feature_inner = extract_svg_inner(feature_svg)
feature_defs = extract_defs(feature_svg)
# Remove defs from inner since we place them at top level
feature_inner_clean = re.sub(
r"<defs>.*?</defs>", "", feature_inner, flags=re.DOTALL
)
defs_block = ""
if feature_defs:
defs_content = re.search(
r"<defs>(.*?)</defs>", feature_defs, re.DOTALL
)
if defs_content:
defs_block = f" <defs>{defs_content.group(1)}</defs>"
footer_y = feature_height + 40
return f"""<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="{SVG_WIDTH}" height="{total_height}" viewBox="0 0 {SVG_WIDTH} {total_height}">
{defs_block}
<!-- Full background -->
<rect width="100%" height="100%" fill="#0d1117"/>
<!-- Feature section (header already baked in) -->
<svg x="0" y="0" width="{SVG_WIDTH}" height="{feature_height}" viewBox="0 0 {SVG_WIDTH} {feature_height}">
{feature_inner_clean}
</svg>
<!-- Footer -->
<rect x="0" y="{feature_height}" width="{SVG_WIDTH}" height="{FOOTER_HEIGHT}" fill="#0d1117"/>
<line x1="60" y1="{feature_height + 8}" x2="790" y2="{feature_height + 8}" stroke="#F2C811" stroke-opacity="0.25" stroke-width="2"/>
<text x="425" y="{footer_y}" font-family="'Segoe UI', Arial, sans-serif" font-size="18" fill="#58a6ff" text-anchor="middle" font-weight="bold">mina-saad.com/pbi-cli</text>
</svg>"""
def render_svg_to_png(svg_content: str, output_path: Path, page) -> None:
"""Render an SVG string to a 4K PNG using Playwright."""
match = re.search(r'viewBox="0 0 (\d+) (\d+)"', svg_content)
svg_w, svg_h = int(match.group(1)), int(match.group(2))
scale = TARGET_WIDTH / svg_w
target_h = int(svg_h * scale)
html = f"""<!DOCTYPE html>
<html>
<head>
<style>
* {{ margin: 0; padding: 0; }}
body {{ background: #0d1117; width: {TARGET_WIDTH}px; height: {target_h}px; overflow: hidden; }}
svg {{ display: block; width: {TARGET_WIDTH}px; height: {target_h}px; }}
</style>
</head>
<body>
{svg_content}
</body>
</html>"""
page.set_viewport_size({"width": TARGET_WIDTH, "height": target_h})
page.set_content(html, wait_until="networkidle")
page.screenshot(path=str(output_path), full_page=True, type="png")
def main():
OUTPUT_DIR.mkdir(parents=True, exist_ok=True)
with sync_playwright() as p:
browser = p.chromium.launch(headless=True)
page = browser.new_page()
for svg_file, output_name in FEATURE_SVGS.items():
svg_path = ASSETS_DIR / svg_file
if not svg_path.exists():
print(f" SKIP {svg_file} (not found)")
continue
feature_svg = read_svg_content(svg_path)
feature_height = get_svg_height(feature_svg)
composite = build_final_svg(feature_svg, feature_height)
output_path = OUTPUT_DIR / f"{output_name}.png"
render_svg_to_png(composite, output_path, page)
total_h = feature_height + FOOTER_HEIGHT
scale = TARGET_WIDTH / SVG_WIDTH
print(
f" OK {output_name}.png "
f"({TARGET_WIDTH}x{int(total_h * scale)})"
)
browser.close()
print(f"\nDone! {len(FEATURE_SVGS)} images saved to {OUTPUT_DIR}")
if __name__ == "__main__":
main()

Binary file not shown.

After

Width:  |  Height:  |  Size: 317 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 419 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 499 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 388 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 485 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 483 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 466 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 368 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 330 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 507 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 448 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 454 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 510 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 420 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 522 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 370 KiB

BIN
marketing/images/layers.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 338 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 513 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 466 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 350 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 352 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 474 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 509 KiB

BIN
marketing/images/stats.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 280 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 280 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 470 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 359 KiB

View file

@ -0,0 +1,24 @@
<!-- Post 01 | Phase 1: Hook & Educate | Day 1 -->
<!-- Image: pbi-cli-vibe-modeling.pdf (10-slide carousel) -->
<!-- Posting note: Upload the PDF as a document so it renders as a swipeable carousel -->
Two days ago I shared the idea of 𝘃𝗶𝗯𝗲 𝗺𝗼𝗱𝗲𝗹𝗶𝗻𝗴. The response blew me away.
So here's the full breakdown. 10 slides covering everything about 𝗽𝗯𝗶-𝗰𝗹𝗶, the open-source CLI that gives Claude Code full Power BI skills.
What you'll find inside:
- What vibe modeling actually means
- The 7 skill areas (DAX, modeling, deployment, diagnostics, docs, partitions, security)
- How it works in 3 steps: install, connect, chat
- Why it uses 130x fewer tokens than MCP servers
- Real examples of Claude writing DAX, creating measures, and querying your model
No GUI. No copy-paste. Just describe what you need in plain English.
Swipe through the carousel and let me know which slide hits hardest. I'd love to hear what resonates with your workflow.
Star it on GitHub: https://github.com/MinaSaad1/pbi-cli
Full details: mina-saad.com/pbi-cli
#PowerBI #DataModeling #OpenSource #VIbeModeling #ClaudeCode #DAX #DataAnalytics #AI

View file

@ -0,0 +1,27 @@
<!-- Post 02 | Phase 1: Hook & Educate | Day 2 -->
<!-- Image: before-after.png (WITHOUT vs WITH pbi-cli comparison) -->
Power BI development in 2024 looked like this:
- Click through 6 menus to create one measure
- Copy-paste DAX from Stack Overflow and hope it works
- No version control. No undo beyond Ctrl+Z
- Manual documentation that's outdated the moment you write it
Now picture this instead:
- "Create a YTD Revenue measure" and it's done
- Claude writes the DAX, validates it, and adds it to your model
- TMDL export gives you real version control with git
- ~30 tokens per command instead of 4,000+ with MCP servers
That's 𝗽𝗯𝗶-𝗰𝗹𝗶. Not a wrapper around an MCP server. A purpose-built CLI where Claude has native Power BI skills.
The left side of this image is where most teams still are. The right side is where you could be this afternoon.
Which side are you on? Drop a comment, I'm curious.
GitHub: https://github.com/MinaSaad1/pbi-cli
Learn more: mina-saad.com/pbi-cli
#PowerBI #DataModeling #VIbeModeling #ClaudeCode #DAX #OpenSource #DataEngineering #AI

View file

@ -0,0 +1,24 @@
<!-- Post 03 | Phase 1: Hook & Educate | Day 3 -->
<!-- Image: token-cost.png (MCP vs CLI + Skills bar chart) -->
MCP tools have a hidden cost most people don't talk about: 𝘀𝗰𝗵𝗲𝗺𝗮 𝗯𝗹𝗼𝗮𝘁.
Every MCP tool definition (name, parameters, descriptions) gets loaded into your context window. Not when you call it. On 𝗲𝘃𝗲𝗿𝘆 𝘀𝗶𝗻𝗴𝗹𝗲 𝘁𝘂𝗿𝗻. A single tool schema costs anywhere from 400 to 3,500 tokens just to be available.
Real benchmarks back this up:
→ A 5-server MCP setup burns ~55K tokens before you type anything (JD Hodges)
→ GitHub's MCP server with 43 tools: a simple repo query costs 44K tokens vs 1,365 for CLI (Scalekit)
→ Anthropic themselves measured 134K tokens of tool definitions internally
Now imagine a Power BI MCP server with 20-40 tools for all the TOM operations. At 2,000-3,000 tokens per schema, that's 𝟲𝟬𝗞-𝟭𝟮𝟬𝗞 𝘁𝗼𝗸𝗲𝗻𝘀 of overhead eating your context window before you do any actual work.
pbi-cli avoids this entirely. CLI commands cost ~30 tokens to invoke, and only when used. No schemas loaded. No per-turn tax. Skills load on-demand, not on every turn.
That's why I built it as a CLI with skills instead of wrapping an MCP server. The architecture isn't just a preference. Real benchmarks show CLI is 4-32x more efficient per task, and for schema overhead specifically, the difference is even larger.
Check the chart. The difference speaks for itself.
GitHub: https://github.com/MinaSaad1/pbi-cli
Details: mina-saad.com/pbi-cli
#PowerBI #ClaudeCode #MCP #TokenEfficiency #OpenSource #VibeModeling #AI #DataModeling

View file

@ -0,0 +1,25 @@
<!-- Post 04 | Phase 2: Show the Magic | Day 4 -->
<!-- Image: how-it-works.png (3-step: Install, Connect, Chat) -->
Two commands. That's all it takes.
𝗦𝘁𝗲𝗽 𝟭: Install
`pipx install pbi-cli`
One line. No dependencies to chase.
𝗦𝘁𝗲𝗽 𝟮: Connect
`pbi connect`
Auto-detects your running Power BI Desktop instance. No config files, no port numbers, no setup wizards.
𝗦𝘁𝗲𝗽 𝟯: Chat
Open Claude Code and start talking. "Show me all measures." "Create a YTD calculation." "Export this model to TMDL."
That's it. Claude discovers all 7 skills automatically. No registration, no API keys, no YAML to write.
𝗭𝗲𝗿𝗼 𝗰𝗼𝗻𝗳𝗶𝗴𝘂𝗿𝗮𝘁𝗶𝗼𝗻. Just install, connect, and describe what you need.
Try it in 30 seconds:
GitHub: https://github.com/MinaSaad1/pbi-cli
Full walkthrough: mina-saad.com/pbi-cli
#PowerBI #ClaudeCode #OpenSource #VIbeModeling #DAX #DataModeling #DeveloperTools

View file

@ -0,0 +1,29 @@
<!-- Post 05 | Phase 2: Show the Magic | Day 5 -->
<!-- Image: chat-demo.png (Just Ask Claude conversation) -->
No DAX syntax to memorize. No GUI menus to navigate.
Look at this conversation:
"Connect to my Power BI model."
Done. Claude finds it automatically.
"Create a Total Revenue measure that sums the Amount column."
Done. Measure created, validated, added to your model.
"Query the top 10 products by revenue."
Done. Results returned right in the terminal.
Three requests. Three results. All in plain English.
This is what working with 𝗽𝗯𝗶-𝗰𝗹𝗶 actually looks like. You don't learn commands. You don't read documentation. You just 𝗱𝗲𝘀𝗰𝗿𝗶𝗯𝗲 what you want.
Claude handles the DAX syntax, the model object references, the column names, the formatting. You handle the thinking.
That's the whole point of vibe modeling. The model is a conversation, not a spreadsheet.
Just describe what you need:
GitHub: https://github.com/MinaSaad1/pbi-cli
Learn more: mina-saad.com/pbi-cli
#PowerBI #DAX #ClaudeCode #VIbeModeling #OpenSource #DataAnalytics #AI #DataModeling

View file

@ -0,0 +1,30 @@
<!-- Post 06 | Phase 2: Show the Magic | Day 6 -->
<!-- Image: bulk-operations.png (One Prompt, Five Measures) -->
One prompt. Five measures. 3.2 seconds.
"Create YTD Revenue, QTD Revenue, MTD Revenue, Prior Year Revenue, and YoY Growth measures for the Sales table."
That's it. One sentence. Claude writes all five DAX expressions, creates each measure, and confirms they're added to your model.
Now compare that to the GUI approach:
- Open the measure editor
- Write the DAX (or Google it)
- Test it
- Repeat 4 more times
- ~10 minutes and 50+ clicks per measure
- Total: nearly an hour of clicking
With 𝗽𝗯𝗶-𝗰𝗹𝗶, all five measures land in your model before you finish your coffee.
This isn't a demo trick. This is the daily workflow. Need 12 KPIs for a new report? Describe them in a paragraph. Need to rename 30 measures to match a naming convention? One prompt.
𝗕𝗮𝘁𝗰𝗵 𝗼𝗽𝗲𝗿𝗮𝘁𝗶𝗼𝗻𝘀 are where the productivity gap becomes impossible to ignore.
Stop clicking. Start describing.
GitHub: https://github.com/MinaSaad1/pbi-cli
Details: mina-saad.com/pbi-cli
#PowerBI #DAX #Productivity #ClaudeCode #VIbeModeling #OpenSource #DataModeling #DataEngineering

View file

@ -0,0 +1,26 @@
<!-- Post 07 | Phase 3: Skill Deep Dives | Day 7 -->
<!-- Image: dax-skill.png (DAX Skill: plain English to results table) -->
What if you could query your Power BI model in plain English?
With 𝗽𝗯𝗶-𝗰𝗹𝗶, you can. I asked Claude: "What are the top 5 products by revenue?" and got a formatted results table in seconds.
Here's what happened behind the scenes:
1. Claude 𝗯𝘂𝗶𝗹𝘁 the DAX query (TOPN, SUMMARIZE, the works)
2. 𝗩𝗮𝗹𝗶𝗱𝗮𝘁𝗲𝗱 the syntax before executing
3. 𝗘𝘅𝗲𝗰𝘂𝘁𝗲𝗱 it against the live semantic model
4. 𝗙𝗼𝗿𝗺𝗮𝘁𝘁𝗲𝗱 the results into a clean table
No EVALUATE statement to remember. No SUMMARIZECOLUMNS vs SUMMARIZE debate. No syntax errors to debug. Just a question and an answer. 🎯
The DAX skill covers query execution, syntax validation, and result formatting. You focus on the business question. Claude handles the rest.
Follow-up questions work too. "Now filter that by region" or "Show me the trend over the last 12 months." It's a conversation, not a query editor. 💬
Try it yourself. Ask any question about your data.
GitHub: https://github.com/MinaSaad1/pbi-cli
Learn more: mina-saad.com/pbi-cli
#PowerBI #DAX #ClaudeCode #DataAnalytics #VIbeModeling #OpenSource #AI #DataModeling

View file

@ -0,0 +1,26 @@
<!-- Post 08 | Phase 3: Skill Deep Dives | Day 8 -->
<!-- Image: dax-debugging.png (Debug DAX Like Never Before) -->
Your YTD Revenue measure is returning blank. What do you do?
Most people start guessing. Comment out lines. Add variables. Stare at CALCULATE filters. Waste 45 minutes before finding it was a date table issue the whole time.
With 𝗽𝗯𝗶-𝗰𝗹𝗶, I told Claude: "My YTD Revenue measure returns blank. Can you investigate?"
Claude traced the problem like a senior developer would 🔍
- Checked the measure definition. Syntax was fine.
- Checked the DAX logic. TOTALYTD looked correct.
- Checked the Calendar table. Found it. The table wasn't 𝗺𝗮𝗿𝗸𝗲𝗱 𝗮𝘀 𝗮 𝗱𝗮𝘁𝗲 𝘁𝗮𝗯𝗹𝗲.
- Fixed it with one command. Measure started working immediately.
Systematic. Methodical. No guessing.
That's the difference. Claude doesn't just write DAX. It 𝗱𝗲𝗯𝘂𝗴𝘀 it. It reads your model structure, understands context, and traces root causes.
Stop guessing. Let Claude trace it. 🛠️
GitHub: https://github.com/MinaSaad1/pbi-cli
Learn more: mina-saad.com/pbi-cli
#PowerBI #DAX #Debugging #ClaudeCode #VIbeModeling #OpenSource #DataModeling #AI

View file

@ -0,0 +1,25 @@
<!-- Post 09 | Phase 3: Skill Deep Dives | Day 9 -->
<!-- Image: model-health-check.png (Model Health Check audit) -->
When was the last time you audited your semantic model?
Be honest. Most teams ship models to production and never look back. Until something breaks.
I asked Claude to run a 𝗳𝘂𝗹𝗹 𝗵𝗲𝗮𝗹𝘁𝗵 𝗰𝗵𝗲𝗰𝗸 on a production model. One prompt. Here's what came back:
𝗘𝗿𝗿𝗼𝗿𝘀: Circular dependency between two calculated tables. Missing relationship between Sales and Store.
⚠️ 𝗪𝗮𝗿𝗻𝗶𝗻𝗴𝘀: 12 unused measures. Bidirectional filter on a fact table. Calendar table missing continuous date coverage.
𝗣𝗮𝘀𝘀𝗲𝘀: Star schema structure. Single-direction relationships on dimensions. Date table properly marked.
Then Claude offered to fix each issue, one by one. "Want me to remove the unused measures?" Yes. "Set the bidirectional filter to single direction?" Yes. Done.
Manual review? 30+ minutes if you know what to look for. With 𝗽𝗯𝗶-𝗰𝗹𝗶? Instant. And it catches things you'd miss.
Catch issues before production. Not after.
GitHub: https://github.com/MinaSaad1/pbi-cli
Learn more: mina-saad.com/pbi-cli
#PowerBI #DataModeling #DataQuality #ClaudeCode #VIbeModeling #OpenSource #SemanticModel #AI

View file

@ -0,0 +1,26 @@
<!-- Post 10 | Phase 3: Skill Deep Dives | Day 10 -->
<!-- Image: modeling-skill.png (Describe schema, Claude builds it) -->
Describe your schema in plain English. Claude builds it.
I told Claude: "Create a star schema with Sales as the fact table, and Products, Calendar, Customers, and Store as dimensions."
In seconds, Claude created:
- 📦 𝟱 𝘁𝗮𝗯𝗹𝗲𝘀 with appropriate columns and data types
- 🔗 𝟰 𝗿𝗲𝗹𝗮𝘁𝗶𝗼𝗻𝘀𝗵𝗶𝗽𝘀, all one-to-many, single direction
- 📅 Calendar 𝗱𝗮𝘁𝗲 𝘁𝗮𝗯𝗹𝗲 properly configured
- 📐 Properly structured for performance and usability
No drag-and-drop. No switching between diagram view and table properties. No manual relationship setup where you pick the wrong cardinality and spend 20 minutes figuring out why your numbers are doubled.
The modeling skill handles tables, relationships, measures, and date table configuration. All from conversation.
Need to iterate? "Add a Geography dimension" or "Create a Total Revenue measure on the Sales table." Claude keeps building on what's already there. 🔧
From description to working schema in one prompt.
GitHub: https://github.com/MinaSaad1/pbi-cli
Learn more: mina-saad.com/pbi-cli
#PowerBI #DataModeling #StarSchema #ClaudeCode #VIbeModeling #OpenSource #SemanticModel #AI

View file

@ -0,0 +1,26 @@
<!-- Post 11 | Phase 3: Skill Deep Dives | Day 11 -->
<!-- Image: backup-restore.png (Undo Anything. Instantly.) -->
"I messed up the relationships and now half my measures are showing blank."
We've all been there. You restructure a few things, feel confident, test one report, and everything's broken. Ctrl+Z won't help you. There's no undo for relationship changes in Power BI.
Unless you have a 𝘀𝗻𝗮𝗽𝘀𝗵𝗼𝘁.
Here's my workflow with 𝗽𝗯𝗶-𝗰𝗹𝗶:
1. 𝗦𝗮𝘃𝗲 a snapshot before risky changes (`pbi database export-tmdl`)
2. 𝗠𝗮𝗸𝗲 changes. Restructure relationships, rename columns, update measures.
3. Something breaks? 𝗥𝗲𝘀𝘁𝗼𝗿𝗲 the snapshot (`pbi database import-tmdl`)
4. Everything's back. Like it never happened. 🔄
It's the safety net that Power BI Desktop never gave you. Experiment freely. Try bold restructures. Refactor without fear. Pair it with git and you have full version history of your semantic model.
Because the worst that can happen is a 5-second rollback.
Never lose work again. ✅
GitHub: https://github.com/MinaSaad1/pbi-cli
Learn more: mina-saad.com/pbi-cli
#PowerBI #TMDL #VersionControl #ClaudeCode #VIbeModeling #OpenSource #DataModeling #DataEngineering

View file

@ -0,0 +1,23 @@
<!-- Post 12 | Phase 3: Skill Deep Dives | Day 12 -->
<!-- Image: rls-testing.png (Test Row-Level Security in Seconds) -->
Setting up Row-Level Security in Power BI Desktop means clicking through multiple dialogs, switching tabs, testing manually.
Create a role. Switch to the DAX editor. Write the filter. Go to "View as Roles." Pick the role. Check the visuals. Repeat for every role.
With 𝗽𝗯𝗶-𝗰𝗹𝗶, I did this in one conversation:
1. "Create an RLS role called Europe Sales" ✅
2. "Filter the Region table where Continent = Europe" ✅
3. "Run a query as that role to verify" ✅
Claude created the role, added the filter expression, then executed a DAX query 𝗮𝘀 𝘁𝗵𝗮𝘁 𝗿𝗼𝗹𝗲 to validate it. Result: 12 of 48 regions visible. Exactly right. 🔒
Build, test, and validate. All from one place. No tab switching, no dialog hunting, no manual verification. Add more roles the same way. Scale security without scaling complexity.
Build and validate security from conversation.
GitHub: https://github.com/MinaSaad1/pbi-cli
Learn more: mina-saad.com/pbi-cli
#PowerBI #RowLevelSecurity #RLS #ClaudeCode #VIbeModeling #OpenSource #DataSecurity #AI

View file

@ -0,0 +1,27 @@
<!-- Post 13 | Phase 4: Enterprise & Architecture | Day 13 -->
<!-- Image: deploy-secure.png (Deploy + Secure: TMDL versioning + RLS) -->
Two things every Power BI model needs: version control and access control.
Most teams have neither. Models get overwritten with no rollback. Security rules get configured by clicking through menus and hoping nothing breaks.
pbi-cli handles both from a single conversation.
On the 𝗱𝗲𝗽𝗹𝗼𝘆𝗺𝗲𝗻𝘁 side, you get full TMDL export and import. Every change becomes a version snapshot you can track in git:
- v1: Baseline schema
- v2: +Revenue measures
- v3: +RLS roles applied
Need to roll back? One command. No guesswork.
On the 𝘀𝗲𝗰𝘂𝗿𝗶𝘁𝘆 side, Claude configures role-based filters directly on your model. Per-user data visibility, row-level security rules, all defined in plain English and applied through the TOM API.
Both skills work from conversation. Describe what you need, Claude builds it. 🔐
Version control your models. Secure them with one prompt.
GitHub: https://github.com/MinaSaad1/pbi-cli
Learn more: mina-saad.com/pbi-cli
#PowerBI #DataSecurity #RLS #VersionControl #TMDL #OpenSource #ClaudeCode #VIbeModeling

View file

@ -0,0 +1,21 @@
<!-- Post 14 | Phase 4: Enterprise & Architecture | Day 14 -->
<!-- Image: docs-diagnostics.png (Docs + Diagnostics combined) -->
How well do you know your own model?
I've seen models with 200+ measures where nobody can explain what half of them do. Tables with columns that aren't used anywhere. Relationships that create circular dependencies nobody notices until a report breaks.
pbi-cli gives you two skills to fix this. 📋
The 𝗱𝗼𝗰𝘀 skill generates a complete data dictionary with one command: `pbi model document`. Every table, every column, every data type, every measure expression. Documented and organized. No more tribal knowledge trapped in someone's head.
The 𝗱𝗶𝗮𝗴𝗻𝗼𝘀𝘁𝗶𝗰𝘀 skill runs health checks across your entire model. Relationship validation, circular dependency detection, unused measure identification. It also traces query execution with duration metrics and performance recommendations. 🔍
One tells you what your model contains. The other tells you how healthy it is.
Know your model inside out.
GitHub: https://github.com/MinaSaad1/pbi-cli
Learn more: mina-saad.com/pbi-cli
#PowerBI #DataModeling #Documentation #DataQuality #OpenSource #ClaudeCode #VIbeModeling #DAX

View file

@ -0,0 +1,25 @@
<!-- Post 15 | Phase 4: Enterprise & Architecture | Day 15 -->
<!-- Image: architecture-flow.png (Architecture: Claude Code -> pbi-cli -> pythonnet -> .NET TOM -> Power BI) -->
No MCP server. No REST API. No external binaries.
Here's how pbi-cli actually works, end to end. ⚙️
Claude Code calls 𝗽𝗯𝗶-𝗰𝗹𝗶, a Python CLI installed via pipx. pbi-cli uses 𝗽𝘆𝘁𝗵𝗼𝗻𝗻𝗲𝘁 to bridge into .NET. From there, the .NET 𝗧𝗮𝗯𝘂𝗹𝗮𝗿 𝗢𝗯𝗷𝗲𝗰𝘁 𝗠𝗼𝗱𝗲𝗹 (TOM) and ADOMD.NET talk directly to Power BI Desktop over the local XMLA endpoint.
The full chain:
```
Claude Code -> pbi-cli -> pythonnet -> .NET TOM/ADOMD -> XMLA -> Power BI
```
Everything runs in-process on your machine. No network hops. No middleware. Sub-second execution for most operations.
Why does the architecture matter? Because direct access means 𝗳𝗮𝘀𝘁𝗲𝗿 execution, 𝗺𝗼𝗿𝗲 𝗿𝗲𝗹𝗶𝗮𝗯𝗹𝗲 results, and 𝟭𝟯𝟬𝘅 𝗰𝗵𝗲𝗮𝗽𝗲𝗿 than MCP tool calls. No JSON-RPC schema bloat. No server process to manage. Just a CLI that does exactly what you ask. 🏗️
Open source. MIT License.
GitHub: https://github.com/MinaSaad1/pbi-cli
Learn more: mina-saad.com/pbi-cli
#PowerBI #SoftwareArchitecture #Python #DotNET #OpenSource #ClaudeCode #VIbeModeling #DataEngineering

View file

@ -0,0 +1,31 @@
<!-- Post 16 | Phase 4: Enterprise & Architecture | Day 16 -->
<!-- Images: feature-grid.png + skills-hub.png (22 Command Groups + 7 Skills) -->
22 command groups. 100+ subcommands. 7 AI skills. Zero memorization.
Here's what pbi-cli covers: 📦
𝗖𝗼𝗺𝗺𝗮𝗻𝗱 𝗴𝗿𝗼𝘂𝗽𝘀: connect, dax, measure, table, column, relationship, model, database, security-role, calc-group, partition, perspective, hierarchy, expression, calendar, trace, transaction, advanced, repl, skills, disconnect, connections, setup.
That's full TOM coverage. Every object you can touch in a Power BI semantic model, accessible from the terminal.
But here's what makes it different from a regular CLI. 🧠
Claude 𝗮𝘂𝘁𝗼-𝗱𝗶𝘀𝗰𝗼𝘃𝗲𝗿𝘀 7 specialized skills the moment you install pbi-cli:
- 𝗗𝗔𝗫: queries, measures, calculations
- 𝗠𝗼𝗱𝗲𝗹𝗶𝗻𝗴: tables, columns, relationships
- 𝗗𝗲𝗽𝗹𝗼𝘆𝗺𝗲𝗻𝘁: TMDL export/import, transactions
- 𝗦𝗲𝗰𝘂𝗿𝗶𝘁𝘆: RLS roles, perspectives
- 𝗗𝗼𝗰𝘀: data dictionary, model documentation
- 𝗣𝗮𝗿𝘁𝗶𝘁𝗶𝗼𝗻𝘀: M expressions, data sources
- 𝗗𝗶𝗮𝗴𝗻𝗼𝘀𝘁𝗶𝗰𝘀: tracing, health checks
You don't memorize commands. You describe what you want. Claude picks the right skill and runs the right commands.
`pbi <group> <command>`. That's the pattern. Claude handles the rest.
GitHub: https://github.com/MinaSaad1/pbi-cli
Learn more: mina-saad.com/pbi-cli
#PowerBI #CLI #DataModeling #DAX #OpenSource #ClaudeCode #VIbeModeling #AI

View file

@ -0,0 +1,22 @@
<!-- Post 17 | Phase 5: CTA & Wrap | Day 17 -->
<!-- Image: cta-start.png (Start Vibe Modeling CTA) -->
Two commands to transform your Power BI workflow. 🚀
```
pipx install pbi-cli-tool
pbi connect
```
That's it. Claude auto-discovers 7 Power BI skills the moment pbi-cli is installed. You describe what you want in plain English. It builds.
Open source. MIT License. Python 3.10+. Windows.
No MCP server. No REST API. No configuration files. Just install, connect, and start modeling. ✨
Like it? Star it on GitHub. Share it with your Power BI team.
GitHub: https://github.com/MinaSaad1/pbi-cli
Learn more: mina-saad.com/pbi-cli
#PowerBI #OpenSource #VIbeModeling #ClaudeCode #DAX #DataModeling #AI

View file

@ -0,0 +1,19 @@
<!-- Post 18 | Video companion | After Phase 5 -->
<!-- Asset: PbiCliVideo.mp4 — upload as native LinkedIn video -->
Ever wonder what 𝗩𝗶𝗯𝗲 𝗠𝗼𝗱𝗲𝗹𝗶𝗻𝗴 actually looks like?
Here it is. 🎬
From the problem with MCP overhead, to install, connect, chat. DAX, modeling, RLS, deployment, diagnostics. All in one short watch.
If you've followed along this past month, this is the summary reel.
If this is your first time seeing 𝗽𝗯𝗶-𝗰𝗹𝗶, start here. ✨
Free and open source. Windows + Python 3.10+.
Details: https://mina-saad.com/pbi-cli
GitHub: https://github.com/MinaSaad1/pbi-cli
#PowerBI #VIbeModeling #ClaudeCode #OpenSource #DataModeling #DAX #AI

View file

@ -0,0 +1,107 @@
<!-- Comments for Post 19 | Release Announcement: v3.10.1 Vibe BI -->
<!-- Post each comment with its corresponding image under the main release post -->
---
### Comment 1 — Report Layer Overview
<!-- Image: report-layer.png -->
Here's the new 𝗥𝗲𝗽𝗼𝗿𝘁 𝗟𝗮𝘆𝗲𝗿 at a glance.
32 visual types, data binding, themes, and filters. All from the terminal.
No connection needed. It reads and writes PBIR JSON directly, auto-syncs with Desktop, and supports bulk operations.
One command to add a chart. One command to bind data. One command to apply your brand theme.
---
### Comment 2 — 32 Visual Types
<!-- Image: visual-types.png -->
𝟯𝟮 𝘃𝗶𝘀𝘂𝗮𝗹 𝘁𝘆𝗽𝗲𝘀 you can add from one command.
Bar, line, column, area, scatter, combo, donut, waterfall, treemap, funnel. Cards, KPIs, gauges. Tables and matrices. Slicers for every use case. Azure Maps. Even decorative elements like shapes, images, and textboxes.
`pbi visual add --type bar --page overview --name my_chart`
That's it. Claude picks the right type, you describe what you need.
---
### Comment 3 — Build a Report in 6 Steps
<!-- Image: report-workflow.png -->
Full report from an empty folder in 𝟲 𝘀𝘁𝗲𝗽𝘀:
1. Scaffold the project
2. Add pages
3. Add visuals
4. Bind data
5. Apply theme
6. Validate
All steps work offline on PBIR files. Desktop auto-syncs when it's open. You can chain these in a single prompt and Claude handles the sequence.
---
### Comment 4 — Desktop Auto-Sync
<!-- Image: auto-sync.png -->
The part that makes this actually usable: 𝗗𝗲𝘀𝗸𝘁𝗼𝗽 𝗔𝘂𝘁𝗼-𝗦𝘆𝗻𝗰.
CLI writes PBIR files, takes a snapshot of your modeling work, then reopens Desktop with everything intact. Both layers preserved.
No more closing Desktop manually. No risk of losing unsaved model changes. It just works.
---
### Comment 5 — Just Ask Claude
<!-- Image: chat-demo-report.png -->
This is what it actually looks like in practice.
"Add a bar chart showing revenue by region to the overview page, and apply our corporate brand theme."
Claude runs the commands: adds the visual, binds the data, applies the theme, syncs Desktop. Then you say "filter it to top 10 regions" and it adds a TopN filter.
No drag-and-drop. No manual binding. Just describe what you want on the page.
---
### Comment 6 — Two Layers, One CLI
<!-- Image: dual-layer.png -->
The full picture: 𝗠𝗼𝗱𝗲𝗹𝗶𝗻𝗴 + 𝗥𝗲𝗽𝗼𝗿𝘁𝗶𝗻𝗴 side by side.
Semantic Model Layer uses live .NET interop for measures, tables, relationships, DAX. Report Layer uses PBIR file operations for visuals, pages, themes, filters.
7 Claude skills for modeling. 5 for reporting. 27 command groups. 125+ subcommands total.
---
### Comment 7 — Architecture
<!-- Image: layers.png -->
How the dual-layer architecture works under the hood.
Modeling side: TMDL export/import, DAX engine, schema control. All through direct .NET TOM interop.
Reporting side: Visual builder, data binding, theme engine. All through PBIR JSON file operations.
One CLI bridges both. Claude picks the right layer automatically based on your request.
---
### Comment 8 — Command Showcase
<!-- Image: commands.png -->
Side-by-side command showcase for both layers.
𝗠𝗼𝗱𝗲𝗹𝗶𝗻𝗴: model export, dax run, add-measure, table list, relationship list, model import.
𝗥𝗲𝗽𝗼𝗿𝘁𝗶𝗻𝗴: add-visual, bind-data, add-page, list-visuals, update-theme, export.
30+ commands across both layers. AI-native from the start.
GitHub: https://github.com/MinaSaad1/pbi-cli

View file

@ -0,0 +1,30 @@
<!-- Post 19 | Release Announcement: v3.10.1 Vibe BI -->
<!-- Image: release-vibe-bi.png -->
It started as vibe modeling. Now it's 𝗩𝗶𝗯𝗲 𝗕𝗜. 🔥
𝗽𝗯𝗶-𝗰𝗹𝗶 v3.10.1 is out, and it's no longer just about semantic models. You can now build full Power BI reports from the terminal too.
𝗪𝗵𝗮𝘁'𝘀 𝗻𝗲𝘄:
𝗥𝗲𝗽𝗼𝗿𝘁 𝗟𝗮𝘆𝗲𝗿: pages, visuals, themes, filters, bookmarks
𝟯𝟮 𝘃𝗶𝘀𝘂𝗮𝗹 𝘁𝘆𝗽𝗲𝘀 supported out of the box
𝟭𝟮 𝗖𝗹𝗮𝘂𝗱𝗲 𝘀𝗸𝗶𝗹𝗹𝘀: 7 for modeling, 5 for reporting
𝟯𝟬+ 𝗰𝗼𝗺𝗺𝗮𝗻𝗱𝘀 across both layers
𝟰𝟴𝟴 𝘁𝗲𝘀𝘁𝘀 passing
Same workflow. Install, connect, chat. Tell Claude "add a bar chart for revenue by region" and it writes the PBIR JSON for you. No clicks. No drag and drop.
Modeling + Reporting. Both layers. One CLI.
```
pipx install pbi-cli-tool
pbi connect
```
Free, open source, MIT licensed. If you've been following along, this is the update I've been building toward. ✨
GitHub: https://github.com/MinaSaad1/pbi-cli
Details: https://mina-saad.com/pbi-cli
#PowerBI #VibeBi #VIbeModeling #ClaudeCode #OpenSource #DataModeling #DAX #PBIR #AI

View file

@ -0,0 +1,26 @@
<!-- Post 20 | Technical Showcase: Auto-Sync | Post after #19 -->
<!-- Image: auto-sync-ai.png -->
The biggest problem with editing Power BI reports from code: Desktop doesn't detect file changes on disk.
You edit the PBIR JSON, Desktop ignores it. You save in Desktop, it overwrites your changes. The workaround? Close Desktop, edit files, reopen manually. Every single time. About 45 seconds of friction per edit, plus the risk of losing unsaved work.
So I built 𝗗𝗲𝘀𝗸𝘁𝗼𝗽 𝗔𝘂𝘁𝗼-𝗦𝘆𝗻𝗰 Technique into 𝗽𝗯𝗶-𝗰𝗹𝗶 v3.10.1.
𝗛𝗼𝘄 𝗶𝘁 𝘄𝗼𝗿𝗸𝘀:
1⃣ Claude executes the CLI to write your PBIR files (page.json, visual.json, filters.json)
2⃣ Claude snapshots the changes from the last 5 seconds
3⃣ Claude closes Desktop for you: sends a WM_CLOSE message via pywin32 and auto-accepts the save dialog so nothing is lost
4⃣ Claude re-applies the snapshots and reopens your .pbip file automatically
~2-5 seconds. Fully automated. You never touch Desktop yourself.
Your unsaved modeling work (measures, relationships) stays safe because Desktop saves before closing. Your report-layer changes (visuals, filters, themes) survive because they're snapshotted and rewritten after Desktop's save. Then Desktop launches right back with everything in place.
This is what makes 𝗩𝗶𝗯𝗲 𝗕𝗜 actually usable. Without it, you'd close Desktop, edit files, reopen manually, every single time. With Auto-Sync, Claude handles the entire close-reopen cycle for you. You just ask for the change and keep working. ✨
GitHub: https://github.com/MinaSaad1/pbi-cli
Details: https://mina-saad.com/pbi-cli
#PowerBI #VibeBi #PBIR #ClaudeCode #OpenSource #PowerBIDeveloper #DataModeling #AI

View file

@ -0,0 +1,66 @@
# LinkedIn Post Campaign: pbi-cli Vibe BI
## Context
- Post 0 (DONE, March 28): Launch announcement, performed well
- Campaign goal: Set the land for "vibe modeling" as a concept, build awareness for pbi-cli + Claude Code + Power BI
## Posting Strategy
**Phase 1: Hook & Educate** (Days 1-3 after launch)
Build on the launch momentum. Give people the full picture, then hit them with the "why."
| # | File | Image/Asset | Angle |
|---|------|-------------|-------|
| 01 | 01-carousel-overview.md | pbi-cli-vibe-modeling.pdf | Full carousel walkthrough |
| 02 | 02-why-pbi-cli.md | before-after.png | Problem/solution framing |
| 03 | 03-token-cost.md | token-cost.png | Technical argument vs MCP |
**Phase 2: Show the Magic** (Days 4-6)
Remove friction. Show how simple it is and the "aha" moments.
| # | File | Image/Asset | Angle |
|---|------|-------------|-------|
| 04 | 04-how-it-works.md | how-it-works.png | 3-step onboarding |
| 05 | 05-chat-demo.md | chat-demo.png | The conversational UX |
| 06 | 06-bulk-operations.md | bulk-operations.png | Productivity proof |
**Phase 3: Skill Deep Dives** (Days 7-12)
One post per major capability. Each stands alone.
| # | File | Image/Asset | Angle |
|---|------|-------------|-------|
| 07 | 07-dax-skill.md | dax-skill.png | DAX without memorizing syntax |
| 08 | 08-dax-debugging.md | dax-debugging.png | Claude as debug partner |
| 09 | 09-model-health.md | model-health-check.png | Instant model audit |
| 10 | 10-modeling-skill.md | modeling-skill.png | Schema from description |
| 11 | 11-backup-restore.md | backup-restore.png | Safety net for risky changes |
| 12 | 12-rls-testing.md | rls-testing.png | Security without the GUI |
**Phase 4: Enterprise & Architecture** (Days 13-16)
For the more technical audience. Builds credibility.
| # | File | Image/Asset | Angle |
|---|------|-------------|-------|
| 13 | 13-deploy-secure.md | deploy-secure.png | Version control + RLS combined |
| 14 | 14-docs-diagnostics.md | docs-diagnostics.png | Documentation + performance |
| 15 | 15-architecture.md | architecture-flow.png | Under the hood |
| 16 | 16-feature-scope.md | feature-grid.png + skills-hub.png | Full scope: 22 groups, 7 skills |
**Phase 5: CTA & Wrap** (Day 17)
Close the loop. Drive installs.
| # | File | Image/Asset | Angle |
|---|------|-------------|-------|
| 17 | 17-cta-start.md | cta-start.png | Final CTA |
**Phase 6: Vibe BI Release** (1 week after Phase 5)
Announce the evolution from Vibe Modeling to Vibe BI with the report layer.
| # | File | Image/Asset | Angle |
|---|------|-------------|-------|
| 19 | 19-release-vibe-bi.md | release-vibe-bi.png | v3.10.1 release, Modeling + Reporting |
| 20 | 20-auto-sync.md | auto-sync-ai.png | Desktop Auto-Sync technique |
## Links (include in every post)
- Landing page: mina-saad.com/pbi-cli
- GitHub: https://github.com/MinaSaad1/pbi-cli

View file

@ -1,13 +1,14 @@
[build-system]
requires = ["setuptools>=68.0", "wheel"]
requires = ["setuptools>=77.0", "wheel"]
build-backend = "setuptools.build_meta"
[project]
name = "pbi-cli-tool"
version = "3.10.1"
version = "3.10.3"
description = "CLI for Power BI semantic models and PBIR reports - direct .NET connection for token-efficient AI agent usage"
readme = "README.pypi.md"
license = {text = "MIT"}
license = "MIT AND LicenseRef-Microsoft-AS-Client-Libraries"
license-files = ["LICENSE", "THIRD_PARTY_LICENSES.md", "NOTICE"]
requires-python = ">=3.10"
authors = [
{name = "pbi-cli contributors"},
@ -17,7 +18,6 @@ classifiers = [
"Development Status :: 5 - Production/Stable",
"Environment :: Console",
"Intended Audience :: Developers",
"License :: OSI Approved :: MIT License",
"Operating System :: OS Independent",
"Programming Language :: Python :: 3",
"Programming Language :: Python :: 3.10",
@ -37,6 +37,7 @@ dependencies = [
[project.scripts]
pbi = "pbi_cli.main:cli"
pbi-cli = "pbi_cli.main_pbi_cli:cli"
[project.urls]
Homepage = "https://github.com/MinaSaad1/pbi-cli"
@ -58,7 +59,7 @@ where = ["src"]
[tool.setuptools.package-data]
"pbi_cli.skills" = ["**/*.md"]
"pbi_cli.dlls" = ["*.dll"]
"pbi_cli.dlls" = ["*.dll", "*.json", "README.md"]
"pbi_cli.templates" = ["**/*.json"]
[tool.ruff]

329
scripts/bake_headers.py Normal file
View file

@ -0,0 +1,329 @@
"""
Bake the Vibe BI header into each feature SVG in assets/.
For each feature SVG:
1. Inject the VIBE BI branding header (ASCII art, connection flow, install cmd)
2. Shift original content down by HEADER_HEIGHT
3. Write the updated SVG back to disk
Logos are referenced via <image> to preserve original dimensions.
"""
import re
import sys
from pathlib import Path
ASSETS_DIR = Path(__file__).parent.parent / "assets"
HEADER_HEIGHT = 210
SVG_WIDTH = 850
# Feature SVGs to process (same list as generate_images.py)
FEATURE_SVGS = [
"before-after.svg",
"architecture-flow.svg",
"backup-restore.svg",
"bulk-operations.svg",
"chat-demo.svg",
"dax-debugging.svg",
"feature-grid.svg",
"model-health-check.svg",
"rls-testing.svg",
"skills-hub.svg",
"token-cost.svg",
"how-it-works.svg",
"dax-skill.svg",
"modeling-skill.svg",
"deploy-secure.svg",
"docs-diagnostics.svg",
"cta-start.svg",
"report-layer.svg",
"dual-layer.svg",
"visual-types.svg",
"report-workflow.svg",
"auto-sync.svg",
"chat-demo-report.svg",
"commands.svg",
"layers.svg",
"release-vibe-bi.svg",
"stats.svg",
"workflow.svg",
]
# The Vibe BI header SVG fragment (210px tall, 850px wide)
HEADER_DEFS = """\
<linearGradient id="hdr-bar1" x1="50%" y1="0%" x2="50%" y2="100%">
<stop offset="0%" stop-color="#EBBB14"/>
<stop offset="100%" stop-color="#B25400"/>
</linearGradient>
<linearGradient id="hdr-bar2" x1="50%" y1="0%" x2="50%" y2="100%">
<stop offset="0%" stop-color="#F9E583"/>
<stop offset="100%" stop-color="#DE9800"/>
</linearGradient>
<linearGradient id="hdr-bar3" x1="50%" y1="0%" x2="50%" y2="100%">
<stop offset="0%" stop-color="#F9E68B"/>
<stop offset="100%" stop-color="#F3CD32"/>
</linearGradient>
<linearGradient id="pbi-lg1" x1="50%" y1="0%" x2="50%" y2="100%">
<stop offset="0%" stop-color="#EBBB14"/>
<stop offset="100%" stop-color="#B25400"/>
</linearGradient>
<linearGradient id="pbi-lg2" x1="50%" y1="0%" x2="50%" y2="100%">
<stop offset="0%" stop-color="#F9E583"/>
<stop offset="100%" stop-color="#DE9800"/>
</linearGradient>
<linearGradient id="pbi-lg5" x1="50%" y1="0%" x2="50%" y2="100%">
<stop offset="0%" stop-color="#F9E68B"/>
<stop offset="100%" stop-color="#F3CD32"/>
</linearGradient>"""
HEADER_BODY = """\
<!-- ==================== VIBE BI HEADER ==================== -->
<!-- "VIBE BI" block art (shadow) -->
<text font-family="'Courier New', Courier, monospace" font-size="9" fill="#7A6508" xml:space="preserve">
<tspan x="296" y="22"> </tspan>
<tspan x="296" y="33"> </tspan>
<tspan x="296" y="44"> </tspan>
<tspan x="296" y="55"> </tspan>
<tspan x="296" y="66"> </tspan>
<tspan x="296" y="77"> </tspan>
</text>
<!-- "VIBE BI" block art (main) -->
<text font-family="'Courier New', Courier, monospace" font-size="9" fill="#F2C811" xml:space="preserve">
<tspan x="295" y="21"> </tspan>
<tspan x="295" y="32"> </tspan>
<tspan x="295" y="43"> </tspan>
<tspan x="295" y="54"> </tspan>
<tspan x="295" y="65"> </tspan>
<tspan x="295" y="76"> </tspan>
</text>
<!-- Separator -->
<line x1="60" y1="84" x2="790" y2="84" stroke="#F2C811" stroke-opacity="0.15" stroke-width="1"/>
<!-- Tagline -->
<text x="425" y="100" font-family="'Segoe UI', Arial, sans-serif" font-size="13" fill="#e6edf3" text-anchor="middle" font-weight="600">The First CLI for Both Power BI Modeling and Reporting</text>
<!-- ===== Connection Flow: Claude > PBI-CLI > Power BI ===== -->
<!-- Claude AI logo (inline, original 1200x1200, displayed as 50x50, centered at x=110) -->
<svg x="85" y="110" width="50" height="50" viewBox="0 0 1200 1200">
<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"/>
</svg>
<text x="110" y="175" 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="155" y1="135" x2="290" y2="135" stroke="#F2C811" stroke-width="2" stroke-dasharray="6,4" stroke-opacity="0.5"/>
<polygon points="294,135 286,130 286,140" fill="#F2C811" fill-opacity="0.5"/>
<!-- PBI-CLI block art (shadow) -->
<text font-family="'Courier New', Courier, monospace" font-size="7" fill="#7A6508" xml:space="preserve">
<tspan x="316" y="118"> </tspan>
<tspan x="316" y="128"> </tspan>
<tspan x="316" y="138"> </tspan>
<tspan x="316" y="148"> </tspan>
<tspan x="316" y="158"> </tspan>
<tspan x="316" y="168"> </tspan>
</text>
<!-- PBI-CLI block art (main) -->
<text font-family="'Courier New', Courier, monospace" font-size="7" fill="#F2C811" xml:space="preserve">
<tspan x="315" y="117"> </tspan>
<tspan x="315" y="127"> </tspan>
<tspan x="315" y="137"> </tspan>
<tspan x="315" y="147"> </tspan>
<tspan x="315" y="157"> </tspan>
<tspan x="315" y="167"> </tspan>
</text>
<!-- Right arrow -->
<line x1="560" y1="135" x2="655" y2="135" stroke="#F2C811" stroke-width="2" stroke-dasharray="6,4" stroke-opacity="0.5"/>
<polygon points="659,135 651,130 651,140" fill="#F2C811" fill-opacity="0.5"/>
<!-- Power BI logo (inline, original 630x630, displayed as 50x50, centered at x=700) -->
<svg x="675" y="110" width="50" height="50" viewBox="0 0 630 630">
<g transform="translate(77.5, 0)">
<rect fill="url(#pbi-lg1)" x="256" y="0" width="219" height="630" rx="26"/>
<path fill="url(#pbi-lg2)" d="M346,604 L346,630 L320,630 L153,630 C138.64,630 127,618.36 127,604 L127,183 C127,168.64 138.64,157 153,157 L320,157 C334.36,157 346,168.64 346,183 L346,604 Z"/>
<path fill="url(#pbi-lg5)" d="M219,604 L219,630 L193,630 L26,630 C11.64,630 0,618.36 0,604 L0,341 C0,326.64 11.64,315 26,315 L193,315 C207.36,315 219,326.64 219,341 L219,604 Z"/>
</g>
</svg>
<text x="700" y="175" font-family="'Segoe UI', Arial, sans-serif" font-size="11" fill="#F2C811" text-anchor="middle" font-weight="600">Power BI</text>
<!-- Modeling + Reporting pills -->
<rect x="308" y="176" width="100" height="20" rx="10" fill="#58a6ff" fill-opacity="0.1" stroke="#58a6ff" stroke-width="1"/>
<text x="358" y="190" font-family="'Segoe UI', Arial, sans-serif" font-size="10" fill="#58a6ff" text-anchor="middle" font-weight="600">Modeling</text>
<text x="420" y="190" font-family="'Segoe UI', Arial, sans-serif" font-size="10" fill="#8b949e" text-anchor="middle">+</text>
<rect x="432" y="176" width="100" height="20" rx="10" fill="#06d6a0" fill-opacity="0.1" stroke="#06d6a0" stroke-width="1"/>
<text x="482" y="190" font-family="'Segoe UI', Arial, sans-serif" font-size="10" fill="#06d6a0" text-anchor="middle" font-weight="600">Reporting</text>
<!-- Bottom separator -->
<line x1="60" y1="200" x2="790" y2="200" stroke="#F2C811" stroke-opacity="0.25" stroke-width="2"/>
<!-- ==================== END HEADER ==================== -->"""
def get_svg_height(svg_text: str) -> int:
"""Extract height from SVG viewBox (expects '0 0 W H' format)."""
match = re.search(r'viewBox="0 0 \d+ (\d+)"', svg_text)
if match:
return int(match.group(1))
match = re.search(r'height="(\d+)"', svg_text)
if match:
return int(match.group(1))
return 400
def extract_svg_inner(svg_text: str) -> str:
"""Extract everything between <svg ...> and </svg> tags."""
inner = re.sub(r"<\?xml[^>]*\?>\s*", "", svg_text)
inner = re.sub(r"<svg[^>]*>", "", inner, count=1)
inner = re.sub(r"</svg>\s*$", "", inner)
return inner
def extract_defs_content(svg_text: str) -> str:
"""Extract the content inside <defs>...</defs> if present."""
match = re.search(r"<defs>(.*?)</defs>", svg_text, re.DOTALL)
return match.group(1) if match else ""
def remove_bg_rect(svg_inner: str) -> str:
"""Remove the first background rect (fill='#0d1117') from the SVG inner content."""
return re.sub(
r'\s*<rect[^>]*fill="#0d1117"[^/]*/>\s*',
"\n",
svg_inner,
count=1,
)
def remove_defs_block(svg_inner: str) -> str:
"""Remove the <defs>...</defs> block from SVG inner content."""
return re.sub(r"\s*<defs>.*?</defs>\s*", "\n", svg_inner, flags=re.DOTALL)
def is_already_baked(svg_text: str) -> bool:
"""Check if the SVG already contains the Vibe BI header."""
return "VIBE BI HEADER" in svg_text
def unbake_header(svg_text: str) -> str:
"""Strip the baked header and reconstruct the original feature SVG."""
# Extract the feature content from inside <g transform="translate(0, 210)">...</g>
match = re.search(
r'<g transform="translate\(0, 210\)">\s*(.*?)\s*</g>\s*</svg>',
svg_text,
re.DOTALL,
)
if not match:
return svg_text
feature_inner = match.group(1)
original_height = get_svg_height(svg_text) - HEADER_HEIGHT
# Extract feature-specific defs (skip header gradient defs)
all_defs = extract_defs_content(svg_text)
# Remove header-specific defs (hdr-bar* and pbi-lg*)
feature_defs = re.sub(
r'\s*<linearGradient id="(hdr-bar|pbi-lg)[^"]*"[^>]*>.*?</linearGradient>',
"",
all_defs,
flags=re.DOTALL,
)
feature_defs = feature_defs.strip()
defs_block = ""
if feature_defs:
defs_block = f"\n <defs>\n{feature_defs}\n </defs>\n"
return f"""<svg xmlns="http://www.w3.org/2000/svg" width="{SVG_WIDTH}" height="{original_height}" viewBox="0 0 {SVG_WIDTH} {original_height}">
{defs_block}
<rect width="100%" height="100%" fill="#0d1117" rx="8"/>
{feature_inner}
</svg>"""
def bake_header(svg_text: str) -> str:
"""Inject the Vibe BI header into a feature SVG."""
original_height = get_svg_height(svg_text)
new_height = original_height + HEADER_HEIGHT
# Extract parts
feature_inner = extract_svg_inner(svg_text)
feature_defs = extract_defs_content(svg_text)
# Clean feature inner: remove defs block and background rect
clean_inner = remove_defs_block(feature_inner)
clean_inner = remove_bg_rect(clean_inner)
# Merge defs
all_defs = HEADER_DEFS
if feature_defs.strip():
all_defs += "\n" + feature_defs
return f"""<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="{SVG_WIDTH}" height="{new_height}" viewBox="0 0 {SVG_WIDTH} {new_height}">
<defs>
{all_defs}
</defs>
<!-- Full background -->
<rect width="100%" height="100%" fill="#0d1117"/>
{HEADER_BODY}
<!-- Feature content (shifted down by {HEADER_HEIGHT}px) -->
<g transform="translate(0, {HEADER_HEIGHT})">
{clean_inner}
</g>
</svg>"""
def process_file(svg_file: str, dry_run: bool = False, force: bool = False) -> None:
"""Process a single feature SVG file."""
filepath = ASSETS_DIR / svg_file
if not filepath.exists():
print(f" SKIP {svg_file} (not found)")
return
svg_text = filepath.read_text(encoding="utf-8")
if is_already_baked(svg_text):
if force:
svg_text = unbake_header(svg_text)
print(f" STRIP {svg_file} (removed old header)")
else:
print(f" SKIP {svg_file} (already has header, use --force)")
return
original_height = get_svg_height(svg_text)
result = bake_header(svg_text)
new_height = original_height + HEADER_HEIGHT
if dry_run:
print(f" DRY {svg_file}: {original_height} -> {new_height}px")
else:
filepath.write_text(result, encoding="utf-8")
print(f" OK {svg_file}: {original_height} -> {new_height}px")
def main():
dry_run = "--dry-run" in sys.argv
force = "--force" in sys.argv
targets = sys.argv[1:]
targets = [t for t in targets if not t.startswith("--")]
if not targets:
targets = FEATURE_SVGS
mode = "DRY RUN" if dry_run else ("FORCE REBAKE" if force else "BAKING")
print(f"\n{mode}: Injecting Vibe BI header into {len(targets)} SVGs\n")
for svg_file in targets:
process_file(svg_file, dry_run=dry_run, force=force)
print(f"\nDone! Processed {len(targets)} files.")
if __name__ == "__main__":
main()

View file

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

Some files were not shown because too many files have changed in this diff Show more