@vibecheckai/cli 2.5.6 → 2.7.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 (159) hide show
  1. package/LICENSE +1 -1
  2. package/dist/bundles/vibecheck-core.js +20 -20
  3. package/dist/commands/secrets-allowlist.js +4 -4
  4. package/dist/commands/secrets-allowlist.js.map +1 -1
  5. package/dist/commands/ship-consolidated.js +193 -193
  6. package/dist/index.d.ts.map +1 -1
  7. package/dist/index.js +103 -17
  8. package/dist/index.js.map +1 -1
  9. package/dist/init/ci-generator.d.ts +2 -2
  10. package/dist/init/hooks-installer.d.ts +2 -2
  11. package/dist/init/index.d.ts +1 -1
  12. package/dist/init/index.d.ts.map +1 -1
  13. package/dist/init/index.js +2 -2
  14. package/dist/init/index.js.map +1 -1
  15. package/dist/init/templates.d.ts +6 -285
  16. package/dist/init/templates.d.ts.map +1 -1
  17. package/dist/init/templates.js +2 -3
  18. package/dist/init/templates.js.map +1 -1
  19. package/dist/runtime/json-output.d.ts +2 -2
  20. package/package.json +11 -3
  21. package/dist/bundles/guardrail-core.js +0 -25799
  22. package/dist/bundles/guardrail-security.js +0 -208687
  23. package/dist/bundles/guardrail-ship.js +0 -2318
  24. package/dist/commands/autopilot-decision.d.ts +0 -24
  25. package/dist/commands/autopilot-decision.d.ts.map +0 -1
  26. package/dist/commands/autopilot-decision.js +0 -304
  27. package/dist/commands/autopilot-decision.js.map +0 -1
  28. package/dist/commands/autopilot.d.ts +0 -33
  29. package/dist/commands/autopilot.d.ts.map +0 -1
  30. package/dist/commands/autopilot.js +0 -1539
  31. package/dist/commands/autopilot.js.map +0 -1
  32. package/dist/commands/context.d.ts +0 -8
  33. package/dist/commands/context.d.ts.map +0 -1
  34. package/dist/commands/context.js +0 -340
  35. package/dist/commands/context.js.map +0 -1
  36. package/dist/commands/debug.d.ts +0 -78
  37. package/dist/commands/debug.d.ts.map +0 -1
  38. package/dist/commands/debug.js +0 -381
  39. package/dist/commands/debug.js.map +0 -1
  40. package/dist/commands/preview.d.ts +0 -54
  41. package/dist/commands/preview.d.ts.map +0 -1
  42. package/dist/commands/preview.js +0 -352
  43. package/dist/commands/preview.js.map +0 -1
  44. package/dist/commands/quality/check.d.ts +0 -31
  45. package/dist/commands/quality/check.d.ts.map +0 -1
  46. package/dist/commands/quality/check.js +0 -242
  47. package/dist/commands/quality/check.js.map +0 -1
  48. package/dist/commands/quality/index.d.ts +0 -8
  49. package/dist/commands/quality/index.d.ts.map +0 -1
  50. package/dist/commands/quality/index.js +0 -14
  51. package/dist/commands/quality/index.js.map +0 -1
  52. package/dist/commands/quality/setup-quality.d.ts +0 -23
  53. package/dist/commands/quality/setup-quality.d.ts.map +0 -1
  54. package/dist/commands/quality/setup-quality.js +0 -452
  55. package/dist/commands/quality/setup-quality.js.map +0 -1
  56. package/dist/commands/quality/tidy.d.ts +0 -41
  57. package/dist/commands/quality/tidy.d.ts.map +0 -1
  58. package/dist/commands/quality/tidy.js +0 -466
  59. package/dist/commands/quality/tidy.js.map +0 -1
  60. package/dist/commands/quality/utils.d.ts +0 -73
  61. package/dist/commands/quality/utils.d.ts.map +0 -1
  62. package/dist/commands/quality/utils.js +0 -158
  63. package/dist/commands/quality/utils.js.map +0 -1
  64. package/dist/fix/analytics.d.ts +0 -121
  65. package/dist/fix/analytics.d.ts.map +0 -1
  66. package/dist/fix/analytics.js +0 -289
  67. package/dist/fix/analytics.js.map +0 -1
  68. package/dist/fix/audit.d.ts +0 -61
  69. package/dist/fix/audit.d.ts.map +0 -1
  70. package/dist/fix/audit.js +0 -149
  71. package/dist/fix/audit.js.map +0 -1
  72. package/dist/fix/config.d.ts +0 -78
  73. package/dist/fix/config.d.ts.map +0 -1
  74. package/dist/fix/config.js +0 -200
  75. package/dist/fix/config.js.map +0 -1
  76. package/dist/fix/impact.d.ts +0 -74
  77. package/dist/fix/impact.d.ts.map +0 -1
  78. package/dist/fix/impact.js +0 -281
  79. package/dist/fix/impact.js.map +0 -1
  80. package/dist/fix/learning.d.ts +0 -109
  81. package/dist/fix/learning.d.ts.map +0 -1
  82. package/dist/fix/learning.js +0 -296
  83. package/dist/fix/learning.js.map +0 -1
  84. package/dist/fix/metrics.d.ts +0 -106
  85. package/dist/fix/metrics.d.ts.map +0 -1
  86. package/dist/fix/metrics.js +0 -138
  87. package/dist/fix/metrics.js.map +0 -1
  88. package/dist/fix/parallel.d.ts +0 -69
  89. package/dist/fix/parallel.d.ts.map +0 -1
  90. package/dist/fix/parallel.js +0 -203
  91. package/dist/fix/parallel.js.map +0 -1
  92. package/dist/fix/report.d.ts +0 -40
  93. package/dist/fix/report.d.ts.map +0 -1
  94. package/dist/fix/report.js +0 -212
  95. package/dist/fix/report.js.map +0 -1
  96. package/dist/fix/strategy.d.ts +0 -53
  97. package/dist/fix/strategy.d.ts.map +0 -1
  98. package/dist/fix/strategy.js +0 -143
  99. package/dist/fix/strategy.js.map +0 -1
  100. package/dist/fix/templates.d.ts +0 -58
  101. package/dist/fix/templates.d.ts.map +0 -1
  102. package/dist/fix/templates.js +0 -259
  103. package/dist/fix/templates.js.map +0 -1
  104. package/dist/fix/testing.d.ts +0 -68
  105. package/dist/fix/testing.d.ts.map +0 -1
  106. package/dist/fix/testing.js +0 -245
  107. package/dist/fix/testing.js.map +0 -1
  108. package/dist/fix/validation.d.ts +0 -71
  109. package/dist/fix/validation.d.ts.map +0 -1
  110. package/dist/fix/validation.js +0 -267
  111. package/dist/fix/validation.js.map +0 -1
  112. package/dist/fix/visualization.d.ts +0 -73
  113. package/dist/fix/visualization.d.ts.map +0 -1
  114. package/dist/fix/visualization.js +0 -243
  115. package/dist/fix/visualization.js.map +0 -1
  116. package/dist/runtime/cli-errors.d.ts +0 -38
  117. package/dist/runtime/cli-errors.d.ts.map +0 -1
  118. package/dist/runtime/cli-errors.js +0 -354
  119. package/dist/runtime/cli-errors.js.map +0 -1
  120. package/dist/runtime/owner-mode.d.ts +0 -48
  121. package/dist/runtime/owner-mode.d.ts.map +0 -1
  122. package/dist/runtime/owner-mode.js +0 -284
  123. package/dist/runtime/owner-mode.js.map +0 -1
  124. package/dist/scanner/index.d.ts +0 -8
  125. package/dist/scanner/index.d.ts.map +0 -1
  126. package/dist/scanner/index.js +0 -15
  127. package/dist/scanner/index.js.map +0 -1
  128. package/dist/scanner/placeholder-detector.d.ts +0 -56
  129. package/dist/scanner/placeholder-detector.d.ts.map +0 -1
  130. package/dist/scanner/placeholder-detector.js +0 -220
  131. package/dist/scanner/placeholder-detector.js.map +0 -1
  132. package/dist/scanner/route-detector.d.ts +0 -100
  133. package/dist/scanner/route-detector.d.ts.map +0 -1
  134. package/dist/scanner/route-detector.js +0 -455
  135. package/dist/scanner/route-detector.js.map +0 -1
  136. package/dist/scanner/scoring.d.ts +0 -67
  137. package/dist/scanner/scoring.d.ts.map +0 -1
  138. package/dist/scanner/scoring.js +0 -284
  139. package/dist/scanner/scoring.js.map +0 -1
  140. package/dist/ship-baseline.d.ts +0 -56
  141. package/dist/ship-baseline.d.ts.map +0 -1
  142. package/dist/ship-baseline.js +0 -194
  143. package/dist/ship-baseline.js.map +0 -1
  144. package/dist/ship-config.d.ts +0 -91
  145. package/dist/ship-config.d.ts.map +0 -1
  146. package/dist/ship-config.js +0 -133
  147. package/dist/ship-config.js.map +0 -1
  148. package/dist/ship-data-loader.d.ts +0 -70
  149. package/dist/ship-data-loader.d.ts.map +0 -1
  150. package/dist/ship-data-loader.js +0 -301
  151. package/dist/ship-data-loader.js.map +0 -1
  152. package/dist/utils/ai-helpers.d.ts +0 -72
  153. package/dist/utils/ai-helpers.d.ts.map +0 -1
  154. package/dist/utils/ai-helpers.js +0 -339
  155. package/dist/utils/ai-helpers.js.map +0 -1
  156. package/dist/utils/validation.d.ts +0 -34
  157. package/dist/utils/validation.d.ts.map +0 -1
  158. package/dist/utils/validation.js +0 -160
  159. package/dist/utils/validation.js.map +0 -1
