@vibecheckai/cli 3.3.0 → 3.5.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 (170) hide show
  1. package/bin/registry.js +389 -269
  2. package/bin/runners/cli-utils.js +2 -33
  3. package/bin/runners/context/generators/cursor.js +49 -2
  4. package/bin/runners/lib/agent-firewall/learning/learning-engine.js +849 -0
  5. package/bin/runners/lib/analyzers.js +599 -142
  6. package/bin/runners/lib/audit-logger.js +532 -0
  7. package/bin/runners/lib/authority/authorities/architecture.js +364 -0
  8. package/bin/runners/lib/authority/authorities/compliance.js +341 -0
  9. package/bin/runners/lib/authority/authorities/human.js +343 -0
  10. package/bin/runners/lib/authority/authorities/quality.js +420 -0
  11. package/bin/runners/lib/authority/authorities/security.js +228 -0
  12. package/bin/runners/lib/authority/index.js +293 -0
  13. package/bin/runners/lib/authority-badge.js +425 -425
  14. package/bin/runners/lib/bundle/bundle-intelligence.js +846 -0
  15. package/bin/runners/lib/cli-charts.js +368 -0
  16. package/bin/runners/lib/cli-config-display.js +405 -0
  17. package/bin/runners/lib/cli-demo.js +275 -0
  18. package/bin/runners/lib/cli-errors.js +438 -0
  19. package/bin/runners/lib/cli-help-formatter.js +439 -0
  20. package/bin/runners/lib/cli-interactive-menu.js +509 -0
  21. package/bin/runners/lib/cli-prompts.js +441 -0
  22. package/bin/runners/lib/cli-scan-cards.js +362 -0
  23. package/bin/runners/lib/compliance-reporter.js +710 -0
  24. package/bin/runners/lib/conductor/index.js +671 -0
  25. package/bin/runners/lib/easy/README.md +123 -0
  26. package/bin/runners/lib/easy/index.js +140 -0
  27. package/bin/runners/lib/easy/interactive-wizard.js +788 -0
  28. package/bin/runners/lib/easy/one-click-firewall.js +564 -0
  29. package/bin/runners/lib/easy/zero-config-reality.js +714 -0
  30. package/bin/runners/lib/engines/accessibility-engine.js +218 -18
  31. package/bin/runners/lib/engines/api-consistency-engine.js +335 -30
  32. package/bin/runners/lib/engines/async-patterns-engine.js +444 -0
  33. package/bin/runners/lib/engines/bundle-size-engine.js +433 -0
  34. package/bin/runners/lib/engines/confidence-scoring.js +276 -0
  35. package/bin/runners/lib/engines/context-detection.js +264 -0
  36. package/bin/runners/lib/engines/cross-file-analysis-engine.js +292 -27
  37. package/bin/runners/lib/engines/database-patterns-engine.js +429 -0
  38. package/bin/runners/lib/engines/duplicate-code-engine.js +354 -0
  39. package/bin/runners/lib/engines/empty-catch-engine.js +127 -17
  40. package/bin/runners/lib/engines/env-variables-engine.js +458 -0
  41. package/bin/runners/lib/engines/error-handling-engine.js +437 -0
  42. package/bin/runners/lib/engines/false-positive-prevention.js +630 -0
  43. package/bin/runners/lib/engines/framework-adapters/index.js +607 -0
  44. package/bin/runners/lib/engines/framework-detection.js +508 -0
  45. package/bin/runners/lib/engines/import-order-engine.js +429 -0
  46. package/bin/runners/lib/engines/mock-data-engine.js +53 -10
  47. package/bin/runners/lib/engines/naming-conventions-engine.js +544 -0
  48. package/bin/runners/lib/engines/noise-reduction-engine.js +452 -0
  49. package/bin/runners/lib/engines/orchestrator.js +334 -0
  50. package/bin/runners/lib/engines/performance-issues-engine.js +176 -36
  51. package/bin/runners/lib/engines/react-patterns-engine.js +457 -0
  52. package/bin/runners/lib/engines/security-vulnerabilities-engine.js +382 -54
  53. package/bin/runners/lib/engines/type-aware-engine.js +263 -39
  54. package/bin/runners/lib/engines/vibecheck-engines/index.js +122 -13
  55. package/bin/runners/lib/engines/vibecheck-engines/lib/ai-hallucination-engine.js +806 -0
  56. package/bin/runners/lib/engines/vibecheck-engines/lib/hardcoded-secrets-engine.js +373 -73
  57. package/bin/runners/lib/engines/vibecheck-engines/lib/smart-fix-engine.js +577 -0
  58. package/bin/runners/lib/engines/vibecheck-engines/lib/vibe-score-engine.js +543 -0
  59. package/bin/runners/lib/engines/vibecheck-engines.js +514 -0
  60. package/bin/runners/lib/enhanced-features/index.js +305 -0
  61. package/bin/runners/lib/enhanced-output.js +631 -0
  62. package/bin/runners/lib/enterprise.js +300 -0
  63. package/bin/runners/lib/entitlements-v2.js +161 -478
  64. package/bin/runners/lib/firewall/command-validator.js +351 -0
  65. package/bin/runners/lib/firewall/config.js +341 -0
  66. package/bin/runners/lib/firewall/content-validator.js +519 -0
  67. package/bin/runners/lib/firewall/index.js +101 -0
  68. package/bin/runners/lib/firewall/path-validator.js +256 -0
  69. package/bin/runners/lib/html-proof-report.js +350 -700
  70. package/bin/runners/lib/intelligence/cross-repo-intelligence.js +817 -0
  71. package/bin/runners/lib/mcp-utils.js +425 -0
  72. package/bin/runners/lib/missions/plan.js +46 -6
  73. package/bin/runners/lib/missions/templates.js +232 -0
  74. package/bin/runners/lib/output/index.js +1022 -0
  75. package/bin/runners/lib/policy-engine.js +652 -0
  76. package/bin/runners/lib/polish/autofix/accessibility-fixes.js +333 -0
  77. package/bin/runners/lib/polish/autofix/async-handlers.js +273 -0
  78. package/bin/runners/lib/polish/autofix/dead-code.js +280 -0
  79. package/bin/runners/lib/polish/autofix/imports-optimizer.js +344 -0
  80. package/bin/runners/lib/polish/autofix/index.js +200 -0
  81. package/bin/runners/lib/polish/autofix/remove-consoles.js +209 -0
  82. package/bin/runners/lib/polish/autofix/strengthen-types.js +245 -0
  83. package/bin/runners/lib/polish/backend-checks.js +148 -0
  84. package/bin/runners/lib/polish/documentation-checks.js +111 -0
  85. package/bin/runners/lib/polish/frontend-checks.js +168 -0
  86. package/bin/runners/lib/polish/index.js +71 -0
  87. package/bin/runners/lib/polish/infrastructure-checks.js +131 -0
  88. package/bin/runners/lib/polish/library-detection.js +175 -0
  89. package/bin/runners/lib/polish/performance-checks.js +100 -0
  90. package/bin/runners/lib/polish/security-checks.js +148 -0
  91. package/bin/runners/lib/polish/utils.js +203 -0
  92. package/bin/runners/lib/prompt-builder.js +540 -0
  93. package/bin/runners/lib/proof-certificate.js +634 -0
  94. package/bin/runners/lib/reality/accessibility-audit.js +946 -0
  95. package/bin/runners/lib/reality/api-contract-validator.js +1012 -0
  96. package/bin/runners/lib/reality/chaos-engineering.js +1084 -0
  97. package/bin/runners/lib/reality/performance-tracker.js +1077 -0
  98. package/bin/runners/lib/reality/scenario-generator.js +1404 -0
  99. package/bin/runners/lib/reality/visual-regression.js +852 -0
  100. package/bin/runners/lib/reality-profiler.js +717 -0
  101. package/bin/runners/lib/replay/flight-recorder-viewer.js +1160 -0
  102. package/bin/runners/lib/review/ai-code-review.js +832 -0
  103. package/bin/runners/lib/rules/custom-rule-engine.js +985 -0
  104. package/bin/runners/lib/sbom-generator.js +641 -0
  105. package/bin/runners/lib/scan-output-enhanced.js +512 -0
  106. package/bin/runners/lib/scan-output.js +65 -19
  107. package/bin/runners/lib/security/owasp-scanner.js +939 -0
  108. package/bin/runners/lib/ship-output.js +18 -25
  109. package/bin/runners/lib/terminal-ui.js +113 -1
  110. package/bin/runners/lib/unified-cli-output.js +603 -430
  111. package/bin/runners/lib/upsell.js +90 -338
  112. package/bin/runners/lib/validators/contract-validator.js +283 -0
  113. package/bin/runners/lib/validators/dead-export-detector.js +279 -0
  114. package/bin/runners/lib/validators/dep-audit.js +245 -0
  115. package/bin/runners/lib/validators/env-validator.js +319 -0
  116. package/bin/runners/lib/validators/index.js +120 -0
  117. package/bin/runners/lib/validators/license-checker.js +252 -0
  118. package/bin/runners/lib/validators/route-validator.js +290 -0
  119. package/bin/runners/runAIAgent.js +5 -10
  120. package/bin/runners/runAgent.js +3 -0
  121. package/bin/runners/runApprove.js +1233 -1200
  122. package/bin/runners/runAuth.js +22 -1
  123. package/bin/runners/runAuthority.js +528 -0
  124. package/bin/runners/runCheckpoint.js +4 -24
  125. package/bin/runners/runClassify.js +862 -859
  126. package/bin/runners/runConductor.js +772 -0
  127. package/bin/runners/runContainer.js +366 -0
  128. package/bin/runners/runContext.js +3 -0
  129. package/bin/runners/runDoctor.js +28 -41
  130. package/bin/runners/runEasy.js +410 -0
  131. package/bin/runners/runFirewall.js +3 -0
  132. package/bin/runners/runFirewallHook.js +3 -0
  133. package/bin/runners/runFix.js +76 -66
  134. package/bin/runners/runGuard.js +411 -18
  135. package/bin/runners/runIaC.js +372 -0
  136. package/bin/runners/runInit.js +10 -60
  137. package/bin/runners/runMcp.js +11 -12
  138. package/bin/runners/runPolish.js +240 -64
  139. package/bin/runners/runPromptFirewall.js +5 -12
  140. package/bin/runners/runProve.js +20 -55
  141. package/bin/runners/runReality.js +68 -59
  142. package/bin/runners/runReport.js +31 -5
  143. package/bin/runners/runRuntime.js +5 -8
  144. package/bin/runners/runScan.js +194 -1273
  145. package/bin/runners/runShip.js +695 -47
  146. package/bin/runners/runTruth.js +3 -0
  147. package/bin/runners/runValidate.js +7 -11
  148. package/bin/runners/runVibe.js +791 -0
  149. package/bin/runners/runWatch.js +14 -23
  150. package/bin/vibecheck.js +179 -65
  151. package/mcp-server/index.js +202 -636
  152. package/mcp-server/lib/api-client.cjs +7 -299
  153. package/mcp-server/package.json +1 -1
  154. package/mcp-server/tier-auth.js +175 -574
  155. package/mcp-server/tools-v3.js +800 -505
  156. package/mcp-server/tools.js +495 -0
  157. package/package.json +1 -1
  158. package/bin/runners/lib/engines/vibecheck-engines/lib/ast-cache.js +0 -164
  159. package/bin/runners/lib/engines/vibecheck-engines/lib/code-quality-engine.js +0 -291
  160. package/bin/runners/lib/engines/vibecheck-engines/lib/console-logs-engine.js +0 -83
  161. package/bin/runners/lib/engines/vibecheck-engines/lib/dead-code-engine.js +0 -198
  162. package/bin/runners/lib/engines/vibecheck-engines/lib/deprecated-api-engine.js +0 -275
  163. package/bin/runners/lib/engines/vibecheck-engines/lib/empty-catch-engine.js +0 -167
  164. package/bin/runners/lib/engines/vibecheck-engines/lib/file-filter.js +0 -217
  165. package/bin/runners/lib/engines/vibecheck-engines/lib/mock-data-engine.js +0 -140
  166. package/bin/runners/lib/engines/vibecheck-engines/lib/parallel-processor.js +0 -164
  167. package/bin/runners/lib/engines/vibecheck-engines/lib/performance-issues-engine.js +0 -234
  168. package/bin/runners/lib/engines/vibecheck-engines/lib/type-aware-engine.js +0 -217
  169. package/bin/runners/lib/engines/vibecheck-engines/lib/unsafe-regex-engine.js +0 -78
  170. package/mcp-server/index-v1.js +0 -698
