@luquimbo/bi-superpowers 3.1.1 → 3.2.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 (107) hide show
  1. package/.claude-plugin/marketplace.json +1 -1
  2. package/.claude-plugin/plugin.json +1 -1
  3. package/.claude-plugin/skill-manifest.json +1 -1
  4. package/.plugin/plugin.json +1 -1
  5. package/bin/build-plugin.js +6 -6
  6. package/bin/cli.js +169 -310
  7. package/bin/commands/install.js +87 -70
  8. package/bin/lib/agents.js +19 -0
  9. package/bin/lib/mcp-config.js +23 -4
  10. package/desktop-extension/manifest.json +4 -11
  11. package/desktop-extension/server.js +34 -25
  12. package/package.json +3 -9
  13. package/skills/pbi-connect/SKILL.md +1 -1
  14. package/skills/project-kickoff/SKILL.md +1 -1
  15. package/bin/commands/add.js +0 -533
  16. package/bin/commands/add.test.js +0 -77
  17. package/bin/commands/changelog.js +0 -443
  18. package/bin/commands/pull.js +0 -287
  19. package/bin/commands/pull.test.js +0 -36
  20. package/bin/commands/push.js +0 -231
  21. package/bin/commands/push.test.js +0 -14
  22. package/bin/commands/search.js +0 -344
  23. package/bin/commands/search.test.js +0 -115
  24. package/bin/commands/setup.js +0 -545
  25. package/bin/commands/setup.test.js +0 -46
  26. package/bin/commands/sync-profile.js +0 -405
  27. package/bin/commands/sync-profile.test.js +0 -14
  28. package/bin/commands/sync-source.js +0 -418
  29. package/bin/commands/sync-source.test.js +0 -14
  30. package/bin/utils/errors.js +0 -159
  31. package/bin/utils/git.js +0 -298
  32. package/bin/utils/logger.js +0 -142
  33. package/bin/utils/pbix.js +0 -305
  34. package/bin/utils/pbix.test.js +0 -37
  35. package/bin/utils/profiles.js +0 -312
  36. package/bin/utils/projects.js +0 -169
  37. package/bin/utils/readline.js +0 -206
  38. package/bin/utils/readline.test.js +0 -47
  39. package/docs/openrouter-free-models.md +0 -92
  40. package/library/examples/README.md +0 -151
  41. package/library/examples/finance-reporting/README.md +0 -351
  42. package/library/examples/finance-reporting/data-model.md +0 -267
  43. package/library/examples/finance-reporting/measures.dax +0 -557
  44. package/library/examples/hr-analytics/README.md +0 -371
  45. package/library/examples/hr-analytics/data-model.md +0 -315
  46. package/library/examples/hr-analytics/measures.dax +0 -460
  47. package/library/examples/marketing-analytics/README.md +0 -37
  48. package/library/examples/marketing-analytics/data-model.md +0 -62
  49. package/library/examples/marketing-analytics/measures.dax +0 -110
  50. package/library/examples/retail-analytics/README.md +0 -439
  51. package/library/examples/retail-analytics/data-model.md +0 -288
  52. package/library/examples/retail-analytics/measures.dax +0 -481
  53. package/library/examples/supply-chain/README.md +0 -37
  54. package/library/examples/supply-chain/data-model.md +0 -69
  55. package/library/examples/supply-chain/measures.dax +0 -77
  56. package/library/examples/udf-library/README.md +0 -228
  57. package/library/examples/udf-library/functions.dax +0 -571
  58. package/library/snippets/dax/README.md +0 -292
  59. package/library/snippets/dax/business-domains.md +0 -576
  60. package/library/snippets/dax/calculate-patterns.md +0 -276
  61. package/library/snippets/dax/calculation-groups.md +0 -489
  62. package/library/snippets/dax/error-handling.md +0 -495
  63. package/library/snippets/dax/iterators-and-aggregations.md +0 -474
  64. package/library/snippets/dax/kpis-and-metrics.md +0 -293
  65. package/library/snippets/dax/rankings-and-topn.md +0 -235
  66. package/library/snippets/dax/security-patterns.md +0 -413
  67. package/library/snippets/dax/text-and-formatting.md +0 -316
  68. package/library/snippets/dax/time-intelligence.md +0 -196
  69. package/library/snippets/dax/user-defined-functions.md +0 -477
  70. package/library/snippets/dax/virtual-tables.md +0 -546
  71. package/library/snippets/excel-formulas/README.md +0 -84
  72. package/library/snippets/excel-formulas/aggregations.md +0 -330
  73. package/library/snippets/excel-formulas/dates-and-times.md +0 -361
  74. package/library/snippets/excel-formulas/dynamic-arrays.md +0 -314
  75. package/library/snippets/excel-formulas/lookups.md +0 -169
  76. package/library/snippets/excel-formulas/text-functions.md +0 -363
  77. package/library/snippets/governance/naming-conventions.md +0 -97
  78. package/library/snippets/governance/review-checklists.md +0 -107
  79. package/library/snippets/power-query/README.md +0 -389
  80. package/library/snippets/power-query/api-integration.md +0 -707
  81. package/library/snippets/power-query/connections.md +0 -434
  82. package/library/snippets/power-query/data-cleaning.md +0 -298
  83. package/library/snippets/power-query/error-handling.md +0 -526
  84. package/library/snippets/power-query/parameters.md +0 -350
  85. package/library/snippets/power-query/performance.md +0 -506
  86. package/library/snippets/power-query/transformations.md +0 -330
  87. package/library/snippets/report-design/accessibility.md +0 -78
  88. package/library/snippets/report-design/chart-selection.md +0 -54
  89. package/library/snippets/report-design/layout-patterns.md +0 -87
  90. package/library/templates/data-models/README.md +0 -93
  91. package/library/templates/data-models/finance-model.md +0 -627
  92. package/library/templates/data-models/retail-star-schema.md +0 -473
  93. package/library/templates/excel/README.md +0 -83
  94. package/library/templates/excel/budget-tracker.md +0 -432
  95. package/library/templates/excel/data-entry-form.md +0 -533
  96. package/library/templates/power-bi/README.md +0 -72
  97. package/library/templates/power-bi/finance-report.md +0 -449
  98. package/library/templates/power-bi/kpi-scorecard.md +0 -461
  99. package/library/templates/power-bi/sales-dashboard.md +0 -281
  100. package/library/themes/excel/README.md +0 -436
  101. package/library/themes/power-bi/README.md +0 -271
  102. package/library/themes/power-bi/accessible.json +0 -307
  103. package/library/themes/power-bi/bi-superpowers-default.json +0 -858
  104. package/library/themes/power-bi/corporate-blue.json +0 -291
  105. package/library/themes/power-bi/dark-mode.json +0 -291
  106. package/library/themes/power-bi/minimal.json +0 -292
  107. package/library/themes/power-bi/print-friendly.json +0 -309