package/dist/index.js CHANGED
@@ -48,7 +48,7 @@ const fs_1 = require("fs");
48
48
  const path_2 = require("path");
49
49
  // Use package.json version instead of hardcoding
50
50
  const { version: CLI_VERSION = '0.0.0' } = require('../package.json');
51
- const vibecheck_security_1 = require('./bundles/vibecheck-security');
51
+ const security_1 = require('./bundles/vibecheck-security');
52
52
  const creds_1 = require("./runtime/creds");
53
53
  const client_1 = require("./runtime/client");
54
54
  const exit_codes_1 = require("./runtime/exit-codes");
@@ -486,6 +486,43 @@ async function delay(ms) {
486
486
  // Config file path for storing API key
487
487
  const CONFIG_DIR = (0, path_2.join)(process.env.HOME || process.env.USERPROFILE || '.', '.vibecheck');
488
488
  const CONFIG_FILE = (0, path_2.join)(CONFIG_DIR, 'credentials.json');
489
+ const FREE_SCANS_PER_MONTH = 5;
490
+ // Get current month key (YYYY-MM)
491
+ function getCurrentMonthKey() {
492
+ const now = new Date();
493
+ return `${now.getFullYear()}-${String(now.getMonth() + 1).padStart(2, '0')}`;
494
+ }
495
+ // Check and track free tier usage
496
+ function checkFreeTierUsage() {
497
+ const config = loadConfig();
498
+ const currentMonth = getCurrentMonthKey();
499
+ // Reset counter if new month
500
+ if (config.freeScansResetDate !== currentMonth) {
501
+ config.freeScansUsed = 0;
502
+ config.freeScansResetDate = currentMonth;
503
+ saveConfig(config);
504
+ }
505
+ const used = config.freeScansUsed || 0;
506
+ const remaining = FREE_SCANS_PER_MONTH - used;
507
+ return {
508
+ allowed: remaining > 0,
509
+ remaining,
510
+ used,
511
+ };
512
+ }
513
+ // Increment free tier usage
514
+ function incrementFreeTierUsage() {
515
+ const config = loadConfig();
516
+ const currentMonth = getCurrentMonthKey();
517
+ if (config.freeScansResetDate !== currentMonth) {
518
+ config.freeScansUsed = 1;
519
+ config.freeScansResetDate = currentMonth;
520
+ }
521
+ else {
522
+ config.freeScansUsed = (config.freeScansUsed || 0) + 1;
523
+ }
524
+ saveConfig(config);
525
+ }
489
526
  function loadConfig() {
490
527
  try {
491
528
  if ((0, fs_1.existsSync)(CONFIG_FILE)) {
@@ -551,11 +588,34 @@ async function requireAuthAsync(requiredTier) {
551
588
  const state = cachedAuthState || await (0, creds_1.loadAuthState)();
552
589
  cachedAuthState = state;
553
590
  if (!state.apiKey && !state.accessToken) {
554
- console.error(`\n${c.critical('ERROR')} Authentication required\n`);
555
- console.log(` ${c.dim('Run')} ${c.bold('vibecheck auth --key YOUR_API_KEY')} ${c.dim('to authenticate')}`);
556
- console.log(` ${c.dim('Get your API key from')} ${c.info('https://vibecheckai.dev/api-key')}\n`);
557
- console.log(` ${c.dim('Or use')} ${c.bold('--demo')} ${c.dim('for local testing')}\n`);
558
- (0, exit_codes_1.exitWith)(exit_codes_1.ExitCode.AUTH_FAILURE);
591
+ // Premium features always require auth
592
+ if (requiredTier && requiredTier !== 'free') {
593
+ console.error(`\n${c.critical('ERROR')} ${requiredTier.toUpperCase()} tier required\n`);
594
+ console.log(` ${c.dim('Run')} ${c.bold('vibecheck auth --key YOUR_API_KEY')} ${c.dim('to authenticate')}`);
595
+ console.log(` ${c.dim('Get your API key from')} ${c.info('https://vibecheckai.dev/api-key')}\n`);
596
+ (0, exit_codes_1.exitWith)(exit_codes_1.ExitCode.AUTH_FAILURE);
597
+ }
598
+ // Check free tier usage
599
+ const usage = checkFreeTierUsage();
600
+ if (usage.allowed) {
601
+ // Increment usage and allow
602
+ incrementFreeTierUsage();
603
+ console.log(` ${c.dim('Free tier:')} ${c.info(`${usage.remaining - 1} scans remaining this month`)}`);
604
+ console.log(` ${c.dim('Get unlimited scans at')} ${c.info('https://vibecheckai.dev/pricing')}\n`);
605
+ return {
606
+ tier: 'free',
607
+ authenticatedAt: new Date().toISOString(),
608
+ };
609
+ }
610
+ else {
611
+ // Free tier exhausted
612
+ console.error(`\n${c.critical('FREE TIER LIMIT REACHED')} You've used all ${FREE_SCANS_PER_MONTH} free scans this month\n`);
613
+ console.log(` ${c.dim('Options:')}`);
614
+ console.log(` ${c.bold('1.')} Get an API key at ${c.info('https://vibecheckai.dev/api-key')}`);
615
+ console.log(` ${c.bold('2.')} Upgrade for unlimited scans at ${c.info('https://vibecheckai.dev/pricing')}`);
616
+ console.log(` ${c.bold('3.')} Wait until next month for free scans to reset\n`);
617
+ (0, exit_codes_1.exitWith)(exit_codes_1.ExitCode.AUTH_FAILURE);
618
+ }
559
619
  }
560
620
  // Check if cached entitlements are still valid
561
621
  if ((0, creds_1.isCacheValid)(state) && state.tier) {
@@ -613,19 +673,45 @@ function requireAuth(tier) {
613
673
  };
614
674
  }
615
675
  const config = loadConfig();
676
+ // If no API key, check free tier allowance (only for basic commands, not premium tiers)
616
677
  if (!config.apiKey) {
617
- console.error(`\n${c.critical('ERROR')} Authentication required\n`);
618
- console.log(` ${c.dim('Run')} ${c.bold('vibecheck auth --key YOUR_API_KEY')} ${c.dim('to authenticate')}`);
619
- console.log(` ${c.dim('Get your API key from')} ${c.info('https://vibecheckai.dev/api-key')}\n`);
620
- console.log(` ${c.dim('Or use')} ${c.bold('--demo')} ${c.dim('for local testing')}\n`);
621
- (0, exit_codes_1.exitWith)(exit_codes_1.ExitCode.AUTH_FAILURE);
678
+ // Premium features always require auth
679
+ if (tier && tier !== 'free') {
680
+ console.error(`\n${c.critical('ERROR')} ${tier.toUpperCase()} tier required\n`);
681
+ console.log(` ${c.dim('Run')} ${c.bold('vibecheck auth --key YOUR_API_KEY')} ${c.dim('to authenticate')}`);
682
+ console.log(` ${c.dim('Get your API key from')} ${c.info('https://vibecheckai.dev/api-key')}\n`);
683
+ (0, exit_codes_1.exitWith)(exit_codes_1.ExitCode.AUTH_FAILURE);
684
+ }
685
+ // Check free tier usage
686
+ const usage = checkFreeTierUsage();
687
+ if (usage.allowed) {
688
+ // Increment usage and allow
689
+ incrementFreeTierUsage();
690
+ console.log(` ${c.dim('Free tier:')} ${c.info(`${usage.remaining - 1} scans remaining this month`)}`);
691
+ console.log(` ${c.dim('Get unlimited scans at')} ${c.info('https://vibecheckai.dev/pricing')}\n`);
692
+ return {
693
+ tier: 'free',
694
+ authenticatedAt: new Date().toISOString(),
695
+ };
696
+ }
697
+ else {
698
+ // Free tier exhausted
699
+ console.error(`\n${c.critical('FREE TIER LIMIT REACHED')} You've used all ${FREE_SCANS_PER_MONTH} free scans this month\n`);
700
+ console.log(` ${c.dim('Options:')}`);
701
+ console.log(` ${c.bold('1.')} Get an API key at ${c.info('https://vibecheckai.dev/api-key')}`);
702
+ console.log(` ${c.bold('2.')} Upgrade for unlimited scans at ${c.info('https://vibecheckai.dev/pricing')}`);
703
+ console.log(` ${c.bold('3.')} Wait until next month for free scans to reset\n`);
704
+ (0, exit_codes_1.exitWith)(exit_codes_1.ExitCode.AUTH_FAILURE);
705
+ }
622
706
  }
623
707
  if (tier) {
624
- const tierLevels = { free: 0, starter: 1, pro: 2, enterprise: 3 };
708
+ // Tier levels: free=0, starter=1, pro=2, compliance=3 (enterprise is alias for compliance)
709
+ const tierLevels = { free: 0, starter: 1, pro: 2, compliance: 3, enterprise: 3 };
625
710
  const requiredLevel = tierLevels[tier] || 0;
626
711
  const currentLevel = tierLevels[config.tier || 'free'] || 0;
627
712
  if (currentLevel < requiredLevel) {
628
- console.error(`\n${c.critical('UPGRADE REQUIRED')} This feature requires ${c.bold(tier.toUpperCase())} tier\n`);
713
+ const tierName = tier === 'enterprise' ? 'COMPLIANCE' : tier.toUpperCase();
714
+ console.error(`\n${c.critical('UPGRADE REQUIRED')} This feature requires ${c.bold(tierName)} tier\n`);
629
715
  console.log(` ${c.dim('Current tier:')} ${c.info(config.tier || 'free')}`);
630
716
  console.log(` ${c.dim('Upgrade at')} ${c.info('https://vibecheckai.dev/pricing')}\n`);
631
717
  (0, exit_codes_1.exitWith)(exit_codes_1.ExitCode.AUTH_FAILURE);
@@ -2972,7 +3058,7 @@ function countFiles(dir) {
2972
3058
  }
2973
3059
  async function generateFindings(projectPath) {
2974
3060
  const findings = [];
2975
- const guardian = new vibecheck_security_1.SecretsGuardian();
3061
+ const guardian = new security_1.SecretsGuardian();
2976
3062
  // File extensions to scan for secrets
2977
3063
  const scanExtensions = ['.ts', '.js', '.tsx', '.jsx', '.json', '.env', '.yaml', '.yml', '.toml', '.py', '.rb'];
2978
3064
  // Recursively get files to scan
@@ -3069,7 +3155,7 @@ async function generateFindings(projectPath) {
3069
3155
  }
3070
3156
  async function scanSecrets(projectPath, options) {
3071
3157
  const s = spinner('Scanning for hardcoded secrets...');
3072
- const guardian = new vibecheck_security_1.SecretsGuardian();
3158
+ const guardian = new security_1.SecretsGuardian();
3073
3159
  // Use enterprise-grade scanProject instead of custom file walking
3074
3160
  // Handles: ignores, binary files, size caps, concurrency, dedupe
3075
3161
  const report = await guardian.scanProject(projectPath, 'cli-scan', {
@@ -3245,7 +3331,7 @@ async function scanCompliance(projectPath, options) {
3245
3331
  }
3246
3332
  async function generateSBOM(projectPath, options) {
3247
3333
  const s = spinner('Generating Software Bill of Materials...');
3248
- const sbomGenerator = new vibecheck_security_1.SBOMGenerator();
3334
+ const sbomGenerator = new security_1.SBOMGenerator();
3249
3335
  try {
3250
3336
  const sbom = await sbomGenerator.generate(projectPath, {
3251
3337
  format: options.format || 'cyclonedx',
@@ -3321,7 +3407,7 @@ async function generateSBOM(projectPath, options) {
3321
3407
  }
3322
3408
  async function generateContainerSBOM(imageName, options) {
3323
3409
  const s = spinner('Generating container SBOM...');
3324
- const sbomGenerator = new vibecheck_security_1.SBOMGenerator();
3410
+ const sbomGenerator = new security_1.SBOMGenerator();
3325
3411
  try {
3326
3412
  const sbom = await sbomGenerator.generateContainerSBOM(imageName, {
3327
3413
  format: options.format || 'cyclonedx',