@@ -0,0 +1,343 @@
1
+ /**
2
+ * Human Authority - Requires human approval
3
+ *
4
+ * Creates approval requests via:
5
+ * - GitHub Issues
6
+ * - Slack messages
7
+ * - Email notifications
8
+ * - Dashboard notifications
9
+ */
10
+
11
+ "use strict";
12
+
13
+ const crypto = require("crypto");
14
+
15
+ class HumanAuthority {
16
+ static description = "Requires human approval (creates GitHub issue/Slack message)";
17
+ static automated = false;
18
+ static tier = "pro";
19
+
20
+ constructor(options = {}) {
21
+ this.options = options;
22
+ this.channels = options.channels || ["dashboard"];
23
+ this.timeout = options.timeout || 7 * 24 * 60 * 60 * 1000; // 7 days default
24
+ this.requiredApprovers = options.requiredApprovers || 1;
25
+ }
26
+
27
+ async review(payload) {
28
+ const { files = [], diff = "", context = {} } = payload;
29
+ const startTime = Date.now();
30
+
31
+ // Generate approval request
32
+ const approvalRequest = this._createApprovalRequest(payload, context);
33
+
34
+ // Attempt to send notifications via configured channels
35
+ const notificationResults = await this._sendNotifications(approvalRequest);
36
+
37
+ // Check if there's an existing approval
38
+ const existingApproval = await this._checkExistingApproval(approvalRequest.id, context);
39
+
40
+ if (existingApproval) {
41
+ return {
42
+ approved: existingApproval.status === "approved",
43
+ reason: existingApproval.status === "approved"
44
+ ? `Approved by ${existingApproval.approvers.join(", ")}`
45
+ : `Rejected by ${existingApproval.approvers.join(", ")}: ${existingApproval.reason}`,
46
+ findings: [],
47
+ approvalRequest,
48
+ existingApproval,
49
+ signature: this._sign(existingApproval),
50
+ metadata: {
51
+ analysisTimeMs: Date.now() - startTime,
52
+ approvedAt: existingApproval.timestamp,
53
+ approvers: existingApproval.approvers,
54
+ },
55
+ };
56
+ }
57
+
58
+ // Return pending status
59
+ return {
60
+ approved: false,
61
+ reason: "Awaiting human approval",
62
+ status: "pending",
63
+ findings: this._generateReviewPoints(payload),
64
+ approvalRequest,
65
+ notifications: notificationResults,
66
+ signature: this._sign(approvalRequest),
67
+ metadata: {
68
+ analysisTimeMs: Date.now() - startTime,
69
+ expiresAt: new Date(Date.now() + this.timeout).toISOString(),
70
+ requiredApprovers: this.requiredApprovers,
71
+ channels: this.channels,
72
+ },
73
+ };
74
+ }
75
+
76
+ _createApprovalRequest(payload, context) {
77
+ const { files = [], diff = "", context: payloadContext = {} } = payload;
78
+
79
+ const id = crypto.randomUUID();
80
+ const timestamp = new Date().toISOString();
81
+
82
+ // Generate summary of changes
83
+ const changedFiles = files.map(f => f.path).filter(Boolean);
84
+ const addedLines = (diff.match(/^\+[^+]/gm) || []).length;
85
+ const removedLines = (diff.match(/^-[^-]/gm) || []).length;
86
+
87
+ return {
88
+ id,
89
+ timestamp,
90
+ type: "human-approval",
91
+ title: context.title || "Code Change Approval Required",
92
+ description: context.description || this._generateDescription(payload),
93
+ summary: {
94
+ filesChanged: changedFiles.length,
95
+ addedLines,
96
+ removedLines,
97
+ changedFiles: changedFiles.slice(0, 10), // Limit to first 10
98
+ },
99
+ requestedBy: context.requestedBy || process.env.USER || "cli",
100
+ priority: context.priority || this._determinePriority(payload),
101
+ expiresAt: new Date(Date.now() + this.timeout).toISOString(),
102
+ requiredApprovers: this.requiredApprovers,
103
+ metadata: {
104
+ branch: context.branch,
105
+ commit: context.commit,
106
+ pullRequest: context.pullRequest,
107
+ repository: context.repository,
108
+ },
109
+ };
110
+ }
111
+
112
+ _generateDescription(payload) {
113
+ const { files = [], diff = "" } = payload;
114
+
115
+ let description = "## Changes Requiring Approval\n\n";
116
+
117
+ if (files.length > 0) {
118
+ description += "### Files Modified\n";
119
+ for (const file of files.slice(0, 10)) {
120
+ description += `- \`${file.path}\`\n`;
121
+ }
122
+ if (files.length > 10) {
123
+ description += `- ... and ${files.length - 10} more files\n`;
124
+ }
125
+ description += "\n";
126
+ }
127
+
128
+ // Add diff statistics
129
+ const addedLines = (diff.match(/^\+[^+]/gm) || []).length;
130
+ const removedLines = (diff.match(/^-[^-]/gm) || []).length;
131
+
132
+ description += "### Statistics\n";
133
+ description += `- Lines added: ${addedLines}\n`;
134
+ description += `- Lines removed: ${removedLines}\n`;
135
+
136
+ return description;
137
+ }
138
+
139
+ _determinePriority(payload) {
140
+ const { files = [], diff = "" } = payload;
141
+
142
+ // Check for high-priority indicators
143
+ const highPriorityPatterns = [
144
+ /security/i,
145
+ /auth/i,
146
+ /billing/i,
147
+ /payment/i,
148
+ /secret/i,
149
+ /migration/i,
150
+ /database/i,
151
+ ];
152
+
153
+ const allContent = diff + files.map(f => f.path || "").join("\n");
154
+
155
+ for (const pattern of highPriorityPatterns) {
156
+ if (pattern.test(allContent)) {
157
+ return "high";
158
+ }
159
+ }
160
+
161
+ // Large changes are medium priority
162
+ const addedLines = (diff.match(/^\+[^+]/gm) || []).length;
163
+ if (addedLines > 500 || files.length > 20) {
164
+ return "medium";
165
+ }
166
+
167
+ return "low";
168
+ }
169
+
170
+ _generateReviewPoints(payload) {
171
+ const { files = [], diff = "" } = payload;
172
+ const points = [];
173
+
174
+ // Highlight areas that need human attention
175
+ const sensitivePatterns = [
176
+ { pattern: /auth|login|password|permission/i, message: "Authentication/authorization changes detected" },
177
+ { pattern: /billing|payment|subscription/i, message: "Billing/payment code changes detected" },
178
+ { pattern: /migration|schema|database/i, message: "Database/migration changes detected" },
179
+ { pattern: /api|endpoint|route/i, message: "API changes detected" },
180
+ { pattern: /config|env|secret/i, message: "Configuration changes detected" },
181
+ { pattern: /security|crypto|encrypt/i, message: "Security-related changes detected" },
182
+ ];
183
+
184
+ const allContent = diff + files.map(f => f.content || "").join("\n");
185
+
186
+ for (const { pattern, message } of sensitivePatterns) {
187
+ if (pattern.test(allContent)) {
188
+ points.push({
189
+ type: "review-point",
190
+ severity: "info",
191
+ message,
192
+ });
193
+ }
194
+ }
195
+
196
+ // Flag large files
197
+ for (const file of files) {
198
+ if (file.content && file.content.split("\n").length > 500) {
199
+ points.push({
200
+ type: "review-point",
201
+ severity: "info",
202
+ message: `Large file change: ${file.path}`,
203
+ file: file.path,
204
+ });
205
+ }
206
+ }
207
+
208
+ return points;
209
+ }
210
+
211
+ async _sendNotifications(approvalRequest) {
212
+ const results = [];
213
+
214
+ for (const channel of this.channels) {
215
+ try {
216
+ switch (channel) {
217
+ case "github":
218
+ results.push(await this._createGitHubIssue(approvalRequest));
219
+ break;
220
+ case "slack":
221
+ results.push(await this._sendSlackMessage(approvalRequest));
222
+ break;
223
+ case "email":
224
+ results.push(await this._sendEmail(approvalRequest));
225
+ break;
226
+ case "dashboard":
227
+ results.push(await this._createDashboardNotification(approvalRequest));
228
+ break;
229
+ default:
230
+ results.push({
231
+ channel,
232
+ success: false,
233
+ error: `Unknown channel: ${channel}`,
234
+ });
235
+ }
236
+ } catch (error) {
237
+ results.push({
238
+ channel,
239
+ success: false,
240
+ error: error.message,
241
+ });
242
+ }
243
+ }
244
+
245
+ return results;
246
+ }
247
+
248
+ async _createGitHubIssue(approvalRequest) {
249
+ // In production, this would use the GitHub API
250
+ // For now, return instructions for manual creation
251
+ return {
252
+ channel: "github",
253
+ success: true,
254
+ type: "manual",
255
+ instructions: {
256
+ action: "Create GitHub Issue",
257
+ title: `[Approval Required] ${approvalRequest.title}`,
258
+ body: approvalRequest.description,
259
+ labels: ["approval-required", `priority-${approvalRequest.priority}`],
260
+ },
261
+ };
262
+ }
263
+
264
+ async _sendSlackMessage(approvalRequest) {
265
+ // In production, this would use the Slack API
266
+ return {
267
+ channel: "slack",
268
+ success: true,
269
+ type: "manual",
270
+ instructions: {
271
+ action: "Send Slack Message",
272
+ channel: process.env.VIBECHECK_SLACK_CHANNEL || "#code-reviews",
273
+ message: `🔒 Approval Required: ${approvalRequest.title}\n\nFiles: ${approvalRequest.summary.filesChanged}\nPriority: ${approvalRequest.priority}\n\nExpires: ${approvalRequest.expiresAt}`,
274
+ },
275
+ };
276
+ }
277
+
278
+ async _sendEmail(approvalRequest) {
279
+ // In production, this would send an email
280
+ return {
281
+ channel: "email",
282
+ success: true,
283
+ type: "manual",
284
+ instructions: {
285
+ action: "Send Email",
286
+ to: process.env.VIBECHECK_APPROVERS_EMAIL,
287
+ subject: `[Approval Required] ${approvalRequest.title}`,
288
+ body: approvalRequest.description,
289
+ },
290
+ };
291
+ }
292
+
293
+ async _createDashboardNotification(approvalRequest) {
294
+ // Store notification locally for dashboard pickup
295
+ return {
296
+ channel: "dashboard",
297
+ success: true,
298
+ type: "stored",
299
+ approvalId: approvalRequest.id,
300
+ dashboardUrl: `https://vibecheckai.dev/approvals/${approvalRequest.id}`,
301
+ };
302
+ }
303
+
304
+ async _checkExistingApproval(approvalId, context) {
305
+ // In production, this would check a database or API
306
+ // For now, check for environment variable override (useful for CI)
307
+ if (process.env.VIBECHECK_AUTO_APPROVE === "true") {
308
+ return {
309
+ status: "approved",
310
+ approvers: ["CI_AUTO_APPROVE"],
311
+ timestamp: new Date().toISOString(),
312
+ reason: "Auto-approved via CI environment variable",
313
+ };
314
+ }
315
+
316
+ // Check for approval file in .vibecheck directory
317
+ const fs = require("fs");
318
+ const path = require("path");
319
+
320
+ try {
321
+ const approvalPath = path.join(process.cwd(), ".vibecheck", "approvals", `${approvalId}.json`);
322
+ if (fs.existsSync(approvalPath)) {
323
+ return JSON.parse(fs.readFileSync(approvalPath, "utf-8"));
324
+ }
325
+ } catch {
326
+ // No existing approval found
327
+ }
328
+
329
+ return null;
330
+ }
331
+
332
+ _sign(data) {
333
+ const timestamp = Date.now();
334
+ const hash = crypto
335
+ .createHash("sha256")
336
+ .update(JSON.stringify({ id: data.id || data.approvalId, timestamp }))
337
+ .digest("hex")
338
+ .slice(0, 16);
339
+ return `human_${timestamp}_${hash}`;
340
+ }
341
+ }
342
+
343
+ module.exports = { HumanAuthority };