Compare commits

...

33 commits

Author SHA1 Message Date
github-actions[bot]
6671155ec7 chore: refresh downloads chart
Some checks are pending
CI / test (windows-latest, 3.10) (push) Waiting to run
CI / test (windows-latest, 3.12) (push) Waiting to run
CI / typecheck (push) Waiting to run
CI / test (windows-latest, 3.13) (push) Waiting to run
CI / lint (push) Waiting to run
2026-04-21 06:56:46 +00:00
github-actions[bot]
61aa3f4994 chore: refresh downloads chart
Some checks are pending
CI / test (windows-latest, 3.13) (push) Waiting to run
CI / lint (push) Waiting to run
CI / typecheck (push) Waiting to run
CI / test (windows-latest, 3.10) (push) Waiting to run
CI / test (windows-latest, 3.12) (push) Waiting to run
2026-04-20 07:04:46 +00:00
github-actions[bot]
68c6611e30 chore: refresh downloads chart
Some checks are pending
CI / test (windows-latest, 3.13) (push) Waiting to run
CI / lint (push) Waiting to run
CI / typecheck (push) Waiting to run
CI / test (windows-latest, 3.10) (push) Waiting to run
CI / test (windows-latest, 3.12) (push) Waiting to run
2026-04-19 06:51:52 +00:00
github-actions[bot]
890eafb883 chore: refresh downloads chart
Some checks are pending
CI / lint (push) Waiting to run
CI / typecheck (push) Waiting to run
CI / test (windows-latest, 3.10) (push) Waiting to run
CI / test (windows-latest, 3.12) (push) Waiting to run
CI / test (windows-latest, 3.13) (push) Waiting to run
2026-04-18 06:42:41 +00:00
github-actions[bot]
d1bb583274 chore: refresh downloads chart 2026-04-17 06:56:36 +00:00
github-actions[bot]
04447e5a15 chore: refresh downloads chart 2026-04-16 06:56:14 +00:00
github-actions[bot]
2f1ad3b06e chore: refresh downloads chart 2026-04-15 06:55:24 +00:00
github-actions[bot]
d9851295e8 chore: refresh downloads chart 2026-04-14 06:54:54 +00:00
github-actions[bot]
f3ab0aaa76 chore: refresh downloads chart 2026-04-13 07:03:12 +00:00
github-actions[bot]
a81cf9cd5b chore: refresh downloads chart 2026-04-12 10:28:56 +00:00
MinaSaad1
3c6261dc9b fix: use PAT to bypass branch protection in downloads chart workflow 2026-04-12 12:28:37 +02:00
MinaSaad1
6642cf12d2 fix: use unicode chars instead of html entities in downloads chart
• and → are HTML entities, not valid XML, so GitHub's
image renderer failed to load the SVG and showed a broken image.
Replaced with literal U+2022 and U+2192 characters.
2026-04-10 22:09:18 +02:00
MinaSaad1
c6bc1b9338 chore: bump checkout/setup-python in downloads-chart workflow
Node.js 20 versions (checkout@v4, setup-python@v5) are deprecated.
2026-04-10 22:08:25 +02:00
MinaSaad1
cb71ba1cf7 feat: add cumulative downloads chart to README
- scripts/generate_downloads_chart.py fetches pypistats.org data
  (mirrors excluded, stdlib only) and renders a dark-theme SVG
  matching the existing asset style
- assets/downloads-chart.svg seeded with the current 15-day history
- .github/workflows/downloads-chart.yml runs daily at 06:15 UTC
  and commits only when the chart actually changes
- README shows the chart directly under stats.svg
2026-04-10 22:06:32 +02:00
MinaSaad1
ff96cc3f3b chore: bump version to 3.10.10 2026-04-07 22:42:10 +02:00
MinaSaad1
b723a134a7 chore: bump version to 3.10.9 2026-04-07 22:24:16 +02:00
MinaSaad1
f7ca7d87e7 docs: add --no-sync batching guide to report, pages, visuals, filters skills 2026-04-07 22:15:51 +02:00
MinaSaad1
dcb48fde7c chore: bump version to 3.10.8 2026-04-07 21:24:02 +02:00
MinaSaad1
e677b018cf fix: apply ruff format to desktop_reload.py 2026-04-07 21:21:46 +02:00
MinaSaad1
849d309228 fix: fix PBI Desktop window detection and fallback chain in desktop_reload
- _find_pbi_window_pywin32: also match by PBIDesktop.exe process name so
  newer Desktop versions that title windows with just the report name are
  found correctly
- _try_pywin32: return None (not an error dict) when window is not found,
  so reload_desktop() falls through to the PowerShell fallback as intended
- bump version to 3.10.7; sync __init__.py (was stale at 3.10.5)
2026-04-07 21:18:10 +02:00
MinaSaad1
93c4275848 fix: wrap long lines in tests to pass ruff E501 (>100 chars) 2026-04-07 17:17:13 +02:00
MinaSaad1
895e90d710 fix: correct 7 PBIR report-layer issues found during Desktop testing
- visual bind: remove legacy Commands/SemanticQueryDataShapeCommand block
  (PBIR 2.7.0 uses additionalProperties:false -- Commands is a hard schema error)
- visual bind: add active:true to column (category/row/detail) projections
  so Desktop treats the field as the active axis
- visual add: remove empty "objects:{}" from all 32 visual templates
  (noisy and rejected by strict schema validators)
- visual add: write position coordinates as integers not floats
  (Desktop normalises to int; 320.0 vs 320 caused inconsistency)
- report set-background: always write transparency:0 alongside color
  (Desktop defaults missing transparency to 100 = fully invisible)
- report validate: drop false-positive layoutOptimization required error
  (real Microsoft 3.2.0 schema does not require this field)
- all write commands: add --no-sync flag to report/visual/filters/bookmarks
  groups to suppress per-command Desktop reload during scripted builds;
  use pbi report reload for a single sync at the end
