@luquimbo/bi-superpowers 4.1.6 → 5.0.1

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.
Files changed (100) hide show
  1. package/.claude-plugin/marketplace.json +8 -6
  2. package/.claude-plugin/plugin.json +1 -1
  3. package/.claude-plugin/skill-manifest.json +35 -19
  4. package/.plugin/plugin.json +1 -1
  5. package/AGENTS.md +150 -26
  6. package/CHANGELOG.md +489 -14
  7. package/README.md +103 -114
  8. package/bin/cli.js +7 -1
  9. package/bin/commands/diff.js +2 -2
  10. package/bin/commands/install.js +58 -45
  11. package/bin/commands/lint.js +2 -2
  12. package/bin/commands/validate-projects.js +425 -0
  13. package/bin/lib/generators/claude-plugin.js +31 -7
  14. package/bin/lib/generators/shared.js +11 -7
  15. package/bin/lib/mcp-config.js +22 -2
  16. package/bin/lib/skills.js +8 -8
  17. package/bin/mcp/powerbi-modeling-launcher.js +8 -4
  18. package/bin/postinstall.js +14 -12
  19. package/bin/utils/mcp-detect.js +11 -11
  20. package/commands/bi-connect.md +418 -0
  21. package/commands/bi-dax.md +385 -0
  22. package/commands/{project-kickoff.md → bi-kickoff.md} +78 -47
  23. package/commands/bi-modeling.md +395 -0
  24. package/commands/bi-performance.md +455 -0
  25. package/commands/bi-start.md +39 -27
  26. package/desktop-extension/manifest.json +2 -2
  27. package/package.json +3 -2
  28. package/skills/bi-connect/SKILL.md +420 -0
  29. package/skills/{pbi-connect → bi-connect}/scripts/update-check.js +1 -1
  30. package/skills/bi-dax/SKILL.md +387 -0
  31. package/skills/{report-design → bi-dax}/scripts/update-check.js +1 -1
  32. package/skills/{project-kickoff → bi-kickoff}/SKILL.md +79 -48
  33. package/skills/{project-kickoff → bi-kickoff}/scripts/update-check.js +1 -1
  34. package/skills/bi-modeling/SKILL.md +397 -0
  35. package/skills/bi-modeling/scripts/update-check.js +403 -0
  36. package/skills/bi-performance/SKILL.md +457 -0
  37. package/skills/bi-performance/scripts/install-tabular-editor.ps1 +90 -0
  38. package/skills/bi-performance/scripts/run-bpa.ps1 +161 -0
  39. package/skills/bi-performance/scripts/update-check.js +403 -0
  40. package/skills/bi-start/SKILL.md +40 -28
  41. package/skills/bi-start/scripts/update-check.js +1 -1
  42. package/src/content/base.md +15 -10
  43. package/src/content/routing.md +15 -18
  44. package/src/content/skills/bi-connect.md +391 -0
  45. package/src/content/skills/bi-dax.md +358 -0
  46. package/src/content/skills/{project-kickoff.md → bi-kickoff.md} +75 -44
  47. package/src/content/skills/bi-modeling.md +368 -0
  48. package/src/content/skills/bi-performance/SKILL.md +428 -0
  49. package/src/content/skills/bi-performance/scripts/install-tabular-editor.ps1 +90 -0
  50. package/src/content/skills/bi-performance/scripts/run-bpa.ps1 +161 -0
  51. package/src/content/skills/bi-start.md +39 -27
  52. package/theme/BISuperpowers.json +3888 -0
  53. package/commands/pbi-connect.md +0 -253
  54. package/commands/report-design.md +0 -403
  55. package/skills/pbi-connect/SKILL.md +0 -255
  56. package/skills/report-design/SKILL.md +0 -405
  57. package/skills/report-design/references/cli-commands.md +0 -184
  58. package/skills/report-design/references/cli-setup.md +0 -101
  59. package/skills/report-design/references/close-write-open-pattern.md +0 -80
  60. package/skills/report-design/references/layouts/finance.md +0 -65
  61. package/skills/report-design/references/layouts/generic.md +0 -46
  62. package/skills/report-design/references/layouts/hr.md +0 -48
  63. package/skills/report-design/references/layouts/marketing.md +0 -45
  64. package/skills/report-design/references/layouts/operations.md +0 -44
  65. package/skills/report-design/references/layouts/sales.md +0 -50
  66. package/skills/report-design/references/native-visuals.md +0 -341
  67. package/skills/report-design/references/pbi-desktop-installation.md +0 -87
  68. package/skills/report-design/references/pbir-preview-activation.md +0 -40
  69. package/skills/report-design/references/slicer.md +0 -89
  70. package/skills/report-design/references/textbox.md +0 -101
  71. package/skills/report-design/references/themes/BISuperpowers.json +0 -915
  72. package/skills/report-design/references/troubleshooting.md +0 -135
  73. package/skills/report-design/references/visual-types.md +0 -78
  74. package/skills/report-design/scripts/apply-theme.js +0 -243
  75. package/skills/report-design/scripts/create-visual.js +0 -942
  76. package/skills/report-design/scripts/ensure-pbi-cli.sh +0 -41
  77. package/skills/report-design/scripts/validate-pbir.js +0 -351
  78. package/src/content/skills/pbi-connect.md +0 -226
  79. package/src/content/skills/report-design/SKILL.md +0 -376
  80. package/src/content/skills/report-design/references/cli-commands.md +0 -184
  81. package/src/content/skills/report-design/references/cli-setup.md +0 -101
  82. package/src/content/skills/report-design/references/close-write-open-pattern.md +0 -80
  83. package/src/content/skills/report-design/references/layouts/finance.md +0 -65
  84. package/src/content/skills/report-design/references/layouts/generic.md +0 -46
  85. package/src/content/skills/report-design/references/layouts/hr.md +0 -48
  86. package/src/content/skills/report-design/references/layouts/marketing.md +0 -45
  87. package/src/content/skills/report-design/references/layouts/operations.md +0 -44
  88. package/src/content/skills/report-design/references/layouts/sales.md +0 -50
  89. package/src/content/skills/report-design/references/native-visuals.md +0 -341
  90. package/src/content/skills/report-design/references/pbi-desktop-installation.md +0 -87
  91. package/src/content/skills/report-design/references/pbir-preview-activation.md +0 -40
  92. package/src/content/skills/report-design/references/slicer.md +0 -89
  93. package/src/content/skills/report-design/references/textbox.md +0 -101
  94. package/src/content/skills/report-design/references/themes/BISuperpowers.json +0 -915
  95. package/src/content/skills/report-design/references/troubleshooting.md +0 -135
  96. package/src/content/skills/report-design/references/visual-types.md +0 -78
  97. package/src/content/skills/report-design/scripts/apply-theme.js +0 -243
  98. package/src/content/skills/report-design/scripts/create-visual.js +0 -942
  99. package/src/content/skills/report-design/scripts/ensure-pbi-cli.sh +0 -41
  100. package/src/content/skills/report-design/scripts/validate-pbir.js +0 -351
