@luquimbo/bi-superpowers 3.1.1 → 4.1.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 (186) hide show
  1. package/.claude-plugin/marketplace.json +5 -3
  2. package/.claude-plugin/plugin.json +28 -2
  3. package/.claude-plugin/skill-manifest.json +22 -6
  4. package/.plugin/plugin.json +1 -1
  5. package/AGENTS.md +52 -36
  6. package/CHANGELOG.md +295 -0
  7. package/README.md +75 -26
  8. package/bin/build-plugin.js +17 -10
  9. package/bin/cli.js +278 -322
  10. package/bin/commands/build-desktop.js +35 -16
  11. package/bin/commands/diff.js +31 -13
  12. package/bin/commands/install.js +93 -72
  13. package/bin/commands/lint.js +40 -26
  14. package/bin/commands/mcp-setup.js +3 -10
  15. package/bin/commands/update-check.js +389 -0
  16. package/bin/lib/agents.js +19 -0
  17. package/bin/lib/generators/claude-plugin.js +144 -6
  18. package/bin/lib/generators/shared.js +29 -33
  19. package/bin/lib/mcp-config.js +191 -16
  20. package/bin/lib/skills.js +115 -27
  21. package/bin/postinstall.js +4 -2
  22. package/bin/utils/mcp-detect.js +2 -2
  23. package/commands/bi-start.md +218 -0
  24. package/commands/pbi-connect.md +43 -65
  25. package/commands/project-kickoff.md +393 -673
  26. package/commands/report-design.md +403 -0
  27. package/desktop-extension/manifest.json +5 -12
  28. package/desktop-extension/server.js +34 -25
  29. package/package.json +6 -10
  30. package/skills/bi-start/SKILL.md +220 -0
  31. package/skills/bi-start/scripts/update-check.js +389 -0
  32. package/skills/pbi-connect/SKILL.md +45 -67
  33. package/skills/pbi-connect/scripts/update-check.js +389 -0
  34. package/skills/project-kickoff/SKILL.md +395 -675
  35. package/skills/project-kickoff/scripts/update-check.js +389 -0
  36. package/skills/report-design/SKILL.md +405 -0
  37. package/skills/report-design/references/cli-commands.md +184 -0
  38. package/skills/report-design/references/cli-setup.md +101 -0
  39. package/skills/report-design/references/close-write-open-pattern.md +80 -0
  40. package/skills/report-design/references/layouts/finance.md +65 -0
  41. package/skills/report-design/references/layouts/generic.md +46 -0
  42. package/skills/report-design/references/layouts/hr.md +48 -0
  43. package/skills/report-design/references/layouts/marketing.md +45 -0
  44. package/skills/report-design/references/layouts/operations.md +44 -0
  45. package/skills/report-design/references/layouts/sales.md +50 -0
  46. package/skills/report-design/references/native-visuals.md +341 -0
  47. package/skills/report-design/references/pbi-desktop-installation.md +87 -0
  48. package/skills/report-design/references/pbir-preview-activation.md +40 -0
  49. package/skills/report-design/references/slicer.md +89 -0
  50. package/skills/report-design/references/textbox.md +101 -0
  51. package/skills/report-design/references/themes/BISuperpowers.json +915 -0
  52. package/skills/report-design/references/troubleshooting.md +135 -0
  53. package/skills/report-design/references/visual-types.md +78 -0
  54. package/skills/report-design/scripts/apply-theme.js +243 -0
  55. package/skills/report-design/scripts/create-visual.js +878 -0
  56. package/skills/report-design/scripts/ensure-pbi-cli.sh +41 -0
  57. package/skills/report-design/scripts/update-check.js +389 -0
  58. package/skills/report-design/scripts/validate-pbir.js +322 -0
  59. package/src/content/base.md +12 -68
  60. package/src/content/mcp-requirements.json +0 -25
  61. package/src/content/routing.md +19 -74
  62. package/src/content/skills/bi-start.md +191 -0
  63. package/src/content/skills/pbi-connect.md +22 -65
  64. package/src/content/skills/project-kickoff.md +372 -673
  65. package/src/content/skills/report-design/SKILL.md +376 -0
  66. package/src/content/skills/report-design/references/cli-commands.md +184 -0
  67. package/src/content/skills/report-design/references/cli-setup.md +101 -0
  68. package/src/content/skills/report-design/references/close-write-open-pattern.md +80 -0
  69. package/src/content/skills/report-design/references/layouts/finance.md +65 -0
  70. package/src/content/skills/report-design/references/layouts/generic.md +46 -0
  71. package/src/content/skills/report-design/references/layouts/hr.md +48 -0
  72. package/src/content/skills/report-design/references/layouts/marketing.md +45 -0
  73. package/src/content/skills/report-design/references/layouts/operations.md +44 -0
  74. package/src/content/skills/report-design/references/layouts/sales.md +50 -0
  75. package/src/content/skills/report-design/references/native-visuals.md +341 -0
  76. package/src/content/skills/report-design/references/pbi-desktop-installation.md +87 -0
  77. package/src/content/skills/report-design/references/pbir-preview-activation.md +40 -0
  78. package/src/content/skills/report-design/references/slicer.md +89 -0
  79. package/src/content/skills/report-design/references/textbox.md +101 -0
  80. package/src/content/skills/report-design/references/themes/BISuperpowers.json +915 -0
  81. package/src/content/skills/report-design/references/troubleshooting.md +135 -0
  82. package/src/content/skills/report-design/references/visual-types.md +78 -0
  83. package/src/content/skills/report-design/scripts/apply-theme.js +243 -0
  84. package/src/content/skills/report-design/scripts/create-visual.js +878 -0
  85. package/src/content/skills/report-design/scripts/ensure-pbi-cli.sh +41 -0
  86. package/src/content/skills/report-design/scripts/validate-pbir.js +322 -0
  87. package/bin/commands/add.js +0 -533
  88. package/bin/commands/add.test.js +0 -77
  89. package/bin/commands/changelog.js +0 -443
  90. package/bin/commands/install.test.js +0 -289
  91. package/bin/commands/lint.test.js +0 -103
  92. package/bin/commands/pull.js +0 -287
  93. package/bin/commands/pull.test.js +0 -36
  94. package/bin/commands/push.js +0 -231
  95. package/bin/commands/push.test.js +0 -14
  96. package/bin/commands/search.js +0 -344
  97. package/bin/commands/search.test.js +0 -115
  98. package/bin/commands/setup.js +0 -545
  99. package/bin/commands/setup.test.js +0 -46
  100. package/bin/commands/sync-profile.js +0 -405
  101. package/bin/commands/sync-profile.test.js +0 -14
  102. package/bin/commands/sync-source.js +0 -418
  103. package/bin/commands/sync-source.test.js +0 -14
  104. package/bin/lib/generators/claude-plugin.test.js +0 -111
  105. package/bin/lib/mcp-config.test.js +0 -310
  106. package/bin/lib/microsoft-mcp.test.js +0 -115
  107. package/bin/utils/errors.js +0 -159
  108. package/bin/utils/git.js +0 -298
  109. package/bin/utils/logger.js +0 -142
  110. package/bin/utils/mcp-detect.test.js +0 -81
  111. package/bin/utils/pbix.js +0 -305
  112. package/bin/utils/pbix.test.js +0 -37
  113. package/bin/utils/profiles.js +0 -312
  114. package/bin/utils/projects.js +0 -169
  115. package/bin/utils/readline.js +0 -206
  116. package/bin/utils/readline.test.js +0 -47
  117. package/bin/utils/tui.test.js +0 -127
  118. package/docs/openrouter-free-models.md +0 -92
  119. package/library/examples/README.md +0 -151
  120. package/library/examples/finance-reporting/README.md +0 -351
  121. package/library/examples/finance-reporting/data-model.md +0 -267
  122. package/library/examples/finance-reporting/measures.dax +0 -557
  123. package/library/examples/hr-analytics/README.md +0 -371
  124. package/library/examples/hr-analytics/data-model.md +0 -315
  125. package/library/examples/hr-analytics/measures.dax +0 -460
  126. package/library/examples/marketing-analytics/README.md +0 -37
  127. package/library/examples/marketing-analytics/data-model.md +0 -62
  128. package/library/examples/marketing-analytics/measures.dax +0 -110
  129. package/library/examples/retail-analytics/README.md +0 -439
  130. package/library/examples/retail-analytics/data-model.md +0 -288
  131. package/library/examples/retail-analytics/measures.dax +0 -481
  132. package/library/examples/supply-chain/README.md +0 -37
  133. package/library/examples/supply-chain/data-model.md +0 -69
  134. package/library/examples/supply-chain/measures.dax +0 -77
  135. package/library/examples/udf-library/README.md +0 -228
  136. package/library/examples/udf-library/functions.dax +0 -571
  137. package/library/snippets/dax/README.md +0 -292
  138. package/library/snippets/dax/business-domains.md +0 -576
  139. package/library/snippets/dax/calculate-patterns.md +0 -276
  140. package/library/snippets/dax/calculation-groups.md +0 -489
  141. package/library/snippets/dax/error-handling.md +0 -495
  142. package/library/snippets/dax/iterators-and-aggregations.md +0 -474
  143. package/library/snippets/dax/kpis-and-metrics.md +0 -293
  144. package/library/snippets/dax/rankings-and-topn.md +0 -235
  145. package/library/snippets/dax/security-patterns.md +0 -413
  146. package/library/snippets/dax/text-and-formatting.md +0 -316
  147. package/library/snippets/dax/time-intelligence.md +0 -196
  148. package/library/snippets/dax/user-defined-functions.md +0 -477
  149. package/library/snippets/dax/virtual-tables.md +0 -546
  150. package/library/snippets/excel-formulas/README.md +0 -84
  151. package/library/snippets/excel-formulas/aggregations.md +0 -330
  152. package/library/snippets/excel-formulas/dates-and-times.md +0 -361
  153. package/library/snippets/excel-formulas/dynamic-arrays.md +0 -314
  154. package/library/snippets/excel-formulas/lookups.md +0 -169
  155. package/library/snippets/excel-formulas/text-functions.md +0 -363
  156. package/library/snippets/governance/naming-conventions.md +0 -97
  157. package/library/snippets/governance/review-checklists.md +0 -107
  158. package/library/snippets/power-query/README.md +0 -389
  159. package/library/snippets/power-query/api-integration.md +0 -707
  160. package/library/snippets/power-query/connections.md +0 -434
  161. package/library/snippets/power-query/data-cleaning.md +0 -298
  162. package/library/snippets/power-query/error-handling.md +0 -526
  163. package/library/snippets/power-query/parameters.md +0 -350
  164. package/library/snippets/power-query/performance.md +0 -506
  165. package/library/snippets/power-query/transformations.md +0 -330
  166. package/library/snippets/report-design/accessibility.md +0 -78
  167. package/library/snippets/report-design/chart-selection.md +0 -54
  168. package/library/snippets/report-design/layout-patterns.md +0 -87
  169. package/library/templates/data-models/README.md +0 -93
  170. package/library/templates/data-models/finance-model.md +0 -627
  171. package/library/templates/data-models/retail-star-schema.md +0 -473
  172. package/library/templates/excel/README.md +0 -83
  173. package/library/templates/excel/budget-tracker.md +0 -432
  174. package/library/templates/excel/data-entry-form.md +0 -533
  175. package/library/templates/power-bi/README.md +0 -72
  176. package/library/templates/power-bi/finance-report.md +0 -449
  177. package/library/templates/power-bi/kpi-scorecard.md +0 -461
  178. package/library/templates/power-bi/sales-dashboard.md +0 -281
  179. package/library/themes/excel/README.md +0 -436
  180. package/library/themes/power-bi/README.md +0 -271
  181. package/library/themes/power-bi/accessible.json +0 -307
  182. package/library/themes/power-bi/bi-superpowers-default.json +0 -858
  183. package/library/themes/power-bi/corporate-blue.json +0 -291
  184. package/library/themes/power-bi/dark-mode.json +0 -291
  185. package/library/themes/power-bi/minimal.json +0 -292
  186. package/library/themes/power-bi/print-friendly.json +0 -309