2026-04-07 17:13:41 +02:00
MinaSaad1
63f4738a2e fix: use official SVG art for ASCII banner, correct I/L rendering 2026-04-06 00:24:31 +02:00
MinaSaad1
acf82b006a chore: bump version to 3.10.4 2026-04-06 00:00:46 +02:00
MinaSaad1
c1d8176a6c fix: apply ruff format to banner.py 2026-04-05 23:34:29 +02:00
MinaSaad1
2dee744bef feat: show ASCII banner when pbi is invoked with no subcommand 2026-04-05 23:31:08 +02:00
MinaSaad1
700c489988 chore: exclude entire docs/ folder from git tracking 2026-04-05 23:06:48 +02:00
MinaSaad1
b83e710fcf fix: restore banner to VIBE BI header + PBI-CLI block art connecting Claude and Power BI 2026-04-05 22:58:01 +02:00
MinaSaad1
756a7c98e3 fix: revert all SVG assets to pre-marketing state
Remove the VIBE BI block-art header and marketing branding that was
added to all 17 assets in v3.10.3. Restore each SVG to its original
content focused on the feature it illustrates (chat demo, DAX
debugging, architecture flow, etc.) without the promotional overlay.
2026-04-05 22:52:35 +02:00
MinaSaad1
a1f806849e chore: untrack marketing folder and unused assets from git
Remove marketing/ directory (51 files) and 19 unused asset files
that are not referenced in README.md from git tracking. Update
.gitignore to prevent re-adding them.

Only the 17 SVGs actually used in README are now tracked in assets/.
2026-04-05 22:44:48 +02:00
MinaSaad1
5f40a4281c fix: apply ruff format to connection.py and skills_cmd.py 2026-04-05 22:32:38 +02:00
MinaSaad1
62706771b2 fix: sort imports in connection.py to satisfy ruff isort 2026-04-05 22:30:35 +02:00
MinaSaad1
8b7bef9e6d fix: resolve CI failures from _ensure_ready removal
- connection.py: move skills_cmd import to module level (fixes ruff I001)
- setup_cmd.py: remove dead _ensure_ready import and call (fixes mypy attr-defined)
- tests/conftest.py: remove _ensure_ready monkeypatch (function no longer exists)
- tests/test_commands/test_setup.py: remove _ensure_ready patch
2026-04-05 22:27:40 +02:00
151 changed files with 736 additions and 6993 deletions

37
.github/workflows/downloads-chart.yml vendored Normal file
View file

@ -0,0 +1,37 @@
name: Update downloads chart
on:
schedule:
# Daily at 06:15 UTC (after pypistats has processed the prior day)
- cron: "15 6 * * *"
workflow_dispatch:
permissions:
contents: write
jobs:
regenerate:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v5
with:
token: ${{ secrets.PAT }}
- uses: actions/setup-python@v6
with:
python-version: "3.12"
- name: Regenerate cumulative downloads chart
run: python scripts/generate_downloads_chart.py
- name: Commit and push updated chart
run: |
if git diff --quiet assets/downloads-chart.svg; then
echo "No changes to downloads chart."
exit 0
fi
git config user.name "github-actions[bot]"
git config user.email "41898282+github-actions[bot]@users.noreply.github.com"
git add assets/downloads-chart.svg
git commit -m "chore: refresh downloads chart"
git push

24
.gitignore vendored
View file