@@ -20,12 +20,21 @@ const {
20
20
  } = require('../microsoft-mcp');
21
21
  const { parseSkillMetadata, getSkillPurpose } = require('./shared');
22
22
 
23
- // Currently the plugin ships 4 skills (bi-start, project-kickoff,
24
- // pbi-connect, report-design). bi-start is the session-opener that
25
- // routes to the other three; the rest are specialists.
23
+ // Currently the plugin ships 6 command skills:
24
+ // - bi-start: session-opener that routes to the BI specialists.
25
+ // - bi-kickoff: new-project bootstrap with AGENTS.md scaffolding.
26
+ // - bi-modeling / bi-dax / bi-performance: model design, DAX, profiling.
27
+ // - bi-connect: MCP connection + DAX UDFs.
26
28
  // The old reference-skills split is kept as an empty set so that any
27
29
  // downstream code that checks `REFERENCE_SKILLS.has(x)` still works.
28
- const COMMAND_SKILLS = new Set(['bi-start', 'project-kickoff', 'pbi-connect', 'report-design']);
30
+ const COMMAND_SKILLS = new Set([
31
+ 'bi-start',
32
+ 'bi-kickoff',
33
+ 'bi-modeling',
34
+ 'bi-dax',
35
+ 'bi-performance',
36
+ 'bi-connect',
37
+ ]);
29
38
 
30
39
  const REFERENCE_SKILLS = new Set();
31
40
 
@@ -124,6 +133,19 @@ function toFrontmatterValue(value) {
124
133
  return JSON.stringify(value);
125
134
  }
126
135
 
