@luquimbo/bi-superpowers 1.2.2 → 2.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (48) 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 -2
  4. package/.plugin/plugin.json +1 -1
  5. package/AGENTS.md +2 -3
  6. package/CHANGELOG.md +25 -0
  7. package/README.md +14 -5
  8. package/bin/cli.js +26 -246
  9. package/bin/commands/build-desktop.js +3 -1
  10. package/bin/commands/diff.js +3 -1
  11. package/bin/commands/install.js +4 -6
  12. package/bin/commands/lint.js +3 -1
  13. package/bin/commands/search.js +1 -1
  14. package/bin/commands/watch.js +3 -1
  15. package/bin/lib/generators/claude-plugin.js +2 -1
  16. package/bin/lib/generators/shared.js +0 -31
  17. package/bin/lib/skills.js +8 -34
  18. package/bin/postinstall.js +20 -18
  19. package/package.json +1 -1
  20. package/skills/contributions/SKILL.md +1 -1
  21. package/skills/data-model-design/SKILL.md +1 -1
  22. package/skills/data-modeling/SKILL.md +1 -1
  23. package/skills/data-quality/SKILL.md +1 -1
  24. package/skills/dax/SKILL.md +1 -1
  25. package/skills/dax-doctor/SKILL.md +1 -1
  26. package/skills/dax-udf/SKILL.md +1 -1
  27. package/skills/deployment/SKILL.md +1 -1
  28. package/skills/excel-formulas/SKILL.md +1 -1
  29. package/skills/fabric-scripts/SKILL.md +1 -1
  30. package/skills/fast-standard/SKILL.md +1 -1
  31. package/skills/governance/SKILL.md +1 -1
  32. package/skills/migration-assistant/SKILL.md +1 -1
  33. package/skills/model-documenter/SKILL.md +1 -1
  34. package/skills/pbi-connect/SKILL.md +1 -1
  35. package/skills/power-query/SKILL.md +1 -1
  36. package/skills/project-kickoff/SKILL.md +1 -1
  37. package/skills/query-performance/SKILL.md +1 -1
  38. package/skills/report-design/SKILL.md +1 -1
  39. package/skills/report-layout/SKILL.md +1 -1
  40. package/skills/rls-design/SKILL.md +1 -1
  41. package/skills/semantic-model/SKILL.md +1 -1
  42. package/skills/testing-validation/SKILL.md +1 -1
  43. package/skills/theme-tweaker/SKILL.md +1 -1
  44. package/bin/lib/licensing/index.js +0 -35
  45. package/bin/lib/licensing/storage.js +0 -404
  46. package/bin/lib/licensing/storage.test.js +0 -55
  47. package/bin/lib/licensing/validator.js +0 -213
  48. package/bin/lib/licensing/validator.test.js +0 -137
@@ -1,137 +0,0 @@
1
- const test = require('node:test');
2
- const assert = require('node:assert/strict');
3
- const http = require('http');
4
-
5
- const storage = require('./storage');
6
-
7
- function startLicenseServer() {
8
- const server = http.createServer((req, res) => {
9
- if (req.method === 'POST' && req.url === '/api/licenses/validate') {
10
- let body = '';
11
- req.on('data', (chunk) => (body += chunk));
12
- req.on('end', () => {
13
- // Minimal happy-path response for requireLicense()
14
- res.writeHead(200, { 'Content-Type': 'application/json' });
15
- res.end(
16
- JSON.stringify({
17
- valid: true,
18
- email: 'server@example.com',
19
- downloadUrl: 'https://example.com/content.zip',
20
- })
21
- );
22
- });
23
- return;
24
- }
25
-
26
- res.writeHead(404, { 'Content-Type': 'application/json' });
27
- res.end(JSON.stringify({ error: 'not found' }));
28
- });
29
-
30
- return new Promise((resolve) => {
31
- server.listen(0, '127.0.0.1', () => {
32
- const address = server.address();
33
- resolve({
34
- server,
35
- baseUrl: `http://127.0.0.1:${address.port}`,
36
- });
37
- });
38
- });
39
- }
40
-
41
- function patch(obj, key, value) {
42
- const original = obj[key];
43
- obj[key] = value;
44
- return () => {
45
- obj[key] = original;
46
- };
47
- }
48
-
49
- test('requireLicense refreshes premium content on version mismatch (best-effort)', async () => {
50
- const { server, baseUrl } = await startLicenseServer();
51
- const originalDevMode = process.env.BIAS_DEV_MODE;
52
- process.env.BIAS_API_URL = baseUrl;
53
- process.env.BIAS_DEV_MODE = 'false';
54
- delete require.cache[require.resolve('./validator')];
55
- const validator = require('./validator');
56
-
57
- const license = {
58
- license: 'LICENSE_KEY',
59
- email: 'user@example.com',
60
- contentVersion: '1.0.0',
61
- };
62
-
63
- let downloadCalls = 0;
64
- let savedLicense = null;
65
-
66
- const restores = [
67
- patch(storage, 'loadLicense', () => license),
68
- patch(storage, 'isContentInstalled', () => true),
69
- patch(storage, 'downloadPremiumContent', async () => {
70
- downloadCalls += 1;
71
- return true;
72
- }),
73
- patch(storage, 'saveLicense', (data) => {
74
- savedLicense = data;
75
- }),
76
- ];
77
-
78
- try {
79
- const result = await validator.requireLicense('2.0.0');
80
- assert.equal(result.valid, true);
81
- assert.equal(downloadCalls, 1);
82
- assert.equal(savedLicense.contentVersion, '2.0.0');
83
- } finally {
84
- restores.forEach((fn) => fn());
85
- server.close();
86
- if (originalDevMode === undefined) {
87
- delete process.env.BIAS_DEV_MODE;
88
- } else {
89
- process.env.BIAS_DEV_MODE = originalDevMode;
90
- }
91
- }
92
- });
93
-
94
- test('requireLicense does not block when refresh fails but content is installed', async () => {
95
- const { server, baseUrl } = await startLicenseServer();
96
- const originalDevMode = process.env.BIAS_DEV_MODE;
97
- process.env.BIAS_API_URL = baseUrl;
98
- process.env.BIAS_DEV_MODE = 'false';
99
- delete require.cache[require.resolve('./validator')];
100
- const validator = require('./validator');
101
-
102
- const license = {
103
- license: 'LICENSE_KEY',
104
- email: 'user@example.com',
105
- contentVersion: '1.0.0',
106
- };
107
-
108
- let downloadCalls = 0;
109
- let saveCalls = 0;
110
-
111
- const restores = [
112
- patch(storage, 'loadLicense', () => license),
113
- patch(storage, 'isContentInstalled', () => true),
114
- patch(storage, 'downloadPremiumContent', async () => {
115
- downloadCalls += 1;
116
- return false;
117
- }),
118
- patch(storage, 'saveLicense', () => {
119
- saveCalls += 1;
120
- }),
121
- ];
122
-
123
- try {
124
- const result = await validator.requireLicense('2.0.0');
125
- assert.equal(result.valid, true);
126
- assert.equal(downloadCalls, 1);
127
- assert.equal(saveCalls, 0);
128
- } finally {
129
- restores.forEach((fn) => fn());
130
- server.close();
131
- if (originalDevMode === undefined) {
132
- delete process.env.BIAS_DEV_MODE;
133
- } else {
134
- process.env.BIAS_DEV_MODE = originalDevMode;
135
- }
136
- }
137
- });