@@ -1,314 +0,0 @@
1
- # Dynamic Array Formulas (Excel 365+)
2
-
3
- Modern Excel formulas that return multiple values.
4
-
5
- ## FILTER Function
6
-
7
- ### Basic Filter
8
- ```excel
9
- =FILTER(tbl_Sales, tbl_Sales[Region]="North")
10
- ```
11
-
12
- ### Filter with Multiple Criteria (AND)
13
- ```excel
14
- =FILTER(tbl_Sales, (tbl_Sales[Region]="North")*(tbl_Sales[Amount]>1000))
15
- ```
16
-
17
- ### Filter with Multiple Criteria (OR)
18
- ```excel
19
- =FILTER(tbl_Sales, (tbl_Sales[Region]="North")+(tbl_Sales[Region]="South"))
20
- ```
21
-
22
- ### Filter with Default Value
23
- ```excel
24
- =FILTER(tbl_Sales, tbl_Sales[Product]=A2, "No results found")
25
- ```
26
-
27
- ### Filter Specific Columns
28
- ```excel
29
- =FILTER(CHOOSECOLS(tbl_Sales, 1, 3, 5), tbl_Sales[Status]="Active")
30
- ```
31
-
32
- ### Top N with Filter
33
- ```excel
34
- =FILTER(tbl_Sales, tbl_Sales[Amount]>=LARGE(tbl_Sales[Amount], 5))
35
- ```
36
-
37
- ## SORT Function
38
-
39
- ### Basic Sort (Ascending)
40
- ```excel
41
- =SORT(tbl_Sales)
42
- ```
43
-
44
- ### Sort by Specific Column
45
- ```excel
46
- =SORT(tbl_Sales, 3, -1)
47
- ```
48
- - `3` = column index
49
- - `-1` = descending, `1` = ascending
50
-
51
- ### Sort by Multiple Columns
52
- ```excel
53
- =SORT(tbl_Sales, {1, 3}, {1, -1})
54
- ```
55
- - First by column 1 ascending, then column 3 descending
56
-
57
- ### Combined Filter and Sort
58
- ```excel
59
- =SORT(FILTER(tbl_Sales, tbl_Sales[Region]="North"), 3, -1)
60
- ```
61
-
62
- ## SORTBY Function
63
-
64
- ### Sort by Another Column
65
- ```excel
66
- =SORTBY(tbl_Products[Name], tbl_Products[Sales], -1)
67
- ```
68
-
69
- ### Sort by Multiple Criteria
70
- ```excel
71
- =SORTBY(tbl_Data, tbl_Data[Category], 1, tbl_Data[Amount], -1)
72
- ```
73
-
74
- ### Sort by External Range
75
- ```excel
76
- =SORTBY(A2:C10, D2:D10, -1)
77
- ```
78
-
79
- ## UNIQUE Function
80
-
81
- ### Unique Values
82
- ```excel
83
- =UNIQUE(tbl_Sales[Customer])
84
- ```
85
-
86
- ### Unique Rows
87
- ```excel
88
- =UNIQUE(tbl_Sales)
89
- ```
90
-
91
- ### Unique Values that Appear Once
92
- ```excel
93
- =UNIQUE(tbl_Sales[Customer], FALSE, TRUE)
94
- ```
95
- - Second parameter: by column (TRUE) or row (FALSE)
96
- - Third parameter: exactly once (TRUE)
97
-
98
- ### Unique Combinations
99
- ```excel
100
- =UNIQUE(CHOOSECOLS(tbl_Sales, 1, 3))
101
- ```
102
-
103
- ## SEQUENCE Function
104
-
105
- ### Simple Sequence
106
- ```excel
107
- =SEQUENCE(10)
108
- ```
109
- Results: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10
110
-
111
- ### Rows and Columns
112
- ```excel
113
- =SEQUENCE(5, 3)
114
- ```
115
- Creates 5 rows x 3 columns matrix
116
-
117
- ### Custom Start and Step
118
- ```excel
119
- =SEQUENCE(10, 1, 0, 5)
120
- ```
121
- Results: 0, 5, 10, 15, 20, 25, 30, 35, 40, 45
122
-
123
- ### Date Sequence
124
- ```excel
125
- =SEQUENCE(12, 1, DATE(2024,1,1), 30)
126
- ```
127
- Creates monthly dates (approximately)
128
-
129
- ### Weekly Dates
130
- ```excel
131
- =SEQUENCE(52, 1, DATE(2024,1,1), 7)
132
- ```
133
-
134
- ## RANDARRAY Function
135
-
136
- ### Random Numbers
137
- ```excel
138
- =RANDARRAY(5, 3)
139
- ```
140
- 5 rows x 3 columns of random decimals
141
-
142
- ### Random Integers
143
- ```excel
144
- =RANDARRAY(10, 1, 1, 100, TRUE)
145
- ```
146
- 10 random integers between 1 and 100
147
-
148
- ### Random Sample
149
- ```excel
150
- =INDEX(tbl_Products, RANDARRAY(5, 1, 1, ROWS(tbl_Products), TRUE), 0)
151
- ```
152
- 5 random rows from table
153
-
154
- ## LET Function
155
-
156
- ### Basic LET (Named Variables)
157
- ```excel
158
- =LET(
159
- sales, SUM(tbl_Sales[Amount]),
160
- target, 100000,
161
- variance, sales - target,
162
- IF(variance >= 0, "Above Target", "Below Target")
163
- )
164
- ```
165
-
166
- ### LET with Complex Calculations
167
- ```excel
168
- =LET(
169
- data, FILTER(tbl_Sales, tbl_Sales[Year]=2024),
170
- total, SUM(INDEX(data, , 3)),
171
- count, ROWS(data),
172
- average, total/count,
173
- "Total: " & total & " | Avg: " & ROUND(average, 2)
174
- )
175
- ```
176
-
177
- ### Reusing Calculated Values
178
- ```excel
179
- =LET(
180
- filtered, FILTER(tbl_Sales, tbl_Sales[Status]="Active"),
181
- sorted, SORT(filtered, 3, -1),
182
- top5, TAKE(sorted, 5),
183
- top5
184
- )
185
- ```
186
-
187
- ## TAKE and DROP Functions (Excel 365+)
188
-
189
- ### Take First N Rows
190
- ```excel
191
- =TAKE(tbl_Sales, 10)
192
- ```
193
-
194
- ### Take Last N Rows
195
- ```excel
196
- =TAKE(tbl_Sales, -10)
197
- ```
198
-
199
- ### Take First N Columns
200
- ```excel
201
- =TAKE(tbl_Sales, , 3)
202
- ```
203
-
204
- ### Drop First N Rows
205
- ```excel
206
- =DROP(tbl_Sales, 1)
207
- ```
208
-
209
- ### Combine for Middle Section
210
- ```excel
211
- =DROP(TAKE(tbl_Sales, 20), 10)
212
- ```
213
- Rows 11-20
214
-
215
- ## CHOOSECOLS and CHOOSEROWS
216
-
217
- ### Select Specific Columns
218
- ```excel
219
- =CHOOSECOLS(tbl_Sales, 1, 3, 5)
220
- ```
221
-
222
- ### Select Specific Rows
223
- ```excel
224
- =CHOOSEROWS(tbl_Sales, 1, 5, 10)
225
- ```
226
-
227
- ### Reorder Columns
228
- ```excel
229
- =CHOOSECOLS(tbl_Sales, 3, 1, 2)
230
- ```
231
-
232
- ## EXPAND Function
233
-
234
- ### Expand Array with Default
235
- ```excel
236
- =EXPAND(A1:C3, 5, 5, 0)
237
- ```
238
- Expands to 5x5, filling with 0
239
-
240
- ### Create Padded Table
241
- ```excel
242
- =EXPAND(FILTER(tbl_Sales, tbl_Sales[Region]="North"), 10, , "")
243
- ```
244
- Ensures at least 10 rows
245
-
246
- ## VSTACK and HSTACK
247
-
248
- ### Stack Vertically
249
- ```excel
250
- =VSTACK(tbl_Sales2023, tbl_Sales2024)
251
- ```
252
-
253
- ### Stack Horizontally
254
- ```excel
255
- =HSTACK(tbl_Info, tbl_Stats)
256
- ```
257
-
258
- ### Create Header Row
259
- ```excel
260
- =VSTACK({"Name", "Amount", "Date"}, FILTER(tbl_Sales, tbl_Sales[Amount]>1000))
261
- ```
262
-
263
- ## TEXTSPLIT and TEXTJOIN
264
-
265
- ### Split Text to Columns
266
- ```excel
267
- =TEXTSPLIT(A2, ",")
268
- ```
269
-
270
- ### Split to Rows and Columns
271
- ```excel
272
- =TEXTSPLIT(A2, ",", ";")
273
- ```
274
- - First delimiter: columns
275
- - Second delimiter: rows
276
-
277
- ### Join Array to Text
278
- ```excel
279
- =TEXTJOIN(", ", TRUE, FILTER(tbl_Products[Name], tbl_Products[Active]=TRUE))
280
- ```
281
-
282
- ## Practical Examples
283
-
284
- ### Dynamic Top 10 Report
285
- ```excel
286
- =LET(
287
- sorted, SORT(tbl_Sales, 3, -1),
288
- top10, TAKE(sorted, 10),
289
- VSTACK({"Product", "Region", "Amount"}, CHOOSECOLS(top10, 1, 2, 3))
290
- )
291
- ```
292
-
293
- ### Pivot-like Summary
294
- ```excel
295
- =LET(
296
- regions, UNIQUE(tbl_Sales[Region]),
297
- totals, MAP(regions, LAMBDA(r, SUMIF(tbl_Sales[Region], r, tbl_Sales[Amount]))),
298
- HSTACK(regions, totals)
299
- )
300
- ```
301
-
302
- ### Dynamic Validation List
303
- ```excel
304
- =SORT(UNIQUE(FILTER(tbl_Products[Name], tbl_Products[Category]=A1)))
305
- ```
306
-
307
- ## Usage Notes
308
-
309
- - Dynamic arrays spill automatically to adjacent cells
310
- - Use `@` operator to get single value: `=@SORT(A:A)`
311
- - Reference spill range with `#`: `=SUM(A1#)`
312
- - LET improves readability and performance
313
- - Combine functions for powerful one-formula solutions
314
- - Test with empty results and large datasets
@@ -1,169 +0,0 @@
1
- # Excel Lookup Formulas
2
-
3
- Reusable patterns for data lookups in Excel.
4
-
5
- ## XLOOKUP (Excel 365+)
6
-
7
- ### Basic XLOOKUP
8
- ```excel
9
- =XLOOKUP(A2, tbl_Products[ID], tbl_Products[Name])
10
- ```
11
-
12
- ### XLOOKUP with Default Value
13
- ```excel
14
- =XLOOKUP(A2, tbl_Products[ID], tbl_Products[Name], "Not Found")
15
- ```
16
-
17
- ### XLOOKUP Return Multiple Columns
18
- ```excel
19
- =XLOOKUP(A2, tbl_Products[ID], tbl_Products[Name]:tbl_Products[Price])
20
- ```
21
-
22
- ### XLOOKUP Approximate Match (Closest)
23
- ```excel
24
- =XLOOKUP(A2, tbl_Brackets[Min], tbl_Brackets[Rate], , 1)
25
- ```
26
- - `-1`: Exact match or next smaller
27
- - `1`: Exact match or next larger
28
-
29
- ### XLOOKUP from Right to Left
30
- ```excel
31
- =XLOOKUP(A2, tbl_Data[Email], tbl_Data[Name], , 0, -1)
32
- ```
33
- - Last parameter `-1` searches from last to first
34
-
35
- ### Nested XLOOKUP (Two-Dimensional)
36
- ```excel
37
- =XLOOKUP(B1, tbl_Matrix[Header], XLOOKUP(A2, tbl_Matrix[RowHeader], tbl_Matrix[Data]))
38
- ```
39
-
40
- ## VLOOKUP / HLOOKUP
41
-
42
- ### Basic VLOOKUP
43
- ```excel
44
- =VLOOKUP(A2, tbl_Products, 3, FALSE)
45
- ```
46
-
47
- ### VLOOKUP with MATCH for Dynamic Column
48
- ```excel
49
- =VLOOKUP(A2, tbl_Products, MATCH(B1, tbl_Products[#Headers], 0), FALSE)
50
- ```
51
-
52
- ### HLOOKUP
53
- ```excel
54
- =HLOOKUP(A1, tbl_Monthly, 3, FALSE)
55
- ```
56
-
57
- ## INDEX/MATCH
58
-
59
- ### Basic INDEX/MATCH
60
- ```excel
61
- =INDEX(tbl_Products[Name], MATCH(A2, tbl_Products[ID], 0))
62
- ```
63
-
64
- ### INDEX/MATCH with Multiple Criteria
65
- ```excel
66
- =INDEX(tbl_Sales[Amount], MATCH(1, (tbl_Sales[Product]=A2)*(tbl_Sales[Region]=B2), 0))
67
- ```
68
- Note: Enter as array formula (Ctrl+Shift+Enter) in older Excel
69
-
70
- ### Two-Way INDEX/MATCH
71
- ```excel
72
- =INDEX(tbl_Matrix, MATCH(A2, tbl_Matrix[RowHeader], 0), MATCH(B1, tbl_Matrix[#Headers], 0))
73
- ```
74
-
75
- ### INDEX/MATCH Return Multiple Columns
76
- ```excel
77
- =INDEX(tbl_Products, MATCH(A2, tbl_Products[ID], 0), 0)
78
- ```
79
- - Column `0` returns entire row
80
-
81
- ## Multiple Criteria Lookups
82
-
83
- ### XLOOKUP with Concatenated Key
84
- ```excel
85
- =XLOOKUP(A2&B2, tbl_Data[Product]&tbl_Data[Region], tbl_Data[Sales], "Not Found")
86
- ```
87
-
88
- ### SUMIFS for Sum with Criteria
89
- ```excel
90
- =SUMIFS(tbl_Sales[Amount], tbl_Sales[Product], A2, tbl_Sales[Region], B2)
91
- ```
92
-
93
- ### FILTER for Multiple Results
94
- ```excel
95
- =FILTER(tbl_Sales, (tbl_Sales[Product]=A2)*(tbl_Sales[Amount]>1000), "No results")
96
- ```
97
-
98
- ## Approximate Match Lookups
99
-
100
- ### XLOOKUP Approximate (Tax Brackets)
101
- ```excel
102
- =XLOOKUP(A2, tbl_TaxBrackets[MinIncome], tbl_TaxBrackets[Rate], 0, -1)
103
- ```
104
-
105
- ### VLOOKUP Approximate
106
- ```excel
107
- =VLOOKUP(A2, tbl_Grades, 2, TRUE)
108
- ```
109
- Note: Data must be sorted ascending
110
-
111
- ### Grading with IFS
112
- ```excel
113
- =IFS(A2>=90, "A", A2>=80, "B", A2>=70, "C", A2>=60, "D", TRUE, "F")
114
- ```
115
-
116
- ## Error Handling
117
-
118
- ### XLOOKUP with IFERROR (Legacy Compatibility)
119
- ```excel
120
- =IFERROR(XLOOKUP(A2, Range1, Range2), "Not Found")
121
- ```
122
-
123
- ### VLOOKUP with IFERROR
124
- ```excel
125
- =IFERROR(VLOOKUP(A2, tbl_Products, 3, FALSE), "Not Found")
126
- ```
127
-
128
- ### Check if Value Exists
129
- ```excel
130
- =IF(ISNA(MATCH(A2, tbl_Products[ID], 0)), "Not Found", "Found")
131
- ```
132
-
133
- ## Fuzzy Matching
134
-
135
- ### Partial Match with Wildcards
136
- ```excel
137
- =XLOOKUP("*"&A2&"*", tbl_Products[Name], tbl_Products[ID], "Not Found", 2)
138
- ```
139
-
140
- ### First Word Match
141
- ```excel
142
- =XLOOKUP(LEFT(A2, FIND(" ", A2)-1)&"*", tbl_Products[Name], tbl_Products[ID], "Not Found", 2)
143
- ```
144
-
145
- ## Dynamic Arrays
146
-
147
- ### Return All Matches
148
- ```excel
149
- =FILTER(tbl_Sales, tbl_Sales[Product]=A2)
150
- ```
151
-
152
- ### Unique Values from Lookup
153
- ```excel
154
- =UNIQUE(FILTER(tbl_Sales[Customer], tbl_Sales[Product]=A2))
155
- ```
156
-
157
- ### Sorted Lookup Results
158
- ```excel
159
- =SORT(FILTER(tbl_Sales, tbl_Sales[Region]=A2), 1, 1)
160
- ```
161
-
162
- ## Usage Notes
163
-
164
- - Prefer XLOOKUP over VLOOKUP for new spreadsheets
165
- - Use structured references (Table[Column]) for clarity
166
- - XLOOKUP handles #N/A with built-in default value
167
- - INDEX/MATCH is more flexible than VLOOKUP
168
- - Consider FILTER for returning multiple matches
169
- - Test with edge cases: blank cells, duplicates, not found