@ -42,3 +42,27 @@ demo.SemanticModel/
demo.pbip
pbir_desktop_test/
"pbib examples/"
# Marketing assets (local only, not for GitHub)
marketing/
# Local-only documents (private notes, call prep, etc.)
docs/
# Assets not referenced in README
assets/*.png
assets/Claude_AI_symbol.svg
assets/New_Power_BI_Logo.svg
assets/commands.svg
assets/cta-start.svg
assets/dax-skill.svg
assets/deploy-secure.svg
assets/docs-diagnostics.svg
assets/dual-layer.svg
assets/feature-grid.svg
assets/header.svg
assets/how-it-works.svg
assets/modeling-skill.svg
assets/release-vibe-bi.svg
assets/token-cost.svg
assets/workflow.svg

View file

@ -5,6 +5,26 @@ 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.6] - 2026-04-07
### Fixed
- `visual bind` no longer writes the legacy `Commands` block (SemanticQueryDataShapeCommand) to `visual.json`. PBIR 2.7.0 uses `additionalProperties: false` on the query object, so the `Commands` field is a hard schema violation. Only `queryState` projections are now written.
- `pbi report validate` and the full PBIR validator no longer flag a missing `layoutOptimization` field as an error. The real Microsoft schema does not list it as required; the previous check was against a stale internal schema.
- `pbi report set-background` now always writes `transparency: 0` alongside the color. Power BI Desktop defaults a missing `transparency` property to 100 (fully invisible), making the color silently unrendered. The new `--transparency` flag (0-100, default 0) lets callers override for semi-transparent backgrounds.
### Added
- `--no-sync` flag on `report`, `visual`, `filters`, and `bookmarks` command groups. Suppresses the per-command Desktop auto-sync for scripted multi-step builds. Use `pbi report reload` for a single explicit sync at the end of the script.
## [3.10.5] - 2026-04-06
### Fixed
- ASCII banner: replaced incorrect hand-crafted art with the official design from `assets/banner.svg`. The `I` in PBI is now correctly narrow, and a small `███╗/╚══╝` block serves as the visible `-` separator between PBI and CLI.
## [3.10.4] - 2026-04-06
### Added
- ASCII banner displayed in terminal when `pbi` is invoked with no subcommand. Renders in Power BI yellow on color terminals, plain text fallback on legacy terminals without Unicode support. Skipped when `--json` flag is used.
## [3.10.3] - 2026-04-05
### Changed

View file

@ -41,6 +41,14 @@
<img src="https://raw.githubusercontent.com/MinaSaad1/pbi-cli/master/assets/stats.svg" alt="pbi-cli at a Glance" width="850"/>
</p>
<p align="center">
<img src="https://raw.githubusercontent.com/MinaSaad1/pbi-cli/master/assets/downloads-chart.svg" alt="pbi-cli cumulative downloads from PyPI" width="850"/>
</p>
<p align="center">
<sub>Cumulative downloads, refreshed daily from <a href="https://pypistats.org/packages/pbi-cli-tool">pypistats.org</a> via GitHub Actions.</sub>
</p>
---
## Get Started

View file

@ -1,7 +0,0 @@
<?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>

Before

Width:  |  Height:  |  Size: 4 KiB

View file

@ -1,36 +0,0 @@
<?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>

Before

Width:  |  Height:  |  Size: 2.5 KiB

View file

@ -1,122 +1,7 @@
<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>
<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"/>
<!-- 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 -->
<!-- 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 -->
@ -192,6 +77,4 @@
<!-- 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>
</svg>

Before

Width:  |  Height:  |  Size: 18 KiB

After

Width:  |  Height:  |  Size: 6.4 KiB

View file

@ -1,3 +0,0 @@
version https://git-lfs.github.com/spec/v1
oid sha256:cd0accbfe5f058a692937540f456a1010e2fa82f60089949e52d3c4999d8c401
size 17179306

View file

@ -1,3 +0,0 @@
version https://git-lfs.github.com/spec/v1
oid sha256:173d00d74c9e4bebb2f957b84562b62155b0c0a42081f81be425f3d3c4dcf628
size 16253073

View file

@ -1,3 +0,0 @@
version https://git-lfs.github.com/spec/v1
oid sha256:21eeb1a24d1a8d59ff0e4a8903dd7e7f864e01c715420012417e010395c90005
size 17077876

View file

@ -1,129 +1,15 @@
<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">
<svg xmlns="http://www.w3.org/2000/svg" width="850" height="380" viewBox="0 0 850 380">
<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="sync-glow" x1="0%" y1="0%" x2="100%" y2="0%">
<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>
<!-- Full background -->
<rect width="100%" height="100%" fill="#0d1117"/>
<rect width="100%" height="100%" fill="#0d1117" rx="8"/>
<!-- ==================== 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 -->
<!-- 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>
@ -229,6 +115,4 @@
<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>
</svg>

Before

Width:  |  Height:  |  Size: 21 KiB

After

Width:  |  Height:  |  Size: 8.6 KiB

View file

@ -1,122 +1,7 @@
<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>
<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"/>
<!-- 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 -->
<!-- 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>
@ -169,6 +54,4 @@
<!-- 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>
</svg>

Before

Width:  |  Height:  |  Size: 17 KiB

After

Width:  |  Height:  |  Size: 4.4 KiB

View file

@ -1,123 +1,9 @@
<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>
<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">
<!-- Full background -->
<rect width="100%" height="100%" fill="#0d1117"/>
<!-- Background -->
<rect width="100%" height="100%" fill="#0d1117" rx="8"/>
<!-- ==================== 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 -->
<!-- Title -->
<text x="425" y="36" font-size="19" fill="#F2C811" font-weight="bold" text-anchor="middle">Why pbi-cli?</text>
<!-- LEFT panel -->
@ -222,5 +108,4 @@
<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>
</svg>

Before

Width:  |  Height:  |  Size: 18 KiB

After

Width:  |  Height:  |  Size: 6.4 KiB

View file

@ -1,122 +1,7 @@
<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>
<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"/>
<!-- 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 -->
<!-- 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>
@ -182,6 +67,4 @@
<!-- 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>
</svg>

Before

Width:  |  Height:  |  Size: 18 KiB

After

Width:  |  Height:  |  Size: 5.3 KiB

View file

@ -1,122 +1,7 @@
<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>
<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"/>
<!-- 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 -->
<!-- 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>
@ -171,6 +56,4 @@
<!-- 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>
</svg>

Before

Width:  |  Height:  |  Size: 17 KiB

After

Width:  |  Height:  |  Size: 4.6 KiB

View file

@ -1,122 +1,7 @@
<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>
<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"/>
<!-- 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 -->
<!-- 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>
@ -173,6 +58,4 @@
<!-- 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>
</svg>

Before

Width:  |  Height:  |  Size: 17 KiB

After

Width:  |  Height:  |  Size: 4.6 KiB

View file

@ -1,347 +0,0 @@
<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>

Before

Width:  |  Height:  |  Size: 26 KiB

View file

@ -1,186 +0,0 @@
<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>

Before

Width:  |  Height:  |  Size: 15 KiB

View file

@ -1,122 +1,7 @@
<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>
<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"/>
<!-- 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 -->
<!-- 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>
@ -175,6 +60,4 @@
<!-- 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>
</svg>

Before

Width:  |  Height:  |  Size: 17 KiB

After

Width:  |  Height:  |  Size: 5.1 KiB

View file

@ -1,202 +0,0 @@
<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>

Before

Width:  |  Height:  |  Size: 17 KiB

View file

@ -1,267 +0,0 @@
<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>

Before

Width:  |  Height:  |  Size: 21 KiB

View file

@ -1,226 +0,0 @@
<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>

Before

Width:  |  Height:  |  Size: 18 KiB

View file

@ -0,0 +1,39 @@
<svg xmlns="http://www.w3.org/2000/svg" width="850" height="340" viewBox="0 0 850 340">
<defs>
<linearGradient id="areaFill" x1="0" y1="0" x2="0" y2="1">
<stop offset="0%" stop-color="#58a6ff" stop-opacity="0.45"/>
<stop offset="100%" stop-color="#58a6ff" stop-opacity="0"/>
</linearGradient>
</defs>
<!-- Background -->
<rect width="100%" height="100%" fill="#0d1117" rx="8"/>
<!-- 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 Downloads Over Time</text>
<text x="425" y="52" font-family="'Segoe UI', Arial, sans-serif" font-size="11" fill="#8b949e" text-anchor="middle">Cumulative installs from PyPI • mirrors excluded • source: pypistats.org</text>
<!-- Gridlines & y-labels -->
<line x1="70" y1="280.0" x2="810" y2="280.0" stroke="#21262d" stroke-width="1" stroke-dasharray="2,3"/><line x1="70" y1="239.6" x2="810" y2="239.6" stroke="#21262d" stroke-width="1" stroke-dasharray="2,3"/><line x1="70" y1="199.2" x2="810" y2="199.2" stroke="#21262d" stroke-width="1" stroke-dasharray="2,3"/><line x1="70" y1="158.8" x2="810" y2="158.8" stroke="#21262d" stroke-width="1" stroke-dasharray="2,3"/><line x1="70" y1="118.4" x2="810" y2="118.4" stroke="#21262d" stroke-width="1" stroke-dasharray="2,3"/><line x1="70" y1="78.0" x2="810" y2="78.0" stroke="#21262d" stroke-width="1" stroke-dasharray="2,3"/>
<text x="62" y="284.0" font-family="'Segoe UI', Arial, sans-serif" font-size="10" fill="#8b949e" text-anchor="end">0</text><text x="62" y="243.6" font-family="'Segoe UI', Arial, sans-serif" font-size="10" fill="#8b949e" text-anchor="end">1,000</text><text x="62" y="203.2" font-family="'Segoe UI', Arial, sans-serif" font-size="10" fill="#8b949e" text-anchor="end">2,000</text><text x="62" y="162.8" font-family="'Segoe UI', Arial, sans-serif" font-size="10" fill="#8b949e" text-anchor="end">3,000</text><text x="62" y="122.4" font-family="'Segoe UI', Arial, sans-serif" font-size="10" fill="#8b949e" text-anchor="end">4,000</text><text x="62" y="82.0" font-family="'Segoe UI', Arial, sans-serif" font-size="10" fill="#8b949e" text-anchor="end">5,000</text>
<!-- Area fill -->
<path d="M 70.00,280 L 70.00,255.48 L 99.60,244.77 L 129.20,243.48 L 158.80,243.24 L 188.40,241.90 L 218.00,241.22 L 247.60,239.92 L 277.20,236.81 L 306.80,230.35 L 336.40,226.75 L 366.00,215.04 L 395.60,206.84 L 425.20,182.51 L 454.80,172.66 L 484.40,166.76 L 514.00,160.94 L 543.60,159.45 L 573.20,155.89 L 602.80,150.28 L 632.40,141.15 L 662.00,137.87 L 691.60,133.11 L 721.20,128.38 L 750.80,126.80 L 780.40,125.03 L 810.00,119.05 L 810.00,280 Z" fill="url(#areaFill)"/>
<!-- Line -->
<path d="M 70.00,255.48 L 99.60,244.77 L 129.20,243.48 L 158.80,243.24 L 188.40,241.90 L 218.00,241.22 L 247.60,239.92 L 277.20,236.81 L 306.80,230.35 L 336.40,226.75 L 366.00,215.04 L 395.60,206.84 L 425.20,182.51 L 454.80,172.66 L 484.40,166.76 L 514.00,160.94 L 543.60,159.45 L 573.20,155.89 L 602.80,150.28 L 632.40,141.15 L 662.00,137.87 L 691.60,133.11 L 721.20,128.38 L 750.80,126.80 L 780.40,125.03 L 810.00,119.05" fill="none" stroke="#58a6ff" stroke-width="2.5" stroke-linejoin="round" stroke-linecap="round"/>
<!-- Data points -->
<circle cx="70.00" cy="255.48" r="2.5" fill="#58a6ff"/><circle cx="99.60" cy="244.77" r="2.5" fill="#58a6ff"/><circle cx="129.20" cy="243.48" r="2.5" fill="#58a6ff"/><circle cx="158.80" cy="243.24" r="2.5" fill="#58a6ff"/><circle cx="188.40" cy="241.90" r="2.5" fill="#58a6ff"/><circle cx="218.00" cy="241.22" r="2.5" fill="#58a6ff"/><circle cx="247.60" cy="239.92" r="2.5" fill="#58a6ff"/><circle cx="277.20" cy="236.81" r="2.5" fill="#58a6ff"/><circle cx="306.80" cy="230.35" r="2.5" fill="#58a6ff"/><circle cx="336.40" cy="226.75" r="2.5" fill="#58a6ff"/><circle cx="366.00" cy="215.04" r="2.5" fill="#58a6ff"/><circle cx="395.60" cy="206.84" r="2.5" fill="#58a6ff"/><circle cx="425.20" cy="182.51" r="2.5" fill="#58a6ff"/><circle cx="454.80" cy="172.66" r="2.5" fill="#58a6ff"/><circle cx="484.40" cy="166.76" r="2.5" fill="#58a6ff"/><circle cx="514.00" cy="160.94" r="2.5" fill="#58a6ff"/><circle cx="543.60" cy="159.45" r="2.5" fill="#58a6ff"/><circle cx="573.20" cy="155.89" r="2.5" fill="#58a6ff"/><circle cx="602.80" cy="150.28" r="2.5" fill="#58a6ff"/><circle cx="632.40" cy="141.15" r="2.5" fill="#58a6ff"/><circle cx="662.00" cy="137.87" r="2.5" fill="#58a6ff"/><circle cx="691.60" cy="133.11" r="2.5" fill="#58a6ff"/><circle cx="721.20" cy="128.38" r="2.5" fill="#58a6ff"/><circle cx="750.80" cy="126.80" r="2.5" fill="#58a6ff"/><circle cx="780.40" cy="125.03" r="2.5" fill="#58a6ff"/><circle cx="810.00" cy="119.05" r="4" fill="#F2C811"/>
<!-- Last-value callout -->
<rect x="720.0" y="92.0" width="82" height="24" rx="4" fill="#0d1a2a" stroke="#F2C811" stroke-width="1"/>
<text x="761.0" y="108.0" font-family="'Segoe UI', Arial, sans-serif" font-size="12" fill="#F2C811" text-anchor="middle" font-weight="bold">3,984 total</text>
<!-- X-axis labels -->
<text x="70.0" y="298" font-family="'Segoe UI', Arial, sans-serif" font-size="10" fill="#8b949e" text-anchor="middle">Mar 26</text><text x="247.6" y="298" font-family="'Segoe UI', Arial, sans-serif" font-size="10" fill="#8b949e" text-anchor="middle">Apr 01</text><text x="454.8" y="298" font-family="'Segoe UI', Arial, sans-serif" font-size="10" fill="#8b949e" text-anchor="middle">Apr 08</text><text x="632.4" y="298" font-family="'Segoe UI', Arial, sans-serif" font-size="10" fill="#8b949e" text-anchor="middle">Apr 14</text><text x="810.0" y="298" font-family="'Segoe UI', Arial, sans-serif" font-size="10" fill="#8b949e" text-anchor="middle">Apr 20</text>
<!-- Footer: date range -->
<text x="70" y="328" font-family="'Segoe UI', Arial, sans-serif" font-size="10" fill="#8b949e">Mar 26, 2026 → Apr 20, 2026</text>
<text x="810" y="328" font-family="'Segoe UI', Arial, sans-serif" font-size="10" fill="#8b949e" text-anchor="end">26 days of data</text>
</svg>

After

Width:  |  Height:  |  Size: 5.9 KiB

View file

@ -1,220 +0,0 @@
<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>

Before

Width:  |  Height:  |  Size: 19 KiB

View file

@ -1,230 +0,0 @@
<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>

Before

Width:  |  Height:  |  Size: 22 KiB

View file

@ -1,19 +0,0 @@
<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>

Before

Width:  |  Height:  |  Size: 2.1 KiB

View file

@ -1,228 +0,0 @@
<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>

Before

Width:  |  Height:  |  Size: 18 KiB

View file

@ -1,122 +1,7 @@
<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>
<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"/>
<!-- 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 -->
<!-- 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 ===== -->
@ -271,5 +156,4 @@
</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>
</svg>

Before

Width:  |  Height:  |  Size: 25 KiB

After

Width:  |  Height:  |  Size: 13 KiB

View file

@ -1,122 +1,7 @@
<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>
<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"/>
<!-- 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 -->
<!-- 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>
@ -191,6 +76,4 @@
<!-- 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>
</svg>

Before

Width:  |  Height:  |  Size: 18 KiB

After

Width:  |  Height:  |  Size: 5.9 KiB

View file

@ -1,220 +0,0 @@
<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>

Before

Width:  |  Height:  |  Size: 19 KiB

View file

@ -1,3 +0,0 @@
version https://git-lfs.github.com/spec/v1
oid sha256:beaee64113d74512f7b8c24178bba4762145d6a54dd3ec47a64ae2b2706fe033
size 6733336

View file

@ -1,301 +0,0 @@
<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>

Before

Width:  |  Height:  |  Size: 24 KiB

View file

@ -1,129 +1,15 @@
<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">
<svg xmlns="http://www.w3.org/2000/svg" width="850" height="350" viewBox="0 0 850 350">
<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="rl-glow" x1="0%" y1="0%" x2="100%" y2="0%">
<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>
<!-- Full background -->
<rect width="100%" height="100%" fill="#0d1117"/>
<rect width="100%" height="100%" fill="#0d1117" rx="8"/>
<!-- ==================== 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 -->
<!-- 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>
@ -237,6 +123,4 @@
<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>
</svg>

Before

Width:  |  Height:  |  Size: 20 KiB

After

Width:  |  Height:  |  Size: 7.8 KiB

View file

@ -1,129 +1,15 @@
<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">
<svg xmlns="http://www.w3.org/2000/svg" width="850" height="280" viewBox="0 0 850 280">
<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="rw-glow" x1="0%" y1="0%" x2="100%" y2="0%">
<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>
<!-- Full background -->
<rect width="100%" height="100%" fill="#0d1117"/>
<rect width="100%" height="100%" fill="#0d1117" rx="8"/>
<!-- ==================== 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 -->
<!-- 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>
@ -235,6 +121,4 @@
<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>
</svg>

Before

Width:  |  Height:  |  Size: 20 KiB

After

Width:  |  Height:  |  Size: 8.1 KiB

View file

@ -1,122 +1,7 @@
<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>
<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"/>
<!-- 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 -->
<!-- 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>
@ -163,6 +48,4 @@
<!-- 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>
</svg>

Before

Width:  |  Height:  |  Size: 16 KiB

After

Width:  |  Height:  |  Size: 4.1 KiB

View file

@ -1,129 +1,15 @@
<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">
<svg xmlns="http://www.w3.org/2000/svg" width="850" height="480" viewBox="0 0 850 480">
<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="glow-line" x1="0%" y1="0%" x2="100%" y2="0%">
<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>
<!-- Full background -->
<rect width="100%" height="100%" fill="#0d1117"/>
<rect width="100%" height="100%" fill="#0d1117" rx="8"/>
<!-- ==================== 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 -->
<!-- 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>
@ -251,6 +137,4 @@
<!-- 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>
</svg>

Before

Width:  |  Height:  |  Size: 24 KiB

After

Width:  |  Height:  |  Size: 12 KiB

View file

@ -1,123 +1,9 @@
<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>
<svg xmlns="http://www.w3.org/2000/svg" width="850" height="300" viewBox="0 0 850 300">
<!-- Full background -->
<rect width="100%" height="100%" fill="#0d1117"/>
<!-- BACKGROUND -->
<rect width="100%" height="100%" fill="#0d1117" rx="8"/>
<!-- ==================== 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 -->
<!-- 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 ===================== -->
@ -198,5 +84,4 @@
<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>
</svg>

Before

Width:  |  Height:  |  Size: 17 KiB

After

Width:  |  Height:  |  Size: 5.2 KiB

View file

@ -1,186 +0,0 @@
<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>

Before

Width:  |  Height:  |  Size: 16 KiB

View file

@ -1,122 +1,7 @@
<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>
<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"/>
<!-- 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 -->
<!-- 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>
@ -357,6 +242,4 @@
<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>
</svg>

Before

Width:  |  Height:  |  Size: 28 KiB

After

Width:  |  Height:  |  Size: 16 KiB

View file

@ -1,244 +0,0 @@
<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>

Before

Width:  |  Height:  |  Size: 22 KiB

View file

@ -1,958 +0,0 @@
# 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

@ -1,187 +0,0 @@
"""
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()

View file

@ -1,3 +0,0 @@
version https://git-lfs.github.com/spec/v1
oid sha256:06197024146790a435df9df5b1e3d92411ba91d9e10d838b1c5cb0454db30412
size 325045

View file

@ -1,3 +0,0 @@
version https://git-lfs.github.com/spec/v1
oid sha256:b695582857e6973c41e132f965f3b5482ccf8d4c1706c91e0135e6b185b39e92
size 428734

View file

@ -1,3 +0,0 @@
version https://git-lfs.github.com/spec/v1
oid sha256:af234a800d37e0dc6ef678cd8be4f121761a19a17ae8a89e71e874d31ccccd37
size 510647

View file

@ -1,3 +0,0 @@
version https://git-lfs.github.com/spec/v1
oid sha256:b9a8870d69511c79250e73ed97c7a341f9f5e6bab8f56be3bc0c07d4b658ad9c
size 396878

View file

@ -1,3 +0,0 @@
version https://git-lfs.github.com/spec/v1
oid sha256:216df8b05012f32ab08b9b324d8b6cc3ed6e7e9a260d22e40551bfde2dd6560b
size 496543

View file

@ -1,3 +0,0 @@
version https://git-lfs.github.com/spec/v1
oid sha256:16370f39d88819cd2ebbeeef388d4dbb4a74d2e27806541cf22405588eab9bec
size 494548

View file

@ -1,3 +0,0 @@
version https://git-lfs.github.com/spec/v1
oid sha256:68d66c38405f639830546c28a67f4b6661918db8eb1a2e62987ab308a343ac11
size 477232

View file

@ -1,3 +0,0 @@
version https://git-lfs.github.com/spec/v1
oid sha256:228792a25890628147488724cfc0ae70d519dba2ec6d245ece14f17fe793d5ed
size 376799

View file

@ -1,3 +0,0 @@
version https://git-lfs.github.com/spec/v1
oid sha256:321721da311ef30e92200fa2b054adf8871b5b20aa28c42593f20c1cd63e2ed9
size 338421

View file

@ -1,3 +0,0 @@
version https://git-lfs.github.com/spec/v1
oid sha256:9db7013eb897bbb0192a5875eff334990b6d822a37bc1be7e01fbbeb557b236c
size 519290

View file

@ -1,3 +0,0 @@
version https://git-lfs.github.com/spec/v1
oid sha256:068efbffa6996fb29e162275cf4f4a599d27ccb41212bb47f82124de0bb5e702
size 459129

View file

@ -1,3 +0,0 @@
version https://git-lfs.github.com/spec/v1
oid sha256:78425c8a90796e9c34166d9c52fb5f739c22712c02c9c42ecb114379a146d235
size 464443

View file

@ -1,3 +0,0 @@
version https://git-lfs.github.com/spec/v1
oid sha256:a58af21589a5a42480d5c0fa0f79d59bd0b2e5be2545cddc61d257675d80c250
size 522021

View file

@ -1,3 +0,0 @@
version https://git-lfs.github.com/spec/v1
oid sha256:ac4141e141604242072b56d788e6244519c681e5115a1b6f815f9bee2b078f0e
size 430420

View file

@ -1,3 +0,0 @@
version https://git-lfs.github.com/spec/v1
oid sha256:b7abc15cfefab3e2e6024f542df3d7fef885b46a30a845e13f3eb09830b139ad
size 534414

View file

@ -1,3 +0,0 @@
version https://git-lfs.github.com/spec/v1
oid sha256:a877f87ab6156cc879edd16764150b89c1cda7f5f63cbb4ba17dfb2c987302c1
size 378908

View file

@ -1,3 +0,0 @@
version https://git-lfs.github.com/spec/v1
oid sha256:fbf81d066fd27aa38b82f371bf34154dd7cefe98e1a34b536d4ff61249b1908d
size 345944

View file

@ -1,3 +0,0 @@
version https://git-lfs.github.com/spec/v1
oid sha256:b46f6f8b61a562408e571e442fb2bd40502c6c4f8b9eef9bda8b20972e889b99
size 525757

View file

@ -1,3 +0,0 @@
version https://git-lfs.github.com/spec/v1
oid sha256:dd521a25791eb6f492f97f797c20ea066b6315a939ba47efb24c29858340ef50
size 477694

View file

@ -1,3 +0,0 @@
version https://git-lfs.github.com/spec/v1
oid sha256:e46430adbe37f97fcc03305a429924449e0dc9255027454b69f08b106177e9ed
size 1191659

View file

@ -1,3 +0,0 @@
version https://git-lfs.github.com/spec/v1
oid sha256:f5a0596d5760e01ad55ceea261353070a6d7beaf0a32d5f11ae6b069e11f3a27
size 358366

View file

@ -1,3 +0,0 @@
version https://git-lfs.github.com/spec/v1
oid sha256:544dae4b02f5baf7dde1599d6b9b34af234e325a3f297113e9a297e48feaaee1
size 360196

View file

@ -1,3 +0,0 @@
version https://git-lfs.github.com/spec/v1
oid sha256:4804a7a74dfc7df1d9f200cca3eb985ea6d999d284062d03b5609852592fb7c4
size 485307

View file

@ -1,3 +0,0 @@
version https://git-lfs.github.com/spec/v1
oid sha256:38cddcbe4ca8bb2f2429ad861603f0498280aedf7442f3b1a0674fb480b3188e
size 521526

View file

@ -1,3 +0,0 @@
version https://git-lfs.github.com/spec/v1
oid sha256:ac1747c2de360727fc5b6b5840ebe683e2bcfb2ba94b7e9ba4b4d0806f8447f8
size 286663

View file

@ -1,3 +0,0 @@
version https://git-lfs.github.com/spec/v1
oid sha256:0bc54a4040abcf22ee6942ed5c69f1a571fca02ff239753cd3e43219e545ac46
size 286221

View file

@ -1,3 +0,0 @@
version https://git-lfs.github.com/spec/v1
oid sha256:0e2f009f6a1bf04a562642d3068c2a3ad0cd3e81ab90f4705f23f8835ca73a62
size 481789

View file

@ -1,3 +0,0 @@
version https://git-lfs.github.com/spec/v1
oid sha256:8e8dd2e17ad6fb400f0d9e09efbbbedc365830a5e8a817adaf6a9e017ea0b7b0
size 367239

View file

@ -1,24 +0,0 @@
<!-- 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

@ -1,27 +0,0 @@
<!-- 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

@ -1,24 +0,0 @@
<!-- 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

@ -1,25 +0,0 @@
<!-- 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

@ -1,29 +0,0 @@
<!-- 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

@ -1,30 +0,0 @@
<!-- 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

@ -1,26 +0,0 @@
<!-- 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

@ -1,26 +0,0 @@
<!-- 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

@ -1,25 +0,0 @@
<!-- 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

@ -1,26 +0,0 @@
<!-- 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

@ -1,26 +0,0 @@
<!-- 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

@ -1,23 +0,0 @@
<!-- 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

@ -1,27 +0,0 @@
<!-- 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

@ -1,21 +0,0 @@
<!-- 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

@ -1,25 +0,0 @@
<!-- 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

@ -1,31 +0,0 @@
<!-- 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

@ -1,22 +0,0 @@
<!-- 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

@ -1,19 +0,0 @@
<!-- 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

@ -1,107 +0,0 @@
<!-- 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

@ -1,30 +0,0 @@
<!-- 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

@ -1,26 +0,0 @@
<!-- 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

@ -1,66 +0,0 @@
# 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

@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
[project]
name = "pbi-cli-tool"
version = "3.10.3"
version = "3.10.10"
description = "CLI for Power BI semantic models and PBIR reports - direct .NET connection for token-efficient AI agent usage"
readme = "README.pypi.md"
license = "MIT AND LicenseRef-Microsoft-AS-Client-Libraries"

View file

@ -0,0 +1,220 @@
"""Regenerate assets/downloads-chart.svg from pypistats.org data.
Fetches daily download counts for pbi-cli-tool (mirrors excluded), computes a
cumulative series, and writes a dark-theme SVG line chart that matches the
visual style of the other assets in this repo.
Runs with stdlib only so it works in CI without extra dependencies.
Usage:
python scripts/generate_downloads_chart.py
"""
from __future__ import annotations
import json
import sys
import urllib.request
from datetime import date, datetime
from pathlib import Path
PACKAGE = "pbi-cli-tool"
API_URL = f"https://pypistats.org/api/packages/{PACKAGE}/overall?mirrors=false"
OUTPUT_PATH = Path(__file__).resolve().parent.parent / "assets" / "downloads-chart.svg"
# Chart geometry
WIDTH = 850
HEIGHT = 340
PLOT_LEFT = 70
PLOT_RIGHT = 810
PLOT_TOP = 78
PLOT_BOTTOM = 280
# Colors (match stats.svg / banner.svg palette)
BG = "#0d1117"
ACCENT_YELLOW = "#F2C811"
LINE_BLUE = "#58a6ff"
GRID = "#21262d"
TEXT_PRIMARY = "#c9d1d9"
TEXT_SECONDARY = "#8b949e"
CARD_BG = "#0d1a2a"
def fetch_downloads() -> list[tuple[date, int]]:
"""Return sorted list of (date, daily_downloads) from pypistats."""
with urllib.request.urlopen(API_URL, timeout=30) as resp:
payload = json.loads(resp.read())
rows = [
(datetime.strptime(r["date"], "%Y-%m-%d").date(), int(r["downloads"]))
for r in payload["data"]
if r["category"] == "without_mirrors"
]
rows.sort(key=lambda item: item[0])
return rows
def to_cumulative(rows: list[tuple[date, int]]) -> list[tuple[date, int]]:
total = 0
out: list[tuple[date, int]] = []
for d, n in rows:
total += n
out.append((d, total))
return out
def nice_ceiling(value: int) -> int:
"""Round up to a nice axis maximum (1-2-5 * 10^n)."""
if value <= 0:
return 10
import math
exp = math.floor(math.log10(value))
base = 10**exp
for step in (1, 2, 2.5, 5, 10):
candidate = int(step * base)
if candidate >= value:
return candidate
return int(10 * base)
def build_svg(series: list[tuple[date, int]]) -> str:
if not series:
raise RuntimeError("No download data returned from pypistats")
n = len(series)
max_val = series[-1][1]
y_max = nice_ceiling(int(max_val * 1.15))
plot_width = PLOT_RIGHT - PLOT_LEFT
plot_height = PLOT_BOTTOM - PLOT_TOP
def x_at(i: int) -> float:
if n == 1:
return PLOT_LEFT + plot_width / 2
return PLOT_LEFT + (i / (n - 1)) * plot_width
def y_at(v: int) -> float:
return PLOT_BOTTOM - (v / y_max) * plot_height
points = [(x_at(i), y_at(v)) for i, (_, v) in enumerate(series)]
line_path = "M " + " L ".join(f"{x:.2f},{y:.2f}" for x, y in points)
area_path = (
f"M {points[0][0]:.2f},{PLOT_BOTTOM} "
+ "L "
+ " L ".join(f"{x:.2f},{y:.2f}" for x, y in points)
+ f" L {points[-1][0]:.2f},{PLOT_BOTTOM} Z"
)
# Y-axis gridlines (5 steps)
gridlines = []
y_labels = []
for step in range(6):
v = y_max * step / 5
y = PLOT_BOTTOM - (v / y_max) * plot_height
gridlines.append(
f'<line x1="{PLOT_LEFT}" y1="{y:.1f}" x2="{PLOT_RIGHT}" y2="{y:.1f}" '
f'stroke="{GRID}" stroke-width="1" stroke-dasharray="2,3"/>'
)
label = f"{int(v):,}"
y_labels.append(
f'<text x="{PLOT_LEFT - 8}" y="{y + 4:.1f}" font-family="\'Segoe UI\', Arial, sans-serif" '
f'font-size="10" fill="{TEXT_SECONDARY}" text-anchor="end">{label}</text>'
)
# X-axis labels: first, last, and ~3 intermediate
label_indices = sorted({0, n - 1, n // 4, n // 2, (3 * n) // 4})
x_labels = []
for i in label_indices:
d, _ = series[i]
x = x_at(i)
x_labels.append(
f'<text x="{x:.1f}" y="{PLOT_BOTTOM + 18}" font-family="\'Segoe UI\', Arial, sans-serif" '
f'font-size="10" fill="{TEXT_SECONDARY}" text-anchor="middle">{d.strftime("%b %d")}</text>'
)
# Data point dots + highlight on last
dots = []
for i, (x, y) in enumerate(points):
is_last = i == n - 1
r = 4 if is_last else 2.5
fill = ACCENT_YELLOW if is_last else LINE_BLUE
dots.append(f'<circle cx="{x:.2f}" cy="{y:.2f}" r="{r}" fill="{fill}"/>')
# Last-value callout
last_x, last_y = points[-1]
last_val = series[-1][1]
callout_x = min(last_x + 10, PLOT_RIGHT - 90)
callout_y = max(last_y - 28, PLOT_TOP + 14)
# Summary stats
first_date = series[0][0].strftime("%b %d, %Y")
last_date = series[-1][0].strftime("%b %d, %Y")
total_str = f"{max_val:,}"
svg = f"""<svg xmlns="http://www.w3.org/2000/svg" width="{WIDTH}" height="{HEIGHT}" viewBox="0 0 {WIDTH} {HEIGHT}">
<defs>
<linearGradient id="areaFill" x1="0" y1="0" x2="0" y2="1">
<stop offset="0%" stop-color="{LINE_BLUE}" stop-opacity="0.45"/>
<stop offset="100%" stop-color="{LINE_BLUE}" stop-opacity="0"/>
</linearGradient>
</defs>
<!-- Background -->
<rect width="100%" height="100%" fill="{BG}" rx="8"/>
<!-- Title -->
<text x="{WIDTH // 2}" y="33" font-family="'Segoe UI', Arial, sans-serif" font-size="17" fill="{ACCENT_YELLOW}" text-anchor="middle" font-weight="bold">pbi-cli Downloads Over Time</text>
<text x="{WIDTH // 2}" y="52" font-family="'Segoe UI', Arial, sans-serif" font-size="11" fill="{TEXT_SECONDARY}" text-anchor="middle">Cumulative installs from PyPI \u2022 mirrors excluded \u2022 source: pypistats.org</text>
<!-- Gridlines & y-labels -->
{"".join(gridlines)}
{"".join(y_labels)}
<!-- Area fill -->
<path d="{area_path}" fill="url(#areaFill)"/>
<!-- Line -->
<path d="{line_path}" fill="none" stroke="{LINE_BLUE}" stroke-width="2.5" stroke-linejoin="round" stroke-linecap="round"/>
<!-- Data points -->
{"".join(dots)}
<!-- Last-value callout -->
<rect x="{callout_x:.1f}" y="{callout_y:.1f}" width="82" height="24" rx="4" fill="{CARD_BG}" stroke="{ACCENT_YELLOW}" stroke-width="1"/>
<text x="{callout_x + 41:.1f}" y="{callout_y + 16:.1f}" font-family="'Segoe UI', Arial, sans-serif" font-size="12" fill="{ACCENT_YELLOW}" text-anchor="middle" font-weight="bold">{total_str} total</text>
<!-- X-axis labels -->
{"".join(x_labels)}
<!-- Footer: date range -->
<text x="{PLOT_LEFT}" y="{HEIGHT - 12}" font-family="'Segoe UI', Arial, sans-serif" font-size="10" fill="{TEXT_SECONDARY}">{first_date} \u2192 {last_date}</text>
<text x="{PLOT_RIGHT}" y="{HEIGHT - 12}" font-family="'Segoe UI', Arial, sans-serif" font-size="10" fill="{TEXT_SECONDARY}" text-anchor="end">{n} days of data</text>
</svg>
"""
return svg
def main() -> int:
try:
daily = fetch_downloads()
except Exception as exc: # noqa: BLE001
print(f"Failed to fetch pypistats data: {exc}", file=sys.stderr)
return 1
if not daily:
print("pypistats returned no rows", file=sys.stderr)
return 1
cumulative = to_cumulative(daily)
svg = build_svg(cumulative)
OUTPUT_PATH.parent.mkdir(parents=True, exist_ok=True)
OUTPUT_PATH.write_text(svg, encoding="utf-8")
print(f"Wrote {OUTPUT_PATH} ({len(cumulative)} days, {cumulative[-1][1]:,} total downloads)")
return 0
if __name__ == "__main__":
sys.exit(main())

View file

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

View file

@ -62,7 +62,7 @@ def run_command(
def _is_report_write(result: Any) -> bool:
"""Check if the result indicates a report-layer write."""
"""Check if the result indicates a report-layer write that should trigger sync."""
if not isinstance(result, dict):
return False
status = result.get("status", "")
@ -74,11 +74,13 @@ def _is_report_write(result: Any) -> bool:
if click_ctx is None:
return False
# Walk up to the group to find report_path
# Walk up to the group to find report_path; also check for --no-sync flag
parent = click_ctx.parent
while parent is not None:
obj = parent.obj
if isinstance(obj, dict) and "report_path" in obj:
if obj.get("no_sync", False):
return False
return True
parent = parent.parent
return False

View file

@ -15,11 +15,18 @@ from pbi_cli.main import PbiContext, pass_context
default=None,
help="Path to .Report folder (auto-detected from CWD if omitted).",
)
@click.option(
"--no-sync",
is_flag=True,
default=False,
help="Skip Desktop auto-sync after write commands. Use for scripted multi-step builds.",
)
@click.pass_context
def bookmarks(ctx: click.Context, path: str | None) -> None:
def bookmarks(ctx: click.Context, path: str | None, no_sync: bool) -> None:
"""Manage report bookmarks."""
ctx.ensure_object(dict)
ctx.obj["report_path"] = path
ctx.obj["no_sync"] = no_sync
@bookmarks.command(name="list")

View file

@ -4,6 +4,7 @@ from __future__ import annotations
import click
from pbi_cli.commands.skills_cmd import _get_bundled_skills, _is_installed
from pbi_cli.core.connection_store import (
ConnectionInfo,
add_connection,
@ -74,8 +75,6 @@ def connect(
)
else:
print_success(f"Connected: {effective_name} ({data_source})")
from pbi_cli.commands.skills_cmd import _is_installed, _get_bundled_skills
bundled = _get_bundled_skills()
any_missing = any(not _is_installed(name) for name in bundled)
if any_missing:
@ -191,6 +190,3 @@ def _auto_discover_data_source() -> str:
data_source = f"localhost:{port}"
print_info(f"Auto-detected Power BI Desktop on {data_source}")
return data_source

View file

@ -15,11 +15,18 @@ from pbi_cli.main import PbiContext, pass_context
default=None,
help="Path to .Report folder (auto-detected from CWD if omitted).",
)
@click.option(
"--no-sync",
is_flag=True,
default=False,
help="Skip Desktop auto-sync after write commands. Use for scripted multi-step builds.",
)
@click.pass_context
def filters(ctx: click.Context, path: str | None) -> None:
def filters(ctx: click.Context, path: str | None, no_sync: bool) -> None:
"""Manage page and visual filters."""
ctx.ensure_object(dict)
ctx.obj["report_path"] = path
ctx.obj["no_sync"] = no_sync
@filters.command(name="list")

View file

@ -17,11 +17,18 @@ from pbi_cli.main import PbiContext, pass_context
default=None,
help="Path to .Report folder (auto-detected from CWD if omitted).",
)
@click.option(
"--no-sync",
is_flag=True,
default=False,
help="Skip Desktop auto-sync after write commands. Use for scripted multi-step builds.",
)
@click.pass_context
def report(ctx: click.Context, path: str | None) -> None:
def report(ctx: click.Context, path: str | None, no_sync: bool) -> None:
"""Manage Power BI PBIR reports (pages, themes, validation)."""
ctx.ensure_object(dict)
ctx.obj["report_path"] = path
ctx.obj["no_sync"] = no_sync
@report.command()
@ -195,9 +202,19 @@ def diff_theme(ctx: PbiContext, click_ctx: click.Context, file: str) -> None:
@report.command(name="set-background")
@click.argument("page_name")
@click.option("--color", "-c", required=True, help="Hex color e.g. '#F8F9FA'.")
@click.option(
"--transparency",
"-t",
default=0,
show_default=True,
type=click.IntRange(0, 100),
help="Transparency 0 (opaque) to 100 (invisible). Defaults to 0 so the color is visible.",
)
@click.pass_context
@pass_context
def set_background(ctx: PbiContext, click_ctx: click.Context, page_name: str, color: str) -> None:
def set_background(
ctx: PbiContext, click_ctx: click.Context, page_name: str, color: str, transparency: int
) -> 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
@ -210,6 +227,7 @@ def set_background(ctx: PbiContext, click_ctx: click.Context, page_name: str, co
definition_path=definition_path,
page_name=page_name,
color=color,
transparency=transparency,
)

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