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.
Files changed (276) hide show
  1. package/.claude-plugin/marketplace.json +31 -0
  2. package/.claude-plugin/plugin.json +34 -0
  3. package/.claude-plugin/skill-manifest.json +79 -0
  4. package/.mcp.json +13 -0
  5. package/.plugin/plugin.json +14 -0
  6. package/LICENSE +21 -0
  7. package/README.md +849 -0
  8. package/bin/build-plugin.js +97 -0
  9. package/bin/cli.js +891 -0
  10. package/bin/commands/autoupdate.js +128 -0
  11. package/bin/commands/build-desktop.js +368 -0
  12. package/bin/commands/create-from-template.js +165 -0
  13. package/bin/commands/diff.js +435 -0
  14. package/bin/commands/install.js +542 -0
  15. package/bin/commands/lint.js +441 -0
  16. package/bin/commands/mcp-setup.js +255 -0
  17. package/bin/commands/session-update.js +204 -0
  18. package/bin/commands/smoke-test.js +20 -0
  19. package/bin/commands/uninstall.js +611 -0
  20. package/bin/commands/update-check.js +427 -0
  21. package/bin/commands/validate-cases.js +264 -0
  22. package/bin/commands/validate-projects.js +426 -0
  23. package/bin/commands/watch.js +251 -0
  24. package/bin/lib/agents.js +62 -0
  25. package/bin/lib/base-template-smoke.js +299 -0
  26. package/bin/lib/claude-hooks.js +160 -0
  27. package/bin/lib/generators/claude-plugin.js +529 -0
  28. package/bin/lib/generators/index.js +116 -0
  29. package/bin/lib/generators/shared.js +257 -0
  30. package/bin/lib/mcp-config.js +835 -0
  31. package/bin/lib/microsoft-mcp.js +206 -0
  32. package/bin/lib/powerbi-mcp-session.js +140 -0
  33. package/bin/lib/skills.js +164 -0
  34. package/bin/lib/template-scaffold.js +366 -0
  35. package/bin/mcp/powerbi-modeling-launcher.js +42 -0
  36. package/bin/postinstall.js +50 -0
  37. package/bin/utils/mcp-detect.js +346 -0
  38. package/bin/utils/tui.js +314 -0
  39. package/commands/bi-connect.md +520 -0
  40. package/commands/bi-dax.md +464 -0
  41. package/commands/bi-kickoff.md +550 -0
  42. package/commands/bi-modeling.md +485 -0
  43. package/commands/bi-performance.md +521 -0
  44. package/commands/bi-powerquery.md +229 -0
  45. package/commands/bi-refactor.md +249 -0
  46. package/commands/bi-scorecard.md +268 -0
  47. package/commands/bi-start.md +272 -0
  48. package/config.example.json +23 -0
  49. package/config.json +23 -0
  50. package/desktop-extension/manifest.json +30 -0
  51. package/desktop-extension/package.json +10 -0
  52. package/desktop-extension/server.js +137 -0
  53. package/package.json +94 -0
  54. package/skills/bi-connect/SKILL.md +522 -0
  55. package/skills/bi-connect/scripts/update-check.js +427 -0
  56. package/skills/bi-dax/SKILL.md +466 -0
  57. package/skills/bi-dax/scripts/update-check.js +427 -0
  58. package/skills/bi-kickoff/SKILL.md +552 -0
  59. package/skills/bi-kickoff/references/flow.html +78 -0
  60. package/skills/bi-kickoff/references/flow.md +62 -0
  61. package/skills/bi-kickoff/scripts/update-check.js +427 -0
  62. package/skills/bi-modeling/SKILL.md +487 -0
  63. package/skills/bi-modeling/scripts/update-check.js +427 -0
  64. package/skills/bi-performance/SKILL.md +523 -0
  65. package/skills/bi-performance/scripts/install-tabular-editor.ps1 +159 -0
  66. package/skills/bi-performance/scripts/run-bpa.ps1 +265 -0
  67. package/skills/bi-performance/scripts/update-check.js +427 -0
  68. package/skills/bi-powerquery/SKILL.md +231 -0
  69. package/skills/bi-powerquery/references/base-template-data-contract.md +323 -0
  70. package/skills/bi-powerquery/references/power-query-standards.md +74 -0
  71. package/skills/bi-powerquery/scripts/new-powerquery-staging.ps1 +371 -0
  72. package/skills/bi-powerquery/scripts/test-powerquery-contract.ps1 +225 -0
  73. package/skills/bi-powerquery/scripts/update-check.js +427 -0
  74. package/skills/bi-refactor/SKILL.md +251 -0
  75. package/skills/bi-refactor/references/flow.md +27 -0
  76. package/skills/bi-refactor/scripts/update-check.js +427 -0
  77. package/skills/bi-scorecard/SKILL.md +270 -0
  78. package/skills/bi-scorecard/examples/base-template-scorecard-overlay.json +82 -0
  79. package/skills/bi-scorecard/scripts/new-scorecard-blueprint-from-base-template.ps1 +124 -0
  80. package/skills/bi-scorecard/scripts/powerbi-goal-status-rules-api.ps1 +39 -0
  81. package/skills/bi-scorecard/scripts/powerbi-goal-values-api.ps1 +48 -0
  82. package/skills/bi-scorecard/scripts/powerbi-goals-api.ps1 +68 -0
  83. package/skills/bi-scorecard/scripts/powerbi-rest-common.ps1 +197 -0
  84. package/skills/bi-scorecard/scripts/powerbi-scorecards-api.ps1 +53 -0
  85. package/skills/bi-scorecard/scripts/update-check.js +427 -0
  86. package/skills/bi-start/SKILL.md +274 -0
  87. package/skills/bi-start/scripts/update-check.js +427 -0
  88. package/src/content/base.md +197 -0
  89. package/src/content/mcp-requirements.json +57 -0
  90. package/src/content/routing.md +201 -0
  91. package/src/content/skills/bi-connect.md +493 -0
  92. package/src/content/skills/bi-dax.md +437 -0
  93. package/src/content/skills/bi-kickoff/SKILL.md +523 -0
  94. package/src/content/skills/bi-kickoff/references/flow.html +78 -0
  95. package/src/content/skills/bi-kickoff/references/flow.md +62 -0
  96. package/src/content/skills/bi-modeling.md +458 -0
  97. package/src/content/skills/bi-performance/SKILL.md +494 -0
  98. package/src/content/skills/bi-performance/scripts/install-tabular-editor.ps1 +159 -0
  99. package/src/content/skills/bi-performance/scripts/run-bpa.ps1 +265 -0
  100. package/src/content/skills/bi-powerquery/SKILL.md +202 -0
  101. package/src/content/skills/bi-powerquery/references/base-template-data-contract.md +323 -0
  102. package/src/content/skills/bi-powerquery/references/power-query-standards.md +74 -0
  103. package/src/content/skills/bi-powerquery/scripts/new-powerquery-staging.ps1 +371 -0
  104. package/src/content/skills/bi-powerquery/scripts/test-powerquery-contract.ps1 +225 -0
  105. package/src/content/skills/bi-refactor/SKILL.md +222 -0
  106. package/src/content/skills/bi-refactor/references/flow.md +27 -0
  107. package/src/content/skills/bi-scorecard/SKILL.md +241 -0
  108. package/src/content/skills/bi-scorecard/examples/base-template-scorecard-blueprint.expected.json +105 -0
  109. package/src/content/skills/bi-scorecard/examples/base-template-scorecard-overlay.json +82 -0
  110. package/src/content/skills/bi-scorecard/scripts/new-scorecard-blueprint-from-base-template.ps1 +124 -0
  111. package/src/content/skills/bi-scorecard/scripts/powerbi-goal-status-rules-api.ps1 +39 -0
  112. package/src/content/skills/bi-scorecard/scripts/powerbi-goal-values-api.ps1 +48 -0
  113. package/src/content/skills/bi-scorecard/scripts/powerbi-goals-api.ps1 +68 -0
  114. package/src/content/skills/bi-scorecard/scripts/powerbi-rest-common.ps1 +197 -0
  115. package/src/content/skills/bi-scorecard/scripts/powerbi-scorecards-api.ps1 +53 -0
  116. package/src/content/skills/bi-start.md +266 -0
  117. package/templates/base-template/AGENTS.md +33 -0
  118. package/templates/base-template/base-template.Report/.platform +11 -0
  119. package/templates/base-template/base-template.Report/StaticResources/RegisteredResources/BISuperpowers.json +3888 -0
  120. package/templates/base-template/base-template.Report/StaticResources/SharedResources/BaseThemes/CY18SU07.json +177 -0
  121. package/templates/base-template/base-template.Report/StaticResources/SharedResources/BaseThemes/Fluent2-CY26SU03.json +4104 -0
  122. package/templates/base-template/base-template.Report/StaticResources/SharedResources/BuiltInThemes/AccessibleCityPark.json +26 -0
  123. package/templates/base-template/base-template.Report/StaticResources/SharedResources/BuiltInThemes/AccessibleDefault.json +26 -0
  124. package/templates/base-template/base-template.Report/StaticResources/SharedResources/BuiltInThemes/AccessibleNeutral.json +26 -0
  125. package/templates/base-template/base-template.Report/StaticResources/SharedResources/BuiltInThemes/AccessibleOrchid.json +26 -0
  126. package/templates/base-template/base-template.Report/StaticResources/SharedResources/BuiltInThemes/AccessibleTidal.json +26 -0
  127. package/templates/base-template/base-template.Report/StaticResources/SharedResources/BuiltInThemes/Bloom.json +139 -0
  128. package/templates/base-template/base-template.Report/StaticResources/SharedResources/BuiltInThemes/CityPark.json +40 -0
  129. package/templates/base-template/base-template.Report/StaticResources/SharedResources/BuiltInThemes/Classroom.json +40 -0
  130. package/templates/base-template/base-template.Report/StaticResources/SharedResources/BuiltInThemes/ColorblindSafe.json +48 -0
  131. package/templates/base-template/base-template.Report/StaticResources/SharedResources/BuiltInThemes/CopilotDefault.json +1861 -0
  132. package/templates/base-template/base-template.Report/StaticResources/SharedResources/BuiltInThemes/Divergent.json +127 -0
  133. package/templates/base-template/base-template.Report/StaticResources/SharedResources/BuiltInThemes/Electric.json +48 -0
  134. package/templates/base-template/base-template.Report/StaticResources/SharedResources/BuiltInThemes/Frontier.json +136 -0
  135. package/templates/base-template/base-template.Report/StaticResources/SharedResources/BuiltInThemes/HighContrast.json +40 -0
  136. package/templates/base-template/base-template.Report/StaticResources/SharedResources/BuiltInThemes/Highrise.json +41 -0
  137. package/templates/base-template/base-template.Report/StaticResources/SharedResources/BuiltInThemes/Innovate.json +227 -0
  138. package/templates/base-template/base-template.Report/StaticResources/SharedResources/BuiltInThemes/NewExecutive.json +41 -0
  139. package/templates/base-template/base-template.Report/StaticResources/SharedResources/BuiltInThemes/Solar.json +33 -0
  140. package/templates/base-template/base-template.Report/StaticResources/SharedResources/BuiltInThemes/Storm.json +25 -0
  141. package/templates/base-template/base-template.Report/StaticResources/SharedResources/BuiltInThemes/Sunset.json +48 -0
  142. package/templates/base-template/base-template.Report/StaticResources/SharedResources/BuiltInThemes/Temperature.json +33 -0
  143. package/templates/base-template/base-template.Report/StaticResources/SharedResources/BuiltInThemes/Tidal.json +100 -0
  144. package/templates/base-template/base-template.Report/StaticResources/SharedResources/BuiltInThemes/Twilight.json +40 -0
  145. package/templates/base-template/base-template.Report/definition/bookmarks/1d40d43c7ade66e8603c.bookmark.json +2297 -0
  146. package/templates/base-template/base-template.Report/definition/bookmarks/af068ff51c0ca3089ea7.bookmark.json +2300 -0
  147. package/templates/base-template/base-template.Report/definition/bookmarks/bookmarks.json +11 -0
  148. package/templates/base-template/base-template.Report/definition/pages/6a4808bb8bb9166f49ff/page.json +130 -0
  149. package/templates/base-template/base-template.Report/definition/pages/6a4808bb8bb9166f49ff/visuals/0352fd80d074693a65db/mobile.json +11 -0
  150. package/templates/base-template/base-template.Report/definition/pages/6a4808bb8bb9166f49ff/visuals/0352fd80d074693a65db/visual.json +669 -0
  151. package/templates/base-template/base-template.Report/definition/pages/6a4808bb8bb9166f49ff/visuals/1c5a14bf493697344b68/mobile.json +11 -0
  152. package/templates/base-template/base-template.Report/definition/pages/6a4808bb8bb9166f49ff/visuals/1c5a14bf493697344b68/visual.json +723 -0
  153. package/templates/base-template/base-template.Report/definition/pages/6a4808bb8bb9166f49ff/visuals/3486cf7624c5b109b4e5/mobile.json +11 -0
  154. package/templates/base-template/base-template.Report/definition/pages/6a4808bb8bb9166f49ff/visuals/3486cf7624c5b109b4e5/visual.json +333 -0
  155. package/templates/base-template/base-template.Report/definition/pages/6a4808bb8bb9166f49ff/visuals/4d8b989008edc0db28d1/mobile.json +11 -0
  156. package/templates/base-template/base-template.Report/definition/pages/6a4808bb8bb9166f49ff/visuals/4d8b989008edc0db28d1/visual.json +109 -0
  157. package/templates/base-template/base-template.Report/definition/pages/6a4808bb8bb9166f49ff/visuals/55e10ac7d76a1954f94f/mobile.json +31 -0
  158. package/templates/base-template/base-template.Report/definition/pages/6a4808bb8bb9166f49ff/visuals/55e10ac7d76a1954f94f/visual.json +378 -0
  159. package/templates/base-template/base-template.Report/definition/pages/6a4808bb8bb9166f49ff/visuals/57f52ecf4490f70e4da1/mobile.json +11 -0
  160. package/templates/base-template/base-template.Report/definition/pages/6a4808bb8bb9166f49ff/visuals/57f52ecf4490f70e4da1/visual.json +175 -0
  161. package/templates/base-template/base-template.Report/definition/pages/6a4808bb8bb9166f49ff/visuals/5f4d76bbc870118e9840/mobile.json +11 -0
  162. package/templates/base-template/base-template.Report/definition/pages/6a4808bb8bb9166f49ff/visuals/5f4d76bbc870118e9840/visual.json +468 -0
  163. package/templates/base-template/base-template.Report/definition/pages/6a4808bb8bb9166f49ff/visuals/73629e1abebb7a444b59/mobile.json +11 -0
  164. package/templates/base-template/base-template.Report/definition/pages/6a4808bb8bb9166f49ff/visuals/73629e1abebb7a444b59/visual.json +359 -0
  165. package/templates/base-template/base-template.Report/definition/pages/6a4808bb8bb9166f49ff/visuals/749cb1388c7e0a88161c/mobile.json +11 -0
  166. package/templates/base-template/base-template.Report/definition/pages/6a4808bb8bb9166f49ff/visuals/749cb1388c7e0a88161c/visual.json +690 -0
  167. package/templates/base-template/base-template.Report/definition/pages/6a4808bb8bb9166f49ff/visuals/90677f13cea5d1275990/visual.json +17 -0
  168. package/templates/base-template/base-template.Report/definition/pages/6a4808bb8bb9166f49ff/visuals/92cf92e3da10493adb78/mobile.json +11 -0
  169. package/templates/base-template/base-template.Report/definition/pages/6a4808bb8bb9166f49ff/visuals/92cf92e3da10493adb78/visual.json +468 -0
  170. package/templates/base-template/base-template.Report/definition/pages/6a4808bb8bb9166f49ff/visuals/9fe17b1971f68443fc15/mobile.json +10 -0
  171. package/templates/base-template/base-template.Report/definition/pages/6a4808bb8bb9166f49ff/visuals/9fe17b1971f68443fc15/visual.json +328 -0
  172. package/templates/base-template/base-template.Report/definition/pages/6a4808bb8bb9166f49ff/visuals/a30bd0950630ed94e8a3/mobile.json +11 -0
  173. package/templates/base-template/base-template.Report/definition/pages/6a4808bb8bb9166f49ff/visuals/a30bd0950630ed94e8a3/visual.json +578 -0
  174. package/templates/base-template/base-template.Report/definition/pages/6a4808bb8bb9166f49ff/visuals/a56e91d9400a835e4814/mobile.json +11 -0
  175. package/templates/base-template/base-template.Report/definition/pages/6a4808bb8bb9166f49ff/visuals/a56e91d9400a835e4814/visual.json +432 -0
  176. package/templates/base-template/base-template.Report/definition/pages/6a4808bb8bb9166f49ff/visuals/aded24cd205c0b528642/mobile.json +11 -0
  177. package/templates/base-template/base-template.Report/definition/pages/6a4808bb8bb9166f49ff/visuals/aded24cd205c0b528642/visual.json +801 -0
  178. package/templates/base-template/base-template.Report/definition/pages/6a4808bb8bb9166f49ff/visuals/af34b26f14a8a724c9a9/mobile.json +37 -0
  179. package/templates/base-template/base-template.Report/definition/pages/6a4808bb8bb9166f49ff/visuals/af34b26f14a8a724c9a9/visual.json +1318 -0
  180. package/templates/base-template/base-template.Report/definition/pages/6a4808bb8bb9166f49ff/visuals/b529688fe5a226643322/visual.json +209 -0
  181. package/templates/base-template/base-template.Report/definition/pages/6a4808bb8bb9166f49ff/visuals/c4c6f332d05e72e2eb06/mobile.json +11 -0
  182. package/templates/base-template/base-template.Report/definition/pages/6a4808bb8bb9166f49ff/visuals/c4c6f332d05e72e2eb06/visual.json +174 -0
  183. package/templates/base-template/base-template.Report/definition/pages/6a4808bb8bb9166f49ff/visuals/fa81f184e2cb0e8b087c/mobile.json +29 -0
  184. package/templates/base-template/base-template.Report/definition/pages/6a4808bb8bb9166f49ff/visuals/fa81f184e2cb0e8b087c/visual.json +241 -0
  185. package/templates/base-template/base-template.Report/definition/pages/9a5b670b015cab882629/page.json +130 -0
  186. package/templates/base-template/base-template.Report/definition/pages/9a5b670b015cab882629/visuals/07e9c4302e29029c5462/mobile.json +11 -0
  187. package/templates/base-template/base-template.Report/definition/pages/9a5b670b015cab882629/visuals/07e9c4302e29029c5462/visual.json +690 -0
  188. package/templates/base-template/base-template.Report/definition/pages/9a5b670b015cab882629/visuals/109ceede4bc015b0c006/mobile.json +11 -0
  189. package/templates/base-template/base-template.Report/definition/pages/9a5b670b015cab882629/visuals/109ceede4bc015b0c006/visual.json +468 -0
  190. package/templates/base-template/base-template.Report/definition/pages/9a5b670b015cab882629/visuals/118257e006d472277e10/mobile.json +11 -0
  191. package/templates/base-template/base-template.Report/definition/pages/9a5b670b015cab882629/visuals/118257e006d472277e10/visual.json +359 -0
  192. package/templates/base-template/base-template.Report/definition/pages/9a5b670b015cab882629/visuals/2caf02e0137c4a1280cc/mobile.json +11 -0
  193. package/templates/base-template/base-template.Report/definition/pages/9a5b670b015cab882629/visuals/2caf02e0137c4a1280cc/visual.json +669 -0
  194. package/templates/base-template/base-template.Report/definition/pages/9a5b670b015cab882629/visuals/311e76fe3c9edad68204/mobile.json +11 -0
  195. package/templates/base-template/base-template.Report/definition/pages/9a5b670b015cab882629/visuals/311e76fe3c9edad68204/visual.json +109 -0
  196. package/templates/base-template/base-template.Report/definition/pages/9a5b670b015cab882629/visuals/31c21f8cbeb3b208940a/visual.json +209 -0
  197. package/templates/base-template/base-template.Report/definition/pages/9a5b670b015cab882629/visuals/3ab72c25062437149b03/visual.json +17 -0
  198. package/templates/base-template/base-template.Report/definition/pages/9a5b670b015cab882629/visuals/5959867442abcb0ce2b3/mobile.json +11 -0
  199. package/templates/base-template/base-template.Report/definition/pages/9a5b670b015cab882629/visuals/5959867442abcb0ce2b3/visual.json +788 -0
  200. package/templates/base-template/base-template.Report/definition/pages/9a5b670b015cab882629/visuals/5b96e0f88d192b044a13/mobile.json +11 -0
  201. package/templates/base-template/base-template.Report/definition/pages/9a5b670b015cab882629/visuals/5b96e0f88d192b044a13/visual.json +592 -0
  202. package/templates/base-template/base-template.Report/definition/pages/9a5b670b015cab882629/visuals/64e749a63d0786000e22/mobile.json +11 -0
  203. package/templates/base-template/base-template.Report/definition/pages/9a5b670b015cab882629/visuals/64e749a63d0786000e22/visual.json +468 -0
  204. package/templates/base-template/base-template.Report/definition/pages/9a5b670b015cab882629/visuals/7ae1ca604edac6586ad0/mobile.json +11 -0
  205. package/templates/base-template/base-template.Report/definition/pages/9a5b670b015cab882629/visuals/7ae1ca604edac6586ad0/visual.json +1310 -0
  206. package/templates/base-template/base-template.Report/definition/pages/9a5b670b015cab882629/visuals/840300733885141a6603/mobile.json +11 -0
  207. package/templates/base-template/base-template.Report/definition/pages/9a5b670b015cab882629/visuals/840300733885141a6603/visual.json +175 -0
  208. package/templates/base-template/base-template.Report/definition/pages/9a5b670b015cab882629/visuals/a38448cdb203279273d2/mobile.json +11 -0
  209. package/templates/base-template/base-template.Report/definition/pages/9a5b670b015cab882629/visuals/a38448cdb203279273d2/visual.json +516 -0
  210. package/templates/base-template/base-template.Report/definition/pages/9a5b670b015cab882629/visuals/d1e86f213a3841d12e20/visual.json +328 -0
  211. package/templates/base-template/base-template.Report/definition/pages/9a5b670b015cab882629/visuals/d4a484c1bcc8ee3075e2/mobile.json +11 -0
  212. package/templates/base-template/base-template.Report/definition/pages/9a5b670b015cab882629/visuals/d4a484c1bcc8ee3075e2/visual.json +432 -0
  213. package/templates/base-template/base-template.Report/definition/pages/9a5b670b015cab882629/visuals/d87cb5cf06acca19bbb5/mobile.json +11 -0
  214. package/templates/base-template/base-template.Report/definition/pages/9a5b670b015cab882629/visuals/d87cb5cf06acca19bbb5/visual.json +241 -0
  215. package/templates/base-template/base-template.Report/definition/pages/9a5b670b015cab882629/visuals/e243da2677209ed69408/mobile.json +11 -0
  216. package/templates/base-template/base-template.Report/definition/pages/9a5b670b015cab882629/visuals/e243da2677209ed69408/visual.json +174 -0
  217. package/templates/base-template/base-template.Report/definition/pages/9a5b670b015cab882629/visuals/f3aaf24f5b22b67573b0/mobile.json +11 -0
  218. package/templates/base-template/base-template.Report/definition/pages/9a5b670b015cab882629/visuals/f3aaf24f5b22b67573b0/visual.json +333 -0
  219. package/templates/base-template/base-template.Report/definition/pages/pages.json +8 -0
  220. package/templates/base-template/base-template.Report/definition/report.json +89 -0
  221. package/templates/base-template/base-template.Report/definition/version.json +4 -0
  222. package/templates/base-template/base-template.Report/definition.pbir +9 -0
  223. package/templates/base-template/base-template.SemanticModel/.platform +11 -0
  224. package/templates/base-template/base-template.SemanticModel/definition/cultures/es-AR.tmdl +11185 -0
  225. package/templates/base-template/base-template.SemanticModel/definition/database.tmdl +3 -0
  226. package/templates/base-template/base-template.SemanticModel/definition/expressions.tmdl +234 -0
  227. package/templates/base-template/base-template.SemanticModel/definition/functions.tmdl +637 -0
  228. package/templates/base-template/base-template.SemanticModel/definition/model.tmdl +82 -0
  229. package/templates/base-template/base-template.SemanticModel/definition/relationships.tmdl +271 -0
  230. package/templates/base-template/base-template.SemanticModel/definition/tables/Calendario.tmdl +200 -0
  231. package/templates/base-template/base-template.SemanticModel/definition/tables/Campa/303/261as.tmdl +75 -0
  232. package/templates/base-template/base-template.SemanticModel/definition/tables/Canales.tmdl +84 -0
  233. package/templates/base-template/base-template.SemanticModel/definition/tables/Clientes.tmdl +143 -0
  234. package/templates/base-template/base-template.SemanticModel/definition/tables/Devoluciones.tmdl +95 -0
  235. package/templates/base-template/base-template.SemanticModel/definition/tables/Ejecuci/303/263n proyectos.tmdl" +130 -0
  236. package/templates/base-template/base-template.SemanticModel/definition/tables/Entregas.tmdl +122 -0
  237. package/templates/base-template/base-template.SemanticModel/definition/tables/Equipos m/303/251tricas.tmdl" +40 -0
  238. package/templates/base-template/base-template.SemanticModel/definition/tables/Equipos.tmdl +73 -0
  239. package/templates/base-template/base-template.SemanticModel/definition/tables/Horas.tmdl +122 -0
  240. package/templates/base-template/base-template.SemanticModel/definition/tables/Interacciones clientes.tmdl +146 -0
  241. package/templates/base-template/base-template.SemanticModel/definition/tables/Leads.tmdl +119 -0
  242. package/templates/base-template/base-template.SemanticModel/definition/tables/Monedas.tmdl +44 -0
  243. package/templates/base-template/base-template.SemanticModel/definition/tables/Movimientos financieros.tmdl +145 -0
  244. package/templates/base-template/base-template.SemanticModel/definition/tables/M/303/251tricas.tmdl +1294 -0
  245. package/templates/base-template/base-template.SemanticModel/definition/tables/N/303/263mina.tmdl +110 -0
  246. package/templates/base-template/base-template.SemanticModel/definition/tables/Oportunidades.tmdl +135 -0
  247. package/templates/base-template/base-template.SemanticModel/definition/tables/Presupuesto.tmdl +125 -0
  248. package/templates/base-template/base-template.SemanticModel/definition/tables/Productos.tmdl +98 -0
  249. package/templates/base-template/base-template.SemanticModel/definition/tables/Proyectos.tmdl +77 -0
  250. package/templates/base-template/base-template.SemanticModel/definition/tables/Servicios.tmdl +75 -0
  251. package/templates/base-template/base-template.SemanticModel/definition/tables/Tareas proyecto.tmdl +102 -0
  252. package/templates/base-template/base-template.SemanticModel/definition/tables/Tipo de cambio.tmdl +67 -0
  253. package/templates/base-template/base-template.SemanticModel/definition/tables/Ventas.tmdl +180 -0
  254. package/templates/base-template/base-template.SemanticModel/definition/tables/_Aux An/303/241lisis dimensiones.tmdl" +38 -0
  255. package/templates/base-template/base-template.SemanticModel/definition/tables/_Aux Comparaciones.tmdl +227 -0
  256. package/templates/base-template/base-template.SemanticModel/definition/tables/_Aux Compatibilidad m/303/251trica-dimensi/303/263n.tmdl" +68 -0
  257. package/templates/base-template/base-template.SemanticModel/definition/tables/_Aux Modelo configuraci/303/263n.tmdl" +44 -0
  258. package/templates/base-template/base-template.SemanticModel/definition/tables/_Aux Modo fechas.tmdl +36 -0
  259. package/templates/base-template/base-template.SemanticModel/definition/tables/_Aux M/303/251trica-Equipo.tmdl" +102 -0
  260. package/templates/base-template/base-template.SemanticModel/definition/tables/_Aux Overrides m/303/251trica-dimensi/303/263n.tmdl" +54 -0
  261. package/templates/base-template/base-template.SemanticModel/definition/tables/_Aux Per/303/255odos.tmdl" +182 -0
  262. package/templates/base-template/base-template.SemanticModel/definition/tables/_Aux Rango fechas modo.tmdl +36 -0
  263. package/templates/base-template/base-template.SemanticModel/definition/tables/_Aux Rango fechas.tmdl +27 -0
  264. package/templates/base-template/base-template.SemanticModel/definition/tables/_Aux Vista de calendario.tmdl +30 -0
  265. package/templates/base-template/base-template.SemanticModel/definition/tables/_GC C/303/241lculo.tmdl" +70 -0
  266. package/templates/base-template/base-template.SemanticModel/definition/tables/_GC Eje X.tmdl +63 -0
  267. package/templates/base-template/base-template.SemanticModel/definition/tables/_GC M/303/251trica.tmdl" +374 -0
  268. package/templates/base-template/base-template.SemanticModel/definition/tables/_GC Tipo c/303/241lculo.tmdl" +223 -0
  269. package/templates/base-template/base-template.SemanticModel/definition/tables/_PC Dimensi/303/263n.tmdl" +98 -0
  270. package/templates/base-template/base-template.SemanticModel/definition/tables/_PC Eje X.tmdl +68 -0
  271. package/templates/base-template/base-template.SemanticModel/definition/tables//303/223rdenes servicio.tmdl" +151 -0
  272. package/templates/base-template/base-template.SemanticModel/definition.pbism +5 -0
  273. package/templates/base-template/base-template.SemanticModel/diagramLayout.json +568 -0
  274. package/templates/base-template/base-template.pbip +14 -0
  275. package/templates/base-template/template.manifest.json +41 -0
  276. package/theme/BISuperpowers.json +3888 -0
