@vibecheckai/cli 3.6.1 โ†’ 3.8.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 (105) hide show
  1. package/README.md +135 -63
  2. package/bin/_deprecations.js +447 -19
  3. package/bin/_router.js +1 -1
  4. package/bin/registry.js +347 -280
  5. package/bin/runners/context/generators/cursor-enhanced.js +2439 -0
  6. package/bin/runners/lib/agent-firewall/enforcement/gateway.js +1059 -0
  7. package/bin/runners/lib/agent-firewall/enforcement/index.js +98 -0
  8. package/bin/runners/lib/agent-firewall/enforcement/mode.js +318 -0
  9. package/bin/runners/lib/agent-firewall/enforcement/orchestrator.js +484 -0
  10. package/bin/runners/lib/agent-firewall/enforcement/proof-artifact.js +418 -0
  11. package/bin/runners/lib/agent-firewall/enforcement/schemas/change-event.schema.json +173 -0
  12. package/bin/runners/lib/agent-firewall/enforcement/schemas/intent.schema.json +181 -0
  13. package/bin/runners/lib/agent-firewall/enforcement/schemas/verdict.schema.json +222 -0
  14. package/bin/runners/lib/agent-firewall/enforcement/verdict-v2.js +333 -0
  15. package/bin/runners/lib/agent-firewall/index.js +200 -0
  16. package/bin/runners/lib/agent-firewall/integration/index.js +20 -0
  17. package/bin/runners/lib/agent-firewall/integration/ship-gate.js +437 -0
  18. package/bin/runners/lib/agent-firewall/intent/alignment-engine.js +622 -0
  19. package/bin/runners/lib/agent-firewall/intent/auto-detect.js +426 -0
  20. package/bin/runners/lib/agent-firewall/intent/index.js +102 -0
  21. package/bin/runners/lib/agent-firewall/intent/schema.js +352 -0
  22. package/bin/runners/lib/agent-firewall/intent/store.js +283 -0
  23. package/bin/runners/lib/agent-firewall/interception/fs-interceptor.js +502 -0
  24. package/bin/runners/lib/agent-firewall/interception/index.js +23 -0
  25. package/bin/runners/lib/agent-firewall/policy/rules/fake-success.js +31 -38
  26. package/bin/runners/lib/agent-firewall/policy/rules/ghost-env.js +68 -3
  27. package/bin/runners/lib/agent-firewall/policy/rules/ghost-route.js +4 -2
  28. package/bin/runners/lib/agent-firewall/risk/thresholds.js +5 -4
  29. package/bin/runners/lib/agent-firewall/session/collector.js +451 -0
  30. package/bin/runners/lib/agent-firewall/session/index.js +26 -0
  31. package/bin/runners/lib/artifact-envelope.js +540 -0
  32. package/bin/runners/lib/auth-shared.js +977 -0
  33. package/bin/runners/lib/checkpoint.js +941 -0
  34. package/bin/runners/lib/cleanup/engine.js +571 -0
  35. package/bin/runners/lib/cleanup/index.js +53 -0
  36. package/bin/runners/lib/cleanup/output.js +375 -0
  37. package/bin/runners/lib/cleanup/rules.js +1060 -0
  38. package/bin/runners/lib/doctor/diagnosis-receipt.js +454 -0
  39. package/bin/runners/lib/doctor/failure-signatures.js +526 -0
  40. package/bin/runners/lib/doctor/fix-script.js +336 -0
  41. package/bin/runners/lib/doctor/modules/build-tools.js +453 -0
  42. package/bin/runners/lib/doctor/modules/index.js +62 -3
  43. package/bin/runners/lib/doctor/modules/os-quirks.js +706 -0
  44. package/bin/runners/lib/doctor/modules/repo-integrity.js +485 -0
  45. package/bin/runners/lib/doctor/safe-repair.js +384 -0
  46. package/bin/runners/lib/engines/attack-detector.js +1192 -0
  47. package/bin/runners/lib/entitlements-v2.js +2 -2
  48. package/bin/runners/lib/error-messages.js +1 -1
  49. package/bin/runners/lib/missions/briefing.js +427 -0
  50. package/bin/runners/lib/missions/checkpoint.js +753 -0
  51. package/bin/runners/lib/missions/hardening.js +851 -0
  52. package/bin/runners/lib/missions/plan.js +421 -32
  53. package/bin/runners/lib/missions/safety-gates.js +645 -0
  54. package/bin/runners/lib/missions/schema.js +478 -0
  55. package/bin/runners/lib/packs/bundle.js +675 -0
  56. package/bin/runners/lib/packs/evidence-pack.js +671 -0
  57. package/bin/runners/lib/packs/pack-factory.js +837 -0
  58. package/bin/runners/lib/packs/permissions-pack.js +686 -0
  59. package/bin/runners/lib/packs/proof-graph-pack.js +779 -0
  60. package/bin/runners/lib/report-output.js +6 -6
  61. package/bin/runners/lib/safelist/index.js +96 -0
  62. package/bin/runners/lib/safelist/integration.js +334 -0
  63. package/bin/runners/lib/safelist/matcher.js +696 -0
  64. package/bin/runners/lib/safelist/schema.js +948 -0
  65. package/bin/runners/lib/safelist/store.js +438 -0
  66. package/bin/runners/lib/schemas/ship-manifest.schema.json +251 -0
  67. package/bin/runners/lib/ship-gate.js +832 -0
  68. package/bin/runners/lib/ship-manifest.js +1153 -0
  69. package/bin/runners/lib/ship-output.js +1 -1
  70. package/bin/runners/lib/unified-cli-output.js +710 -383
  71. package/bin/runners/lib/upsell.js +3 -3
  72. package/bin/runners/lib/why-tree.js +650 -0
  73. package/bin/runners/runAllowlist.js +33 -4
  74. package/bin/runners/runApprove.js +240 -1122
  75. package/bin/runners/runAudit.js +692 -0
  76. package/bin/runners/runAuth.js +325 -29
  77. package/bin/runners/runCheckpoint.js +442 -494
  78. package/bin/runners/runCleanup.js +343 -0
  79. package/bin/runners/runDoctor.js +269 -19
  80. package/bin/runners/runFix.js +411 -32
  81. package/bin/runners/runForge.js +411 -0
  82. package/bin/runners/runIntent.js +906 -0
  83. package/bin/runners/runKickoff.js +878 -0
  84. package/bin/runners/runLaunch.js +2000 -0
  85. package/bin/runners/runLink.js +785 -0
  86. package/bin/runners/runMcp.js +1741 -837
  87. package/bin/runners/runPacks.js +2089 -0
  88. package/bin/runners/runPolish.js +41 -0
  89. package/bin/runners/runSafelist.js +1190 -0
  90. package/bin/runners/runScan.js +21 -9
  91. package/bin/runners/runShield.js +1282 -0
  92. package/bin/runners/runShip.js +395 -16
  93. package/bin/vibecheck.js +34 -6
  94. package/mcp-server/README.md +117 -158
  95. package/mcp-server/handlers/tool-handler.ts +3 -3
  96. package/mcp-server/index.js +16 -0
  97. package/mcp-server/intent-firewall-interceptor.js +529 -0
  98. package/mcp-server/manifest.json +473 -0
  99. package/mcp-server/package.json +1 -1
  100. package/mcp-server/registry/tool-registry.js +315 -523
  101. package/mcp-server/registry/tools.json +442 -428
  102. package/mcp-server/tier-auth.js +164 -16
  103. package/mcp-server/tools-v3.js +70 -16
  104. package/package.json +1 -1
  105. package/bin/runners/runProof.zip +0 -0
