@luquimbo/bi-superpowers 5.0.0 → 5.0.2
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 +5 -3
- package/.claude-plugin/plugin.json +1 -1
- package/.claude-plugin/skill-manifest.json +23 -7
- package/.plugin/plugin.json +1 -1
- package/AGENTS.md +124 -26
- package/CHANGELOG.md +494 -16
- package/README.md +33 -117
- package/bin/cli.js +1 -1
- package/bin/commands/diff.js +2 -2
- package/bin/commands/install.js +58 -45
- package/bin/commands/lint.js +2 -2
- package/bin/commands/validate-projects.js +1 -1
- package/bin/lib/generators/claude-plugin.js +14 -5
- package/bin/lib/generators/shared.js +9 -5
- package/bin/lib/mcp-config.js +22 -2
- package/bin/lib/skills.js +8 -8
- package/bin/mcp/powerbi-modeling-launcher.js +8 -4
- package/bin/postinstall.js +14 -12
- package/bin/utils/mcp-detect.js +11 -11
- package/commands/bi-connect.md +34 -17
- package/commands/bi-dax.md +385 -0
- package/commands/bi-kickoff.md +75 -44
- package/commands/bi-modeling.md +395 -0
- package/commands/bi-performance.md +455 -0
- package/commands/bi-start.md +30 -18
- package/desktop-extension/manifest.json +2 -2
- package/package.json +6 -3
- package/skills/bi-connect/SKILL.md +34 -17
- package/skills/bi-connect/scripts/update-check.js +1 -1
- package/skills/bi-dax/SKILL.md +387 -0
- package/skills/{bi-report → bi-dax}/scripts/update-check.js +1 -1
- package/skills/bi-kickoff/SKILL.md +75 -44
- package/skills/bi-kickoff/scripts/update-check.js +1 -1
- package/skills/bi-modeling/SKILL.md +397 -0
- package/skills/bi-modeling/scripts/update-check.js +403 -0
- package/skills/bi-performance/SKILL.md +457 -0
- package/skills/bi-performance/scripts/install-tabular-editor.ps1 +90 -0
- package/skills/bi-performance/scripts/run-bpa.ps1 +161 -0
- package/skills/bi-performance/scripts/update-check.js +403 -0
- package/skills/bi-start/SKILL.md +31 -19
- package/skills/bi-start/scripts/update-check.js +1 -1
- package/src/content/base.md +13 -8
- package/src/content/routing.md +1 -5
- package/src/content/skills/bi-connect.md +32 -15
- package/src/content/skills/bi-dax.md +358 -0
- package/src/content/skills/bi-kickoff.md +73 -42
- package/src/content/skills/bi-modeling.md +368 -0
- package/src/content/skills/bi-performance/SKILL.md +428 -0
- package/src/content/skills/bi-performance/scripts/install-tabular-editor.ps1 +90 -0
- package/src/content/skills/bi-performance/scripts/run-bpa.ps1 +161 -0
- package/src/content/skills/bi-start.md +30 -18
- package/templates/sales/AGENTS.md +33 -0
- package/templates/sales/sales-template.Report/.platform +11 -0
- package/templates/sales/sales-template.Report/StaticResources/RegisteredResources/BISuperpowers.json +3888 -0
- package/templates/sales/sales-template.Report/StaticResources/SharedResources/BaseThemes/Fluent2-CY26SU03.json +4104 -0
- package/templates/sales/sales-template.Report/definition/pages/017e2c84c7dc89f26e57/page.json +123 -0
- package/templates/sales/sales-template.Report/definition/pages/017e2c84c7dc89f26e57/visuals/10420560e5b8c5235857/visual.json +16 -0
- package/templates/sales/sales-template.Report/definition/pages/017e2c84c7dc89f26e57/visuals/2181c54a94f0c67abb2d/visual.json +283 -0
- package/templates/sales/sales-template.Report/definition/pages/017e2c84c7dc89f26e57/visuals/24eba6a7af0b59974ef5/visual.json +703 -0
- package/templates/sales/sales-template.Report/definition/pages/017e2c84c7dc89f26e57/visuals/26db24c91e5b615a5c29/mobile.json +11 -0
- package/templates/sales/sales-template.Report/definition/pages/017e2c84c7dc89f26e57/visuals/26db24c91e5b615a5c29/visual.json +528 -0
- package/templates/sales/sales-template.Report/definition/pages/017e2c84c7dc89f26e57/visuals/2ec652d0956901dd2afd/mobile.json +11 -0
- package/templates/sales/sales-template.Report/definition/pages/017e2c84c7dc89f26e57/visuals/2ec652d0956901dd2afd/visual.json +324 -0
- package/templates/sales/sales-template.Report/definition/pages/017e2c84c7dc89f26e57/visuals/45dda4e0b159becf2dcd/mobile.json +11 -0
- package/templates/sales/sales-template.Report/definition/pages/017e2c84c7dc89f26e57/visuals/45dda4e0b159becf2dcd/visual.json +359 -0
- package/templates/sales/sales-template.Report/definition/pages/017e2c84c7dc89f26e57/visuals/4ca8800cf1539ad423f2/visual.json +468 -0
- package/templates/sales/sales-template.Report/definition/pages/017e2c84c7dc89f26e57/visuals/4f5704218eb88f7cdff6/mobile.json +29 -0
- package/templates/sales/sales-template.Report/definition/pages/017e2c84c7dc89f26e57/visuals/4f5704218eb88f7cdff6/visual.json +241 -0
- package/templates/sales/sales-template.Report/definition/pages/017e2c84c7dc89f26e57/visuals/54d3fdbedbbb863a9d7a/visual.json +575 -0
- package/templates/sales/sales-template.Report/definition/pages/017e2c84c7dc89f26e57/visuals/68043403e96ca8ed23e8/visual.json +575 -0
- package/templates/sales/sales-template.Report/definition/pages/017e2c84c7dc89f26e57/visuals/80b54a678ef36a250994/visual.json +351 -0
- package/templates/sales/sales-template.Report/definition/pages/017e2c84c7dc89f26e57/visuals/814f624b6056dc4c8de5/mobile.json +11 -0
- package/templates/sales/sales-template.Report/definition/pages/017e2c84c7dc89f26e57/visuals/814f624b6056dc4c8de5/visual.json +421 -0
- package/templates/sales/sales-template.Report/definition/pages/017e2c84c7dc89f26e57/visuals/85e1cc13559f4e107ede/visual.json +681 -0
- package/templates/sales/sales-template.Report/definition/pages/017e2c84c7dc89f26e57/visuals/8686961b837e855963fe/mobile.json +11 -0
- package/templates/sales/sales-template.Report/definition/pages/017e2c84c7dc89f26e57/visuals/8686961b837e855963fe/visual.json +720 -0
- package/templates/sales/sales-template.Report/definition/pages/017e2c84c7dc89f26e57/visuals/8d302c5b7e87e8cb57bb/visual.json +590 -0
- package/templates/sales/sales-template.Report/definition/pages/017e2c84c7dc89f26e57/visuals/a02c5b30f2e757637d78/mobile.json +11 -0
- package/templates/sales/sales-template.Report/definition/pages/017e2c84c7dc89f26e57/visuals/a02c5b30f2e757637d78/visual.json +102 -0
- package/templates/sales/sales-template.Report/definition/pages/017e2c84c7dc89f26e57/visuals/a405d29e7744c770d445/visual.json +575 -0
- package/templates/sales/sales-template.Report/definition/pages/017e2c84c7dc89f26e57/visuals/b0dc2036d3cf2baafb35/mobile.json +11 -0
- package/templates/sales/sales-template.Report/definition/pages/017e2c84c7dc89f26e57/visuals/b0dc2036d3cf2baafb35/visual.json +333 -0
- package/templates/sales/sales-template.Report/definition/pages/017e2c84c7dc89f26e57/visuals/cdd696baaf3b80b326f8/mobile.json +11 -0
- package/templates/sales/sales-template.Report/definition/pages/017e2c84c7dc89f26e57/visuals/cdd696baaf3b80b326f8/visual.json +468 -0
- package/templates/sales/sales-template.Report/definition/pages/017e2c84c7dc89f26e57/visuals/ff77ca1bafff5bfe5044/mobile.json +11 -0
- package/templates/sales/sales-template.Report/definition/pages/017e2c84c7dc89f26e57/visuals/ff77ca1bafff5bfe5044/visual.json +523 -0
- package/templates/sales/sales-template.Report/definition/pages/6a4808bb8bb9166f49ff/page.json +130 -0
- package/templates/sales/sales-template.Report/definition/pages/6a4808bb8bb9166f49ff/visuals/0352fd80d074693a65db/visual.json +681 -0
- package/templates/sales/sales-template.Report/definition/pages/6a4808bb8bb9166f49ff/visuals/1c5a14bf493697344b68/visual.json +351 -0
- package/templates/sales/sales-template.Report/definition/pages/6a4808bb8bb9166f49ff/visuals/3486cf7624c5b109b4e5/mobile.json +11 -0
- package/templates/sales/sales-template.Report/definition/pages/6a4808bb8bb9166f49ff/visuals/3486cf7624c5b109b4e5/visual.json +333 -0
- package/templates/sales/sales-template.Report/definition/pages/6a4808bb8bb9166f49ff/visuals/4d8b989008edc0db28d1/mobile.json +11 -0
- package/templates/sales/sales-template.Report/definition/pages/6a4808bb8bb9166f49ff/visuals/4d8b989008edc0db28d1/visual.json +102 -0
- package/templates/sales/sales-template.Report/definition/pages/6a4808bb8bb9166f49ff/visuals/5f4d76bbc870118e9840/mobile.json +11 -0
- package/templates/sales/sales-template.Report/definition/pages/6a4808bb8bb9166f49ff/visuals/5f4d76bbc870118e9840/visual.json +468 -0
- package/templates/sales/sales-template.Report/definition/pages/6a4808bb8bb9166f49ff/visuals/73629e1abebb7a444b59/mobile.json +11 -0
- package/templates/sales/sales-template.Report/definition/pages/6a4808bb8bb9166f49ff/visuals/73629e1abebb7a444b59/visual.json +359 -0
- package/templates/sales/sales-template.Report/definition/pages/6a4808bb8bb9166f49ff/visuals/749cb1388c7e0a88161c/visual.json +685 -0
- package/templates/sales/sales-template.Report/definition/pages/6a4808bb8bb9166f49ff/visuals/85090dcdf75ac2487d1e/visual.json +283 -0
- package/templates/sales/sales-template.Report/definition/pages/6a4808bb8bb9166f49ff/visuals/92cf92e3da10493adb78/visual.json +468 -0
- package/templates/sales/sales-template.Report/definition/pages/6a4808bb8bb9166f49ff/visuals/a30bd0950630ed94e8a3/visual.json +590 -0
- package/templates/sales/sales-template.Report/definition/pages/6a4808bb8bb9166f49ff/visuals/a56e91d9400a835e4814/mobile.json +11 -0
- package/templates/sales/sales-template.Report/definition/pages/6a4808bb8bb9166f49ff/visuals/a56e91d9400a835e4814/visual.json +528 -0
- package/templates/sales/sales-template.Report/definition/pages/6a4808bb8bb9166f49ff/visuals/a90aaa3e3117494f18f8/mobile.json +11 -0
- package/templates/sales/sales-template.Report/definition/pages/6a4808bb8bb9166f49ff/visuals/a90aaa3e3117494f18f8/visual.json +523 -0
- package/templates/sales/sales-template.Report/definition/pages/6a4808bb8bb9166f49ff/visuals/aded24cd205c0b528642/mobile.json +11 -0
- package/templates/sales/sales-template.Report/definition/pages/6a4808bb8bb9166f49ff/visuals/aded24cd205c0b528642/visual.json +720 -0
- package/templates/sales/sales-template.Report/definition/pages/6a4808bb8bb9166f49ff/visuals/af34b26f14a8a724c9a9/mobile.json +37 -0
- package/templates/sales/sales-template.Report/definition/pages/6a4808bb8bb9166f49ff/visuals/af34b26f14a8a724c9a9/visual.json +1230 -0
- package/templates/sales/sales-template.Report/definition/pages/6a4808bb8bb9166f49ff/visuals/b06ef80aa78cabcef8a6/mobile.json +11 -0
- package/templates/sales/sales-template.Report/definition/pages/6a4808bb8bb9166f49ff/visuals/b06ef80aa78cabcef8a6/visual.json +324 -0
- package/templates/sales/sales-template.Report/definition/pages/6a4808bb8bb9166f49ff/visuals/d97979633a91e041107e/mobile.json +11 -0
- package/templates/sales/sales-template.Report/definition/pages/6a4808bb8bb9166f49ff/visuals/d97979633a91e041107e/visual.json +421 -0
- package/templates/sales/sales-template.Report/definition/pages/6a4808bb8bb9166f49ff/visuals/fa81f184e2cb0e8b087c/mobile.json +29 -0
- package/templates/sales/sales-template.Report/definition/pages/6a4808bb8bb9166f49ff/visuals/fa81f184e2cb0e8b087c/visual.json +241 -0
- package/templates/sales/sales-template.Report/definition/pages/pages.json +8 -0
- package/templates/sales/sales-template.Report/definition/report.json +89 -0
- package/templates/sales/sales-template.Report/definition/version.json +4 -0
- package/templates/sales/sales-template.Report/definition.pbir +9 -0
- package/templates/sales/sales-template.SemanticModel/.pbi/editorSettings.json +8 -0
- package/templates/sales/sales-template.SemanticModel/.platform +11 -0
- package/templates/sales/sales-template.SemanticModel/DAXQueries/.pbi/daxQueries.json +9 -0
- package/templates/sales/sales-template.SemanticModel/DAXQueries/Calendar445MonthNr.dax +0 -0
- package/templates/sales/sales-template.SemanticModel/DAXQueries/Consulta 1.dax +6 -0
- package/templates/sales/sales-template.SemanticModel/DAXQueries/Consulta 2.dax +32 -0
- package/templates/sales/sales-template.SemanticModel/definition/cultures/es-AR.tmdl +7324 -0
- package/templates/sales/sales-template.SemanticModel/definition/database.tmdl +3 -0
- package/templates/sales/sales-template.SemanticModel/definition/expressions.tmdl +233 -0
- package/templates/sales/sales-template.SemanticModel/definition/functions.tmdl +247 -0
- package/templates/sales/sales-template.SemanticModel/definition/model.tmdl +46 -0
- package/templates/sales/sales-template.SemanticModel/definition/relationships.tmdl +16 -0
- package/templates/sales/sales-template.SemanticModel/definition/tables/Aux Comparaciones.tmdl +194 -0
- package/templates/sales/sales-template.SemanticModel/definition/tables/Aux Dimensiones ventas.tmdl +71 -0
- package/templates/sales/sales-template.SemanticModel/definition/tables/Aux Ejes temporales.tmdl +67 -0
- package/templates/sales/sales-template.SemanticModel/definition/tables/Aux Per/303/255odos.tmdl" +318 -0
- package/templates/sales/sales-template.SemanticModel/definition/tables/Aux Vista de calendario.tmdl +36 -0
- package/templates/sales/sales-template.SemanticModel/definition/tables/Aux Vista del valor.tmdl +87 -0
- package/templates/sales/sales-template.SemanticModel/definition/tables/Aux Vista temporal.tmdl +62 -0
- package/templates/sales/sales-template.SemanticModel/definition/tables/Calendario.tmdl +198 -0
- package/templates/sales/sales-template.SemanticModel/definition/tables/Canales.tmdl +59 -0
- package/templates/sales/sales-template.SemanticModel/definition/tables/Clientes.tmdl +120 -0
- package/templates/sales/sales-template.SemanticModel/definition/tables/Modelo Configuraci/303/263n.tmdl" +48 -0
- package/templates/sales/sales-template.SemanticModel/definition/tables/Monedas.tmdl +43 -0
- package/templates/sales/sales-template.SemanticModel/definition/tables/M/303/251tricas.tmdl +553 -0
- package/templates/sales/sales-template.SemanticModel/definition/tables/Productos.tmdl +73 -0
- package/templates/sales/sales-template.SemanticModel/definition/tables/Tipo de cambio.tmdl +66 -0
- package/templates/sales/sales-template.SemanticModel/definition/tables/Ventas.tmdl +133 -0
- package/templates/sales/sales-template.SemanticModel/definition.pbism +5 -0
- package/templates/sales/sales-template.SemanticModel/diagramLayout.json +239 -0
- package/templates/sales/sales-template.pbip +14 -0
- package/theme/BISuperpowers.json +3888 -0
- package/commands/bi-report.md +0 -403
- package/skills/bi-report/SKILL.md +0 -405
- package/skills/bi-report/references/cli-commands.md +0 -184
- package/skills/bi-report/references/cli-setup.md +0 -101
- package/skills/bi-report/references/close-write-open-pattern.md +0 -80
- package/skills/bi-report/references/layouts/finance.md +0 -65
- package/skills/bi-report/references/layouts/generic.md +0 -46
- package/skills/bi-report/references/layouts/hr.md +0 -48
- package/skills/bi-report/references/layouts/marketing.md +0 -45
- package/skills/bi-report/references/layouts/operations.md +0 -44
- package/skills/bi-report/references/layouts/sales.md +0 -50
- package/skills/bi-report/references/native-visuals.md +0 -341
- package/skills/bi-report/references/pbi-desktop-installation.md +0 -87
- package/skills/bi-report/references/pbir-preview-activation.md +0 -40
- package/skills/bi-report/references/slicer.md +0 -89
- package/skills/bi-report/references/textbox.md +0 -101
- package/skills/bi-report/references/themes/BISuperpowers.json +0 -915
- package/skills/bi-report/references/troubleshooting.md +0 -135
- package/skills/bi-report/references/visual-types.md +0 -78
- package/skills/bi-report/scripts/apply-theme.js +0 -243
- package/skills/bi-report/scripts/create-visual.js +0 -942
- package/skills/bi-report/scripts/ensure-pbi-cli.sh +0 -41
- package/skills/bi-report/scripts/validate-pbir.js +0 -351
- package/src/content/skills/bi-report/SKILL.md +0 -376
- package/src/content/skills/bi-report/references/cli-commands.md +0 -184
- package/src/content/skills/bi-report/references/cli-setup.md +0 -101
- package/src/content/skills/bi-report/references/close-write-open-pattern.md +0 -80
- package/src/content/skills/bi-report/references/layouts/finance.md +0 -65
- package/src/content/skills/bi-report/references/layouts/generic.md +0 -46
- package/src/content/skills/bi-report/references/layouts/hr.md +0 -48
- package/src/content/skills/bi-report/references/layouts/marketing.md +0 -45
- package/src/content/skills/bi-report/references/layouts/operations.md +0 -44
- package/src/content/skills/bi-report/references/layouts/sales.md +0 -50
- package/src/content/skills/bi-report/references/native-visuals.md +0 -341
- package/src/content/skills/bi-report/references/pbi-desktop-installation.md +0 -87
- package/src/content/skills/bi-report/references/pbir-preview-activation.md +0 -40
- package/src/content/skills/bi-report/references/slicer.md +0 -89
- package/src/content/skills/bi-report/references/textbox.md +0 -101
- package/src/content/skills/bi-report/references/themes/BISuperpowers.json +0 -915
- package/src/content/skills/bi-report/references/troubleshooting.md +0 -135
- package/src/content/skills/bi-report/references/visual-types.md +0 -78
- package/src/content/skills/bi-report/scripts/apply-theme.js +0 -243
- package/src/content/skills/bi-report/scripts/create-visual.js +0 -942
- package/src/content/skills/bi-report/scripts/ensure-pbi-cli.sh +0 -41
- package/src/content/skills/bi-report/scripts/validate-pbir.js +0 -351
package/bin/lib/mcp-config.js
CHANGED
|
@@ -31,6 +31,19 @@ const os = require('os');
|
|
|
31
31
|
const MICROSOFT_LEARN_URL = 'https://learn.microsoft.com/api/mcp';
|
|
32
32
|
const MODELING_SERVER_NAME = 'powerbi-modeling-mcp';
|
|
33
33
|
const LEARN_SERVER_NAME = 'microsoft-learn';
|
|
34
|
+
const CODEX_POWERBI_WRITE_TOOLS = [
|
|
35
|
+
'column_operations',
|
|
36
|
+
'database_operations',
|
|
37
|
+
'function_operations',
|
|
38
|
+
'measure_operations',
|
|
39
|
+
'object_translation_operations',
|
|
40
|
+
'partition_operations',
|
|
41
|
+
'perspective_operations',
|
|
42
|
+
'query_group_operations',
|
|
43
|
+
'relationship_operations',
|
|
44
|
+
'table_operations',
|
|
45
|
+
'user_hierarchy_operations',
|
|
46
|
+
];
|
|
34
47
|
|
|
35
48
|
/**
|
|
36
49
|
* Resolves the absolute path to the Power BI Modeling MCP launcher
|
|
@@ -418,18 +431,25 @@ function writeCodexConfig(packageDir) {
|
|
|
418
431
|
// Remove any previous bi-superpowers MCP sections so re-running install
|
|
419
432
|
// doesn't duplicate them. Strips each section from its header to the
|
|
420
433
|
// next [ header or EOF. Server names are escaped for regex safety even
|
|
421
|
-
// though current values are literal
|
|
434
|
+
// though current values are literal. The optional suffix removes child
|
|
435
|
+
// sections like [mcp_servers.powerbi-modeling-mcp.tools.measure_operations].
|
|
422
436
|
const namePattern = [MODELING_SERVER_NAME, LEARN_SERVER_NAME].map(escapeRegex).join('|');
|
|
423
437
|
const stripPattern = new RegExp(
|
|
424
|
-
`\\n?\\[mcp_servers\\.(${namePattern})
|
|
438
|
+
`\\n?\\[mcp_servers\\.(${namePattern})(?:\\.[^\\]]+)?\\][\\s\\S]*?(?=\\n\\[|$)`,
|
|
425
439
|
'g'
|
|
426
440
|
);
|
|
427
441
|
existing = existing.replace(stripPattern, '');
|
|
428
442
|
|
|
443
|
+
const writeToolApprovals = CODEX_POWERBI_WRITE_TOOLS.map(
|
|
444
|
+
(toolName) =>
|
|
445
|
+
`\n[mcp_servers.${MODELING_SERVER_NAME}.tools.${toolName}]\n` + 'approval_mode = "approve"\n'
|
|
446
|
+
).join('');
|
|
447
|
+
|
|
429
448
|
const newSections =
|
|
430
449
|
`\n\n[mcp_servers.${MODELING_SERVER_NAME}]\n` +
|
|
431
450
|
'command = "node"\n' +
|
|
432
451
|
`args = ["${tomlEscape(launcher)}"]\n` +
|
|
452
|
+
writeToolApprovals +
|
|
433
453
|
`\n[mcp_servers.${LEARN_SERVER_NAME}]\n` +
|
|
434
454
|
`url = "${MICROSOFT_LEARN_URL}"\n`;
|
|
435
455
|
|
package/bin/lib/skills.js
CHANGED
|
@@ -38,7 +38,7 @@ function loadFlatSkill(filePath) {
|
|
|
38
38
|
bundleDir: null,
|
|
39
39
|
};
|
|
40
40
|
} catch (err) {
|
|
41
|
-
console.warn(`⚠
|
|
41
|
+
console.warn(`⚠ Could not read skill ${filePath}: ${err.message}`);
|
|
42
42
|
return null;
|
|
43
43
|
}
|
|
44
44
|
}
|
|
@@ -63,7 +63,7 @@ function loadFolderSkill(folderPath) {
|
|
|
63
63
|
bundleDir: folderPath,
|
|
64
64
|
};
|
|
65
65
|
} catch (err) {
|
|
66
|
-
console.warn(`⚠
|
|
66
|
+
console.warn(`⚠ Could not read skill ${skillMd}: ${err.message}`);
|
|
67
67
|
return null;
|
|
68
68
|
}
|
|
69
69
|
}
|
|
@@ -89,7 +89,7 @@ function readSkillDirectory(directory) {
|
|
|
89
89
|
try {
|
|
90
90
|
entries = fs.readdirSync(directory, { withFileTypes: true });
|
|
91
91
|
} catch (err) {
|
|
92
|
-
console.warn(`⚠
|
|
92
|
+
console.warn(`⚠ Could not read skills directory ${directory}: ${err.message}`);
|
|
93
93
|
return [];
|
|
94
94
|
}
|
|
95
95
|
|
|
@@ -138,16 +138,16 @@ function loadSkills(options = {}) {
|
|
|
138
138
|
/**
|
|
139
139
|
* Normalize any user-facing skill identifier into its canonical name.
|
|
140
140
|
*
|
|
141
|
-
* Accepts `dax`, `dax.md`, `
|
|
142
|
-
* or `
|
|
141
|
+
* Accepts `dax`, `dax.md`, `folder-skill`, `folder-skill/SKILL.md`,
|
|
142
|
+
* or `folder-skill\SKILL.md` (Windows separator) and returns the
|
|
143
143
|
* canonical skill name used as the key in readSkillDirectory's
|
|
144
|
-
* output map (`dax`, `
|
|
144
|
+
* output map (`dax`, `folder-skill`).
|
|
145
145
|
*
|
|
146
146
|
* Uses a single alternation regex so the longer suffix `/SKILL.md`
|
|
147
147
|
* is tried BEFORE the bare `.md`. Earlier callers chained two
|
|
148
148
|
* `.replace()` calls and stripped `.md` first, which meant the
|
|
149
|
-
* `/SKILL.md` alternative never matched — `
|
|
150
|
-
* came out as `
|
|
149
|
+
* `/SKILL.md` alternative never matched — `folder-skill/SKILL.md`
|
|
150
|
+
* came out as `folder-skill/SKILL` and the lookup failed.
|
|
151
151
|
*
|
|
152
152
|
* @param {string} input - User-supplied skill identifier
|
|
153
153
|
* @returns {string} Canonical skill name
|
|
@@ -18,10 +18,14 @@ if (!executablePath) {
|
|
|
18
18
|
process.exit(1);
|
|
19
19
|
}
|
|
20
20
|
|
|
21
|
-
const child = spawn(
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
21
|
+
const child = spawn(
|
|
22
|
+
executablePath,
|
|
23
|
+
['--readwrite', '--skip-confirmation', ...process.argv.slice(2)],
|
|
24
|
+
{
|
|
25
|
+
stdio: 'inherit',
|
|
26
|
+
env: process.env,
|
|
27
|
+
}
|
|
28
|
+
);
|
|
25
29
|
|
|
26
30
|
child.on('error', (error) => {
|
|
27
31
|
console.error(`Failed to launch Power BI Modeling MCP: ${error.message}`);
|
package/bin/postinstall.js
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
/**
|
|
4
4
|
* Post-install script for BI Agent Superpowers
|
|
5
|
-
* Shows helpful information after npm install
|
|
5
|
+
* Shows helpful information after npm install.
|
|
6
6
|
* Developed by Lucas Sanchez (@luquimbo)
|
|
7
7
|
*/
|
|
8
8
|
|
|
@@ -12,32 +12,34 @@ console.log(`
|
|
|
12
12
|
╔═══════════════════════════════════════════════════════════╗
|
|
13
13
|
║ ║
|
|
14
14
|
║ BI Agent Superpowers v${VERSION.padEnd(34)}║
|
|
15
|
-
║
|
|
15
|
+
║ Power BI Desktop toolkit — open source (MIT) ║
|
|
16
16
|
║ Developed by Lucas Sanchez (@luquimbo) ║
|
|
17
17
|
║ ║
|
|
18
18
|
╚═══════════════════════════════════════════════════════════╝
|
|
19
19
|
|
|
20
|
-
|
|
20
|
+
Installed successfully.
|
|
21
21
|
|
|
22
22
|
Quick Start:
|
|
23
|
-
super install #
|
|
23
|
+
super install # Install skills + MCPs in your AI agents
|
|
24
24
|
|
|
25
|
-
|
|
25
|
+
Works with 5 agents:
|
|
26
26
|
• Claude Code
|
|
27
27
|
• GitHub Copilot
|
|
28
28
|
• Codex (OpenAI)
|
|
29
29
|
• Gemini CLI
|
|
30
30
|
• Kilo Code
|
|
31
31
|
|
|
32
|
-
|
|
33
|
-
/bi-start —
|
|
34
|
-
/bi-kickoff
|
|
35
|
-
/bi-
|
|
36
|
-
/bi-
|
|
32
|
+
6 skills:
|
|
33
|
+
/bi-start — Session opener and specialist routing
|
|
34
|
+
/bi-kickoff — New BI project bootstrap
|
|
35
|
+
/bi-modeling — Semantic model design and audit
|
|
36
|
+
/bi-dax — DAX authoring, debugging, and optimization
|
|
37
|
+
/bi-performance — Performance profiling, VertiPaq, and BPA
|
|
38
|
+
/bi-connect — Power BI Desktop MCP connection and DAX UDFs
|
|
37
39
|
|
|
38
40
|
2 MCP servers:
|
|
39
|
-
powerbi-modeling-mcp —
|
|
40
|
-
microsoft-learn
|
|
41
|
+
powerbi-modeling-mcp — Local Power BI Desktop connection (XMLA)
|
|
42
|
+
microsoft-learn — Microsoft Learn docs in context
|
|
41
43
|
|
|
42
44
|
Documentation: https://github.com/luquimbo/bi-superpowers
|
|
43
45
|
`);
|
package/bin/utils/mcp-detect.js
CHANGED
|
@@ -179,33 +179,33 @@ function getMcpStatus() {
|
|
|
179
179
|
*/
|
|
180
180
|
function getInstallInstructions() {
|
|
181
181
|
return {
|
|
182
|
-
title: 'Power BI Modeling MCP
|
|
182
|
+
title: 'Power BI Modeling MCP not detected',
|
|
183
183
|
options: [
|
|
184
184
|
{
|
|
185
185
|
name: 'VS Code / Cursor',
|
|
186
186
|
steps: [
|
|
187
|
-
'
|
|
188
|
-
'
|
|
189
|
-
'
|
|
190
|
-
'
|
|
191
|
-
'
|
|
187
|
+
'Open VS Code or Cursor',
|
|
188
|
+
'Go to Extensions (Ctrl+Shift+X)',
|
|
189
|
+
'Search for "Power BI Modeling MCP"',
|
|
190
|
+
'Install the Microsoft extension',
|
|
191
|
+
'Run: super install --all --yes',
|
|
192
192
|
],
|
|
193
193
|
link: 'https://aka.ms/powerbi-modeling-mcp-vscode',
|
|
194
194
|
},
|
|
195
195
|
{
|
|
196
196
|
name: 'Manual',
|
|
197
197
|
steps: [
|
|
198
|
-
'
|
|
199
|
-
'
|
|
200
|
-
`
|
|
201
|
-
'
|
|
198
|
+
'Download the VSIX from VS Code Marketplace',
|
|
199
|
+
'Rename .vsix to .zip',
|
|
200
|
+
`Extract to ${path.join(os.homedir(), '.bi-superpowers', 'mcp')}`,
|
|
201
|
+
'Set BI_SUPERPOWERS_POWERBI_MODELING_MCP_PATH to the .exe path',
|
|
202
202
|
],
|
|
203
203
|
link: 'https://marketplace.visualstudio.com/items?itemName=analysis-services.powerbi-modeling-mcp',
|
|
204
204
|
},
|
|
205
205
|
],
|
|
206
206
|
note:
|
|
207
207
|
os.platform() !== 'win32'
|
|
208
|
-
? '
|
|
208
|
+
? 'The local MCP is only available on Windows. On macOS/Linux, microsoft-learn still provides official docs.'
|
|
209
209
|
: null,
|
|
210
210
|
};
|
|
211
211
|
}
|
package/commands/bi-connect.md
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
---
|
|
2
|
-
description: "Power BI Desktop connection and DAX UDF authoring"
|
|
2
|
+
description: "Power BI Desktop MCP connection and DAX UDF authoring"
|
|
3
3
|
---
|
|
4
4
|
|
|
5
5
|
<!-- Generated by BI Agent Superpowers. Edit src/content/skills/bi-connect.md instead. -->
|
|
@@ -15,7 +15,7 @@ node "{skillBundleDir}/scripts/update-check.js" --silent-if-uptodate --silent-if
|
|
|
15
15
|
|
|
16
16
|
- Empty output or `UPTODATE` — proceed with the skill silently. No message.
|
|
17
17
|
- `UPDATE_AVAILABLE <installed> <latest>` — tell the user exactly once this conversation, before diving into the skill:
|
|
18
|
-
> "
|
|
18
|
+
> "bi-superpowers v{latest} is available (you are on v{installed}). Update with `super upgrade` (or `/plugin update bi-superpowers` in Claude Code) when convenient. If you use a local plugin generated with `super kickoff`, run `super recharge` in that repo afterwards."
|
|
19
19
|
|
|
20
20
|
Then continue with the skill below.
|
|
21
21
|
- `SNOOZED <iso>` — proceed silently.
|
|
@@ -44,10 +44,26 @@ You are a **Power BI MCP Connection Specialist**. Your job is to help the user c
|
|
|
44
44
|
## MANDATORY RULES
|
|
45
45
|
1. **USER-LEVEL FIRST.** Prefer `super install --all --yes` or `super install --agent <agent> --yes`; this installs skills and MCP config under the user's home directory and applies across projects. `.mcp.json` is only for an optional repo-local Claude Code plugin.
|
|
46
46
|
2. **OFFICIAL SERVERS ONLY.** Use `powerbi-modeling-mcp` (local) and `microsoft-learn` (HTTP). Do not invent or recommend unofficial MCPs.
|
|
47
|
-
3. **WINDOWS
|
|
47
|
+
3. **WINDOWS + POWER BI DESKTOP ONLY.** Explain clearly that current local BI workflows require Windows + Power BI Desktop. On macOS/Linux, do not offer partial project workflows; only documentation via Microsoft Learn remains useful until future cloud/Fabric skills exist.
|
|
48
48
|
4. **NO PORT INVENTION.** Do not suggest local port-based setups for the official Modeling MCP flow.
|
|
49
49
|
5. **ONE QUESTION AT A TIME.** Follow the wizard pattern.
|
|
50
50
|
6. **DAX UDFS USE UPSTREAM REFERENCES.** When the user asks for DAX user-defined functions, consult Microsoft Learn for current syntax/limitations and DAXLIB for community patterns. Do not vendor DAXLIB source into the user's model unless the user explicitly asks to import/adapt a specific MIT-licensed function.
|
|
51
|
+
7. **TEACH AS YOU CONNECT OR WRITE.** Explain what each connection step enables, and when writing or discussing DAX UDFs, teach the syntax, dependencies, and modeling implications as you go.
|
|
52
|
+
|
|
53
|
+
8. **MCP MODEL EDITS ARE IN-MEMORY ONLY — SAVE BEFORE CLOSE.** Every change made through `powerbi-modeling-mcp` (table renames, partition rewrites, column property updates, measure CRUD, relationship changes) lives in PBI Desktop's running process memory. The on-disk TMDL is not updated until the user (or the agent) issues a save. **Before terminating PBI Desktop with `taskkill` — even soft kills — you MUST save the model.** Two acceptable save mechanisms:
|
|
54
|
+
|
|
55
|
+
- **Ask the user** to press `Ctrl+S` in PBI Desktop and confirm with "saved" / "listo".
|
|
56
|
+
- **Drive the save programmatically** with the bundled helper:
|
|
57
|
+
```powershell
|
|
58
|
+
pwsh "{skillBundleDir}/scripts/save-powerbi-window.ps1" -WindowTitle "<projectName>" -WaitMs 3000
|
|
59
|
+
```
|
|
60
|
+
The helper resolves the matching `PBIDesktop.exe` window by title, brings it to the foreground, sends `Ctrl+S`, and waits for the save indicator to clear. Returns 0 on success.
|
|
61
|
+
|
|
62
|
+
`taskkill /F /IM PBIDesktop.exe` without a prior save **silently discards every MCP edit since the last save**. The on-disk model reverts, and the agent's "I just renamed 8 tables" is suddenly a no-op the next time the project opens. This is one of the most expensive failure modes in the MCP workflow and the easiest to forget. Always save first.
|
|
63
|
+
|
|
64
|
+
9. **PBIP FILES ARE READ-ONLY SNAPSHOTS.** Use PBIP/TMDL/PBIR files for inspection, diffs, and validation only. Do not hand-edit `.tmdl`, `.SemanticModel/**`, `.Report/**`, PBIR JSON, `visual.json`, `page.json`, themes, slicers, bookmarks, or any visual binding. Model changes go through the Power BI Modeling MCP. **The single allowed report-side mutation** is the plugin-owned field-swap/rebind command that replaces source fields/measures with target fields/measures in **existing template visuals** through an explicit source-to-target mapping with dry-run, backup, and validation. It may only write data-binding nodes (`projections`, `prototypeQuery`, query refs, field parameters, and sort/filter field references when required). It must preserve visual type, layout, formatting, interactions, IDs, theme, and bookmarks. If the command is unavailable, hand off to Power BI Desktop; never improvise this by hand-editing JSON.
|
|
65
|
+
|
|
66
|
+
10. **TEMPLATE IS THE REFERENCE.** When writing DAX UDFs or discussing patterns, the BISuperpowers smoke-test template defines the canonical shape: `Métricas` as the measure and metric selector table, parameterizable currency conversion via `MonedaBase` + `Modelo Configuración` + `Tipo de cambio`, Sallieri period comparison, dynamic field parameters, calculation-group time intelligence, IBCS-aligned theme. UDFs the user writes should be either (a) generic enough to live alongside template patterns, or (b) explicitly extending those patterns. Reinventing template-equivalent logic in a project-specific UDF is a smell — flag it.
|
|
51
67
|
|
|
52
68
|
---
|
|
53
69
|
|
|
@@ -144,11 +160,12 @@ If they are intentionally maintaining a repo-local Claude Code plugin, they can
|
|
|
144
160
|
Say:
|
|
145
161
|
|
|
146
162
|
```text
|
|
147
|
-
The
|
|
163
|
+
The current BI Agent Superpowers local project workflows require Windows + Power BI Desktop.
|
|
148
164
|
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
165
|
+
On macOS/Linux, do not run partial local Desktop workflows
|
|
166
|
+
flows for local Power BI projects. You still have `microsoft-learn` (HTTP)
|
|
167
|
+
available for docs. Future cloud/Fabric skills may work cross-platform when
|
|
168
|
+
they do not depend on Desktop.
|
|
152
169
|
```
|
|
153
170
|
|
|
154
171
|
---
|
|
@@ -257,8 +274,8 @@ Do not:
|
|
|
257
274
|
|
|
258
275
|
When writing a UDF:
|
|
259
276
|
|
|
260
|
-
1. Confirm the model target:
|
|
261
|
-
|
|
277
|
+
1. Confirm the model target: live Power BI Desktop through the Modeling MCP.
|
|
278
|
+
PBIP/TMDL file edits are not allowed; those files are export snapshots.
|
|
262
279
|
2. Confirm that DAX UDF preview is enabled in Power BI Desktop when live Desktop
|
|
263
280
|
authoring is required.
|
|
264
281
|
3. Inspect existing functions first:
|
|
@@ -276,10 +293,10 @@ When writing a UDF:
|
|
|
276
293
|
function must preserve or change filter context.
|
|
277
294
|
8. Test the function with a small `DEFINE FUNCTION ... EVALUATE ...` query before
|
|
278
295
|
applying it to the model.
|
|
279
|
-
9.
|
|
280
|
-
|
|
281
|
-
10. After saving, re-query `INFO.USERDEFINEDFUNCTIONS()` or equivalent
|
|
282
|
-
metadata to verify the function exists.
|
|
296
|
+
9. Apply the function through MCP or guide the user through Power BI Desktop
|
|
297
|
+
authoring if the current MCP surface cannot perform the write.
|
|
298
|
+
10. After saving/exporting, re-query `INFO.USERDEFINEDFUNCTIONS()` or equivalent
|
|
299
|
+
model metadata to verify the function exists.
|
|
283
300
|
|
|
284
301
|
### UDF design checklist
|
|
285
302
|
|
|
@@ -319,8 +336,8 @@ EVALUATE
|
|
|
319
336
|
{ Company.Finance.GrossMarginPct ( 120, 300 ) }
|
|
320
337
|
```
|
|
321
338
|
|
|
322
|
-
Use TMDL
|
|
323
|
-
`definition/functions.tmdl
|
|
339
|
+
Use this TMDL shape only as a review reference for what Desktop/MCP should
|
|
340
|
+
persist. Do not write it into `definition/functions.tmdl` by file patch:
|
|
324
341
|
|
|
325
342
|
```tmdl
|
|
326
343
|
createOrReplace
|
|
@@ -362,7 +379,7 @@ reference and produce an original function.
|
|
|
362
379
|
| Modeling MCP installed manually | Set `BI_SUPERPOWERS_POWERBI_MODELING_MCP_PATH` |
|
|
363
380
|
| Agent not loading MCPs | Re-run `super install --agent <agent-id> --yes` and restart the agent |
|
|
364
381
|
| Local Claude Code plugin not loading MCPs | Re-run `super mcp-setup` inside the plugin project and restart Claude Code |
|
|
365
|
-
| macOS/Linux local
|
|
382
|
+
| macOS/Linux local project request | Explain that current local BI workflows require Windows + Power BI Desktop; use `microsoft-learn` only for docs |
|
|
366
383
|
| User asks about Excel MCP | Explain Excel remains supported through skills and library content, not a default MCP |
|
|
367
384
|
|
|
368
385
|
---
|
|
@@ -384,7 +401,7 @@ reference and produce an original function.
|
|
|
384
401
|
Adjust depth based on `config.json → experienceLevel`:
|
|
385
402
|
- **beginner**: Step-by-step with explanations, reference library examples
|
|
386
403
|
- **intermediate**: Standard depth, explain non-obvious decisions
|
|
387
|
-
- **advanced**: Concise, skip basics,
|
|
404
|
+
- **advanced**: Concise, skip basics, but still teach edge cases, performance, and design criteria
|
|
388
405
|
|
|
389
406
|
---
|
|
390
407
|
|