@@ -1,443 +0,0 @@
1
- /**
2
- * Changelog Command - Generate changelog from Git history
3
- * ========================================================
4
- *
5
- * Generates or updates CHANGELOG.md from Git commit history.
6
- * Also updates the agent context file with recent changes.
7
- *
8
- * Usage:
9
- * super changelog Generate changelog for current project
10
- * super changelog --all Generate for all projects in bi-repo
11
- * super changelog --since v1.0.0 Generate since specific tag/commit
12
- *
13
- * @module commands/changelog
14
- */
15
-
16
- const fs = require('fs');
17
- const path = require('path');
18
-
19
- const git = require('../utils/git');
20
- const profiles = require('../utils/profiles');
21
-
22
- /**
23
- * Parse command line arguments
24
- * @param {string[]} args - CLI arguments
25
- * @returns {Object} Parsed options
26
- */
27
- function parseArgs(args) {
28
- const options = {
29
- all: false,
30
- since: null,
31
- project: null,
32
- help: false,
33
- };
34
-
35
- for (let i = 0; i < args.length; i++) {
36
- const arg = args[i];
37
-
38
- if (arg === '--all' || arg === '-a') {
39
- options.all = true;
40
- } else if (arg === '--since' || arg === '-s') {
41
- options.since = args[++i];
42
- } else if (arg === '--project' || arg === '-p') {
43
- options.project = args[++i];
44
- } else if (arg === '--help' || arg === '-h') {
45
- options.help = true;
46
- }
47
- }
48
-
49
- return options;
50
- }
51
-
52
- /**
53
- * Show help message
54
- */
55
- function showHelp() {
56
- console.log(`
57
- super changelog - Generar changelog desde historial Git
58
-
59
- Uso:
60
- super changelog Generar changelog del proyecto actual
61
- super changelog --all Generar para todos los proyectos
62
- super changelog --since <ref> Generar desde tag/commit específico
63
- super changelog --project <name> Generar para proyecto específico
64
-
65
- Opciones:
66
- --all, -a Procesar todos los proyectos del bi-repo
67
- --since, -s <ref> Commit o tag desde donde generar (ej: v1.0.0, HEAD~10)
68
- --project, -p <name> Nombre del proyecto específico
69
- --help, -h Mostrar esta ayuda
70
-
71
- Ejemplos:
72
- super changelog
73
- super changelog --since HEAD~20
74
- super changelog --all
75
- super changelog --project sales-dashboard
76
- `);
77
- }
78
-
79
- /**
80
- * Validate git ref format to prevent command injection
81
- * @param {string} ref - Git reference (tag, branch, commit hash)
82
- * @returns {boolean} Whether the ref is valid
83
- */
84
- function isValidGitRef(ref) {
85
- // Allow alphanumeric, dots, dashes, underscores, slashes (for branches like feature/foo)
86
- // Also allow ~ and ^ for relative refs like HEAD~10 or HEAD^2
87
- const validRefPattern = /^[a-zA-Z0-9._\-/~^]+$/;
88
- return validRefPattern.test(ref) && ref.length <= 256;
89
- }
90
-
91
- /**
92
- * Get commits from Git log
93
- * @param {string} repoPath - Path to the repository
94
- * @param {string} projectPath - Path to project subdirectory (optional)
95
- * @param {string} since - Starting point for log (optional)
96
- * @returns {Array} Array of commit objects
97
- */
98
- function getCommits(repoPath, projectPath = null, since = null) {
99
- const commits = [];
100
-
101
- try {
102
- const logArgs = ['log', '--pretty=format:%H|%h|%ai|%s|%an', '-n', '100'];
103
-
104
- if (since) {
105
- if (!isValidGitRef(since)) {
106
- console.error(`Error: Invalid git ref format: "${since}"`);
107
- console.error(
108
- 'Git refs must contain only alphanumeric characters, dots, dashes, underscores, slashes, ~ or ^'
109
- );
110
- process.exit(1);
111
- }
112
- logArgs.push(`${since}..HEAD`);
113
- }
114
-
115
- if (projectPath) {
116
- logArgs.push('--', projectPath);
117
- }
118
-
119
- const result = git.execGitCommand(repoPath, logArgs);
120
-
121
- if (result && result.trim()) {
122
- const lines = result.trim().split('\n');
123
- for (const line of lines) {
124
- const [hash, shortHash, date, subject, author] = line.split('|');
125
- commits.push({
126
- hash,
127
- shortHash,
128
- date: new Date(date),
129
- subject,
130
- author,
131
- });
132
- }
133
- }
134
- } catch (e) {
135
- // Return empty array if git log fails
136
- }
137
-
138
- return commits;
139
- }
140
-
141
- /**
142
- * Categorize commit by conventional commit type
143
- * @param {string} subject - Commit subject line
144
- * @returns {string} Category name
145
- */
146
- function categorizeCommit(subject) {
147
- const lowerSubject = subject.toLowerCase();
148
-
149
- if (lowerSubject.startsWith('feat') || lowerSubject.startsWith('add')) {
150
- return 'Added';
151
- } else if (lowerSubject.startsWith('fix')) {
152
- return 'Fixed';
153
- } else if (lowerSubject.startsWith('change') || lowerSubject.startsWith('update')) {
154
- return 'Changed';
155
- } else if (lowerSubject.startsWith('remove') || lowerSubject.startsWith('delete')) {
156
- return 'Removed';
157
- } else if (lowerSubject.startsWith('deprecate')) {
158
- return 'Deprecated';
159
- } else if (lowerSubject.startsWith('security')) {
160
- return 'Security';
161
- } else if (lowerSubject.startsWith('refactor')) {
162
- return 'Changed';
163
- } else if (lowerSubject.startsWith('docs')) {
164
- return 'Documentation';
165
- } else if (lowerSubject.startsWith('style') || lowerSubject.startsWith('format')) {
166
- return 'Style';
167
- } else if (lowerSubject.startsWith('test')) {
168
- return 'Testing';
169
- } else if (lowerSubject.startsWith('perf')) {
170
- return 'Performance';
171
- }
172
-
173
- return 'Changed';
174
- }
175
-
176
- /**
177
- * Generate changelog content from commits
178
- * @param {Array} commits - Array of commit objects
179
- * @param {string} projectName - Project name for header
180
- * @returns {string} Markdown changelog content
181
- */
182
- function generateChangelogContent(commits, projectName) {
183
- const categories = {};
184
-
185
- // Group commits by category
186
- for (const commit of commits) {
187
- const category = categorizeCommit(commit.subject);
188
- if (!categories[category]) {
189
- categories[category] = [];
190
- }
191
- categories[category].push(commit);
192
- }
193
-
194
- // Build markdown content
195
- let content = `# Changelog - ${projectName}
196
-
197
- All notable changes to this project will be documented in this file.
198
-
199
- The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
200
-
201
- ## [Unreleased]
202
-
203
- `;
204
-
205
- // Add categories in preferred order
206
- const categoryOrder = [
207
- 'Added',
208
- 'Changed',
209
- 'Fixed',
210
- 'Removed',
211
- 'Deprecated',
212
- 'Security',
213
- 'Performance',
214
- 'Documentation',
215
- 'Style',
216
- 'Testing',
217
- ];
218
-
219
- for (const category of categoryOrder) {
220
- if (categories[category] && categories[category].length > 0) {
221
- content += `### ${category}\n`;
222
- for (const commit of categories[category]) {
223
- // Clean up commit subject (remove conventional commit prefix)
224
- let subject = commit.subject
225
- .replace(
226
- /^(feat|fix|add|change|update|remove|delete|refactor|docs|style|test|perf|security)[\s:()[\]]*\s*/i,
227
- ''
228
- )
229
- .trim();
230
- // Capitalize first letter
231
- subject = subject.charAt(0).toUpperCase() + subject.slice(1);
232
- content += `- ${subject} (${commit.shortHash})\n`;
233
- }
234
- content += '\n';
235
- }
236
- }
237
-
238
- content += `---
239
- *Generated by [BI Agent Superpowers](https://github.com/luquimbo/bi-superpowers) on ${new Date().toISOString().split('T')[0]}*
240
- `;
241
-
242
- return content;
243
- }
244
-
245
- /**
246
- * Generate recent changes summary for agent context
247
- * @param {Array} commits - Array of commit objects
248
- * @param {number} count - Number of recent changes to include
249
- * @returns {string} Markdown summary
250
- */
251
- function generateRecentChangesSummary(commits, count = 5) {
252
- const recentCommits = commits.slice(0, count);
253
-
254
- if (recentCommits.length === 0) {
255
- return '## Recent Changes\n\nNo recent changes recorded.\n';
256
- }
257
-
258
- let summary = '## Recent Changes\n\n';
259
-
260
- for (const commit of recentCommits) {
261
- const dateStr = commit.date.toISOString().split('T')[0];
262
- summary += `- **${dateStr}**: ${commit.subject} (${commit.shortHash})\n`;
263
- }
264
-
265
- summary += '\n';
266
- return summary;
267
- }
268
-
269
- /**
270
- * Update agent context file with recent changes
271
- * @param {string} projectPath - Path to project directory
272
- * @param {string} recentChanges - Recent changes markdown
273
- */
274
- function updateAgentContext(projectPath, recentChanges) {
275
- // Check for Claude Code CLAUDE.md
276
- const claudeDir = path.join(projectPath, '.claude');
277
- const claudeMdPath = path.join(claudeDir, 'CLAUDE.md');
278
-
279
- if (fs.existsSync(claudeMdPath)) {
280
- let content = fs.readFileSync(claudeMdPath, 'utf8');
281
-
282
- // Replace or append recent changes section
283
- const recentChangesRegex = /## Recent Changes[\s\S]*?(?=##|$)/;
284
-
285
- if (recentChangesRegex.test(content)) {
286
- content = content.replace(recentChangesRegex, recentChanges);
287
- } else {
288
- // Append at the end
289
- content += '\n' + recentChanges;
290
- }
291
-
292
- fs.writeFileSync(claudeMdPath, content);
293
- console.log(' ✓ Actualizado: .claude/CLAUDE.md');
294
- }
295
- }
296
-
297
- /**
298
- * Process a single project
299
- * @param {string} repoPath - Path to bi-repo
300
- * @param {string} projectName - Project name
301
- * @param {Object} options - Command options
302
- */
303
- function processProject(repoPath, projectName, options) {
304
- const projectPath = path.join(repoPath, 'projects', projectName);
305
-
306
- if (!fs.existsSync(projectPath)) {
307
- console.log(` ⚠ Proyecto no encontrado: ${projectName}`);
308
- return;
309
- }
310
-
311
- console.log(`\nProcesando: ${projectName}`);
312
-
313
- // Get commits for this project
314
- const commits = getCommits(repoPath, path.join('projects', projectName), options.since);
315
-
316
- if (commits.length === 0) {
317
- console.log(' ℹ No se encontraron commits para este proyecto');
318
- return;
319
- }
320
-
321
- console.log(` ✓ Encontrados ${commits.length} commits`);
322
-
323
- // Load bi-project.json to get display name and settings
324
- const biProjectPath = path.join(projectPath, 'bi-project.json');
325
- let displayName = projectName;
326
- let changelogSettings = { enabled: true, recentChangesCount: 5 };
327
-
328
- if (fs.existsSync(biProjectPath)) {
329
- try {
330
- const biProject = JSON.parse(fs.readFileSync(biProjectPath, 'utf8'));
331
- displayName = biProject.displayName || projectName;
332
- if (biProject.changelog) {
333
- changelogSettings = { ...changelogSettings, ...biProject.changelog };
334
- }
335
- } catch (e) {
336
- // Use defaults
337
- }
338
- }
339
-
340
- if (!changelogSettings.enabled) {
341
- console.log(' ℹ Changelog deshabilitado para este proyecto');
342
- return;
343
- }
344
-
345
- // Generate and write changelog
346
- const changelogContent = generateChangelogContent(commits, displayName);
347
- const changelogPath = path.join(projectPath, 'CHANGELOG.md');
348
- fs.writeFileSync(changelogPath, changelogContent);
349
- console.log(' ✓ Generado: CHANGELOG.md');
350
-
351
- // Generate recent changes summary
352
- const recentChanges = generateRecentChangesSummary(commits, changelogSettings.recentChangesCount);
353
-
354
- // Update agent context if enabled
355
- if (changelogSettings.includeInAgentContext !== false) {
356
- updateAgentContext(projectPath, recentChanges);
357
- }
358
- }
359
-
360
- /**
361
- * Main changelog command handler
362
- * @param {string[]} args - Command arguments
363
- * @param {Object} _config - CLI configuration (unused)
364
- */
365
- async function changelogCommand(args, _config) {
366
- const options = parseArgs(args);
367
-
368
- if (options.help) {
369
- showHelp();
370
- return;
371
- }
372
-
373
- // Check if in bi-repo
374
- const repoPath = profiles.getRepoPath();
375
- if (!repoPath || !fs.existsSync(repoPath)) {
376
- console.log(`
377
- No se encontró el repositorio de BI.
378
-
379
- Ejecuta primero:
380
- super setup
381
-
382
- Para crear tu repositorio de proyectos.
383
- `);
384
- process.exit(1);
385
- }
386
-
387
- console.log(`
388
- ════════════════════════════════════════════════════════════════
389
- BI Agent Superpowers - Changelog Generator
390
- ════════════════════════════════════════════════════════════════
391
- `);
392
-
393
- // Get list of projects
394
- const projectsDir = path.join(repoPath, 'projects');
395
-
396
- if (!fs.existsSync(projectsDir)) {
397
- console.log('No hay proyectos en el repositorio.');
398
- return;
399
- }
400
-
401
- const allProjects = fs
402
- .readdirSync(projectsDir)
403
- .filter((f) => fs.statSync(path.join(projectsDir, f)).isDirectory());
404
-
405
- if (allProjects.length === 0) {
406
- console.log('No hay proyectos en el repositorio.');
407
- console.log('Usa "bi-superpowers add <archivo>" para añadir un proyecto.');
408
- return;
409
- }
410
-
411
- // Determine which projects to process
412
- let projectsToProcess = [];
413
-
414
- if (options.project) {
415
- if (allProjects.includes(options.project)) {
416
- projectsToProcess = [options.project];
417
- } else {
418
- console.log(`Proyecto "${options.project}" no encontrado.`);
419
- console.log(`Proyectos disponibles: ${allProjects.join(', ')}`);
420
- process.exit(1);
421
- }
422
- } else if (options.all) {
423
- projectsToProcess = allProjects;
424
- } else {
425
- // Default to first project or prompt
426
- projectsToProcess = allProjects.slice(0, 1);
427
- console.log(`Procesando proyecto: ${projectsToProcess[0]}`);
428
- console.log('(Usa --all para procesar todos los proyectos)');
429
- }
430
-
431
- // Process each project
432
- for (const projectName of projectsToProcess) {
433
- processProject(repoPath, projectName, options);
434
- }
435
-
436
- console.log(`
437
- ════════════════════════════════════════════════════════════════
438
- ¡Changelog generado!
439
- ════════════════════════════════════════════════════════════════
440
- `);
441
- }
442
-
443
- module.exports = changelogCommand;