136
+ /**
137
+ * Return the canonical source path that maintainers should edit.
138
+ *
139
+ * @param {Object} skill - Skill definition object
140
+ * @returns {string} Source path relative to the repository root
141
+ */
142
+ function getSourceEditPath(skill) {
143
+ if (skill.bundleDir) {
144
+ return `src/content/skills/${skill.name}/SKILL.md`;
145
+ }
146
+ return `src/content/skills/${skill.name}.md`;
147
+ }
148
+
127
149
  // ---------------------------------------------------------------------------
128
150
  // Update-check preamble
129
151
  // ---------------------------------------------------------------------------
@@ -150,7 +172,7 @@ node "{skillBundleDir}/scripts/update-check.js" --silent-if-uptodate --silent-if
150
172
 
151
173
  - Empty output or \`UPTODATE\` — proceed with the skill silently. No message.
152
174
  - \`UPDATE_AVAILABLE <installed> <latest>\` — tell the user exactly once this conversation, before diving into the skill:
153
- > "Hay **bi-superpowers v{latest}** disponible (estás en v{installed}). Actualizá con \`super upgrade\` (o \`/plugin update bi-superpowers\` en Claude Code) cuando te venga bien. Si estás usando un plugin local generado con \`super kickoff\`, después corré \`super recharge\` en ese repo."
175
+ > "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."
154
176
 
155
177
  Then continue with the skill below.
156
178
  - \`SNOOZED <iso>\` — proceed silently.
@@ -185,12 +207,13 @@ function buildCommandMarkdown(skill, libraryPrefix, options = {}) {
185
207
  const description = getSkillPurpose(skill.name);
186
208
  const content = rewriteLibraryReferences(skill.content, libraryPrefix);
187
209
  const preamble = shouldIncludeUpdateCheckPreamble(skill, options) ? UPDATE_CHECK_PREAMBLE : '';
210
+ const sourceEditPath = getSourceEditPath(skill);
188
211
 
189
212
  return `---
190
213
  description: ${toFrontmatterValue(description)}
191
214
  ---
192
215
 
193
- <!-- Generated by BI Agent Superpowers. Edit src/content/skills/${skill.name}.md instead. -->
216
+ <!-- Generated by BI Agent Superpowers. Edit ${sourceEditPath} instead. -->
194
217
 
195
218
  ${preamble}${content}`;
196
219
  }
@@ -208,6 +231,7 @@ ${preamble}${content}`;
208
231
  function buildSkillMarkdown(skill, version, libraryPrefix, options = {}) {
209
232
  const content = rewriteLibraryReferences(skill.content, libraryPrefix);
210
233
  const preamble = shouldIncludeUpdateCheckPreamble(skill, options) ? UPDATE_CHECK_PREAMBLE : '';
234
+ const sourceEditPath = getSourceEditPath(skill);
211
235
 
212
236
  return `---
213
237
  name: ${toFrontmatterValue(skill.name)}
@@ -215,7 +239,7 @@ description: ${toFrontmatterValue(getPluginDescription(skill))}
215
239
  version: ${toFrontmatterValue(version)}
216
240
  ---
217
241
 
218
- <!-- Generated by BI Agent Superpowers. Edit src/content/skills/${skill.name}.md instead. -->
242
+ <!-- Generated by BI Agent Superpowers. Edit ${sourceEditPath} instead. -->
219
243
 
220
244
  ${preamble}${content}`;
221
245
  }