@@ -7,7 +7,7 @@
7
7
  *
8
8
  * Simple 2-tier model:
9
9
  * - FREE ($0): Inspect & Observe
10
- * - PRO ($69/mo): Fix, Prove & Enforce
10
+ * - PRO ($49/mo): Fix, Prove & Enforce
11
11
  *
12
12
  * โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
13
13
  * โ”‚ MCP Tool โ”‚ Tier โ”‚ CLI Equivalent โ”‚
@@ -42,6 +42,37 @@
42
42
  import fs from "fs/promises";
43
43
  import path from "path";
44
44
  import os from "os";
45
+ import crypto from "crypto";
46
+
47
+ // ============================================================================
48
+ // REDACTION - Secure API key masking
49
+ // ============================================================================
50
+
51
+ /**
52
+ * Mask API key for secure display/logging.
53
+ * @param {string} key
54
+ * @returns {string}
55
+ */
56
+ export function redactApiKey(key) {
57
+ if (!key || typeof key !== 'string' || key.length < 8) {
58
+ return '****';
59
+ }
60
+
61
+ if (key.startsWith('grl_')) {
62
+ return `grl_${'*'.repeat(8)}${key.slice(-4)}`;
63
+ }
64
+
65
+ const legacyMatch = key.match(/^(gr_[a-z]+_)/);
66
+ if (legacyMatch) {
67
+ return `${legacyMatch[1]}${'*'.repeat(8)}${key.slice(-4)}`;
68
+ }
69
+
70
+ if (key.length >= 12) {
71
+ return `${key.slice(0, 3)}****${key.slice(-4)}`;
72
+ }
73
+
74
+ return '****';
75
+ }
45
76
 
