bi-superpowers 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude-plugin/marketplace.json +31 -0
- package/.claude-plugin/plugin.json +34 -0
- package/.claude-plugin/skill-manifest.json +79 -0
- package/.mcp.json +13 -0
- package/.plugin/plugin.json +14 -0
- package/LICENSE +21 -0
- package/README.md +849 -0
- package/bin/build-plugin.js +97 -0
- package/bin/cli.js +891 -0
- package/bin/commands/autoupdate.js +128 -0
- package/bin/commands/build-desktop.js +368 -0
- package/bin/commands/create-from-template.js +165 -0
- package/bin/commands/diff.js +435 -0
- package/bin/commands/install.js +542 -0
- package/bin/commands/lint.js +441 -0
- package/bin/commands/mcp-setup.js +255 -0
- package/bin/commands/session-update.js +204 -0
- package/bin/commands/smoke-test.js +20 -0
- package/bin/commands/uninstall.js +611 -0
- package/bin/commands/update-check.js +427 -0
- package/bin/commands/validate-cases.js +264 -0
- package/bin/commands/validate-projects.js +426 -0
- package/bin/commands/watch.js +251 -0
- package/bin/lib/agents.js +62 -0
- package/bin/lib/base-template-smoke.js +299 -0
- package/bin/lib/claude-hooks.js +160 -0
- package/bin/lib/generators/claude-plugin.js +529 -0
- package/bin/lib/generators/index.js +116 -0
- package/bin/lib/generators/shared.js +257 -0
- package/bin/lib/mcp-config.js +835 -0
- package/bin/lib/microsoft-mcp.js +206 -0
- package/bin/lib/powerbi-mcp-session.js +140 -0
- package/bin/lib/skills.js +164 -0
- package/bin/lib/template-scaffold.js +366 -0
- package/bin/mcp/powerbi-modeling-launcher.js +42 -0
- package/bin/postinstall.js +50 -0
- package/bin/utils/mcp-detect.js +346 -0
- package/bin/utils/tui.js +314 -0
- package/commands/bi-connect.md +520 -0
- package/commands/bi-dax.md +464 -0
- package/commands/bi-kickoff.md +550 -0
- package/commands/bi-modeling.md +485 -0
- package/commands/bi-performance.md +521 -0
- package/commands/bi-powerquery.md +229 -0
- package/commands/bi-refactor.md +249 -0
- package/commands/bi-scorecard.md +268 -0
- package/commands/bi-start.md +272 -0
- package/config.example.json +23 -0
- package/config.json +23 -0
- package/desktop-extension/manifest.json +30 -0
- package/desktop-extension/package.json +10 -0
- package/desktop-extension/server.js +137 -0
- package/package.json +94 -0
- package/skills/bi-connect/SKILL.md +522 -0
- package/skills/bi-connect/scripts/update-check.js +427 -0
- package/skills/bi-dax/SKILL.md +466 -0
- package/skills/bi-dax/scripts/update-check.js +427 -0
- package/skills/bi-kickoff/SKILL.md +552 -0
- package/skills/bi-kickoff/references/flow.html +78 -0
- package/skills/bi-kickoff/references/flow.md +62 -0
- package/skills/bi-kickoff/scripts/update-check.js +427 -0
- package/skills/bi-modeling/SKILL.md +487 -0
- package/skills/bi-modeling/scripts/update-check.js +427 -0
- package/skills/bi-performance/SKILL.md +523 -0
- package/skills/bi-performance/scripts/install-tabular-editor.ps1 +159 -0
- package/skills/bi-performance/scripts/run-bpa.ps1 +265 -0
- package/skills/bi-performance/scripts/update-check.js +427 -0
- package/skills/bi-powerquery/SKILL.md +231 -0
- package/skills/bi-powerquery/references/base-template-data-contract.md +323 -0
- package/skills/bi-powerquery/references/power-query-standards.md +74 -0
- package/skills/bi-powerquery/scripts/new-powerquery-staging.ps1 +371 -0
- package/skills/bi-powerquery/scripts/test-powerquery-contract.ps1 +225 -0
- package/skills/bi-powerquery/scripts/update-check.js +427 -0
- package/skills/bi-refactor/SKILL.md +251 -0
- package/skills/bi-refactor/references/flow.md +27 -0
- package/skills/bi-refactor/scripts/update-check.js +427 -0
- package/skills/bi-scorecard/SKILL.md +270 -0
- package/skills/bi-scorecard/examples/base-template-scorecard-overlay.json +82 -0
- package/skills/bi-scorecard/scripts/new-scorecard-blueprint-from-base-template.ps1 +124 -0
- package/skills/bi-scorecard/scripts/powerbi-goal-status-rules-api.ps1 +39 -0
- package/skills/bi-scorecard/scripts/powerbi-goal-values-api.ps1 +48 -0
- package/skills/bi-scorecard/scripts/powerbi-goals-api.ps1 +68 -0
- package/skills/bi-scorecard/scripts/powerbi-rest-common.ps1 +197 -0
- package/skills/bi-scorecard/scripts/powerbi-scorecards-api.ps1 +53 -0
- package/skills/bi-scorecard/scripts/update-check.js +427 -0
- package/skills/bi-start/SKILL.md +274 -0
- package/skills/bi-start/scripts/update-check.js +427 -0
- package/src/content/base.md +197 -0
- package/src/content/mcp-requirements.json +57 -0
- package/src/content/routing.md +201 -0
- package/src/content/skills/bi-connect.md +493 -0
- package/src/content/skills/bi-dax.md +437 -0
- package/src/content/skills/bi-kickoff/SKILL.md +523 -0
- package/src/content/skills/bi-kickoff/references/flow.html +78 -0
- package/src/content/skills/bi-kickoff/references/flow.md +62 -0
- package/src/content/skills/bi-modeling.md +458 -0
- package/src/content/skills/bi-performance/SKILL.md +494 -0
- package/src/content/skills/bi-performance/scripts/install-tabular-editor.ps1 +159 -0
- package/src/content/skills/bi-performance/scripts/run-bpa.ps1 +265 -0
- package/src/content/skills/bi-powerquery/SKILL.md +202 -0
- package/src/content/skills/bi-powerquery/references/base-template-data-contract.md +323 -0
- package/src/content/skills/bi-powerquery/references/power-query-standards.md +74 -0
- package/src/content/skills/bi-powerquery/scripts/new-powerquery-staging.ps1 +371 -0
- package/src/content/skills/bi-powerquery/scripts/test-powerquery-contract.ps1 +225 -0
- package/src/content/skills/bi-refactor/SKILL.md +222 -0
- package/src/content/skills/bi-refactor/references/flow.md +27 -0
- package/src/content/skills/bi-scorecard/SKILL.md +241 -0
- package/src/content/skills/bi-scorecard/examples/base-template-scorecard-blueprint.expected.json +105 -0
- package/src/content/skills/bi-scorecard/examples/base-template-scorecard-overlay.json +82 -0
- package/src/content/skills/bi-scorecard/scripts/new-scorecard-blueprint-from-base-template.ps1 +124 -0
- package/src/content/skills/bi-scorecard/scripts/powerbi-goal-status-rules-api.ps1 +39 -0
- package/src/content/skills/bi-scorecard/scripts/powerbi-goal-values-api.ps1 +48 -0
- package/src/content/skills/bi-scorecard/scripts/powerbi-goals-api.ps1 +68 -0
- package/src/content/skills/bi-scorecard/scripts/powerbi-rest-common.ps1 +197 -0
- package/src/content/skills/bi-scorecard/scripts/powerbi-scorecards-api.ps1 +53 -0
- package/src/content/skills/bi-start.md +266 -0
- package/templates/base-template/AGENTS.md +33 -0
- package/templates/base-template/base-template.Report/.platform +11 -0
- package/templates/base-template/base-template.Report/StaticResources/RegisteredResources/BISuperpowers.json +3888 -0
- package/templates/base-template/base-template.Report/StaticResources/SharedResources/BaseThemes/CY18SU07.json +177 -0
- package/templates/base-template/base-template.Report/StaticResources/SharedResources/BaseThemes/Fluent2-CY26SU03.json +4104 -0
- package/templates/base-template/base-template.Report/StaticResources/SharedResources/BuiltInThemes/AccessibleCityPark.json +26 -0
- package/templates/base-template/base-template.Report/StaticResources/SharedResources/BuiltInThemes/AccessibleDefault.json +26 -0
- package/templates/base-template/base-template.Report/StaticResources/SharedResources/BuiltInThemes/AccessibleNeutral.json +26 -0
- package/templates/base-template/base-template.Report/StaticResources/SharedResources/BuiltInThemes/AccessibleOrchid.json +26 -0
- package/templates/base-template/base-template.Report/StaticResources/SharedResources/BuiltInThemes/AccessibleTidal.json +26 -0
- package/templates/base-template/base-template.Report/StaticResources/SharedResources/BuiltInThemes/Bloom.json +139 -0
- package/templates/base-template/base-template.Report/StaticResources/SharedResources/BuiltInThemes/CityPark.json +40 -0
- package/templates/base-template/base-template.Report/StaticResources/SharedResources/BuiltInThemes/Classroom.json +40 -0
- package/templates/base-template/base-template.Report/StaticResources/SharedResources/BuiltInThemes/ColorblindSafe.json +48 -0
- package/templates/base-template/base-template.Report/StaticResources/SharedResources/BuiltInThemes/CopilotDefault.json +1861 -0
- package/templates/base-template/base-template.Report/StaticResources/SharedResources/BuiltInThemes/Divergent.json +127 -0
- package/templates/base-template/base-template.Report/StaticResources/SharedResources/BuiltInThemes/Electric.json +48 -0
- package/templates/base-template/base-template.Report/StaticResources/SharedResources/BuiltInThemes/Frontier.json +136 -0
- package/templates/base-template/base-template.Report/StaticResources/SharedResources/BuiltInThemes/HighContrast.json +40 -0
- package/templates/base-template/base-template.Report/StaticResources/SharedResources/BuiltInThemes/Highrise.json +41 -0
- package/templates/base-template/base-template.Report/StaticResources/SharedResources/BuiltInThemes/Innovate.json +227 -0
- package/templates/base-template/base-template.Report/StaticResources/SharedResources/BuiltInThemes/NewExecutive.json +41 -0
- package/templates/base-template/base-template.Report/StaticResources/SharedResources/BuiltInThemes/Solar.json +33 -0
- package/templates/base-template/base-template.Report/StaticResources/SharedResources/BuiltInThemes/Storm.json +25 -0
- package/templates/base-template/base-template.Report/StaticResources/SharedResources/BuiltInThemes/Sunset.json +48 -0
- package/templates/base-template/base-template.Report/StaticResources/SharedResources/BuiltInThemes/Temperature.json +33 -0
- package/templates/base-template/base-template.Report/StaticResources/SharedResources/BuiltInThemes/Tidal.json +100 -0
- package/templates/base-template/base-template.Report/StaticResources/SharedResources/BuiltInThemes/Twilight.json +40 -0
- package/templates/base-template/base-template.Report/definition/bookmarks/1d40d43c7ade66e8603c.bookmark.json +2297 -0
- package/templates/base-template/base-template.Report/definition/bookmarks/af068ff51c0ca3089ea7.bookmark.json +2300 -0
- package/templates/base-template/base-template.Report/definition/bookmarks/bookmarks.json +11 -0
- package/templates/base-template/base-template.Report/definition/pages/6a4808bb8bb9166f49ff/page.json +130 -0
- package/templates/base-template/base-template.Report/definition/pages/6a4808bb8bb9166f49ff/visuals/0352fd80d074693a65db/mobile.json +11 -0
- package/templates/base-template/base-template.Report/definition/pages/6a4808bb8bb9166f49ff/visuals/0352fd80d074693a65db/visual.json +669 -0
- package/templates/base-template/base-template.Report/definition/pages/6a4808bb8bb9166f49ff/visuals/1c5a14bf493697344b68/mobile.json +11 -0
- package/templates/base-template/base-template.Report/definition/pages/6a4808bb8bb9166f49ff/visuals/1c5a14bf493697344b68/visual.json +723 -0
- package/templates/base-template/base-template.Report/definition/pages/6a4808bb8bb9166f49ff/visuals/3486cf7624c5b109b4e5/mobile.json +11 -0
- package/templates/base-template/base-template.Report/definition/pages/6a4808bb8bb9166f49ff/visuals/3486cf7624c5b109b4e5/visual.json +333 -0
- package/templates/base-template/base-template.Report/definition/pages/6a4808bb8bb9166f49ff/visuals/4d8b989008edc0db28d1/mobile.json +11 -0
- package/templates/base-template/base-template.Report/definition/pages/6a4808bb8bb9166f49ff/visuals/4d8b989008edc0db28d1/visual.json +109 -0
- package/templates/base-template/base-template.Report/definition/pages/6a4808bb8bb9166f49ff/visuals/55e10ac7d76a1954f94f/mobile.json +31 -0
- package/templates/base-template/base-template.Report/definition/pages/6a4808bb8bb9166f49ff/visuals/55e10ac7d76a1954f94f/visual.json +378 -0
- package/templates/base-template/base-template.Report/definition/pages/6a4808bb8bb9166f49ff/visuals/57f52ecf4490f70e4da1/mobile.json +11 -0
- package/templates/base-template/base-template.Report/definition/pages/6a4808bb8bb9166f49ff/visuals/57f52ecf4490f70e4da1/visual.json +175 -0
- package/templates/base-template/base-template.Report/definition/pages/6a4808bb8bb9166f49ff/visuals/5f4d76bbc870118e9840/mobile.json +11 -0
- package/templates/base-template/base-template.Report/definition/pages/6a4808bb8bb9166f49ff/visuals/5f4d76bbc870118e9840/visual.json +468 -0
- package/templates/base-template/base-template.Report/definition/pages/6a4808bb8bb9166f49ff/visuals/73629e1abebb7a444b59/mobile.json +11 -0
- package/templates/base-template/base-template.Report/definition/pages/6a4808bb8bb9166f49ff/visuals/73629e1abebb7a444b59/visual.json +359 -0
- package/templates/base-template/base-template.Report/definition/pages/6a4808bb8bb9166f49ff/visuals/749cb1388c7e0a88161c/mobile.json +11 -0
- package/templates/base-template/base-template.Report/definition/pages/6a4808bb8bb9166f49ff/visuals/749cb1388c7e0a88161c/visual.json +690 -0
- package/templates/base-template/base-template.Report/definition/pages/6a4808bb8bb9166f49ff/visuals/90677f13cea5d1275990/visual.json +17 -0
- package/templates/base-template/base-template.Report/definition/pages/6a4808bb8bb9166f49ff/visuals/92cf92e3da10493adb78/mobile.json +11 -0
- package/templates/base-template/base-template.Report/definition/pages/6a4808bb8bb9166f49ff/visuals/92cf92e3da10493adb78/visual.json +468 -0
- package/templates/base-template/base-template.Report/definition/pages/6a4808bb8bb9166f49ff/visuals/9fe17b1971f68443fc15/mobile.json +10 -0
- package/templates/base-template/base-template.Report/definition/pages/6a4808bb8bb9166f49ff/visuals/9fe17b1971f68443fc15/visual.json +328 -0
- package/templates/base-template/base-template.Report/definition/pages/6a4808bb8bb9166f49ff/visuals/a30bd0950630ed94e8a3/mobile.json +11 -0
- package/templates/base-template/base-template.Report/definition/pages/6a4808bb8bb9166f49ff/visuals/a30bd0950630ed94e8a3/visual.json +578 -0
- package/templates/base-template/base-template.Report/definition/pages/6a4808bb8bb9166f49ff/visuals/a56e91d9400a835e4814/mobile.json +11 -0
- package/templates/base-template/base-template.Report/definition/pages/6a4808bb8bb9166f49ff/visuals/a56e91d9400a835e4814/visual.json +432 -0
- package/templates/base-template/base-template.Report/definition/pages/6a4808bb8bb9166f49ff/visuals/aded24cd205c0b528642/mobile.json +11 -0
- package/templates/base-template/base-template.Report/definition/pages/6a4808bb8bb9166f49ff/visuals/aded24cd205c0b528642/visual.json +801 -0
- package/templates/base-template/base-template.Report/definition/pages/6a4808bb8bb9166f49ff/visuals/af34b26f14a8a724c9a9/mobile.json +37 -0
- package/templates/base-template/base-template.Report/definition/pages/6a4808bb8bb9166f49ff/visuals/af34b26f14a8a724c9a9/visual.json +1318 -0
- package/templates/base-template/base-template.Report/definition/pages/6a4808bb8bb9166f49ff/visuals/b529688fe5a226643322/visual.json +209 -0
- package/templates/base-template/base-template.Report/definition/pages/6a4808bb8bb9166f49ff/visuals/c4c6f332d05e72e2eb06/mobile.json +11 -0
- package/templates/base-template/base-template.Report/definition/pages/6a4808bb8bb9166f49ff/visuals/c4c6f332d05e72e2eb06/visual.json +174 -0
- package/templates/base-template/base-template.Report/definition/pages/6a4808bb8bb9166f49ff/visuals/fa81f184e2cb0e8b087c/mobile.json +29 -0
- package/templates/base-template/base-template.Report/definition/pages/6a4808bb8bb9166f49ff/visuals/fa81f184e2cb0e8b087c/visual.json +241 -0
- package/templates/base-template/base-template.Report/definition/pages/9a5b670b015cab882629/page.json +130 -0
- package/templates/base-template/base-template.Report/definition/pages/9a5b670b015cab882629/visuals/07e9c4302e29029c5462/mobile.json +11 -0
- package/templates/base-template/base-template.Report/definition/pages/9a5b670b015cab882629/visuals/07e9c4302e29029c5462/visual.json +690 -0
- package/templates/base-template/base-template.Report/definition/pages/9a5b670b015cab882629/visuals/109ceede4bc015b0c006/mobile.json +11 -0
- package/templates/base-template/base-template.Report/definition/pages/9a5b670b015cab882629/visuals/109ceede4bc015b0c006/visual.json +468 -0
- package/templates/base-template/base-template.Report/definition/pages/9a5b670b015cab882629/visuals/118257e006d472277e10/mobile.json +11 -0
- package/templates/base-template/base-template.Report/definition/pages/9a5b670b015cab882629/visuals/118257e006d472277e10/visual.json +359 -0
- package/templates/base-template/base-template.Report/definition/pages/9a5b670b015cab882629/visuals/2caf02e0137c4a1280cc/mobile.json +11 -0
- package/templates/base-template/base-template.Report/definition/pages/9a5b670b015cab882629/visuals/2caf02e0137c4a1280cc/visual.json +669 -0
- package/templates/base-template/base-template.Report/definition/pages/9a5b670b015cab882629/visuals/311e76fe3c9edad68204/mobile.json +11 -0
- package/templates/base-template/base-template.Report/definition/pages/9a5b670b015cab882629/visuals/311e76fe3c9edad68204/visual.json +109 -0
- package/templates/base-template/base-template.Report/definition/pages/9a5b670b015cab882629/visuals/31c21f8cbeb3b208940a/visual.json +209 -0
- package/templates/base-template/base-template.Report/definition/pages/9a5b670b015cab882629/visuals/3ab72c25062437149b03/visual.json +17 -0
- package/templates/base-template/base-template.Report/definition/pages/9a5b670b015cab882629/visuals/5959867442abcb0ce2b3/mobile.json +11 -0
- package/templates/base-template/base-template.Report/definition/pages/9a5b670b015cab882629/visuals/5959867442abcb0ce2b3/visual.json +788 -0
- package/templates/base-template/base-template.Report/definition/pages/9a5b670b015cab882629/visuals/5b96e0f88d192b044a13/mobile.json +11 -0
- package/templates/base-template/base-template.Report/definition/pages/9a5b670b015cab882629/visuals/5b96e0f88d192b044a13/visual.json +592 -0
- package/templates/base-template/base-template.Report/definition/pages/9a5b670b015cab882629/visuals/64e749a63d0786000e22/mobile.json +11 -0
- package/templates/base-template/base-template.Report/definition/pages/9a5b670b015cab882629/visuals/64e749a63d0786000e22/visual.json +468 -0
- package/templates/base-template/base-template.Report/definition/pages/9a5b670b015cab882629/visuals/7ae1ca604edac6586ad0/mobile.json +11 -0
- package/templates/base-template/base-template.Report/definition/pages/9a5b670b015cab882629/visuals/7ae1ca604edac6586ad0/visual.json +1310 -0
- package/templates/base-template/base-template.Report/definition/pages/9a5b670b015cab882629/visuals/840300733885141a6603/mobile.json +11 -0
- package/templates/base-template/base-template.Report/definition/pages/9a5b670b015cab882629/visuals/840300733885141a6603/visual.json +175 -0
- package/templates/base-template/base-template.Report/definition/pages/9a5b670b015cab882629/visuals/a38448cdb203279273d2/mobile.json +11 -0
- package/templates/base-template/base-template.Report/definition/pages/9a5b670b015cab882629/visuals/a38448cdb203279273d2/visual.json +516 -0
- package/templates/base-template/base-template.Report/definition/pages/9a5b670b015cab882629/visuals/d1e86f213a3841d12e20/visual.json +328 -0
- package/templates/base-template/base-template.Report/definition/pages/9a5b670b015cab882629/visuals/d4a484c1bcc8ee3075e2/mobile.json +11 -0
- package/templates/base-template/base-template.Report/definition/pages/9a5b670b015cab882629/visuals/d4a484c1bcc8ee3075e2/visual.json +432 -0
- package/templates/base-template/base-template.Report/definition/pages/9a5b670b015cab882629/visuals/d87cb5cf06acca19bbb5/mobile.json +11 -0
- package/templates/base-template/base-template.Report/definition/pages/9a5b670b015cab882629/visuals/d87cb5cf06acca19bbb5/visual.json +241 -0
- package/templates/base-template/base-template.Report/definition/pages/9a5b670b015cab882629/visuals/e243da2677209ed69408/mobile.json +11 -0
- package/templates/base-template/base-template.Report/definition/pages/9a5b670b015cab882629/visuals/e243da2677209ed69408/visual.json +174 -0
- package/templates/base-template/base-template.Report/definition/pages/9a5b670b015cab882629/visuals/f3aaf24f5b22b67573b0/mobile.json +11 -0
- package/templates/base-template/base-template.Report/definition/pages/9a5b670b015cab882629/visuals/f3aaf24f5b22b67573b0/visual.json +333 -0
- package/templates/base-template/base-template.Report/definition/pages/pages.json +8 -0
- package/templates/base-template/base-template.Report/definition/report.json +89 -0
- package/templates/base-template/base-template.Report/definition/version.json +4 -0
- package/templates/base-template/base-template.Report/definition.pbir +9 -0
- package/templates/base-template/base-template.SemanticModel/.platform +11 -0
- package/templates/base-template/base-template.SemanticModel/definition/cultures/es-AR.tmdl +11185 -0
- package/templates/base-template/base-template.SemanticModel/definition/database.tmdl +3 -0
- package/templates/base-template/base-template.SemanticModel/definition/expressions.tmdl +234 -0
- package/templates/base-template/base-template.SemanticModel/definition/functions.tmdl +637 -0
- package/templates/base-template/base-template.SemanticModel/definition/model.tmdl +82 -0
- package/templates/base-template/base-template.SemanticModel/definition/relationships.tmdl +271 -0
- package/templates/base-template/base-template.SemanticModel/definition/tables/Calendario.tmdl +200 -0
- package/templates/base-template/base-template.SemanticModel/definition/tables/Campa/303/261as.tmdl +75 -0
- package/templates/base-template/base-template.SemanticModel/definition/tables/Canales.tmdl +84 -0
- package/templates/base-template/base-template.SemanticModel/definition/tables/Clientes.tmdl +143 -0
- package/templates/base-template/base-template.SemanticModel/definition/tables/Devoluciones.tmdl +95 -0
- package/templates/base-template/base-template.SemanticModel/definition/tables/Ejecuci/303/263n proyectos.tmdl" +130 -0
- package/templates/base-template/base-template.SemanticModel/definition/tables/Entregas.tmdl +122 -0
- package/templates/base-template/base-template.SemanticModel/definition/tables/Equipos m/303/251tricas.tmdl" +40 -0
- package/templates/base-template/base-template.SemanticModel/definition/tables/Equipos.tmdl +73 -0
- package/templates/base-template/base-template.SemanticModel/definition/tables/Horas.tmdl +122 -0
- package/templates/base-template/base-template.SemanticModel/definition/tables/Interacciones clientes.tmdl +146 -0
- package/templates/base-template/base-template.SemanticModel/definition/tables/Leads.tmdl +119 -0
- package/templates/base-template/base-template.SemanticModel/definition/tables/Monedas.tmdl +44 -0
- package/templates/base-template/base-template.SemanticModel/definition/tables/Movimientos financieros.tmdl +145 -0
- package/templates/base-template/base-template.SemanticModel/definition/tables/M/303/251tricas.tmdl +1294 -0
- package/templates/base-template/base-template.SemanticModel/definition/tables/N/303/263mina.tmdl +110 -0
- package/templates/base-template/base-template.SemanticModel/definition/tables/Oportunidades.tmdl +135 -0
- package/templates/base-template/base-template.SemanticModel/definition/tables/Presupuesto.tmdl +125 -0
- package/templates/base-template/base-template.SemanticModel/definition/tables/Productos.tmdl +98 -0
- package/templates/base-template/base-template.SemanticModel/definition/tables/Proyectos.tmdl +77 -0
- package/templates/base-template/base-template.SemanticModel/definition/tables/Servicios.tmdl +75 -0
- package/templates/base-template/base-template.SemanticModel/definition/tables/Tareas proyecto.tmdl +102 -0
- package/templates/base-template/base-template.SemanticModel/definition/tables/Tipo de cambio.tmdl +67 -0
- package/templates/base-template/base-template.SemanticModel/definition/tables/Ventas.tmdl +180 -0
- package/templates/base-template/base-template.SemanticModel/definition/tables/_Aux An/303/241lisis dimensiones.tmdl" +38 -0
- package/templates/base-template/base-template.SemanticModel/definition/tables/_Aux Comparaciones.tmdl +227 -0
- package/templates/base-template/base-template.SemanticModel/definition/tables/_Aux Compatibilidad m/303/251trica-dimensi/303/263n.tmdl" +68 -0
- package/templates/base-template/base-template.SemanticModel/definition/tables/_Aux Modelo configuraci/303/263n.tmdl" +44 -0
- package/templates/base-template/base-template.SemanticModel/definition/tables/_Aux Modo fechas.tmdl +36 -0
- package/templates/base-template/base-template.SemanticModel/definition/tables/_Aux M/303/251trica-Equipo.tmdl" +102 -0
- package/templates/base-template/base-template.SemanticModel/definition/tables/_Aux Overrides m/303/251trica-dimensi/303/263n.tmdl" +54 -0
- package/templates/base-template/base-template.SemanticModel/definition/tables/_Aux Per/303/255odos.tmdl" +182 -0
- package/templates/base-template/base-template.SemanticModel/definition/tables/_Aux Rango fechas modo.tmdl +36 -0
- package/templates/base-template/base-template.SemanticModel/definition/tables/_Aux Rango fechas.tmdl +27 -0
- package/templates/base-template/base-template.SemanticModel/definition/tables/_Aux Vista de calendario.tmdl +30 -0
- package/templates/base-template/base-template.SemanticModel/definition/tables/_GC C/303/241lculo.tmdl" +70 -0
- package/templates/base-template/base-template.SemanticModel/definition/tables/_GC Eje X.tmdl +63 -0
- package/templates/base-template/base-template.SemanticModel/definition/tables/_GC M/303/251trica.tmdl" +374 -0
- package/templates/base-template/base-template.SemanticModel/definition/tables/_GC Tipo c/303/241lculo.tmdl" +223 -0
- package/templates/base-template/base-template.SemanticModel/definition/tables/_PC Dimensi/303/263n.tmdl" +98 -0
- package/templates/base-template/base-template.SemanticModel/definition/tables/_PC Eje X.tmdl +68 -0
- package/templates/base-template/base-template.SemanticModel/definition/tables//303/223rdenes servicio.tmdl" +151 -0
- package/templates/base-template/base-template.SemanticModel/definition.pbism +5 -0
- package/templates/base-template/base-template.SemanticModel/diagramLayout.json +568 -0
- package/templates/base-template/base-template.pbip +14 -0
- package/templates/base-template/template.manifest.json +41 -0
- package/theme/BISuperpowers.json +3888 -0
|
@@ -0,0 +1,366 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Template Scaffolding
|
|
3
|
+
* ====================
|
|
4
|
+
*
|
|
5
|
+
* Copies a packaged template (under `templates/<name>/`) into a user project
|
|
6
|
+
* as `<targetDir>/pbip-files/<projectName>.*`, renaming the PBIP descriptor,
|
|
7
|
+
* the `.SemanticModel/` and `.Report/` folders, and the internal cross-
|
|
8
|
+
* references that Power BI Desktop uses to wire the report to the model.
|
|
9
|
+
*
|
|
10
|
+
* Why this exists: the `bi-kickoff` skill needs a deterministic, testable
|
|
11
|
+
* way to bootstrap a new project from the BISuperpowers reference template
|
|
12
|
+
* without asking the agent to copy files by hand. PBIP rebinding is fiddly
|
|
13
|
+
* (two JSON files reference each other by relative path, plus two
|
|
14
|
+
* `.platform` files carry a displayName + logicalId) so this lives in code,
|
|
15
|
+
* not in markdown instructions.
|
|
16
|
+
*
|
|
17
|
+
* The function only writes inside `<targetDir>/pbip-files/`. It refuses to
|
|
18
|
+
* overwrite existing PBIP files unless `--force` is passed, regenerates
|
|
19
|
+
* Fabric logicalIds so two projects derived from the same template do not
|
|
20
|
+
* collide in Power BI Service, and skips the template's own `AGENTS.md`
|
|
21
|
+
* because `bi-kickoff` PHASE 5 writes a fresh one with the 8-rule contract.
|
|
22
|
+
*/
|
|
23
|
+
|
|
24
|
+
const fs = require('fs');
|
|
25
|
+
const path = require('path');
|
|
26
|
+
const crypto = require('crypto');
|
|
27
|
+
|
|
28
|
+
const PROJECT_NAME_PATTERN = /^[A-Za-z][A-Za-z0-9_-]*$/;
|
|
29
|
+
const PBIP_SUBFOLDER = 'pbip-files';
|
|
30
|
+
const TEMPLATE_AGENTS_FILE = 'AGENTS.md';
|
|
31
|
+
const SKIPPED_ENTRY_NAMES = new Set(['.pbi', 'DAXQueries']);
|
|
32
|
+
const SKIPPED_FILE_NAMES = new Set(['localSettings.json', 'cache.abf']);
|
|
33
|
+
|
|
34
|
+
function getTemplatesRoot(packageDir) {
|
|
35
|
+
return path.join(packageDir, 'templates');
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
function listTemplates(packageDir) {
|
|
39
|
+
const root = getTemplatesRoot(packageDir);
|
|
40
|
+
if (!fs.existsSync(root)) {
|
|
41
|
+
return [];
|
|
42
|
+
}
|
|
43
|
+
const entries = fs.readdirSync(root, { withFileTypes: true });
|
|
44
|
+
const templates = [];
|
|
45
|
+
for (const entry of entries) {
|
|
46
|
+
if (!entry.isDirectory()) continue;
|
|
47
|
+
const templateDir = path.join(root, entry.name);
|
|
48
|
+
const pbip = findPbipFile(templateDir);
|
|
49
|
+
if (pbip) {
|
|
50
|
+
templates.push({
|
|
51
|
+
name: entry.name,
|
|
52
|
+
pbipFile: path.basename(pbip),
|
|
53
|
+
path: templateDir,
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
return templates.sort((a, b) => a.name.localeCompare(b.name));
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
function findPbipFile(templateDir) {
|
|
61
|
+
if (!fs.existsSync(templateDir)) return null;
|
|
62
|
+
const entries = fs.readdirSync(templateDir);
|
|
63
|
+
const pbip = entries.find((file) => file.toLowerCase().endsWith('.pbip'));
|
|
64
|
+
return pbip ? path.join(templateDir, pbip) : null;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
function validateProjectName(name) {
|
|
68
|
+
if (typeof name !== 'string' || name.length === 0) {
|
|
69
|
+
throw new Error('projectName is required.');
|
|
70
|
+
}
|
|
71
|
+
if (name.length > 64) {
|
|
72
|
+
throw new Error('projectName must be 64 characters or fewer.');
|
|
73
|
+
}
|
|
74
|
+
if (!PROJECT_NAME_PATTERN.test(name)) {
|
|
75
|
+
throw new Error(
|
|
76
|
+
`projectName "${name}" is invalid. Use letters, digits, hyphen, or underscore; must start with a letter.`
|
|
77
|
+
);
|
|
78
|
+
}
|
|
79
|
+
return name;
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
function resolveTemplate(packageDir, templateName) {
|
|
83
|
+
if (!templateName) {
|
|
84
|
+
throw new Error('templateName is required.');
|
|
85
|
+
}
|
|
86
|
+
const templates = listTemplates(packageDir);
|
|
87
|
+
const match = templates.find((t) => t.name === templateName);
|
|
88
|
+
if (!match) {
|
|
89
|
+
const available = templates.map((t) => t.name).join(', ') || '(none)';
|
|
90
|
+
throw new Error(
|
|
91
|
+
`Template "${templateName}" not found in templates/. Available templates: ${available}.`
|
|
92
|
+
);
|
|
93
|
+
}
|
|
94
|
+
return match;
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
function getTemplatePrefix(template) {
|
|
98
|
+
// The .pbip filename without extension is the prefix shared by the
|
|
99
|
+
// SemanticModel and Report folders in every template that follows the
|
|
100
|
+
// BISuperpowers convention.
|
|
101
|
+
return path.basename(template.pbipFile, path.extname(template.pbipFile));
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
function getPbipDestination(targetDir) {
|
|
105
|
+
return path.join(targetDir, PBIP_SUBFOLDER);
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
function scaffoldFromTemplate({
|
|
109
|
+
packageDir,
|
|
110
|
+
templateName,
|
|
111
|
+
targetDir,
|
|
112
|
+
projectName,
|
|
113
|
+
force = false,
|
|
114
|
+
dryRun = false,
|
|
115
|
+
}) {
|
|
116
|
+
const safeName = validateProjectName(projectName);
|
|
117
|
+
const template = resolveTemplate(packageDir, templateName);
|
|
118
|
+
const templatePrefix = getTemplatePrefix(template);
|
|
119
|
+
|
|
120
|
+
if (!targetDir || typeof targetDir !== 'string') {
|
|
121
|
+
throw new Error('targetDir is required.');
|
|
122
|
+
}
|
|
123
|
+
const resolvedTarget = path.resolve(targetDir);
|
|
124
|
+
if (!fs.existsSync(resolvedTarget)) {
|
|
125
|
+
throw new Error(`targetDir does not exist: ${resolvedTarget}`);
|
|
126
|
+
}
|
|
127
|
+
if (!fs.statSync(resolvedTarget).isDirectory()) {
|
|
128
|
+
throw new Error(`targetDir is not a directory: ${resolvedTarget}`);
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
const pbipDir = getPbipDestination(resolvedTarget);
|
|
132
|
+
const existingPbip = fs.existsSync(pbipDir) ? findPbipFile(pbipDir) : null;
|
|
133
|
+
if (existingPbip && !force) {
|
|
134
|
+
throw new Error(
|
|
135
|
+
`Refusing to overwrite existing PBIP file at ${existingPbip}. Pass force=true to replace.`
|
|
136
|
+
);
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
const plannedWrites = [];
|
|
140
|
+
const sourceRoot = template.path;
|
|
141
|
+
const entries = listTemplateEntries(sourceRoot);
|
|
142
|
+
|
|
143
|
+
for (const entry of entries) {
|
|
144
|
+
const sourcePath = path.join(sourceRoot, entry.relativeFromTemplate);
|
|
145
|
+
const destRelative = renameRelative(entry.relativeFromTemplate, templatePrefix, safeName);
|
|
146
|
+
const destPath = path.join(pbipDir, destRelative);
|
|
147
|
+
plannedWrites.push({ sourcePath, destPath, kind: entry.kind, destRelative });
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
if (dryRun) {
|
|
151
|
+
return {
|
|
152
|
+
template: template.name,
|
|
153
|
+
projectName: safeName,
|
|
154
|
+
pbipDir,
|
|
155
|
+
planned: plannedWrites.map((entry) => ({
|
|
156
|
+
from: entry.sourcePath,
|
|
157
|
+
to: entry.destPath,
|
|
158
|
+
kind: entry.kind,
|
|
159
|
+
})),
|
|
160
|
+
written: [],
|
|
161
|
+
dryRun: true,
|
|
162
|
+
};
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
if (force && fs.existsSync(pbipDir)) {
|
|
166
|
+
removeDestinationProject({ pbipDir, projectName: safeName });
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
fs.mkdirSync(pbipDir, { recursive: true });
|
|
170
|
+
|
|
171
|
+
const written = [];
|
|
172
|
+
for (const entry of plannedWrites) {
|
|
173
|
+
if (entry.kind === 'directory') {
|
|
174
|
+
fs.mkdirSync(entry.destPath, { recursive: true });
|
|
175
|
+
written.push({ path: entry.destPath, action: 'mkdir' });
|
|
176
|
+
} else {
|
|
177
|
+
fs.mkdirSync(path.dirname(entry.destPath), { recursive: true });
|
|
178
|
+
const buffer = fs.readFileSync(entry.sourcePath);
|
|
179
|
+
fs.writeFileSync(entry.destPath, buffer);
|
|
180
|
+
written.push({ path: entry.destPath, action: 'copy' });
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
const updates = rewriteInternalReferences({
|
|
185
|
+
pbipDir,
|
|
186
|
+
projectName: safeName,
|
|
187
|
+
templatePrefix,
|
|
188
|
+
});
|
|
189
|
+
|
|
190
|
+
return {
|
|
191
|
+
template: template.name,
|
|
192
|
+
projectName: safeName,
|
|
193
|
+
pbipDir,
|
|
194
|
+
written,
|
|
195
|
+
updatedJson: updates,
|
|
196
|
+
dryRun: false,
|
|
197
|
+
};
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
function listTemplateEntries(sourceRoot) {
|
|
201
|
+
const results = [];
|
|
202
|
+
|
|
203
|
+
function walk(relative) {
|
|
204
|
+
const absolute = path.join(sourceRoot, relative);
|
|
205
|
+
const stat = fs.statSync(absolute);
|
|
206
|
+
if (stat.isDirectory()) {
|
|
207
|
+
if (relative !== '') {
|
|
208
|
+
results.push({ relativeFromTemplate: relative, kind: 'directory' });
|
|
209
|
+
}
|
|
210
|
+
const entries = fs.readdirSync(absolute, { withFileTypes: true });
|
|
211
|
+
for (const entry of entries) {
|
|
212
|
+
if (shouldSkipEntry(entry.name, relative)) continue;
|
|
213
|
+
walk(path.join(relative, entry.name));
|
|
214
|
+
}
|
|
215
|
+
} else if (stat.isFile()) {
|
|
216
|
+
results.push({ relativeFromTemplate: relative, kind: 'file' });
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
const topEntries = fs.readdirSync(sourceRoot, { withFileTypes: true });
|
|
221
|
+
for (const entry of topEntries) {
|
|
222
|
+
if (shouldSkipEntry(entry.name, '')) continue;
|
|
223
|
+
walk(entry.name);
|
|
224
|
+
}
|
|
225
|
+
return results;
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
function shouldSkipEntry(name, relativeDir) {
|
|
229
|
+
if (relativeDir === '' && name === TEMPLATE_AGENTS_FILE) {
|
|
230
|
+
return true;
|
|
231
|
+
}
|
|
232
|
+
if (SKIPPED_ENTRY_NAMES.has(name)) {
|
|
233
|
+
return true;
|
|
234
|
+
}
|
|
235
|
+
if (SKIPPED_FILE_NAMES.has(name)) {
|
|
236
|
+
return true;
|
|
237
|
+
}
|
|
238
|
+
return false;
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
function removeDestinationProject({ pbipDir, projectName }) {
|
|
242
|
+
const targets = [
|
|
243
|
+
path.join(pbipDir, `${projectName}.pbip`),
|
|
244
|
+
path.join(pbipDir, `${projectName}.SemanticModel`),
|
|
245
|
+
path.join(pbipDir, `${projectName}.Report`),
|
|
246
|
+
];
|
|
247
|
+
|
|
248
|
+
for (const target of targets) {
|
|
249
|
+
assertPathInside(pbipDir, target);
|
|
250
|
+
if (fs.existsSync(target)) {
|
|
251
|
+
fs.rmSync(target, { recursive: true, force: true });
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
function assertPathInside(baseDir, targetPath) {
|
|
257
|
+
const resolvedBase = path.resolve(baseDir);
|
|
258
|
+
const resolvedTarget = path.resolve(targetPath);
|
|
259
|
+
const relative = path.relative(resolvedBase, resolvedTarget);
|
|
260
|
+
if (relative === '' || relative.startsWith('..') || path.isAbsolute(relative)) {
|
|
261
|
+
throw new Error(`Refusing to remove path outside PBIP output directory: ${resolvedTarget}`);
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
|
|
265
|
+
function renameRelative(relative, templatePrefix, projectName) {
|
|
266
|
+
const segments = relative.split(path.sep);
|
|
267
|
+
const renamed = segments.map((segment) => {
|
|
268
|
+
if (segment === `${templatePrefix}.pbip`) {
|
|
269
|
+
return `${projectName}.pbip`;
|
|
270
|
+
}
|
|
271
|
+
if (segment === `${templatePrefix}.SemanticModel`) {
|
|
272
|
+
return `${projectName}.SemanticModel`;
|
|
273
|
+
}
|
|
274
|
+
if (segment === `${templatePrefix}.Report`) {
|
|
275
|
+
return `${projectName}.Report`;
|
|
276
|
+
}
|
|
277
|
+
return segment;
|
|
278
|
+
});
|
|
279
|
+
return renamed.join(path.sep);
|
|
280
|
+
}
|
|
281
|
+
|
|
282
|
+
function rewriteInternalReferences({ pbipDir, projectName, templatePrefix }) {
|
|
283
|
+
const updates = [];
|
|
284
|
+
|
|
285
|
+
const pbipPath = path.join(pbipDir, `${projectName}.pbip`);
|
|
286
|
+
if (fs.existsSync(pbipPath)) {
|
|
287
|
+
const pbip = readJson(pbipPath);
|
|
288
|
+
if (Array.isArray(pbip.artifacts)) {
|
|
289
|
+
for (const artifact of pbip.artifacts) {
|
|
290
|
+
if (
|
|
291
|
+
artifact &&
|
|
292
|
+
artifact.report &&
|
|
293
|
+
typeof artifact.report.path === 'string' &&
|
|
294
|
+
artifact.report.path === `${templatePrefix}.Report`
|
|
295
|
+
) {
|
|
296
|
+
artifact.report.path = `${projectName}.Report`;
|
|
297
|
+
}
|
|
298
|
+
}
|
|
299
|
+
}
|
|
300
|
+
writeJson(pbipPath, pbip);
|
|
301
|
+
updates.push(pbipPath);
|
|
302
|
+
}
|
|
303
|
+
|
|
304
|
+
const pbirPath = path.join(pbipDir, `${projectName}.Report`, 'definition.pbir');
|
|
305
|
+
if (fs.existsSync(pbirPath)) {
|
|
306
|
+
const pbir = readJson(pbirPath);
|
|
307
|
+
if (
|
|
308
|
+
pbir &&
|
|
309
|
+
pbir.datasetReference &&
|
|
310
|
+
pbir.datasetReference.byPath &&
|
|
311
|
+
typeof pbir.datasetReference.byPath.path === 'string'
|
|
312
|
+
) {
|
|
313
|
+
const expected = `../${templatePrefix}.SemanticModel`;
|
|
314
|
+
if (pbir.datasetReference.byPath.path === expected) {
|
|
315
|
+
pbir.datasetReference.byPath.path = `../${projectName}.SemanticModel`;
|
|
316
|
+
}
|
|
317
|
+
}
|
|
318
|
+
writeJson(pbirPath, pbir);
|
|
319
|
+
updates.push(pbirPath);
|
|
320
|
+
}
|
|
321
|
+
|
|
322
|
+
for (const folder of [`${projectName}.SemanticModel`, `${projectName}.Report`]) {
|
|
323
|
+
const platformPath = path.join(pbipDir, folder, '.platform');
|
|
324
|
+
if (!fs.existsSync(platformPath)) continue;
|
|
325
|
+
const platform = readJson(platformPath);
|
|
326
|
+
if (platform && platform.metadata && platform.metadata.displayName === templatePrefix) {
|
|
327
|
+
platform.metadata.displayName = projectName;
|
|
328
|
+
}
|
|
329
|
+
if (platform && platform.config && typeof platform.config.logicalId === 'string') {
|
|
330
|
+
platform.config.logicalId = crypto.randomUUID();
|
|
331
|
+
}
|
|
332
|
+
writeJson(platformPath, platform);
|
|
333
|
+
updates.push(platformPath);
|
|
334
|
+
}
|
|
335
|
+
|
|
336
|
+
return updates;
|
|
337
|
+
}
|
|
338
|
+
|
|
339
|
+
function readJson(filePath) {
|
|
340
|
+
let raw = fs.readFileSync(filePath, 'utf8');
|
|
341
|
+
// Power BI Desktop frequently re-saves PBIP/.pbir/.platform JSON with a UTF-8
|
|
342
|
+
// BOM; strip the leading U+FEFF code unit so JSON.parse doesn't throw on it.
|
|
343
|
+
if (raw.charCodeAt(0) === 0xfeff) {
|
|
344
|
+
raw = raw.slice(1);
|
|
345
|
+
}
|
|
346
|
+
try {
|
|
347
|
+
return JSON.parse(raw);
|
|
348
|
+
} catch (err) {
|
|
349
|
+
throw new Error(`Failed to parse JSON in ${filePath}: ${err.message}`);
|
|
350
|
+
}
|
|
351
|
+
}
|
|
352
|
+
|
|
353
|
+
function writeJson(filePath, value) {
|
|
354
|
+
const text = JSON.stringify(value, null, 2);
|
|
355
|
+
fs.writeFileSync(filePath, text + '\n');
|
|
356
|
+
}
|
|
357
|
+
|
|
358
|
+
module.exports = {
|
|
359
|
+
PBIP_SUBFOLDER,
|
|
360
|
+
PROJECT_NAME_PATTERN,
|
|
361
|
+
listTemplates,
|
|
362
|
+
validateProjectName,
|
|
363
|
+
resolveTemplate,
|
|
364
|
+
scaffoldFromTemplate,
|
|
365
|
+
getPbipDestination,
|
|
366
|
+
};
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Power BI Modeling MCP Launcher
|
|
5
|
+
* ==============================
|
|
6
|
+
*
|
|
7
|
+
* Wrapper that locates the official Microsoft Power BI Modeling MCP
|
|
8
|
+
* executable and starts it with stdio transport for Claude Code.
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
const { spawn } = require('child_process');
|
|
12
|
+
const { findLocalMcp, getModelingMcpError } = require('../utils/mcp-detect');
|
|
13
|
+
|
|
14
|
+
const executablePath = findLocalMcp();
|
|
15
|
+
|
|
16
|
+
if (!executablePath) {
|
|
17
|
+
console.error(getModelingMcpError());
|
|
18
|
+
process.exit(1);
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
const child = spawn(
|
|
22
|
+
executablePath,
|
|
23
|
+
['--readwrite', '--skip-confirmation', ...process.argv.slice(2)],
|
|
24
|
+
{
|
|
25
|
+
stdio: 'inherit',
|
|
26
|
+
env: process.env,
|
|
27
|
+
}
|
|
28
|
+
);
|
|
29
|
+
|
|
30
|
+
child.on('error', (error) => {
|
|
31
|
+
console.error(`Failed to launch Power BI Modeling MCP: ${error.message}`);
|
|
32
|
+
process.exit(1);
|
|
33
|
+
});
|
|
34
|
+
|
|
35
|
+
child.on('exit', (code, signal) => {
|
|
36
|
+
if (signal) {
|
|
37
|
+
process.kill(process.pid, signal);
|
|
38
|
+
return;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
process.exit(code === null ? 1 : code);
|
|
42
|
+
});
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Post-install script for BI Agent Superpowers
|
|
5
|
+
* Shows helpful information after npm install.
|
|
6
|
+
* Developed by Lucas Sanchez (@luquimbo)
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
const path = require('path');
|
|
10
|
+
const { loadSkills } = require('./lib/skills');
|
|
11
|
+
const { getSkillPurpose } = require('./lib/generators/shared');
|
|
12
|
+
|
|
13
|
+
const VERSION = require('../package.json').version;
|
|
14
|
+
const PACKAGE_DIR = path.dirname(__dirname);
|
|
15
|
+
|
|
16
|
+
const skills = loadSkills({ packageDir: PACKAGE_DIR });
|
|
17
|
+
const skillLines = skills
|
|
18
|
+
.map((s) => ` /${s.name.padEnd(18)} — ${getSkillPurpose(s.name)}`)
|
|
19
|
+
.join('\n');
|
|
20
|
+
|
|
21
|
+
console.log(`
|
|
22
|
+
╔═══════════════════════════════════════════════════════════╗
|
|
23
|
+
║ ║
|
|
24
|
+
║ BI Agent Superpowers v${VERSION.padEnd(34)}║
|
|
25
|
+
║ Power BI Desktop toolkit — open source (MIT) ║
|
|
26
|
+
║ Developed by Lucas Sanchez (@luquimbo) ║
|
|
27
|
+
║ ║
|
|
28
|
+
╚═══════════════════════════════════════════════════════════╝
|
|
29
|
+
|
|
30
|
+
Installed successfully.
|
|
31
|
+
|
|
32
|
+
Quick Start:
|
|
33
|
+
super install # Install skills + MCPs in your AI agents
|
|
34
|
+
|
|
35
|
+
Works with 5 agents:
|
|
36
|
+
• Claude Code
|
|
37
|
+
• GitHub Copilot
|
|
38
|
+
• Codex (OpenAI)
|
|
39
|
+
• Gemini CLI
|
|
40
|
+
• Kilo Code
|
|
41
|
+
|
|
42
|
+
${skills.length} skills:
|
|
43
|
+
${skillLines}
|
|
44
|
+
|
|
45
|
+
2 MCP servers:
|
|
46
|
+
powerbi-modeling-mcp — Local Power BI Desktop connection (XMLA)
|
|
47
|
+
microsoft-learn — Microsoft Learn docs in context
|
|
48
|
+
|
|
49
|
+
Documentation: https://bi-superpowers.dev
|
|
50
|
+
`);
|