@luquimbo/bi-superpowers 1.2.2 → 2.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 +1 -1
- package/.claude-plugin/plugin.json +1 -1
- package/.claude-plugin/skill-manifest.json +1 -2
- package/.plugin/plugin.json +1 -1
- package/AGENTS.md +2 -3
- package/README.md +14 -5
- package/bin/cli.js +28 -234
- package/bin/commands/build-desktop.js +3 -1
- package/bin/commands/diff.js +3 -1
- package/bin/commands/install.js +4 -6
- package/bin/commands/lint.js +3 -1
- package/bin/commands/search.js +1 -1
- package/bin/commands/watch.js +3 -1
- package/bin/lib/generators/claude-plugin.js +2 -1
- package/bin/lib/skills.js +9 -34
- package/bin/postinstall.js +20 -18
- package/package.json +1 -1
- package/skills/contributions/SKILL.md +1 -1
- package/skills/data-model-design/SKILL.md +1 -1
- package/skills/data-modeling/SKILL.md +1 -1
- package/skills/data-quality/SKILL.md +1 -1
- package/skills/dax/SKILL.md +1 -1
- package/skills/dax-doctor/SKILL.md +1 -1
- package/skills/dax-udf/SKILL.md +1 -1
- package/skills/deployment/SKILL.md +1 -1
- package/skills/excel-formulas/SKILL.md +1 -1
- package/skills/fabric-scripts/SKILL.md +1 -1
- package/skills/fast-standard/SKILL.md +1 -1
- package/skills/governance/SKILL.md +1 -1
- package/skills/migration-assistant/SKILL.md +1 -1
- package/skills/model-documenter/SKILL.md +1 -1
- package/skills/pbi-connect/SKILL.md +1 -1
- package/skills/power-query/SKILL.md +1 -1
- package/skills/project-kickoff/SKILL.md +1 -1
- package/skills/query-performance/SKILL.md +1 -1
- package/skills/report-design/SKILL.md +1 -1
- package/skills/report-layout/SKILL.md +1 -1
- package/skills/rls-design/SKILL.md +1 -1
- package/skills/semantic-model/SKILL.md +1 -1
- package/skills/testing-validation/SKILL.md +1 -1
- package/skills/theme-tweaker/SKILL.md +1 -1
- package/bin/lib/licensing/index.js +0 -35
- package/bin/lib/licensing/storage.js +0 -404
- package/bin/lib/licensing/storage.test.js +0 -55
- package/bin/lib/licensing/validator.js +0 -213
- package/bin/lib/licensing/validator.test.js +0 -137
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
},
|
|
7
7
|
"metadata": {
|
|
8
8
|
"description": "AI-powered skills for Power BI, Microsoft Fabric, and Excel development. 24 skills covering DAX, Power Query, data modeling, report design, governance, and more.",
|
|
9
|
-
"version": "
|
|
9
|
+
"version": "2.0.0",
|
|
10
10
|
"repository": "https://github.com/luquimbo/bi-superpowers"
|
|
11
11
|
},
|
|
12
12
|
"plugins": [
|
package/.plugin/plugin.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"spec": "open-plugin-spec@1",
|
|
3
3
|
"name": "bi-superpowers",
|
|
4
|
-
"version": "
|
|
4
|
+
"version": "2.0.0",
|
|
5
5
|
"description": "Claude Code plugin for Power BI, Microsoft Fabric, and semantic model workflows powered by the official Microsoft MCP servers.",
|
|
6
6
|
"author": {
|
|
7
7
|
"name": "Lucas Sanchez"
|
package/AGENTS.md
CHANGED
|
@@ -102,16 +102,15 @@ Opciones:
|
|
|
102
102
|
- `--agent claude-code --agent codex` — agentes específicos
|
|
103
103
|
- Sin flags → modo interactivo (detecta agentes instalados)
|
|
104
104
|
|
|
105
|
-
### Option 2: Full CLI (
|
|
105
|
+
### Option 2: Full CLI (open source — includes MCP, library, themes)
|
|
106
106
|
|
|
107
107
|
```bash
|
|
108
108
|
npm install -g @luquimbo/bi-superpowers
|
|
109
|
-
super unlock
|
|
110
109
|
super kickoff
|
|
111
110
|
```
|
|
112
111
|
|
|
113
112
|
Incluye generación del plugin Claude Code con MCP servers, biblioteca de
|
|
114
|
-
snippets, temas de Power BI y toda la CLI `super`.
|
|
113
|
+
snippets, temas de Power BI y toda la CLI `super`. Todo gratis y open source (MIT).
|
|
115
114
|
|
|
116
115
|
### Option 3: Claude Code Plugin marketplace
|
|
117
116
|
|
package/README.md
CHANGED
|
@@ -20,14 +20,21 @@ AI-powered toolkit for Power BI, Microsoft Fabric & Excel development. Ships as
|
|
|
20
20
|
|
|
21
21
|
## Quick Start
|
|
22
22
|
|
|
23
|
+
### Option 1 — Install skills for your AI agents (fastest)
|
|
24
|
+
|
|
25
|
+
```bash
|
|
26
|
+
npx @luquimbo/bi-superpowers install
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
Interactive installer — detects Claude Code, GitHub Copilot, Codex, Gemini CLI, Kilo Code and installs the 24 skills into the right directories.
|
|
30
|
+
|
|
31
|
+
### Option 2 — Full CLI with plugin generation
|
|
32
|
+
|
|
23
33
|
```bash
|
|
24
34
|
# Install globally
|
|
25
35
|
npm install -g @luquimbo/bi-superpowers
|
|
26
36
|
|
|
27
|
-
#
|
|
28
|
-
super unlock
|
|
29
|
-
|
|
30
|
-
# Initialize in your project
|
|
37
|
+
# Initialize the plugin in your project
|
|
31
38
|
cd your-bi-project
|
|
32
39
|
super kickoff
|
|
33
40
|
|
|
@@ -35,6 +42,8 @@ super kickoff
|
|
|
35
42
|
claude --plugin-dir .
|
|
36
43
|
```
|
|
37
44
|
|
|
45
|
+
100% open source (MIT). No license keys. All 24 skills and the full library ship with the npm package.
|
|
46
|
+
|
|
38
47
|
### Claude Desktop
|
|
39
48
|
|
|
40
49
|
```bash
|
|
@@ -118,8 +127,8 @@ your-project/
|
|
|
118
127
|
| `super recharge` | Regenerate plugin after editing source skills |
|
|
119
128
|
| `super build-desktop` | Build MCPB extension for Claude Desktop |
|
|
120
129
|
| `super mcp-setup` | Configure MCP servers |
|
|
130
|
+
| `super install` | Install skills into your AI agents' directories |
|
|
121
131
|
| `super powers` | Show available skills, snippets, and themes |
|
|
122
|
-
| `super unlock` | Activate your license key |
|
|
123
132
|
| `super upgrade` | Update to the latest version |
|
|
124
133
|
| `super xray <query>` | Search snippets and library content |
|
|
125
134
|
| `super checkup [file]` | Validate skill files |
|
package/bin/cli.js
CHANGED
|
@@ -13,10 +13,9 @@
|
|
|
13
13
|
* and generated for the Claude Code plugin.
|
|
14
14
|
* - Supports: Claude Code, 1code.dev, Claude Desktop (via MCPB).
|
|
15
15
|
*
|
|
16
|
-
*
|
|
17
|
-
* -
|
|
18
|
-
* -
|
|
19
|
-
* - Content is cached locally in ~/.bi-superpowers/
|
|
16
|
+
* Licensing:
|
|
17
|
+
* - Open source (MIT) — no license activation required
|
|
18
|
+
* - All skills and library content ship with the npm package
|
|
20
19
|
*
|
|
21
20
|
* @module cli
|
|
22
21
|
* @author Lucas Sanchez (@luquimbo)
|
|
@@ -26,14 +25,11 @@
|
|
|
26
25
|
const fs = require('fs');
|
|
27
26
|
const path = require('path');
|
|
28
27
|
const { execSync } = require('child_process');
|
|
29
|
-
const readline = require('readline');
|
|
30
|
-
const os = require('os');
|
|
31
28
|
const { loadSkills } = require('./lib/skills');
|
|
32
29
|
|
|
33
30
|
// Import lib modules (extracted from cli.js for better organization)
|
|
34
|
-
let
|
|
31
|
+
let generators;
|
|
35
32
|
try {
|
|
36
|
-
licensing = require('./lib/licensing');
|
|
37
33
|
generators = require('./lib/generators');
|
|
38
34
|
} catch (e) {
|
|
39
35
|
// Modules may not be available during npm install phase
|
|
@@ -88,22 +84,15 @@ try {
|
|
|
88
84
|
/** Directory where the npm package is installed */
|
|
89
85
|
const PACKAGE_DIR = path.dirname(__dirname);
|
|
90
86
|
|
|
91
|
-
/** Directory
|
|
92
|
-
const
|
|
93
|
-
|
|
94
|
-
// File paths - premium content is downloaded to CONTENT_CACHE_DIR
|
|
95
|
-
/** Directory containing skill definition files (.md) */
|
|
96
|
-
const SKILLS_DIR = path.join(CONTENT_CACHE_DIR, 'src', 'content', 'skills');
|
|
87
|
+
/** Directory containing skill source files (.md) */
|
|
88
|
+
const SKILLS_DIR = path.join(PACKAGE_DIR, 'src', 'content', 'skills');
|
|
97
89
|
|
|
98
90
|
/** Directory containing code snippets, templates, and themes */
|
|
99
|
-
const LIBRARY_DIR = path.join(
|
|
91
|
+
const LIBRARY_DIR = path.join(PACKAGE_DIR, 'library');
|
|
100
92
|
|
|
101
93
|
/** Project-local config file name (stores tool selections) */
|
|
102
94
|
const CONFIG_FILE = '.bi-superpowers.json';
|
|
103
95
|
|
|
104
|
-
/** Symlink name created in projects pointing to content cache */
|
|
105
|
-
const SYMLINK_NAME = '.bi-superpowers';
|
|
106
|
-
|
|
107
96
|
/** npm package name for update commands */
|
|
108
97
|
const PACKAGE_NAME = '@luquimbo/bi-superpowers';
|
|
109
98
|
const DEFAULT_TOOLS = ['claude-plugin'];
|
|
@@ -123,7 +112,7 @@ const AI_TOOLS = generators ? generators.AI_TOOLS : {};
|
|
|
123
112
|
*
|
|
124
113
|
* Command Categories:
|
|
125
114
|
* - Core: Basic info commands (help, version, about, status)
|
|
126
|
-
* - Setup: Project initialization and configuration (kickoff, recharge,
|
|
115
|
+
* - Setup: Project initialization and configuration (kickoff, recharge, upgrade)
|
|
127
116
|
* - Developer: Advanced tools for content management (xray, checkup, scan, sentinel, powers)
|
|
128
117
|
* - Legacy: Old command names maintained for backward compatibility
|
|
129
118
|
*/
|
|
@@ -134,23 +123,20 @@ const AI_TOOLS = generators ? generators.AI_TOOLS : {};
|
|
|
134
123
|
// further down in the file) are attached imperatively after that function exists.
|
|
135
124
|
// See the `commands.xray = runSearch;` block after the wrapper `const`s.
|
|
136
125
|
const commands = {
|
|
137
|
-
// Core commands - basic info
|
|
126
|
+
// Core commands - basic info (hoisted functions, safe here)
|
|
138
127
|
help: showHelp,
|
|
139
128
|
version: showVersion,
|
|
140
129
|
about: showInfo,
|
|
141
|
-
status: showLicenseStatus,
|
|
142
130
|
|
|
143
131
|
// Setup & sync - project configuration (hoisted functions, safe here)
|
|
144
132
|
kickoff: initProject,
|
|
145
133
|
recharge: syncProject,
|
|
146
|
-
unlock: activateLicense,
|
|
147
134
|
upgrade: updatePackage,
|
|
148
135
|
powers: listAgents,
|
|
149
136
|
|
|
150
137
|
// Legacy aliases (hoisted functions, safe here)
|
|
151
138
|
init: initProject,
|
|
152
139
|
sync: syncProject,
|
|
153
|
-
activate: activateLicense,
|
|
154
140
|
update: updatePackage,
|
|
155
141
|
list: listAgents,
|
|
156
142
|
info: showInfo,
|
|
@@ -185,7 +171,6 @@ Usage:
|
|
|
185
171
|
|
|
186
172
|
Commands:
|
|
187
173
|
install Install skills for your AI agents (Claude, Copilot, Codex...)
|
|
188
|
-
unlock Activate your license key
|
|
189
174
|
kickoff [path] Initialize the Claude Code plugin in your project
|
|
190
175
|
recharge [path] Regenerate the plugin from source skills
|
|
191
176
|
build-desktop Build .mcpb extension for Claude Desktop
|
|
@@ -196,9 +181,8 @@ Commands:
|
|
|
196
181
|
sentinel Watch for changes and auto-regenerate
|
|
197
182
|
mcp-setup Configure official Microsoft MCP servers
|
|
198
183
|
upgrade Update to latest version
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
help Show this help
|
|
184
|
+
about Show installation info
|
|
185
|
+
help Show this help
|
|
202
186
|
|
|
203
187
|
Repo Multi-Proyecto (v3):
|
|
204
188
|
setup Create your bi-repo for version control
|
|
@@ -220,7 +204,6 @@ Examples:
|
|
|
220
204
|
super install # Interactive multi-agent installer
|
|
221
205
|
super install -a claude-code # Install for Claude Code only
|
|
222
206
|
super install --all --yes # Install for all agents, no prompts
|
|
223
|
-
super unlock # Activate your license
|
|
224
207
|
super kickoff # Initialize plugin in current directory
|
|
225
208
|
super kickoff ./my-project # Initialize in specific directory
|
|
226
209
|
super kickoff --dry-run # Preview what would be created
|
|
@@ -241,7 +224,7 @@ Repo Multi-Proyecto:
|
|
|
241
224
|
super sync-source # Auto-detect and sync
|
|
242
225
|
super sync-profile # Save snippets to profile
|
|
243
226
|
|
|
244
|
-
|
|
227
|
+
Open source — MIT licensed
|
|
245
228
|
Documentation: https://github.com/luquimbo/bi-superpowers
|
|
246
229
|
`);
|
|
247
230
|
}
|
|
@@ -252,9 +235,6 @@ function showVersion() {
|
|
|
252
235
|
|
|
253
236
|
function showInfo() {
|
|
254
237
|
const skillCount = getSkillFiles().length;
|
|
255
|
-
const license = loadLicense();
|
|
256
|
-
const licenseStatus = license ? `Active (${license.email})` : 'Not activated';
|
|
257
|
-
const contentStatus = isContentInstalled() ? `Installed (${skillCount} skills)` : 'Not installed';
|
|
258
238
|
const aiToolsList = Object.entries(AI_TOOLS)
|
|
259
239
|
.map(([_k, v]) => ` - ${v.name}`)
|
|
260
240
|
.join('\n');
|
|
@@ -266,16 +246,18 @@ BI Agent Superpowers - Installation Info
|
|
|
266
246
|
Version: ${VERSION}
|
|
267
247
|
Author: Lucas Sanchez (@luquimbo)
|
|
268
248
|
Package dir: ${PACKAGE_DIR}
|
|
269
|
-
|
|
270
|
-
License:
|
|
271
|
-
Content: ${contentStatus}
|
|
249
|
+
Skills: ${skillCount} available
|
|
250
|
+
License: MIT (open source)
|
|
272
251
|
|
|
273
252
|
Architecture: Single Source of Truth
|
|
274
253
|
Skills defined once, generated for the Claude Code plugin
|
|
275
254
|
|
|
276
255
|
Compatible with:
|
|
277
256
|
- Claude Code (plugin)
|
|
278
|
-
-
|
|
257
|
+
- GitHub Copilot (agent skills)
|
|
258
|
+
- Codex (OpenAI)
|
|
259
|
+
- Gemini CLI
|
|
260
|
+
- Kilo Code
|
|
279
261
|
- Claude Desktop (via MCPB extension)
|
|
280
262
|
|
|
281
263
|
Plugin Generators:
|
|
@@ -285,182 +267,9 @@ GitHub: https://github.com/luquimbo/bi-superpowers
|
|
|
285
267
|
`);
|
|
286
268
|
}
|
|
287
269
|
|
|
288
|
-
/**
|
|
289
|
-
* Creates a readline interface for interactive CLI prompts
|
|
290
|
-
* @returns {readline.Interface} Readline interface
|
|
291
|
-
*/
|
|
292
|
-
function createReadline() {
|
|
293
|
-
return readline.createInterface({
|
|
294
|
-
input: process.stdin,
|
|
295
|
-
output: process.stdout,
|
|
296
|
-
});
|
|
297
|
-
}
|
|
298
|
-
|
|
299
|
-
/**
|
|
300
|
-
* Promisified readline question
|
|
301
|
-
* @param {readline.Interface} rl - Readline interface
|
|
302
|
-
* @param {string} question - Question to display
|
|
303
|
-
* @returns {Promise<string>} User's trimmed answer
|
|
304
|
-
*/
|
|
305
|
-
function prompt(rl, question) {
|
|
306
|
-
return new Promise((resolve) => {
|
|
307
|
-
rl.question(question, (answer) => resolve(answer.trim()));
|
|
308
|
-
});
|
|
309
|
-
}
|
|
310
|
-
|
|
311
270
|
// ============================================
|
|
312
271
|
// LICENSE MANAGEMENT
|
|
313
272
|
// ============================================
|
|
314
|
-
// These functions handle license storage, validation, and premium content downloads.
|
|
315
|
-
// Licenses are stored in ~/.bi-superpowers-license as JSON.
|
|
316
|
-
|
|
317
|
-
// License functions - delegated to lib/licensing module
|
|
318
|
-
function loadLicense() {
|
|
319
|
-
return licensing ? licensing.loadLicense() : null;
|
|
320
|
-
}
|
|
321
|
-
|
|
322
|
-
function saveLicense(data) {
|
|
323
|
-
if (licensing) licensing.saveLicense(data);
|
|
324
|
-
}
|
|
325
|
-
|
|
326
|
-
// HTTP/download/extract functions - delegated to lib/licensing module
|
|
327
|
-
function isContentInstalled() {
|
|
328
|
-
return licensing ? licensing.isContentInstalled() : false;
|
|
329
|
-
}
|
|
330
|
-
|
|
331
|
-
async function validateLicense(licenseKey) {
|
|
332
|
-
return licensing
|
|
333
|
-
? licensing.validateLicense(licenseKey)
|
|
334
|
-
: { valid: false, error: 'Module not loaded' };
|
|
335
|
-
}
|
|
336
|
-
|
|
337
|
-
async function downloadPremiumContent(downloadUrl) {
|
|
338
|
-
return licensing ? licensing.downloadPremiumContent(downloadUrl) : false;
|
|
339
|
-
}
|
|
340
|
-
|
|
341
|
-
/**
|
|
342
|
-
* Show license status command handler
|
|
343
|
-
*
|
|
344
|
-
* Displays current license status including:
|
|
345
|
-
* - Whether a license is activated
|
|
346
|
-
* - Email and activation date if active
|
|
347
|
-
* - Instructions for activation if not active
|
|
348
|
-
*/
|
|
349
|
-
function showLicenseStatus() {
|
|
350
|
-
const license = loadLicense();
|
|
351
|
-
|
|
352
|
-
if (!license) {
|
|
353
|
-
console.log(`
|
|
354
|
-
License Status: NOT ACTIVATED
|
|
355
|
-
|
|
356
|
-
Run 'bi-superpowers unlock' to activate your license.
|
|
357
|
-
Get your license at: https://acadevor.com/bi-superpowers
|
|
358
|
-
`);
|
|
359
|
-
return;
|
|
360
|
-
}
|
|
361
|
-
|
|
362
|
-
console.log(`
|
|
363
|
-
License Status: ACTIVE ✓
|
|
364
|
-
|
|
365
|
-
Email: ${license.email}
|
|
366
|
-
License: ${license.license.substring(0, 8)}...
|
|
367
|
-
Activated: ${license.activatedAt || 'Unknown'}
|
|
368
|
-
|
|
369
|
-
Run 'bi-superpowers unlock' to re-activate or change license.
|
|
370
|
-
`);
|
|
371
|
-
}
|
|
372
|
-
|
|
373
|
-
/**
|
|
374
|
-
* Activate license command handler (super unlock)
|
|
375
|
-
*
|
|
376
|
-
* Interactive command that:
|
|
377
|
-
* 1. Prompts user for their license key
|
|
378
|
-
* 2. Validates the key against the API
|
|
379
|
-
* 3. Downloads premium content if validation succeeds
|
|
380
|
-
* 4. Saves the license locally for future sessions
|
|
381
|
-
*
|
|
382
|
-
* This is typically the first command users run after installation.
|
|
383
|
-
*/
|
|
384
|
-
async function activateLicense() {
|
|
385
|
-
console.log(`
|
|
386
|
-
BI Agent Superpowers - License Activation
|
|
387
|
-
=========================================
|
|
388
|
-
`);
|
|
389
|
-
|
|
390
|
-
const existingLicense = loadLicense();
|
|
391
|
-
if (existingLicense) {
|
|
392
|
-
console.log(
|
|
393
|
-
`Current license: ${existingLicense.license.substring(0, 8)}... (${existingLicense.email})`
|
|
394
|
-
);
|
|
395
|
-
console.log('');
|
|
396
|
-
}
|
|
397
|
-
|
|
398
|
-
const rl = createReadline();
|
|
399
|
-
|
|
400
|
-
try {
|
|
401
|
-
const licenseKey = await prompt(rl, 'Enter your license key: ');
|
|
402
|
-
|
|
403
|
-
if (!licenseKey) {
|
|
404
|
-
console.log('\nNo license key provided.');
|
|
405
|
-
process.exit(1);
|
|
406
|
-
}
|
|
407
|
-
|
|
408
|
-
console.log('\nValidating license...');
|
|
409
|
-
|
|
410
|
-
const result = await validateLicense(licenseKey);
|
|
411
|
-
|
|
412
|
-
if (!result.valid) {
|
|
413
|
-
console.log(`\n✗ License invalid: ${result.error || 'Unknown error'}`);
|
|
414
|
-
console.log('\nGet your license at: https://acadevor.com/bi-superpowers');
|
|
415
|
-
process.exit(1);
|
|
416
|
-
}
|
|
417
|
-
|
|
418
|
-
console.log('\n✓ License validated!');
|
|
419
|
-
console.log(` Email: ${result.email}`);
|
|
420
|
-
if (result.name) {
|
|
421
|
-
console.log(` Name: ${result.name}`);
|
|
422
|
-
}
|
|
423
|
-
|
|
424
|
-
// Download premium content
|
|
425
|
-
console.log('');
|
|
426
|
-
if (result.downloadUrl) {
|
|
427
|
-
const downloaded = await downloadPremiumContent(result.downloadUrl);
|
|
428
|
-
if (!downloaded) {
|
|
429
|
-
console.log('\n⚠ Content download failed. You can retry with "bi-superpowers unlock"');
|
|
430
|
-
}
|
|
431
|
-
}
|
|
432
|
-
|
|
433
|
-
// Save license
|
|
434
|
-
saveLicense({
|
|
435
|
-
license: licenseKey,
|
|
436
|
-
email: result.email,
|
|
437
|
-
name: result.name,
|
|
438
|
-
activatedAt: new Date().toISOString(),
|
|
439
|
-
contentVersion: VERSION,
|
|
440
|
-
});
|
|
441
|
-
|
|
442
|
-
console.log(`
|
|
443
|
-
════════════════════════════════════════════════════════════
|
|
444
|
-
License activated successfully!
|
|
445
|
-
════════════════════════════════════════════════════════════
|
|
446
|
-
|
|
447
|
-
You can now run:
|
|
448
|
-
|
|
449
|
-
super kickoff # Initialize in current project
|
|
450
|
-
super powers # See available skills
|
|
451
|
-
|
|
452
|
-
════════════════════════════════════════════════════════════
|
|
453
|
-
`);
|
|
454
|
-
} finally {
|
|
455
|
-
rl.close();
|
|
456
|
-
}
|
|
457
|
-
}
|
|
458
|
-
|
|
459
|
-
// requireLicense - delegated to lib/licensing module
|
|
460
|
-
async function requireLicense() {
|
|
461
|
-
return licensing ? licensing.requireLicense(VERSION) : process.exit(1);
|
|
462
|
-
}
|
|
463
|
-
|
|
464
273
|
// ============================================
|
|
465
274
|
// SKILL FILE MANAGEMENT
|
|
466
275
|
// ============================================
|
|
@@ -483,7 +292,7 @@ async function requireLicense() {
|
|
|
483
292
|
function getSkillFiles() {
|
|
484
293
|
return loadSkills({
|
|
485
294
|
packageDir: PACKAGE_DIR,
|
|
486
|
-
|
|
295
|
+
preferLocal: true,
|
|
487
296
|
});
|
|
488
297
|
}
|
|
489
298
|
|
|
@@ -528,9 +337,6 @@ async function initProject(args) {
|
|
|
528
337
|
const cleanArgs = removeDryRunFlag(args);
|
|
529
338
|
const targetDir = cleanArgs[0] ? path.resolve(cleanArgs[0]) : process.cwd();
|
|
530
339
|
|
|
531
|
-
// Require valid license
|
|
532
|
-
await requireLicense();
|
|
533
|
-
|
|
534
340
|
const skills = getSkillFiles();
|
|
535
341
|
|
|
536
342
|
console.log(`
|
|
@@ -609,9 +415,6 @@ async function syncProject(args) {
|
|
|
609
415
|
const cleanArgs = removeDryRunFlag(args);
|
|
610
416
|
const targetDir = cleanArgs[0] ? path.resolve(cleanArgs[0]) : process.cwd();
|
|
611
417
|
|
|
612
|
-
// Require valid license
|
|
613
|
-
await requireLicense();
|
|
614
|
-
|
|
615
418
|
const skills = getSkillFiles();
|
|
616
419
|
|
|
617
420
|
console.log(`
|
|
@@ -689,9 +492,11 @@ function ensurePluginTool(tools = []) {
|
|
|
689
492
|
*/
|
|
690
493
|
function getGenerationOptions(targetDir) {
|
|
691
494
|
const usePluginRootLauncher = path.resolve(targetDir) === PACKAGE_DIR;
|
|
495
|
+
// If the project has a local library/ folder, use it; otherwise point to
|
|
496
|
+
// the library bundled inside the installed npm package.
|
|
692
497
|
const libraryPrefix = fs.existsSync(path.join(targetDir, 'library'))
|
|
693
498
|
? 'library'
|
|
694
|
-
:
|
|
499
|
+
: path.join(PACKAGE_DIR, 'library');
|
|
695
500
|
|
|
696
501
|
return {
|
|
697
502
|
packageDir: PACKAGE_DIR,
|
|
@@ -810,12 +615,12 @@ async function generateForTool(tool, targetDir, skills) {
|
|
|
810
615
|
}
|
|
811
616
|
|
|
812
617
|
/**
|
|
813
|
-
*
|
|
618
|
+
* Placeholder kept for backwards compatibility with callers. Previously
|
|
619
|
+
* created a symlink from the project to the license content cache; now that
|
|
620
|
+
* content is bundled in the npm package we no longer need the symlink.
|
|
814
621
|
*/
|
|
815
|
-
function createSymlink(
|
|
816
|
-
|
|
817
|
-
generators.createSymlink(targetDir, CONTENT_CACHE_DIR, SYMLINK_NAME);
|
|
818
|
-
}
|
|
622
|
+
function createSymlink(_targetDir) {
|
|
623
|
+
// no-op (kept to avoid breaking existing call sites)
|
|
819
624
|
}
|
|
820
625
|
|
|
821
626
|
function showCompletionMessage(targetDir, tools, skillCount) {
|
|
@@ -890,22 +695,13 @@ function updatePackage() {
|
|
|
890
695
|
|
|
891
696
|
function listAgents() {
|
|
892
697
|
const skills = getSkillFiles();
|
|
893
|
-
const license = loadLicense();
|
|
894
|
-
const contentInstalled = isContentInstalled();
|
|
895
698
|
|
|
896
699
|
console.log(`
|
|
897
700
|
BI Agent Superpowers - Skills & Resources
|
|
898
701
|
=========================================
|
|
899
|
-
Single Source of Truth: ${skills.length} skills
|
|
900
|
-
License: ${license ? `Active (${license.email})` : 'Not activated'}
|
|
901
|
-
Content: ${contentInstalled ? 'Installed' : 'Not installed (run "bi-superpowers unlock")'}
|
|
702
|
+
Single Source of Truth: ${skills.length} skills (open source)
|
|
902
703
|
`);
|
|
903
704
|
|
|
904
|
-
if (!contentInstalled) {
|
|
905
|
-
console.log('⚠ Premium content not installed. Run "bi-superpowers unlock" first.\n');
|
|
906
|
-
return;
|
|
907
|
-
}
|
|
908
|
-
|
|
909
705
|
console.log('Skills (source content for the plugin and optional adapters):');
|
|
910
706
|
for (const skill of skills) {
|
|
911
707
|
const meta = parseSkillMetadata(skill.content);
|
|
@@ -963,7 +759,6 @@ function getCommandConfig() {
|
|
|
963
759
|
return {
|
|
964
760
|
skillsDir: SKILLS_DIR,
|
|
965
761
|
libraryDir: LIBRARY_DIR,
|
|
966
|
-
contentCacheDir: CONTENT_CACHE_DIR,
|
|
967
762
|
packageDir: PACKAGE_DIR,
|
|
968
763
|
version: VERSION,
|
|
969
764
|
};
|
|
@@ -1073,7 +868,6 @@ module.exports = {
|
|
|
1073
868
|
AI_TOOLS,
|
|
1074
869
|
SKILLS_DIR,
|
|
1075
870
|
LIBRARY_DIR,
|
|
1076
|
-
CONTENT_CACHE_DIR,
|
|
1077
871
|
VERSION,
|
|
1078
872
|
};
|
|
1079
873
|
|
|
@@ -51,7 +51,9 @@ BI Agent Superpowers — Build Desktop Extension
|
|
|
51
51
|
|
|
52
52
|
// Verify skills exist
|
|
53
53
|
if (!fs.existsSync(SKILLS_SOURCE_DIR)) {
|
|
54
|
-
console.error(
|
|
54
|
+
console.error(
|
|
55
|
+
'Error: skill sources not found. Try reinstalling: npm install -g @luquimbo/bi-superpowers'
|
|
56
|
+
);
|
|
55
57
|
process.exit(1);
|
|
56
58
|
}
|
|
57
59
|
|
package/bin/commands/diff.js
CHANGED
|
@@ -222,7 +222,9 @@ function diffCommand(args, config) {
|
|
|
222
222
|
if (fs.existsSync(localSkills)) {
|
|
223
223
|
skillsDir = localSkills;
|
|
224
224
|
} else {
|
|
225
|
-
tui.error(
|
|
225
|
+
tui.error(
|
|
226
|
+
'Skills directory not found. Try reinstalling: npm install -g @luquimbo/bi-superpowers'
|
|
227
|
+
);
|
|
226
228
|
process.exit(1);
|
|
227
229
|
}
|
|
228
230
|
}
|
package/bin/commands/install.js
CHANGED
|
@@ -6,13 +6,11 @@
|
|
|
6
6
|
* correctos para cada agente AI. Inspirado en el CLI `npx skills` de
|
|
7
7
|
* Vercel Labs.
|
|
8
8
|
*
|
|
9
|
-
* Los skills siempre se instalan a nivel de usuario (~/) para
|
|
10
|
-
*
|
|
11
|
-
*
|
|
9
|
+
* Los skills siempre se instalan a nivel de usuario (~/) para no
|
|
10
|
+
* contaminar el repo del proyecto. El usuario los obtiene una vez
|
|
11
|
+
* y los comparte con todos sus proyectos.
|
|
12
12
|
*
|
|
13
|
-
*
|
|
14
|
-
* instalar; la licencia controla acceso a contenido premium vía
|
|
15
|
-
* `super unlock` + `super kickoff`.
|
|
13
|
+
* Open source: todo el contenido ship gratis con el paquete npm.
|
|
16
14
|
*
|
|
17
15
|
* Uso:
|
|
18
16
|
* npx @luquimbo/bi-superpowers install
|
package/bin/commands/lint.js
CHANGED
|
@@ -345,7 +345,9 @@ function lintCommand(args, config) {
|
|
|
345
345
|
if (fs.existsSync(localSkills)) {
|
|
346
346
|
skillsDir = localSkills;
|
|
347
347
|
} else {
|
|
348
|
-
tui.error(
|
|
348
|
+
tui.error(
|
|
349
|
+
'Skills directory not found. Try reinstalling: npm install -g @luquimbo/bi-superpowers'
|
|
350
|
+
);
|
|
349
351
|
process.exit(1);
|
|
350
352
|
}
|
|
351
353
|
}
|
package/bin/commands/search.js
CHANGED
|
@@ -297,7 +297,7 @@ function searchCommand(args, config) {
|
|
|
297
297
|
if (fs.existsSync(localLibrary)) {
|
|
298
298
|
libraryDir = localLibrary;
|
|
299
299
|
} else {
|
|
300
|
-
tui.error('Library not found.
|
|
300
|
+
tui.error('Library not found. Try reinstalling: npm install -g @luquimbo/bi-superpowers');
|
|
301
301
|
process.exit(1);
|
|
302
302
|
}
|
|
303
303
|
}
|
package/bin/commands/watch.js
CHANGED
|
@@ -66,7 +66,9 @@ function watchCommand(args, config, cliModule) {
|
|
|
66
66
|
const targetDir = options.targetDir;
|
|
67
67
|
|
|
68
68
|
if (!fs.existsSync(skillsDir)) {
|
|
69
|
-
tui.error(
|
|
69
|
+
tui.error(
|
|
70
|
+
'Skills directory not found. Try reinstalling: npm install -g @luquimbo/bi-superpowers'
|
|
71
|
+
);
|
|
70
72
|
process.exit(1);
|
|
71
73
|
}
|
|
72
74
|
|
|
@@ -251,10 +251,11 @@ async function generate(targetDir, skills, options = {}) {
|
|
|
251
251
|
// Generate skill-manifest.json — a compact summary of all skills with
|
|
252
252
|
// frontmatter metadata (name, title, description, category). Used by
|
|
253
253
|
// internal tooling (xray, powers, checkup) and as a CI consistency check.
|
|
254
|
+
// Intentionally omits timestamps so the file is deterministic and doesn't
|
|
255
|
+
// show as dirty in git on every build.
|
|
254
256
|
const skillManifest = {
|
|
255
257
|
name: 'bi-superpowers',
|
|
256
258
|
version,
|
|
257
|
-
generatedAt: new Date().toISOString(),
|
|
258
259
|
skillCount: skills.length,
|
|
259
260
|
skills: skills.map((skill) => {
|
|
260
261
|
const metadata = parseSkillMetadata(skill.content);
|