bi-superpowers 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude-plugin/marketplace.json +31 -0
- package/.claude-plugin/plugin.json +34 -0
- package/.claude-plugin/skill-manifest.json +79 -0
- package/.mcp.json +13 -0
- package/.plugin/plugin.json +14 -0
- package/LICENSE +21 -0
- package/README.md +849 -0
- package/bin/build-plugin.js +97 -0
- package/bin/cli.js +891 -0
- package/bin/commands/autoupdate.js +128 -0
- package/bin/commands/build-desktop.js +368 -0
- package/bin/commands/create-from-template.js +165 -0
- package/bin/commands/diff.js +435 -0
- package/bin/commands/install.js +542 -0
- package/bin/commands/lint.js +441 -0
- package/bin/commands/mcp-setup.js +255 -0
- package/bin/commands/session-update.js +204 -0
- package/bin/commands/smoke-test.js +20 -0
- package/bin/commands/uninstall.js +611 -0
- package/bin/commands/update-check.js +427 -0
- package/bin/commands/validate-cases.js +264 -0
- package/bin/commands/validate-projects.js +426 -0
- package/bin/commands/watch.js +251 -0
- package/bin/lib/agents.js +62 -0
- package/bin/lib/base-template-smoke.js +299 -0
- package/bin/lib/claude-hooks.js +160 -0
- package/bin/lib/generators/claude-plugin.js +529 -0
- package/bin/lib/generators/index.js +116 -0
- package/bin/lib/generators/shared.js +257 -0
- package/bin/lib/mcp-config.js +835 -0
- package/bin/lib/microsoft-mcp.js +206 -0
- package/bin/lib/powerbi-mcp-session.js +140 -0
- package/bin/lib/skills.js +164 -0
- package/bin/lib/template-scaffold.js +366 -0
- package/bin/mcp/powerbi-modeling-launcher.js +42 -0
- package/bin/postinstall.js +50 -0
- package/bin/utils/mcp-detect.js +346 -0
- package/bin/utils/tui.js +314 -0
- package/commands/bi-connect.md +520 -0
- package/commands/bi-dax.md +464 -0
- package/commands/bi-kickoff.md +550 -0
- package/commands/bi-modeling.md +485 -0
- package/commands/bi-performance.md +521 -0
- package/commands/bi-powerquery.md +229 -0
- package/commands/bi-refactor.md +249 -0
- package/commands/bi-scorecard.md +268 -0
- package/commands/bi-start.md +272 -0
- package/config.example.json +23 -0
- package/config.json +23 -0
- package/desktop-extension/manifest.json +30 -0
- package/desktop-extension/package.json +10 -0
- package/desktop-extension/server.js +137 -0
- package/package.json +94 -0
- package/skills/bi-connect/SKILL.md +522 -0
- package/skills/bi-connect/scripts/update-check.js +427 -0
- package/skills/bi-dax/SKILL.md +466 -0
- package/skills/bi-dax/scripts/update-check.js +427 -0
- package/skills/bi-kickoff/SKILL.md +552 -0
- package/skills/bi-kickoff/references/flow.html +78 -0
- package/skills/bi-kickoff/references/flow.md +62 -0
- package/skills/bi-kickoff/scripts/update-check.js +427 -0
- package/skills/bi-modeling/SKILL.md +487 -0
- package/skills/bi-modeling/scripts/update-check.js +427 -0
- package/skills/bi-performance/SKILL.md +523 -0
- package/skills/bi-performance/scripts/install-tabular-editor.ps1 +159 -0
- package/skills/bi-performance/scripts/run-bpa.ps1 +265 -0
- package/skills/bi-performance/scripts/update-check.js +427 -0
- package/skills/bi-powerquery/SKILL.md +231 -0
- package/skills/bi-powerquery/references/base-template-data-contract.md +323 -0
- package/skills/bi-powerquery/references/power-query-standards.md +74 -0
- package/skills/bi-powerquery/scripts/new-powerquery-staging.ps1 +371 -0
- package/skills/bi-powerquery/scripts/test-powerquery-contract.ps1 +225 -0
- package/skills/bi-powerquery/scripts/update-check.js +427 -0
- package/skills/bi-refactor/SKILL.md +251 -0
- package/skills/bi-refactor/references/flow.md +27 -0
- package/skills/bi-refactor/scripts/update-check.js +427 -0
- package/skills/bi-scorecard/SKILL.md +270 -0
- package/skills/bi-scorecard/examples/base-template-scorecard-overlay.json +82 -0
- package/skills/bi-scorecard/scripts/new-scorecard-blueprint-from-base-template.ps1 +124 -0
- package/skills/bi-scorecard/scripts/powerbi-goal-status-rules-api.ps1 +39 -0
- package/skills/bi-scorecard/scripts/powerbi-goal-values-api.ps1 +48 -0
- package/skills/bi-scorecard/scripts/powerbi-goals-api.ps1 +68 -0
- package/skills/bi-scorecard/scripts/powerbi-rest-common.ps1 +197 -0
- package/skills/bi-scorecard/scripts/powerbi-scorecards-api.ps1 +53 -0
- package/skills/bi-scorecard/scripts/update-check.js +427 -0
- package/skills/bi-start/SKILL.md +274 -0
- package/skills/bi-start/scripts/update-check.js +427 -0
- package/src/content/base.md +197 -0
- package/src/content/mcp-requirements.json +57 -0
- package/src/content/routing.md +201 -0
- package/src/content/skills/bi-connect.md +493 -0
- package/src/content/skills/bi-dax.md +437 -0
- package/src/content/skills/bi-kickoff/SKILL.md +523 -0
- package/src/content/skills/bi-kickoff/references/flow.html +78 -0
- package/src/content/skills/bi-kickoff/references/flow.md +62 -0
- package/src/content/skills/bi-modeling.md +458 -0
- package/src/content/skills/bi-performance/SKILL.md +494 -0
- package/src/content/skills/bi-performance/scripts/install-tabular-editor.ps1 +159 -0
- package/src/content/skills/bi-performance/scripts/run-bpa.ps1 +265 -0
- package/src/content/skills/bi-powerquery/SKILL.md +202 -0
- package/src/content/skills/bi-powerquery/references/base-template-data-contract.md +323 -0
- package/src/content/skills/bi-powerquery/references/power-query-standards.md +74 -0
- package/src/content/skills/bi-powerquery/scripts/new-powerquery-staging.ps1 +371 -0
- package/src/content/skills/bi-powerquery/scripts/test-powerquery-contract.ps1 +225 -0
- package/src/content/skills/bi-refactor/SKILL.md +222 -0
- package/src/content/skills/bi-refactor/references/flow.md +27 -0
- package/src/content/skills/bi-scorecard/SKILL.md +241 -0
- package/src/content/skills/bi-scorecard/examples/base-template-scorecard-blueprint.expected.json +105 -0
- package/src/content/skills/bi-scorecard/examples/base-template-scorecard-overlay.json +82 -0
- package/src/content/skills/bi-scorecard/scripts/new-scorecard-blueprint-from-base-template.ps1 +124 -0
- package/src/content/skills/bi-scorecard/scripts/powerbi-goal-status-rules-api.ps1 +39 -0
- package/src/content/skills/bi-scorecard/scripts/powerbi-goal-values-api.ps1 +48 -0
- package/src/content/skills/bi-scorecard/scripts/powerbi-goals-api.ps1 +68 -0
- package/src/content/skills/bi-scorecard/scripts/powerbi-rest-common.ps1 +197 -0
- package/src/content/skills/bi-scorecard/scripts/powerbi-scorecards-api.ps1 +53 -0
- package/src/content/skills/bi-start.md +266 -0
- package/templates/base-template/AGENTS.md +33 -0
- package/templates/base-template/base-template.Report/.platform +11 -0
- package/templates/base-template/base-template.Report/StaticResources/RegisteredResources/BISuperpowers.json +3888 -0
- package/templates/base-template/base-template.Report/StaticResources/SharedResources/BaseThemes/CY18SU07.json +177 -0
- package/templates/base-template/base-template.Report/StaticResources/SharedResources/BaseThemes/Fluent2-CY26SU03.json +4104 -0
- package/templates/base-template/base-template.Report/StaticResources/SharedResources/BuiltInThemes/AccessibleCityPark.json +26 -0
- package/templates/base-template/base-template.Report/StaticResources/SharedResources/BuiltInThemes/AccessibleDefault.json +26 -0
- package/templates/base-template/base-template.Report/StaticResources/SharedResources/BuiltInThemes/AccessibleNeutral.json +26 -0
- package/templates/base-template/base-template.Report/StaticResources/SharedResources/BuiltInThemes/AccessibleOrchid.json +26 -0
- package/templates/base-template/base-template.Report/StaticResources/SharedResources/BuiltInThemes/AccessibleTidal.json +26 -0
- package/templates/base-template/base-template.Report/StaticResources/SharedResources/BuiltInThemes/Bloom.json +139 -0
- package/templates/base-template/base-template.Report/StaticResources/SharedResources/BuiltInThemes/CityPark.json +40 -0
- package/templates/base-template/base-template.Report/StaticResources/SharedResources/BuiltInThemes/Classroom.json +40 -0
- package/templates/base-template/base-template.Report/StaticResources/SharedResources/BuiltInThemes/ColorblindSafe.json +48 -0
- package/templates/base-template/base-template.Report/StaticResources/SharedResources/BuiltInThemes/CopilotDefault.json +1861 -0
- package/templates/base-template/base-template.Report/StaticResources/SharedResources/BuiltInThemes/Divergent.json +127 -0
- package/templates/base-template/base-template.Report/StaticResources/SharedResources/BuiltInThemes/Electric.json +48 -0
- package/templates/base-template/base-template.Report/StaticResources/SharedResources/BuiltInThemes/Frontier.json +136 -0
- package/templates/base-template/base-template.Report/StaticResources/SharedResources/BuiltInThemes/HighContrast.json +40 -0
- package/templates/base-template/base-template.Report/StaticResources/SharedResources/BuiltInThemes/Highrise.json +41 -0
- package/templates/base-template/base-template.Report/StaticResources/SharedResources/BuiltInThemes/Innovate.json +227 -0
- package/templates/base-template/base-template.Report/StaticResources/SharedResources/BuiltInThemes/NewExecutive.json +41 -0
- package/templates/base-template/base-template.Report/StaticResources/SharedResources/BuiltInThemes/Solar.json +33 -0
- package/templates/base-template/base-template.Report/StaticResources/SharedResources/BuiltInThemes/Storm.json +25 -0
- package/templates/base-template/base-template.Report/StaticResources/SharedResources/BuiltInThemes/Sunset.json +48 -0
- package/templates/base-template/base-template.Report/StaticResources/SharedResources/BuiltInThemes/Temperature.json +33 -0
- package/templates/base-template/base-template.Report/StaticResources/SharedResources/BuiltInThemes/Tidal.json +100 -0
- package/templates/base-template/base-template.Report/StaticResources/SharedResources/BuiltInThemes/Twilight.json +40 -0
- package/templates/base-template/base-template.Report/definition/bookmarks/1d40d43c7ade66e8603c.bookmark.json +2297 -0
- package/templates/base-template/base-template.Report/definition/bookmarks/af068ff51c0ca3089ea7.bookmark.json +2300 -0
- package/templates/base-template/base-template.Report/definition/bookmarks/bookmarks.json +11 -0
- package/templates/base-template/base-template.Report/definition/pages/6a4808bb8bb9166f49ff/page.json +130 -0
- package/templates/base-template/base-template.Report/definition/pages/6a4808bb8bb9166f49ff/visuals/0352fd80d074693a65db/mobile.json +11 -0
- package/templates/base-template/base-template.Report/definition/pages/6a4808bb8bb9166f49ff/visuals/0352fd80d074693a65db/visual.json +669 -0
- package/templates/base-template/base-template.Report/definition/pages/6a4808bb8bb9166f49ff/visuals/1c5a14bf493697344b68/mobile.json +11 -0
- package/templates/base-template/base-template.Report/definition/pages/6a4808bb8bb9166f49ff/visuals/1c5a14bf493697344b68/visual.json +723 -0
- package/templates/base-template/base-template.Report/definition/pages/6a4808bb8bb9166f49ff/visuals/3486cf7624c5b109b4e5/mobile.json +11 -0
- package/templates/base-template/base-template.Report/definition/pages/6a4808bb8bb9166f49ff/visuals/3486cf7624c5b109b4e5/visual.json +333 -0
- package/templates/base-template/base-template.Report/definition/pages/6a4808bb8bb9166f49ff/visuals/4d8b989008edc0db28d1/mobile.json +11 -0
- package/templates/base-template/base-template.Report/definition/pages/6a4808bb8bb9166f49ff/visuals/4d8b989008edc0db28d1/visual.json +109 -0
- package/templates/base-template/base-template.Report/definition/pages/6a4808bb8bb9166f49ff/visuals/55e10ac7d76a1954f94f/mobile.json +31 -0
- package/templates/base-template/base-template.Report/definition/pages/6a4808bb8bb9166f49ff/visuals/55e10ac7d76a1954f94f/visual.json +378 -0
- package/templates/base-template/base-template.Report/definition/pages/6a4808bb8bb9166f49ff/visuals/57f52ecf4490f70e4da1/mobile.json +11 -0
- package/templates/base-template/base-template.Report/definition/pages/6a4808bb8bb9166f49ff/visuals/57f52ecf4490f70e4da1/visual.json +175 -0
- package/templates/base-template/base-template.Report/definition/pages/6a4808bb8bb9166f49ff/visuals/5f4d76bbc870118e9840/mobile.json +11 -0
- package/templates/base-template/base-template.Report/definition/pages/6a4808bb8bb9166f49ff/visuals/5f4d76bbc870118e9840/visual.json +468 -0
- package/templates/base-template/base-template.Report/definition/pages/6a4808bb8bb9166f49ff/visuals/73629e1abebb7a444b59/mobile.json +11 -0
- package/templates/base-template/base-template.Report/definition/pages/6a4808bb8bb9166f49ff/visuals/73629e1abebb7a444b59/visual.json +359 -0
- package/templates/base-template/base-template.Report/definition/pages/6a4808bb8bb9166f49ff/visuals/749cb1388c7e0a88161c/mobile.json +11 -0
- package/templates/base-template/base-template.Report/definition/pages/6a4808bb8bb9166f49ff/visuals/749cb1388c7e0a88161c/visual.json +690 -0
- package/templates/base-template/base-template.Report/definition/pages/6a4808bb8bb9166f49ff/visuals/90677f13cea5d1275990/visual.json +17 -0
- package/templates/base-template/base-template.Report/definition/pages/6a4808bb8bb9166f49ff/visuals/92cf92e3da10493adb78/mobile.json +11 -0
- package/templates/base-template/base-template.Report/definition/pages/6a4808bb8bb9166f49ff/visuals/92cf92e3da10493adb78/visual.json +468 -0
- package/templates/base-template/base-template.Report/definition/pages/6a4808bb8bb9166f49ff/visuals/9fe17b1971f68443fc15/mobile.json +10 -0
- package/templates/base-template/base-template.Report/definition/pages/6a4808bb8bb9166f49ff/visuals/9fe17b1971f68443fc15/visual.json +328 -0
- package/templates/base-template/base-template.Report/definition/pages/6a4808bb8bb9166f49ff/visuals/a30bd0950630ed94e8a3/mobile.json +11 -0
- package/templates/base-template/base-template.Report/definition/pages/6a4808bb8bb9166f49ff/visuals/a30bd0950630ed94e8a3/visual.json +578 -0
- package/templates/base-template/base-template.Report/definition/pages/6a4808bb8bb9166f49ff/visuals/a56e91d9400a835e4814/mobile.json +11 -0
- package/templates/base-template/base-template.Report/definition/pages/6a4808bb8bb9166f49ff/visuals/a56e91d9400a835e4814/visual.json +432 -0
- package/templates/base-template/base-template.Report/definition/pages/6a4808bb8bb9166f49ff/visuals/aded24cd205c0b528642/mobile.json +11 -0
- package/templates/base-template/base-template.Report/definition/pages/6a4808bb8bb9166f49ff/visuals/aded24cd205c0b528642/visual.json +801 -0
- package/templates/base-template/base-template.Report/definition/pages/6a4808bb8bb9166f49ff/visuals/af34b26f14a8a724c9a9/mobile.json +37 -0
- package/templates/base-template/base-template.Report/definition/pages/6a4808bb8bb9166f49ff/visuals/af34b26f14a8a724c9a9/visual.json +1318 -0
- package/templates/base-template/base-template.Report/definition/pages/6a4808bb8bb9166f49ff/visuals/b529688fe5a226643322/visual.json +209 -0
- package/templates/base-template/base-template.Report/definition/pages/6a4808bb8bb9166f49ff/visuals/c4c6f332d05e72e2eb06/mobile.json +11 -0
- package/templates/base-template/base-template.Report/definition/pages/6a4808bb8bb9166f49ff/visuals/c4c6f332d05e72e2eb06/visual.json +174 -0
- package/templates/base-template/base-template.Report/definition/pages/6a4808bb8bb9166f49ff/visuals/fa81f184e2cb0e8b087c/mobile.json +29 -0
- package/templates/base-template/base-template.Report/definition/pages/6a4808bb8bb9166f49ff/visuals/fa81f184e2cb0e8b087c/visual.json +241 -0
- package/templates/base-template/base-template.Report/definition/pages/9a5b670b015cab882629/page.json +130 -0
- package/templates/base-template/base-template.Report/definition/pages/9a5b670b015cab882629/visuals/07e9c4302e29029c5462/mobile.json +11 -0
- package/templates/base-template/base-template.Report/definition/pages/9a5b670b015cab882629/visuals/07e9c4302e29029c5462/visual.json +690 -0
- package/templates/base-template/base-template.Report/definition/pages/9a5b670b015cab882629/visuals/109ceede4bc015b0c006/mobile.json +11 -0
- package/templates/base-template/base-template.Report/definition/pages/9a5b670b015cab882629/visuals/109ceede4bc015b0c006/visual.json +468 -0
- package/templates/base-template/base-template.Report/definition/pages/9a5b670b015cab882629/visuals/118257e006d472277e10/mobile.json +11 -0
- package/templates/base-template/base-template.Report/definition/pages/9a5b670b015cab882629/visuals/118257e006d472277e10/visual.json +359 -0
- package/templates/base-template/base-template.Report/definition/pages/9a5b670b015cab882629/visuals/2caf02e0137c4a1280cc/mobile.json +11 -0
- package/templates/base-template/base-template.Report/definition/pages/9a5b670b015cab882629/visuals/2caf02e0137c4a1280cc/visual.json +669 -0
- package/templates/base-template/base-template.Report/definition/pages/9a5b670b015cab882629/visuals/311e76fe3c9edad68204/mobile.json +11 -0
- package/templates/base-template/base-template.Report/definition/pages/9a5b670b015cab882629/visuals/311e76fe3c9edad68204/visual.json +109 -0
- package/templates/base-template/base-template.Report/definition/pages/9a5b670b015cab882629/visuals/31c21f8cbeb3b208940a/visual.json +209 -0
- package/templates/base-template/base-template.Report/definition/pages/9a5b670b015cab882629/visuals/3ab72c25062437149b03/visual.json +17 -0
- package/templates/base-template/base-template.Report/definition/pages/9a5b670b015cab882629/visuals/5959867442abcb0ce2b3/mobile.json +11 -0
- package/templates/base-template/base-template.Report/definition/pages/9a5b670b015cab882629/visuals/5959867442abcb0ce2b3/visual.json +788 -0
- package/templates/base-template/base-template.Report/definition/pages/9a5b670b015cab882629/visuals/5b96e0f88d192b044a13/mobile.json +11 -0
- package/templates/base-template/base-template.Report/definition/pages/9a5b670b015cab882629/visuals/5b96e0f88d192b044a13/visual.json +592 -0
- package/templates/base-template/base-template.Report/definition/pages/9a5b670b015cab882629/visuals/64e749a63d0786000e22/mobile.json +11 -0
- package/templates/base-template/base-template.Report/definition/pages/9a5b670b015cab882629/visuals/64e749a63d0786000e22/visual.json +468 -0
- package/templates/base-template/base-template.Report/definition/pages/9a5b670b015cab882629/visuals/7ae1ca604edac6586ad0/mobile.json +11 -0
- package/templates/base-template/base-template.Report/definition/pages/9a5b670b015cab882629/visuals/7ae1ca604edac6586ad0/visual.json +1310 -0
- package/templates/base-template/base-template.Report/definition/pages/9a5b670b015cab882629/visuals/840300733885141a6603/mobile.json +11 -0
- package/templates/base-template/base-template.Report/definition/pages/9a5b670b015cab882629/visuals/840300733885141a6603/visual.json +175 -0
- package/templates/base-template/base-template.Report/definition/pages/9a5b670b015cab882629/visuals/a38448cdb203279273d2/mobile.json +11 -0
- package/templates/base-template/base-template.Report/definition/pages/9a5b670b015cab882629/visuals/a38448cdb203279273d2/visual.json +516 -0
- package/templates/base-template/base-template.Report/definition/pages/9a5b670b015cab882629/visuals/d1e86f213a3841d12e20/visual.json +328 -0
- package/templates/base-template/base-template.Report/definition/pages/9a5b670b015cab882629/visuals/d4a484c1bcc8ee3075e2/mobile.json +11 -0
- package/templates/base-template/base-template.Report/definition/pages/9a5b670b015cab882629/visuals/d4a484c1bcc8ee3075e2/visual.json +432 -0
- package/templates/base-template/base-template.Report/definition/pages/9a5b670b015cab882629/visuals/d87cb5cf06acca19bbb5/mobile.json +11 -0
- package/templates/base-template/base-template.Report/definition/pages/9a5b670b015cab882629/visuals/d87cb5cf06acca19bbb5/visual.json +241 -0
- package/templates/base-template/base-template.Report/definition/pages/9a5b670b015cab882629/visuals/e243da2677209ed69408/mobile.json +11 -0
- package/templates/base-template/base-template.Report/definition/pages/9a5b670b015cab882629/visuals/e243da2677209ed69408/visual.json +174 -0
- package/templates/base-template/base-template.Report/definition/pages/9a5b670b015cab882629/visuals/f3aaf24f5b22b67573b0/mobile.json +11 -0
- package/templates/base-template/base-template.Report/definition/pages/9a5b670b015cab882629/visuals/f3aaf24f5b22b67573b0/visual.json +333 -0
- package/templates/base-template/base-template.Report/definition/pages/pages.json +8 -0
- package/templates/base-template/base-template.Report/definition/report.json +89 -0
- package/templates/base-template/base-template.Report/definition/version.json +4 -0
- package/templates/base-template/base-template.Report/definition.pbir +9 -0
- package/templates/base-template/base-template.SemanticModel/.platform +11 -0
- package/templates/base-template/base-template.SemanticModel/definition/cultures/es-AR.tmdl +11185 -0
- package/templates/base-template/base-template.SemanticModel/definition/database.tmdl +3 -0
- package/templates/base-template/base-template.SemanticModel/definition/expressions.tmdl +234 -0
- package/templates/base-template/base-template.SemanticModel/definition/functions.tmdl +637 -0
- package/templates/base-template/base-template.SemanticModel/definition/model.tmdl +82 -0
- package/templates/base-template/base-template.SemanticModel/definition/relationships.tmdl +271 -0
- package/templates/base-template/base-template.SemanticModel/definition/tables/Calendario.tmdl +200 -0
- package/templates/base-template/base-template.SemanticModel/definition/tables/Campa/303/261as.tmdl +75 -0
- package/templates/base-template/base-template.SemanticModel/definition/tables/Canales.tmdl +84 -0
- package/templates/base-template/base-template.SemanticModel/definition/tables/Clientes.tmdl +143 -0
- package/templates/base-template/base-template.SemanticModel/definition/tables/Devoluciones.tmdl +95 -0
- package/templates/base-template/base-template.SemanticModel/definition/tables/Ejecuci/303/263n proyectos.tmdl" +130 -0
- package/templates/base-template/base-template.SemanticModel/definition/tables/Entregas.tmdl +122 -0
- package/templates/base-template/base-template.SemanticModel/definition/tables/Equipos m/303/251tricas.tmdl" +40 -0
- package/templates/base-template/base-template.SemanticModel/definition/tables/Equipos.tmdl +73 -0
- package/templates/base-template/base-template.SemanticModel/definition/tables/Horas.tmdl +122 -0
- package/templates/base-template/base-template.SemanticModel/definition/tables/Interacciones clientes.tmdl +146 -0
- package/templates/base-template/base-template.SemanticModel/definition/tables/Leads.tmdl +119 -0
- package/templates/base-template/base-template.SemanticModel/definition/tables/Monedas.tmdl +44 -0
- package/templates/base-template/base-template.SemanticModel/definition/tables/Movimientos financieros.tmdl +145 -0
- package/templates/base-template/base-template.SemanticModel/definition/tables/M/303/251tricas.tmdl +1294 -0
- package/templates/base-template/base-template.SemanticModel/definition/tables/N/303/263mina.tmdl +110 -0
- package/templates/base-template/base-template.SemanticModel/definition/tables/Oportunidades.tmdl +135 -0
- package/templates/base-template/base-template.SemanticModel/definition/tables/Presupuesto.tmdl +125 -0
- package/templates/base-template/base-template.SemanticModel/definition/tables/Productos.tmdl +98 -0
- package/templates/base-template/base-template.SemanticModel/definition/tables/Proyectos.tmdl +77 -0
- package/templates/base-template/base-template.SemanticModel/definition/tables/Servicios.tmdl +75 -0
- package/templates/base-template/base-template.SemanticModel/definition/tables/Tareas proyecto.tmdl +102 -0
- package/templates/base-template/base-template.SemanticModel/definition/tables/Tipo de cambio.tmdl +67 -0
- package/templates/base-template/base-template.SemanticModel/definition/tables/Ventas.tmdl +180 -0
- package/templates/base-template/base-template.SemanticModel/definition/tables/_Aux An/303/241lisis dimensiones.tmdl" +38 -0
- package/templates/base-template/base-template.SemanticModel/definition/tables/_Aux Comparaciones.tmdl +227 -0
- package/templates/base-template/base-template.SemanticModel/definition/tables/_Aux Compatibilidad m/303/251trica-dimensi/303/263n.tmdl" +68 -0
- package/templates/base-template/base-template.SemanticModel/definition/tables/_Aux Modelo configuraci/303/263n.tmdl" +44 -0
- package/templates/base-template/base-template.SemanticModel/definition/tables/_Aux Modo fechas.tmdl +36 -0
- package/templates/base-template/base-template.SemanticModel/definition/tables/_Aux M/303/251trica-Equipo.tmdl" +102 -0
- package/templates/base-template/base-template.SemanticModel/definition/tables/_Aux Overrides m/303/251trica-dimensi/303/263n.tmdl" +54 -0
- package/templates/base-template/base-template.SemanticModel/definition/tables/_Aux Per/303/255odos.tmdl" +182 -0
- package/templates/base-template/base-template.SemanticModel/definition/tables/_Aux Rango fechas modo.tmdl +36 -0
- package/templates/base-template/base-template.SemanticModel/definition/tables/_Aux Rango fechas.tmdl +27 -0
- package/templates/base-template/base-template.SemanticModel/definition/tables/_Aux Vista de calendario.tmdl +30 -0
- package/templates/base-template/base-template.SemanticModel/definition/tables/_GC C/303/241lculo.tmdl" +70 -0
- package/templates/base-template/base-template.SemanticModel/definition/tables/_GC Eje X.tmdl +63 -0
- package/templates/base-template/base-template.SemanticModel/definition/tables/_GC M/303/251trica.tmdl" +374 -0
- package/templates/base-template/base-template.SemanticModel/definition/tables/_GC Tipo c/303/241lculo.tmdl" +223 -0
- package/templates/base-template/base-template.SemanticModel/definition/tables/_PC Dimensi/303/263n.tmdl" +98 -0
- package/templates/base-template/base-template.SemanticModel/definition/tables/_PC Eje X.tmdl +68 -0
- package/templates/base-template/base-template.SemanticModel/definition/tables//303/223rdenes servicio.tmdl" +151 -0
- package/templates/base-template/base-template.SemanticModel/definition.pbism +5 -0
- package/templates/base-template/base-template.SemanticModel/diagramLayout.json +568 -0
- package/templates/base-template/base-template.pbip +14 -0
- package/templates/base-template/template.manifest.json +41 -0
- package/theme/BISuperpowers.json +3888 -0
|
@@ -0,0 +1,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
|
+
}
|