@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.
Files changed (46) 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/README.md +14 -5
  7. package/bin/cli.js +28 -234
  8. package/bin/commands/build-desktop.js +3 -1
  9. package/bin/commands/diff.js +3 -1
  10. package/bin/commands/install.js +4 -6
  11. package/bin/commands/lint.js +3 -1
  12. package/bin/commands/search.js +1 -1
  13. package/bin/commands/watch.js +3 -1
  14. package/bin/lib/generators/claude-plugin.js +2 -1
  15. package/bin/lib/skills.js +9 -34
  16. package/bin/postinstall.js +20 -18
  17. package/package.json +1 -1
  18. package/skills/contributions/SKILL.md +1 -1
  19. package/skills/data-model-design/SKILL.md +1 -1
  20. package/skills/data-modeling/SKILL.md +1 -1
  21. package/skills/data-quality/SKILL.md +1 -1
  22. package/skills/dax/SKILL.md +1 -1
  23. package/skills/dax-doctor/SKILL.md +1 -1
  24. package/skills/dax-udf/SKILL.md +1 -1
  25. package/skills/deployment/SKILL.md +1 -1
  26. package/skills/excel-formulas/SKILL.md +1 -1
  27. package/skills/fabric-scripts/SKILL.md +1 -1
  28. package/skills/fast-standard/SKILL.md +1 -1
  29. package/skills/governance/SKILL.md +1 -1
  30. package/skills/migration-assistant/SKILL.md +1 -1
  31. package/skills/model-documenter/SKILL.md +1 -1
  32. package/skills/pbi-connect/SKILL.md +1 -1
  33. package/skills/power-query/SKILL.md +1 -1
  34. package/skills/project-kickoff/SKILL.md +1 -1
  35. package/skills/query-performance/SKILL.md +1 -1
  36. package/skills/report-design/SKILL.md +1 -1
  37. package/skills/report-layout/SKILL.md +1 -1
  38. package/skills/rls-design/SKILL.md +1 -1
  39. package/skills/semantic-model/SKILL.md +1 -1
  40. package/skills/testing-validation/SKILL.md +1 -1
  41. package/skills/theme-tweaker/SKILL.md +1 -1
  42. package/bin/lib/licensing/index.js +0 -35
  43. package/bin/lib/licensing/storage.js +0 -404
  44. package/bin/lib/licensing/storage.test.js +0 -55
  45. package/bin/lib/licensing/validator.js +0 -213
  46. 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": "1.2.2",
9
+ "version": "2.0.0",
10
10
  "repository": "https://github.com/luquimbo/bi-superpowers"
11
11
  },
12
12
  "plugins": [
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "bi-superpowers",
3
3
  "description": "Claude Code plugin for Power BI, Microsoft Fabric, and semantic model workflows powered by the official Microsoft MCP servers.",
4
- "version": "1.2.2",
4
+ "version": "2.0.0",
5
5
  "author": {
6
6
  "name": "Lucas Sanchez"
7
7
  }
@@ -1,7 +1,6 @@
1
1
  {
2
2
  "name": "bi-superpowers",
3
- "version": "1.2.2",
4
- "generatedAt": "2026-04-11T11:35:26.330Z",
3
+ "version": "2.0.0",
5
4
  "skillCount": 24,
6
5
  "skills": [
7
6
  {
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "spec": "open-plugin-spec@1",
3
3
  "name": "bi-superpowers",
4
- "version": "1.2.2",
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 (premium — includes MCP, library, themes)
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
- # Activate your license
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
- * License System:
17
- * - Premium content requires activation via `bi-superpowers unlock`
18
- * - License validation happens against https://acadevor.com API
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 licensing, generators;
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 for cached premium content (skills, snippets, themes) */
92
- const CONTENT_CACHE_DIR = path.join(os.homedir(), '.bi-superpowers');
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(CONTENT_CACHE_DIR, 'library');
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, unlock, upgrade)
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 and status (hoisted functions, safe here)
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
- status Show license status
200
- about Show installation info
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
- Get your license at: https://acadevor.com/bi-superpowers
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
- Content dir: ${CONTENT_CACHE_DIR}
270
- License: ${licenseStatus}
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
- - 1code.dev (uses Claude Code SDK)
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
- contentCacheDir: CONTENT_CACHE_DIR,
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
- : `${SYMLINK_NAME}/library`;
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
- * Create symlink to content cache directory for easy access to library
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(targetDir) {
816
- if (generators) {
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('Error: skill sources not found. Run "super unlock" first.');
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
 
@@ -222,7 +222,9 @@ function diffCommand(args, config) {
222
222
  if (fs.existsSync(localSkills)) {
223
223
  skillsDir = localSkills;
224
224
  } else {
225
- tui.error('Skills directory not found. Run "bi-superpowers unlock" first.');
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
  }
@@ -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 proteger
10
- * contenido licenciado. Un usuario podría copiarlos manualmente, pero
11
- * no se commitean al repo del proyecto por accidente.
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
- * Nota: este comando NO requiere licencia. Los skills son gratis de
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
@@ -345,7 +345,9 @@ function lintCommand(args, config) {
345
345
  if (fs.existsSync(localSkills)) {
346
346
  skillsDir = localSkills;
347
347
  } else {
348
- tui.error('Skills directory not found. Run "bi-superpowers unlock" first.');
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
  }
@@ -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. Run "bi-superpowers unlock" first.');
300
+ tui.error('Library not found. Try reinstalling: npm install -g @luquimbo/bi-superpowers');
301
301
  process.exit(1);
302
302
  }
303
303
  }
@@ -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('Skills directory not found. Run "bi-superpowers unlock" first.');
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);