46
77
  // ============================================================================
47
78
  // ERROR CODES - Standard error envelope codes
@@ -51,6 +82,7 @@ export const ERROR_CODES = {
51
82
  INVALID_API_KEY: 'INVALID_API_KEY',
52
83
  RATE_LIMITED: 'RATE_LIMITED',
53
84
  OPTION_NOT_ENTITLED: 'OPTION_NOT_ENTITLED',
85
+ API_KEY_REQUIRED: 'API_KEY_REQUIRED',
54
86
  };
55
87
 
56
88
  // ============================================================================
@@ -237,10 +269,48 @@ export function createTierErrorEnvelope(code, message, extra = {}) {
237
269
  };
238
270
  }
239
271
 
272
+ /**
273
+ * Create API_KEY_REQUIRED error envelope
274
+ * Used when a PRO tool is requested but no API key is provided
275
+ */
276
+ export function apiKeyRequiredError(toolName) {
277
+ return createTierErrorEnvelope(ERROR_CODES.API_KEY_REQUIRED, `API key required for ${toolName}`, {
278
+ tool: toolName,
279
+ userAction: 'Add API Key',
280
+ retryable: true,
281
+ nextSteps: [
282
+ 'Get your API key at https://vibecheckai.dev/dashboard',
283
+ 'Run: vibecheck login',
284
+ 'Or set VIBECHECK_API_KEY environment variable',
285
+ 'Then pass apiKey in tool arguments or configure in ~/.vibecheck/credentials.json',
286
+ ],
287
+ });
288
+ }
289
+
240
290
  /**
241
291
  * Create NOT_ENTITLED error envelope
242
292
  */