@@ -0,0 +1,435 @@
1
+ /**
2
+ * Diff Command (scan)
3
+ * ===================
4
+ * Shows differences between source skills and generated configs.
5
+ *
6
+ * Usage:
7
+ * super scan Show all pending changes
8
+ * super scan --skill dax Show changes for specific skill
9
+ * super scan --tool claude-code Show changes for specific tool
10
+ */
11
+
12
+ const fs = require('fs');
13
+ const path = require('path');
14
+ const tui = require('../utils/tui');
15
+ const { readSkillDirectory, normalizeSkillName } = require('../lib/skills');
16
+ const { buildCommandMarkdown } = require('../lib/generators/claude-plugin');
17
+
18
+ /**
19
+ * Generate a simple diff between two strings
20
+ * @param {string} oldContent - Original content
21
+ * @param {string} newContent - New content
22
+ * @returns {Object} Diff result with lines and stats
23
+ */
24
+ function generateDiff(oldContent, newContent) {
25
+ const oldLines = oldContent.split('\n');
26
+ const newLines = newContent.split('\n');
27
+
28
+ const diff = {
29
+ lines: [],
30
+ additions: 0,
31
+ deletions: 0,
32
+ unchanged: 0,
33
+ };
34
+
35
+ // Multiset-based diff: track per-line frequency so duplicate lines
36
+ // (blank lines, repeated patterns like `---`) are matched independently
37
+ // rather than collapsing into a single Set entry.
38
+ const newCounts = new Map();
39
+ for (const line of newLines) {
40
+ newCounts.set(line, (newCounts.get(line) || 0) + 1);
41
+ }
42
+
43
+ // Walk old lines. Consume one slot from newCounts when the line exists
44
+ // in the new file; mark as removed otherwise.
45
+ for (let i = 0; i < oldLines.length; i++) {
46
+ const line = oldLines[i];
47
+ const available = newCounts.get(line) || 0;
48
+ if (available > 0) {
49
+ diff.lines.push({ type: 'unchanged', content: line, lineNum: i + 1 });
50
+ diff.unchanged++;
51
+ newCounts.set(line, available - 1);
52
+ } else {
53
+ diff.lines.push({ type: 'removed', content: line, lineNum: i + 1 });
54
+ diff.deletions++;
55
+ }
56
+ }
57
+
58
+ // Walk new lines. Lines whose old-count was already consumed are additions.
59
+ const oldCounts = new Map();
60
+ for (const line of oldLines) {
61
+ oldCounts.set(line, (oldCounts.get(line) || 0) + 1);
62
+ }
63
+ const consumed = new Map();
64
+ for (let i = 0; i < newLines.length; i++) {
65
+ const line = newLines[i];
66
+ const total = oldCounts.get(line) || 0;
67
+ const used = consumed.get(line) || 0;
68
+ if (used < total) {
69
+ consumed.set(line, used + 1);
70
+ } else {
71
+ diff.lines.push({ type: 'added', content: line, lineNum: i + 1 });
72
+ diff.additions++;
73
+ }
74
+ }
75
+
76
+ return diff;
77
+ }
78
+
79
+ /**
80
+ * Compare a source skill with its generated output
81
+ * @param {string} skillPath - Path to source skill
82
+ * @param {string} generatedPath - Path to generated file
83
+ * @returns {Object|null} Comparison result or null if no difference
84
+ */
85
+ function compareFiles(skillPath, generatedPath) {
86
+ if (!fs.existsSync(skillPath)) {
87
+ return {
88
+ skill: path.basename(skillPath),
89
+ status: 'missing-source',
90
+ message: 'Source skill file not found',
91
+ };
92
+ }
93
+
94
+ if (!fs.existsSync(generatedPath)) {
95
+ return {
96
+ skill: path.basename(skillPath),
97
+ status: 'not-generated',
98
+ message: 'Generated file does not exist (will be created on sync)',
99
+ };
100
+ }
101
+
102
+ const sourceContent = fs.readFileSync(skillPath, 'utf8');
103
+ const generatedContent = fs.readFileSync(generatedPath, 'utf8');
104
+
105
+ if (sourceContent === generatedContent) {
106
+ return {
107
+ skill: path.basename(skillPath),
108
+ status: 'unchanged',
109
+ message: 'No changes',
110
+ };
111
+ }
112
+
113
+ const diff = generateDiff(generatedContent, sourceContent);
114
+
115
+ return {
116
+ skill: path.basename(skillPath),
117
+ status: 'changed',
118
+ diff,
119
+ sourcePath: skillPath,
120
+ generatedPath,
121
+ };
122
+ }
123
+
124
+ /**
125
+ * Compare a loaded skill against the content that should have been generated
126
+ * for a specific tool. This avoids false drift from generator-owned wrappers
127
+ * such as Claude command frontmatter, generated comments, and update-check
128
+ * preambles.
129
+ *
130
+ * @param {{name: string, path: string, content: string}} skill - Loaded source skill
131
+ * @param {string} generatedPath - Path to generated file
132
+ * @param {Object} [options] - Comparison options
133
+ * @param {string} [options.tool] - Tool id
134
+ * @param {string} [options.libraryPrefix] - Library prefix used by the generator
135
+ * @returns {Object} Comparison result
136
+ */
137
+ function compareSkillToGenerated(skill, generatedPath, options = {}) {
138
+ if (!skill || !fs.existsSync(skill.path)) {
139
+ return {
140
+ skill: skill && skill.name ? skill.name : 'unknown',
141
+ status: 'missing-source',
142
+ message: 'Source skill file not found',
143
+ };
144
+ }
145
+
146
+ if (!fs.existsSync(generatedPath)) {
147
+ return {
148
+ skill: skill.name,
149
+ status: 'not-generated',
150
+ message: 'Generated file does not exist (will be created on sync)',
151
+ };
152
+ }
153
+
154
+ const generatedContent = fs.readFileSync(generatedPath, 'utf8');
155
+ const expectedContent = buildExpectedGeneratedContent(skill, options);
156
+
157
+ if (expectedContent === generatedContent) {
158
+ return {
159
+ skill: skill.name,
160
+ status: 'unchanged',
161
+ message: 'No changes',
162
+ };
163
+ }
164
+
165
+ const diff = generateDiff(generatedContent, expectedContent);
166
+
167
+ return {
168
+ skill: skill.name,
169
+ status: 'changed',
170
+ diff,
171
+ sourcePath: skill.path,
172
+ generatedPath,
173
+ };
174
+ }
175
+
176
+ /**
177
+ * @param {{name: string, content: string}} skill - Loaded source skill
178
+ * @param {Object} options - Comparison options
179
+ * @returns {string} Expected generated output for the scan target
180
+ */
181
+ function buildExpectedGeneratedContent(skill, options = {}) {
182
+ if (options.tool === 'claude-code') {
183
+ return buildCommandMarkdown(skill, options.libraryPrefix || 'library');
184
+ }
185
+
186
+ return skill.content;
187
+ }
188
+
189
+ /**
190
+ * Get generated file path for a skill based on tool
191
+ * @param {string} skillName - Skill name (without .md)
192
+ * @param {string} tool - AI tool name
193
+ * @param {string} targetDir - Target project directory
194
+ * @returns {string|null} Path to generated file or null
195
+ */
196
+ function getGeneratedPath(skillName, tool, targetDir) {
197
+ switch (tool) {
198
+ case 'claude-code':
199
+ // The Claude Code plugin generator (bin/lib/generators/claude-plugin.js)
200
+ // writes slash commands to `<targetDir>/commands/<skill>.md` — NOT
201
+ // `.claude/commands/...`. An earlier path here pointed at the old
202
+ // location and silently made `super scan --tool claude-code`
203
+ // report every skill as "not-generated".
204
+ return path.join(targetDir, 'commands', `${skillName}.md`);
205
+ case 'cursor':
206
+ // Cursor uses a single file, can't diff per-skill
207
+ return null;
208
+ case 'copilot':
209
+ // Copilot uses a single file, can't diff per-skill
210
+ return null;
211
+ default:
212
+ return null;
213
+ }
214
+ }
215
+
216
+ /**
217
+ * Display diff for a single comparison
218
+ * @param {Object} comparison - Comparison result
219
+ * @param {boolean} verbose - Show full diff
220
+ */
221
+ function displayComparison(comparison, verbose = false) {
222
+ const { skill, status, diff } = comparison;
223
+
224
+ switch (status) {
225
+ case 'unchanged':
226
+ console.log(`${tui.icons.success} ${tui.colors.muted(skill)} - No changes`);
227
+ break;
228
+
229
+ case 'not-generated':
230
+ console.log(`${tui.icons.info} ${tui.colors.info(skill)} - Will be created`);
231
+ break;
232
+
233
+ case 'missing-source':
234
+ console.log(`${tui.icons.warning} ${tui.colors.warning(skill)} - Source missing`);
235
+ break;
236
+
237
+ case 'changed':
238
+ console.log(`\n${tui.icons.warning} ${tui.colors.highlight(skill)} - Changes detected`);
239
+ console.log(
240
+ ` ${tui.colors.success(`+${diff.additions}`)} additions, ${tui.colors.error(`-${diff.deletions}`)} deletions`
241
+ );
242
+
243
+ if (verbose && diff.lines) {
244
+ console.log('');
245
+ diff.lines.forEach((line) => {
246
+ if (line.type === 'added') {
247
+ tui.diffAdd(tui.truncate(line.content, 100));
248
+ } else if (line.type === 'removed') {
249
+ tui.diffRemove(tui.truncate(line.content, 100));
250
+ }
251
+ });
252
+ }
253
+ break;
254
+ }
255
+ }
256
+
257
+ /**
258
+ * Parse command line arguments
259
+ * @param {string[]} args - CLI arguments
260
+ * @returns {Object} Parsed options
261
+ */
262
+ function parseArgs(args) {
263
+ const options = {
264
+ skill: null,
265
+ tool: 'claude-code', // Default to claude-code as it supports per-skill diffs
266
+ verbose: false,
267
+ targetDir: process.cwd(),
268
+ };
269
+
270
+ for (let i = 0; i < args.length; i++) {
271
+ const arg = args[i];
272
+
273
+ if (arg === '--skill' || arg === '-s') {
274
+ options.skill = args[++i];
275
+ } else if (arg === '--tool' || arg === '-t') {
276
+ options.tool = args[++i];
277
+ } else if (arg === '--verbose' || arg === '-v') {
278
+ options.verbose = true;
279
+ } else if (!arg.startsWith('-')) {
280
+ options.targetDir = arg;
281
+ }
282
+ }
283
+
284
+ return options;
285
+ }
286
+
287
+ /**
288
+ * Main diff command handler
289
+ * @param {string[]} args - Command arguments
290
+ * @param {Object} config - CLI configuration with paths
291
+ */
292
+ function diffCommand(args, config) {
293
+ const options = parseArgs(args);
294
+ const targetDir = options.targetDir;
295
+
296
+ // Try cache directory first, fall back to local skills
297
+ let skillsDir = config.skillsDir;
298
+ const localSkills = path.join(config.packageDir, '.agents', 'prompts', 'skills');
299
+
300
+ if (!fs.existsSync(skillsDir)) {
301
+ if (fs.existsSync(localSkills)) {
302
+ skillsDir = localSkills;
303
+ } else {
304
+ tui.error('Skills directory not found. Try reinstalling: npm install -g bi-superpowers');
305
+ process.exit(1);
306
+ }
307
+ }
308
+
309
+ tui.header('BI Agent Superpowers', 'Diff: Source vs Generated');
310
+
311
+ // Check if tool supports per-skill diff
312
+ if (options.tool !== 'claude-code') {
313
+ tui.warning(`Tool "${options.tool}" uses a combined config file.`);
314
+ tui.info('Per-skill diff is only available for Claude Code.');
315
+ console.log('\nTo see changes, compare:');
316
+ console.log(` Source: ${skillsDir}`);
317
+
318
+ switch (options.tool) {
319
+ case 'cursor':
320
+ console.log(` Generated: ${path.join(targetDir, '.cursorrules')}`);
321
+ break;
322
+ case 'copilot':
323
+ console.log(` Generated: ${path.join(targetDir, '.github', 'copilot-instructions.md')}`);
324
+ break;
325
+ }
326
+ return;
327
+ }
328
+
329
+ // Get skill files to compare. Use the shared skill loader so both
330
+ // flat (`<name>.md`) and folder-based (`<name>/SKILL.md`) skills
331
+ // are picked up — a previous version filtered with
332
+ // `f.endsWith('.md')` and silently dropped every folder-based skill.
333
+ const allSkills = readSkillDirectory(skillsDir);
334
+ const skillsByName = new Map(allSkills.map((s) => [s.name, s]));
335
+ const skillNameByPath = new Map(allSkills.map((s) => [s.path, s.name]));
336
+ let skillFiles = [];
337
+
338
+ if (options.skill) {
339
+ // normalizeSkillName accepts `dax`, `dax.md`, `folder-skill`, or
340
+ // `folder-skill/SKILL.md` and returns the canonical skill name.
341
+ const skill = skillsByName.get(normalizeSkillName(options.skill));
342
+ if (skill) {
343
+ skillFiles = [skill.path];
344
+ } else {
345
+ tui.error(`Skill not found: ${options.skill}`);
346
+ process.exit(1);
347
+ }
348
+ } else {
349
+ skillFiles = allSkills.map((s) => s.path);
350
+ }
351
+
352
+ if (skillFiles.length === 0) {
353
+ tui.warning('No skill files found');
354
+ return;
355
+ }
356
+
357
+ tui.info(`Comparing ${skillFiles.length} skill(s) for ${options.tool}...`);
358
+ tui.section('Changes');
359
+
360
+ // Compare each skill. Use the loader-built map to derive the canonical
361
+ // skill name — for folder-based skills the path is `<folder>/SKILL.md`
362
+ // and `path.basename(...)` would return `SKILL`, breaking the diff.
363
+ const results = skillFiles.map((skillPath) => {
364
+ const skillName = skillNameByPath.get(skillPath) || path.basename(skillPath, '.md');
365
+ const skill = skillsByName.get(skillName);
366
+ const generatedPath = getGeneratedPath(skillName, options.tool, targetDir);
367
+
368
+ if (!generatedPath) {
369
+ return {
370
+ skill: skillName,
371
+ status: 'skipped',
372
+ message: 'Tool does not support per-skill diff',
373
+ };
374
+ }
375
+
376
+ return compareSkillToGenerated(skill, generatedPath, {
377
+ tool: options.tool,
378
+ libraryPrefix: getLibraryPrefix(targetDir, config.packageDir),
379
+ });
380
+ });
381
+
382
+ // Display results
383
+ results.forEach((result) => {
384
+ displayComparison(result, options.verbose);
385
+ });
386
+
387
+ // Summary
388
+ const changed = results.filter((r) => r.status === 'changed').length;
389
+ const unchanged = results.filter((r) => r.status === 'unchanged').length;
390
+ const notGenerated = results.filter((r) => r.status === 'not-generated').length;
391
+
392
+ console.log('');
393
+ tui.section('Summary');
394
+
395
+ const table = tui.createTable(
396
+ ['Status', 'Count'],
397
+ [
398
+ ['Unchanged', unchanged.toString()],
399
+ ['Changed', tui.colors.warning(changed.toString())],
400
+ ['New (will create)', tui.colors.info(notGenerated.toString())],
401
+ ]
402
+ );
403
+ console.log(table);
404
+
405
+ if (changed > 0 || notGenerated > 0) {
406
+ console.log(
407
+ `\n${tui.colors.muted('Run')} super recharge ${tui.colors.muted('to apply changes')}`
408
+ );
409
+ } else {
410
+ console.log(`\n${tui.icons.success} ${tui.colors.success('Everything is in sync!')}`);
411
+ }
412
+ }
413
+
414
+ // Expose primitives for tests (B3 — replace fake tests with real ones).
415
+ module.exports = Object.assign(diffCommand, {
416
+ generateDiff,
417
+ compareFiles,
418
+ compareSkillToGenerated,
419
+ buildExpectedGeneratedContent,
420
+ getGeneratedPath,
421
+ parseArgs,
422
+ });
423
+
424
+ /**
425
+ * Match the Claude plugin generator's library reference behavior.
426
+ *
427
+ * @param {string} targetDir - Target project directory
428
+ * @param {string} packageDir - Package root
429
+ * @returns {string} Library prefix used in generated markdown
430
+ */
431
+ function getLibraryPrefix(targetDir, packageDir) {
432
+ return fs.existsSync(path.join(targetDir, 'library'))
433
+ ? 'library'
434
+ : path.join(packageDir, 'library');
435
+ }