@@ -35,8 +35,8 @@ function parseSkillMetadata(content) {
35
35
  // - Prose bullets: - User mentions: "analizar proyecto", "new project"
36
36
  // - Asterisk bullets: * "pattern"
37
37
  // The regex intentionally doesn't anchor to bullet syntax — that's
38
- // what broke extraction for project-kickoff (prose) and under-counted
39
- // pbi-connect (first quote per bullet only) before this change.
38
+ // what broke extraction for bi-kickoff (prose) and under-counted
39
+ // bi-connect (first quote per bullet only) before this change.
40
40
  const triggerSection = content.match(/##\s+Trigger[\s\S]*?(?=##|$)/i);
41
41
  if (triggerSection) {
42
42
  const quotedFragments = triggerSection[0].match(/"([^"]+)"/g);
@@ -65,9 +65,15 @@ function parseSkillMetadata(content) {
65
65
  */
66
66
  const SKILL_PURPOSES = {
67
67
  'bi-start': 'Session opener — environment snapshot, update check, and routing to other skills',
68
- 'project-kickoff': 'Project analysis and planning',
69
- 'pbi-connect': 'Power BI Desktop connection',
70
- 'report-design': '3-page PBIR report generation for Power BI Desktop (Windows)',
68
+ 'bi-kickoff':
69
+ 'New-project bootstrap AGENTS.md, ROADMAP.md, foundation model with fictitious data',
70
+ 'bi-modeling':
71
+ 'Semantic model design and audit — star schema, relationships, Date Table, health checklist',
72
+ 'bi-dax':
73
+ 'DAX authoring, debugging, and optimization — measures, calculation groups, SE/FE timing, Sallieri patterns',
74
+ 'bi-performance':
75
+ 'Performance profiling — Performance Analyzer, VertiPaq DMVs, refresh diagnostics, Tabular Editor 2 / BPA',
76
+ 'bi-connect': 'Power BI Desktop MCP connection and DAX UDF authoring',
71
77
  };
72
78
 
73
79
  /**
@@ -205,8 +211,6 @@ function getFormatFooter() {
205
211
  ## Resources
206
212
 
207
213
  - Skills: \`skills/*/SKILL.md\` - BI workflow instructions
208
- - Report design references: \`skills/report-design/references/\` - PBIR layouts, themes, native visuals, and troubleshooting
209
- - Runtime scripts: \`skills/report-design/scripts/\` - PBIR visual, theme, and validation helpers
210
214
 
211
215
  ---
212
216
 
@@ -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 defensive against future renames.
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})\\][\\s\\S]*?(?=\\n\\[|$)`,
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(`⚠ No pude leer el skill ${filePath}: ${err.message}`);
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(`⚠ No pude leer el skill ${skillMd}: ${err.message}`);
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(`⚠ No pude leer el directorio de skills ${directory}: ${err.message}`);
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`, `report-design`, `report-design/SKILL.md`,
142
- * or `report-design\SKILL.md` (Windows separator) and returns the
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`, `report-design`).
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 — `report-design/SKILL.md`
150
- * came out as `report-design/SKILL` and the lookup failed.
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(executablePath, ['--start', ...process.argv.slice(2)], {
22
- stdio: 'inherit',
23
- env: process.env,
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}`);
@@ -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
- Plugin para Power BI Desktop — open source (MIT)
15
+ ║ Power BI Desktop toolkit — open source (MIT)
16
16
  ║ Developed by Lucas Sanchez (@luquimbo) ║
17
17
  ║ ║
18
18
  ╚═══════════════════════════════════════════════════════════╝
19
19
 
20
- Instalado correctamente.
20
+ Installed successfully.
21
21
 
22
22
  Quick Start:
23
- super install # Instalá skills + MCPs en tus agentes AI
23
+ super install # Install skills + MCPs in your AI agents
24
24
 
25
- Funciona con los 5 agentes:
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
- 4 skills iniciales:
33
- /bi-start — Arrancar una sesión (menú + update + conexión)
34
- /project-kickoff Analizá tu proyecto BI (proyecto nuevo)
35
- /pbi-connectConectá tu agente a Power BI Desktop
36
- /report-design Generá reportes PBIR para Power BI Desktop (Windows)
32
+ 6 skills:
33
+ /bi-start — Session opener and specialist routing
34
+ /bi-kickoff New BI project bootstrap
35
+ /bi-modelingSemantic 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 — Conexión local a Power BI Desktop (XMLA)
40
- microsoft-learn Docs de Microsoft Learn en contexto
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
  `);
@@ -179,33 +179,33 @@ function getMcpStatus() {
179
179
  */
180
180
  function getInstallInstructions() {
181
181
  return {
182
- title: 'Power BI Modeling MCP no detectado',
182
+ title: 'Power BI Modeling MCP not detected',
183
183
  options: [
184
184
  {
185
185
  name: 'VS Code / Cursor',
186
186
  steps: [
187
- 'Abrir VS Code o Cursor',
188
- 'Ir a Extensions (Ctrl+Shift+X)',
189
- 'Buscar "Power BI Modeling MCP"',
190
- 'Instalar la extensión de Microsoft',
191
- 'Ejecutar: super install --all --yes',
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
- 'Descargar VSIX desde VS Code Marketplace',
199
- 'Renombrar .vsix a .zip',
200
- `Extraer a ${path.join(os.homedir(), '.bi-superpowers', 'mcp')}`,
201
- 'Configurar BI_SUPERPOWERS_POWERBI_MODELING_MCP_PATH con la ruta al .exe',
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
- ? 'El MCP local solo está disponible en Windows. En Mac/Linux tenés microsoft-learn para docs oficiales.'
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
  }