243
- export function notEntitledError(toolName, currentTier = 'free', requiredTier = 'pro') {
293
+ export function notEntitledError(toolName, currentTier = 'free', requiredTier = 'pro', hasApiKey = true) {
294
+ // If no API key was provided, give more specific guidance
295
+ if (!hasApiKey) {
296
+ return createTierErrorEnvelope(ERROR_CODES.NOT_ENTITLED, `${toolName} requires PRO - add your API key`, {
297
+ tier: currentTier,
298
+ required: requiredTier,
299
+ tool: toolName,
300
+ userAction: 'Add API Key',
301
+ retryable: true,
302
+ nextSteps: [
303
+ `${toolName} requires PRO ($49/mo) subscription`,
304
+ 'If you have PRO, add your API key:',
305
+ ' - Run: vibecheck login',
306
+ ' - Or pass apiKey in tool arguments',
307
+ ' - Or set VIBECHECK_API_KEY environment variable',
308
+ 'Get your API key at https://vibecheckai.dev/dashboard',
309
+ 'Upgrade at https://vibecheckai.dev/pricing',
310
+ ],
311
+ });
312
+ }
313
+
244
314
  return createTierErrorEnvelope(ERROR_CODES.NOT_ENTITLED, `Requires ${requiredTier.toUpperCase()}`, {
245
315
  tier: currentTier,
246
316
  required: requiredTier,
@@ -248,7 +318,7 @@ export function notEntitledError(toolName, currentTier = 'free', requiredTier =
248
318
  userAction: 'Open billing',
249
319
  retryable: false,
250
320
  nextSteps: [
251
- `Upgrade to ${requiredTier.toUpperCase()} ($69/mo) to unlock this feature`,
321
+ `Upgrade to ${requiredTier.toUpperCase()} ($49/mo) to unlock this feature`,
252
322
  'Visit https://vibecheckai.dev/pricing',
253
323
  'Run: vibecheck upgrade',
254
324
  ],
@@ -326,6 +396,50 @@ export async function getTierFromApiKey(apiKey) {
326
396
  }
327
397
  }
328
398
 
399
+ // ============================================================================
400
+ // USER CONFIG
401
+ // ============================================================================
402
+
403
+ /**
404
+ * Load user configuration from credential files.
405
+ * Checks multiple locations in priority order:
406
+ * 1. ~/.vibecheck/auth.json (new unified format)
407
+ * 2. ~/.vibecheck/credentials.json (legacy TS CLI)
408
+ * 3. ~/.config/vibecheck/config.json (legacy JS CLI)
409
+ *
410
+ * @returns {Promise<{apiKey?: string, email?: string}|null>}
411
+ */
412
+ async function loadUserConfig() {
413
+ const locations = [
414
+ // New unified auth file (highest priority)
415
+ path.join(os.homedir(), '.vibecheck', 'auth.json'),
416
+ // Legacy credentials file
417
+ path.join(os.homedir(), '.vibecheck', 'credentials.json'),
418
+ // Legacy config file (Unix)
419
+ path.join(os.homedir(), '.config', 'vibecheck', 'config.json'),
420
+ ];
421
+
422
+ // Windows legacy location
423
+ if (process.platform === 'win32' && process.env.APPDATA) {
424
+ locations.push(path.join(process.env.APPDATA, 'vibecheck', 'config.json'));
425
+ }
426
+
427
+ for (const configPath of locations) {
428
+ try {
429
+ const data = await fs.readFile(configPath, 'utf-8');
430
+ const config = JSON.parse(data);
431
+ if (config?.apiKey) {
432
+ return config;
433
+ }
434
+ } catch {
435
+ // Try next location
436
+ continue;
437
+ }
438
+ }
439
+
440
+ return null;
441
+ }
442
+
329
443
  // ============================================================================
330
444
  // ACCESS CONTROL
331
445
  // ============================================================================
@@ -410,6 +524,34 @@ export function canApproveAuthority(tier) {
410
524
  return tier === 'pro';
411
525
  }
412
526
 
527
+ /**
528
+ * Resolve API key from multiple sources
529
+ * Priority: 1. Passed directly 2. Environment variable 3. Credentials file
530
+ *
531
+ * @param {string} apiKey - API key passed directly (optional)
532
+ * @returns {Promise<{apiKey: string|null, source: string}>}
533
+ */
534
+ export async function resolveApiKey(apiKey) {
535
+ // 1. Use directly provided API key
536
+ if (apiKey && typeof apiKey === 'string' && apiKey.length >= 10) {
537
+ return { apiKey, source: 'args' };
538
+ }
539
+
540
+ // 2. Check environment variable
541
+ const envKey = process.env.VIBECHECK_API_KEY;
542
+ if (envKey && typeof envKey === 'string' && envKey.length >= 10) {
543
+ return { apiKey: envKey, source: 'env' };
544
+ }
545
+
546
+ // 3. Check credentials file
547
+ const config = await loadUserConfig();
548
+ if (config?.apiKey && typeof config.apiKey === 'string' && config.apiKey.length >= 10) {
549
+ return { apiKey: config.apiKey, source: 'credentials' };
550
+ }
551
+
552
+ return { apiKey: null, source: 'none' };
553
+ }
554
+
413
555
  /**
414
556
  * Get MCP tool access with full ErrorEnvelope support
415
557
  *
@@ -419,18 +561,30 @@ export function canApproveAuthority(tier) {
419
561
  * @returns {Promise<{hasAccess: boolean, tier: string, error?: object}>}
420
562
  */
421
563
  export async function getMcpToolAccess(toolName, apiKey, args = {}) {
422
- const tier = await getTierFromApiKey(apiKey);
564
+ // Resolve API key from multiple sources
565
+ const resolved = await resolveApiKey(apiKey);
566
+ const resolvedApiKey = resolved.apiKey;
567
+ const hasApiKey = resolvedApiKey !== null;
568
+
569
+ const tier = await getTierFromApiKey(resolvedApiKey);
423
570
 
424
571
  // Check tool-level access
425
572
  const hasToolAccess = canAccessTool(tier, toolName);
426
573
 
427
574
  if (!hasToolAccess) {
575
+ // Check if this is a PRO tool and no API key was provided
576
+ const isPROTool = PRO_TOOLS.includes(toolName);
577
+
428
578
  return {
429
579
  hasAccess: false,
430
580
  tier,
581
+ hasApiKey,
582
+ apiKeySource: resolved.source,
431
583
  firewallMode: getFirewallMode(tier),
432
- error: notEntitledError(toolName, tier, 'pro'),
433
- reason: `${toolName} requires Pro ($69/mo). Upgrade at https://vibecheckai.dev/pricing`,
584
+ error: notEntitledError(toolName, tier, 'pro', hasApiKey),
585
+ reason: hasApiKey
586
+ ? `${toolName} requires Pro ($49/mo). Upgrade at https://vibecheckai.dev/pricing`
587
+ : `${toolName} requires Pro. Add your API key first: run 'vibecheck login' or pass apiKey in tool arguments.`,
434
588
  };
435
589
  }
436
590
 
@@ -440,6 +594,8 @@ export async function getMcpToolAccess(toolName, apiKey, args = {}) {
440
594
  return {
441
595
  hasAccess: false,
442
596
  tier,
597
+ hasApiKey,
598
+ apiKeySource: resolved.source,
443
599
  firewallMode: getFirewallMode(tier),
444
600
  error: optionNotEntitledError(toolName, optionCheck.blockedOption, tier, optionCheck.required),
445
601
  reason: `Option --${optionCheck.blockedOption} requires Pro`,
@@ -449,6 +605,8 @@ export async function getMcpToolAccess(toolName, apiKey, args = {}) {
449
605
  return {
450
606
  hasAccess: true,
451
607
  tier,
608
+ hasApiKey,
609
+ apiKeySource: resolved.source,
452
610
  firewallMode: getFirewallMode(tier),
453
611
  reason: 'Access granted',
454
612
  };
@@ -515,16 +673,6 @@ export async function checkTierGate(toolName, apiKey, args = {}) {
515
673
  // USER INFO
516
674
  // ============================================================================
517
675
 
518
- async function loadUserConfig() {
519
- try {
520
- const configPath = path.join(os.homedir(), '.vibecheck', 'credentials.json');
521
- const data = await fs.readFile(configPath, 'utf-8');
522
- return JSON.parse(data);
523
- } catch {
524
- return null;
525
- }
526
- }
527
-
528
676
  export async function getUserInfo() {
529
677
  const config = await loadUserConfig();
530
678
 
@@ -7,7 +7,7 @@
7
7
  *
8
8
  * Simple 2-tier model:
9
9
  * - FREE ($0): Inspect & Observe (10 tools)
10
- * - PRO ($69/mo): Fix, Prove & Enforce (18 tools)
10
+ * - PRO ($49/mo): Fix, Prove & Enforce (18 tools)
11
11
  *
12
12
  * PRO includes:
13
13
  * - Authority System (verdicts, approvals)
@@ -356,7 +356,7 @@ Response:
356
356
  Returns evidence-backed verdict.
357
357
  Response includes cacheStats: { hit, reusedFindingsCount, durationMs }
358
358
 
359
- [PRO - $69/mo]`,
359
+ [PRO - $49/mo]`,
360
360
  inputSchema: {
361
361
  type: "object",
362
362
  properties: {
@@ -381,7 +381,7 @@ Response includes cacheStats: { hit, reusedFindingsCount, durationMs }
381
381
 
382
382
  Modes: plan, apply, loop
383
383
 
384
- [PRO - $69/mo]`,
384
+ [PRO - $49/mo]`,
385
385
  inputSchema: {
386
386
  type: "object",
387
387
  properties: {
@@ -396,7 +396,7 @@ Modes: plan, apply, loop
396
396
  name: "vibecheck.prove",
397
397
  description: `๐Ÿ”ฌ Full proof loop with runtime verification
398
398
 
399
- [PRO - $69/mo]`,
399
+ [PRO - $49/mo]`,
400
400
  inputSchema: {
401
401
  type: "object",
402
402
  properties: {
@@ -410,7 +410,7 @@ Modes: plan, apply, loop
410
410
 
411
411
  {
412
412
  name: "vibecheck.gate",
413
- description: `๐Ÿšง CI/CD enforcement - fail builds on issues [PRO - $69/mo]`,
413
+ description: `๐Ÿšง CI/CD enforcement - fail builds on issues [PRO - $49/mo]`,
414
414
  inputSchema: {
415
415
  type: "object",
416
416
  properties: {
@@ -422,7 +422,7 @@ Modes: plan, apply, loop
422
422
 
423
423
  {
424
424
  name: "vibecheck.badge",
425
- description: `๐Ÿท๏ธ Generate ship badge [PRO - $69/mo]`,
425
+ description: `๐Ÿท๏ธ Generate ship badge [PRO - $49/mo]`,
426
426
  inputSchema: {
427
427
  type: "object",
428
428
  properties: {
@@ -434,7 +434,7 @@ Modes: plan, apply, loop
434
434
 
435
435
  {
436
436
  name: "vibecheck.reality",
437
- description: `๐Ÿงช Full runtime verification with auth boundary testing [PRO - $69/mo]`,
437
+ description: `๐Ÿงช Full runtime verification with auth boundary testing [PRO - $49/mo]`,
438
438
  inputSchema: {
439
439
  type: "object",
440
440
  properties: {
@@ -449,7 +449,7 @@ Modes: plan, apply, loop
449
449
 
450
450
  {
451
451
  name: "vibecheck.ai_test",
452
- description: `๐Ÿค– AI agent testing - autonomous exploration [PRO - $69/mo]`,
452
+ description: `๐Ÿค– AI agent testing - autonomous exploration [PRO - $49/mo]`,
453
453
  inputSchema: {
454
454
  type: "object",
455
455
  properties: {
@@ -463,7 +463,7 @@ Modes: plan, apply, loop
463
463
 
464
464
  {
465
465
  name: "vibecheck.share",
466
- description: `๐Ÿ“ค Generate PR/review bundle [PRO - $69/mo]`,
466
+ description: `๐Ÿ“ค Generate PR/review bundle [PRO - $49/mo]`,
467
467
  inputSchema: {
468
468
  type: "object",
469
469
  properties: {
@@ -483,7 +483,7 @@ Modes: plan, apply, loop
483
483
 
484
484
  Execute an authority to get a structured verdict with proofs.
485
485
 
486
- [PRO - $69/mo]`,
486
+ [PRO - $49/mo]`,
487
487
  inputSchema: {
488
488
  type: "object",
489
489
  properties: {
@@ -505,7 +505,7 @@ Execute an authority to get a structured verdict with proofs.
505
505
 
506
506
  Call this at the start of any multi-agent workflow.
507
507
 
508
- [PRO - $69/mo]`,
508
+ [PRO - $49/mo]`,
509
509
  inputSchema: {
510
510
  type: "object",
511
511
  properties: {
@@ -523,7 +523,7 @@ Call this at the start of any multi-agent workflow.
523
523
 
524
524
  Prevents concurrent modifications by other agents.
525
525
 
526
- [PRO - $69/mo]`,
526
+ [PRO - $49/mo]`,
527
527
  inputSchema: {
528
528
  type: "object",
529
529
  properties: {
@@ -538,7 +538,7 @@ Prevents concurrent modifications by other agents.
538
538
 
539
539
  {
540
540
  name: "vibecheck_conductor_release_lock",
541
- description: `๐Ÿ”“ Release a previously acquired lock [PRO - $69/mo]`,
541
+ description: `๐Ÿ”“ Release a previously acquired lock [PRO - $49/mo]`,
542
542
  inputSchema: {
543
543
  type: "object",
544
544
  properties: {
@@ -555,7 +555,7 @@ Prevents concurrent modifications by other agents.
555
555
 
556
556
  Checks for conflicts with other agents before proceeding.
557
557
 
558
- [PRO - $69/mo]`,
558
+ [PRO - $49/mo]`,
559
559
  inputSchema: {
560
560
  type: "object",
561
561
  properties: {
@@ -581,7 +581,7 @@ Checks for conflicts with other agents before proceeding.
581
581
 
582
582
  {
583
583
  name: "vibecheck_conductor_terminate",
584
- description: `๐Ÿ›‘ Terminate agent session and release all locks [PRO - $69/mo]`,
584
+ description: `๐Ÿ›‘ Terminate agent session and release all locks [PRO - $49/mo]`,
585
585
  inputSchema: {
586
586
  type: "object",
587
587
  properties: {
@@ -611,7 +611,7 @@ Features:
611
611
 
612
612
  Call BEFORE any file write operations.
613
613
 
614
- [PRO - $69/mo]`,
614
+ [PRO - $49/mo]`,
615
615
  inputSchema: {
616
616
  type: "object",
617
617
  required: ["agentId", "filePath", "content"],
@@ -625,6 +625,60 @@ Call BEFORE any file write operations.
625
625
  },
626
626
  },
627
627
  },
628
+
629
+ // โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•
630
+ // INTENT FIREWALL v2 (PRO) - Intent-Aware BLOCKING Enforcement
631
+ // โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•
632
+
633
+ {
634
+ name: "vibecheck_intent_firewall_intercept",
635
+ description: `๐Ÿ›ก๏ธ Intent-Aware Firewall v2 - BLOCKING enforcement
636
+
637
+ Intercepts AI code changes and BLOCKS unless:
638
+ 1. User intent is declared (via vibecheck intent set)
639
+ 2. Changes align with declared intent
640
+ 3. Reality proofs pass
641
+
642
+ โš ๏ธ If no intent is declared, ALL CHANGES ARE BLOCKED.
643
+
644
+ This is enforcement infrastructure that cannot be bypassed.
645
+ Declare intent BEFORE making AI changes:
646
+ vibecheck intent set -s "Your intent"
647
+
648
+ Returns: { decision: "PASS"|"BLOCK", violations, intent_hash }
649
+
650
+ [PRO - $49/mo]`,
651
+ inputSchema: {
652
+ type: "object",
653
+ required: ["agentId", "filePath", "content"],
654
+ properties: {
655
+ agentId: { type: "string", description: "Agent ID" },
656
+ filePath: { type: "string", description: "File to write" },
657
+ content: { type: "string", description: "New content" },
658
+ oldContent: { type: "string", description: "Old content (for diff)" },
659
+ intent: { type: "string", description: "Agent's stated intent (NOT user intent)" },
660
+ projectRoot: { type: "string" },
661
+ },
662
+ },
663
+ },
664
+
665
+ {
666
+ name: "vibecheck_intent_status",
667
+ description: `๐Ÿ“‹ Get current intent status for Agent Firewall v2
668
+
669
+ Shows whether intent is declared and what changes are allowed.
670
+ Use this BEFORE making AI changes to understand constraints.
671
+
672
+ Returns: { hasIntent, summary, constraints, allowed_changes, hash }
673
+
674
+ [FREE]`,
675
+ inputSchema: {
676
+ type: "object",
677
+ properties: {
678
+ projectRoot: { type: "string", default: "." },
679
+ },
680
+ },
681
+ },
628
682
  ];
629
683
 
630
684
  // =============================================================================
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@vibecheckai/cli",
3
- "version": "3.6.1",
3
+ "version": "3.8.0",
4
4
  "description": "Vibecheck CLI - Ship with confidence. One verdict: SHIP | WARN | BLOCK.",
5
5
  "main": "bin/vibecheck.js",
6
6
  "bin": {
Binary file