@vibecheckai/cli 3.5.0 → 3.5.2
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/bin/registry.js +214 -237
- package/bin/runners/cli-utils.js +33 -2
- package/bin/runners/context/analyzer.js +52 -1
- package/bin/runners/context/generators/cursor.js +2 -49
- package/bin/runners/context/git-context.js +3 -1
- package/bin/runners/context/team-conventions.js +33 -7
- package/bin/runners/lib/analysis-core.js +25 -5
- package/bin/runners/lib/analyzers.js +431 -481
- package/bin/runners/lib/default-config.js +127 -0
- package/bin/runners/lib/doctor/modules/security.js +3 -1
- package/bin/runners/lib/engine/ast-cache.js +210 -0
- package/bin/runners/lib/engine/auth-extractor.js +211 -0
- package/bin/runners/lib/engine/billing-extractor.js +112 -0
- package/bin/runners/lib/engine/enforcement-extractor.js +100 -0
- package/bin/runners/lib/engine/env-extractor.js +207 -0
- package/bin/runners/lib/engine/express-extractor.js +208 -0
- package/bin/runners/lib/engine/extractors.js +849 -0
- package/bin/runners/lib/engine/index.js +207 -0
- package/bin/runners/lib/engine/repo-index.js +514 -0
- package/bin/runners/lib/engine/types.js +124 -0
- package/bin/runners/lib/engines/accessibility-engine.js +18 -218
- package/bin/runners/lib/engines/api-consistency-engine.js +30 -335
- package/bin/runners/lib/engines/cross-file-analysis-engine.js +27 -292
- package/bin/runners/lib/engines/empty-catch-engine.js +17 -127
- package/bin/runners/lib/engines/mock-data-engine.js +10 -53
- package/bin/runners/lib/engines/performance-issues-engine.js +36 -176
- package/bin/runners/lib/engines/security-vulnerabilities-engine.js +54 -382
- package/bin/runners/lib/engines/type-aware-engine.js +39 -263
- package/bin/runners/lib/engines/vibecheck-engines/index.js +13 -122
- package/bin/runners/lib/engines/vibecheck-engines/lib/ast-cache.js +164 -0
- package/bin/runners/lib/engines/vibecheck-engines/lib/code-quality-engine.js +291 -0
- package/bin/runners/lib/engines/vibecheck-engines/lib/console-logs-engine.js +83 -0
- package/bin/runners/lib/engines/vibecheck-engines/lib/dead-code-engine.js +198 -0
- package/bin/runners/lib/engines/vibecheck-engines/lib/deprecated-api-engine.js +275 -0
- package/bin/runners/lib/engines/vibecheck-engines/lib/empty-catch-engine.js +167 -0
- package/bin/runners/lib/engines/vibecheck-engines/lib/file-filter.js +217 -0
- package/bin/runners/lib/engines/vibecheck-engines/lib/hardcoded-secrets-engine.js +73 -373
- package/bin/runners/lib/engines/vibecheck-engines/lib/mock-data-engine.js +140 -0
- package/bin/runners/lib/engines/vibecheck-engines/lib/parallel-processor.js +164 -0
- package/bin/runners/lib/engines/vibecheck-engines/lib/performance-issues-engine.js +234 -0
- package/bin/runners/lib/engines/vibecheck-engines/lib/type-aware-engine.js +217 -0
- package/bin/runners/lib/engines/vibecheck-engines/lib/unsafe-regex-engine.js +78 -0
- package/bin/runners/lib/entitlements-v2.js +73 -97
- package/bin/runners/lib/error-handler.js +44 -3
- package/bin/runners/lib/error-messages.js +289 -0
- package/bin/runners/lib/evidence-pack.js +7 -1
- package/bin/runners/lib/finding-id.js +69 -0
- package/bin/runners/lib/finding-sorter.js +89 -0
- package/bin/runners/lib/html-proof-report.js +700 -350
- package/bin/runners/lib/missions/plan.js +6 -46
- package/bin/runners/lib/missions/templates.js +0 -232
- package/bin/runners/lib/next-action.js +560 -0
- package/bin/runners/lib/prerequisites.js +149 -0
- package/bin/runners/lib/route-detection.js +137 -68
- package/bin/runners/lib/scan-output.js +91 -76
- package/bin/runners/lib/scan-runner.js +135 -0
- package/bin/runners/lib/schemas/ajv-validator.js +464 -0
- package/bin/runners/lib/schemas/error-envelope.schema.json +105 -0
- package/bin/runners/lib/schemas/finding-v3.schema.json +151 -0
- package/bin/runners/lib/schemas/report-artifact.schema.json +120 -0
- package/bin/runners/lib/schemas/run-request.schema.json +108 -0
- package/bin/runners/lib/schemas/validator.js +27 -0
- package/bin/runners/lib/schemas/verdict.schema.json +140 -0
- package/bin/runners/lib/ship-output-enterprise.js +23 -23
- package/bin/runners/lib/ship-output.js +75 -31
- package/bin/runners/lib/terminal-ui.js +6 -113
- package/bin/runners/lib/truth.js +351 -10
- package/bin/runners/lib/unified-cli-output.js +430 -603
- package/bin/runners/lib/unified-output.js +13 -9
- package/bin/runners/runAIAgent.js +10 -5
- package/bin/runners/runAgent.js +0 -3
- package/bin/runners/runAllowlist.js +389 -0
- package/bin/runners/runApprove.js +0 -33
- package/bin/runners/runAuth.js +73 -45
- package/bin/runners/runCheckpoint.js +51 -11
- package/bin/runners/runClassify.js +85 -21
- package/bin/runners/runContext.js +0 -3
- package/bin/runners/runDoctor.js +41 -28
- package/bin/runners/runEvidencePack.js +362 -0
- package/bin/runners/runFirewall.js +0 -3
- package/bin/runners/runFirewallHook.js +0 -3
- package/bin/runners/runFix.js +66 -76
- package/bin/runners/runGuard.js +18 -411
- package/bin/runners/runInit.js +113 -30
- package/bin/runners/runLabs.js +424 -0
- package/bin/runners/runMcp.js +19 -25
- package/bin/runners/runPolish.js +64 -240
- package/bin/runners/runPromptFirewall.js +12 -5
- package/bin/runners/runProve.js +57 -22
- package/bin/runners/runQuickstart.js +531 -0
- package/bin/runners/runReality.js +59 -68
- package/bin/runners/runReport.js +38 -33
- package/bin/runners/runRuntime.js +8 -5
- package/bin/runners/runScan.js +1413 -190
- package/bin/runners/runShip.js +113 -719
- package/bin/runners/runTruth.js +0 -3
- package/bin/runners/runValidate.js +13 -9
- package/bin/runners/runWatch.js +23 -14
- package/bin/scan.js +6 -1
- package/bin/vibecheck.js +204 -185
- package/mcp-server/deprecation-middleware.js +282 -0
- package/mcp-server/handlers/index.ts +15 -0
- package/mcp-server/handlers/tool-handler.ts +554 -0
- package/mcp-server/index-v1.js +698 -0
- package/mcp-server/index.js +210 -238
- package/mcp-server/lib/cache-wrapper.cjs +383 -0
- package/mcp-server/lib/error-envelope.js +138 -0
- package/mcp-server/lib/executor.ts +499 -0
- package/mcp-server/lib/index.ts +19 -0
- package/mcp-server/lib/rate-limiter.js +166 -0
- package/mcp-server/lib/sandbox.test.ts +519 -0
- package/mcp-server/lib/sandbox.ts +395 -0
- package/mcp-server/lib/types.ts +267 -0
- package/mcp-server/package.json +12 -3
- package/mcp-server/registry/tool-registry.js +794 -0
- package/mcp-server/registry/tools.json +605 -0
- package/mcp-server/registry.test.ts +334 -0
- package/mcp-server/tests/tier-gating.test.js +297 -0
- package/mcp-server/tier-auth.js +378 -45
- package/mcp-server/tools-v3.js +353 -442
- package/mcp-server/tsconfig.json +37 -0
- package/mcp-server/vibecheck-2.0-tools.js +14 -1
- package/package.json +1 -1
- package/bin/runners/lib/agent-firewall/learning/learning-engine.js +0 -849
- package/bin/runners/lib/audit-logger.js +0 -532
- package/bin/runners/lib/authority/authorities/architecture.js +0 -364
- package/bin/runners/lib/authority/authorities/compliance.js +0 -341
- package/bin/runners/lib/authority/authorities/human.js +0 -343
- package/bin/runners/lib/authority/authorities/quality.js +0 -420
- package/bin/runners/lib/authority/authorities/security.js +0 -228
- package/bin/runners/lib/authority/index.js +0 -293
- package/bin/runners/lib/bundle/bundle-intelligence.js +0 -846
- package/bin/runners/lib/cli-charts.js +0 -368
- package/bin/runners/lib/cli-config-display.js +0 -405
- package/bin/runners/lib/cli-demo.js +0 -275
- package/bin/runners/lib/cli-errors.js +0 -438
- package/bin/runners/lib/cli-help-formatter.js +0 -439
- package/bin/runners/lib/cli-interactive-menu.js +0 -509
- package/bin/runners/lib/cli-prompts.js +0 -441
- package/bin/runners/lib/cli-scan-cards.js +0 -362
- package/bin/runners/lib/compliance-reporter.js +0 -710
- package/bin/runners/lib/conductor/index.js +0 -671
- package/bin/runners/lib/easy/README.md +0 -123
- package/bin/runners/lib/easy/index.js +0 -140
- package/bin/runners/lib/easy/interactive-wizard.js +0 -788
- package/bin/runners/lib/easy/one-click-firewall.js +0 -564
- package/bin/runners/lib/easy/zero-config-reality.js +0 -714
- package/bin/runners/lib/engines/async-patterns-engine.js +0 -444
- package/bin/runners/lib/engines/bundle-size-engine.js +0 -433
- package/bin/runners/lib/engines/confidence-scoring.js +0 -276
- package/bin/runners/lib/engines/context-detection.js +0 -264
- package/bin/runners/lib/engines/database-patterns-engine.js +0 -429
- package/bin/runners/lib/engines/duplicate-code-engine.js +0 -354
- package/bin/runners/lib/engines/env-variables-engine.js +0 -458
- package/bin/runners/lib/engines/error-handling-engine.js +0 -437
- package/bin/runners/lib/engines/false-positive-prevention.js +0 -630
- package/bin/runners/lib/engines/framework-adapters/index.js +0 -607
- package/bin/runners/lib/engines/framework-detection.js +0 -508
- package/bin/runners/lib/engines/import-order-engine.js +0 -429
- package/bin/runners/lib/engines/naming-conventions-engine.js +0 -544
- package/bin/runners/lib/engines/noise-reduction-engine.js +0 -452
- package/bin/runners/lib/engines/orchestrator.js +0 -334
- package/bin/runners/lib/engines/react-patterns-engine.js +0 -457
- package/bin/runners/lib/engines/vibecheck-engines/lib/ai-hallucination-engine.js +0 -806
- package/bin/runners/lib/engines/vibecheck-engines/lib/smart-fix-engine.js +0 -577
- package/bin/runners/lib/engines/vibecheck-engines/lib/vibe-score-engine.js +0 -543
- package/bin/runners/lib/engines/vibecheck-engines.js +0 -514
- package/bin/runners/lib/enhanced-features/index.js +0 -305
- package/bin/runners/lib/enhanced-output.js +0 -631
- package/bin/runners/lib/enterprise.js +0 -300
- package/bin/runners/lib/firewall/command-validator.js +0 -351
- package/bin/runners/lib/firewall/config.js +0 -341
- package/bin/runners/lib/firewall/content-validator.js +0 -519
- package/bin/runners/lib/firewall/index.js +0 -101
- package/bin/runners/lib/firewall/path-validator.js +0 -256
- package/bin/runners/lib/intelligence/cross-repo-intelligence.js +0 -817
- package/bin/runners/lib/mcp-utils.js +0 -425
- package/bin/runners/lib/output/index.js +0 -1022
- package/bin/runners/lib/policy-engine.js +0 -652
- package/bin/runners/lib/polish/autofix/accessibility-fixes.js +0 -333
- package/bin/runners/lib/polish/autofix/async-handlers.js +0 -273
- package/bin/runners/lib/polish/autofix/dead-code.js +0 -280
- package/bin/runners/lib/polish/autofix/imports-optimizer.js +0 -344
- package/bin/runners/lib/polish/autofix/index.js +0 -200
- package/bin/runners/lib/polish/autofix/remove-consoles.js +0 -209
- package/bin/runners/lib/polish/autofix/strengthen-types.js +0 -245
- package/bin/runners/lib/polish/backend-checks.js +0 -148
- package/bin/runners/lib/polish/documentation-checks.js +0 -111
- package/bin/runners/lib/polish/frontend-checks.js +0 -168
- package/bin/runners/lib/polish/index.js +0 -71
- package/bin/runners/lib/polish/infrastructure-checks.js +0 -131
- package/bin/runners/lib/polish/library-detection.js +0 -175
- package/bin/runners/lib/polish/performance-checks.js +0 -100
- package/bin/runners/lib/polish/security-checks.js +0 -148
- package/bin/runners/lib/polish/utils.js +0 -203
- package/bin/runners/lib/prompt-builder.js +0 -540
- package/bin/runners/lib/proof-certificate.js +0 -634
- package/bin/runners/lib/reality/accessibility-audit.js +0 -946
- package/bin/runners/lib/reality/api-contract-validator.js +0 -1012
- package/bin/runners/lib/reality/chaos-engineering.js +0 -1084
- package/bin/runners/lib/reality/performance-tracker.js +0 -1077
- package/bin/runners/lib/reality/scenario-generator.js +0 -1404
- package/bin/runners/lib/reality/visual-regression.js +0 -852
- package/bin/runners/lib/reality-profiler.js +0 -717
- package/bin/runners/lib/replay/flight-recorder-viewer.js +0 -1160
- package/bin/runners/lib/review/ai-code-review.js +0 -832
- package/bin/runners/lib/rules/custom-rule-engine.js +0 -985
- package/bin/runners/lib/sbom-generator.js +0 -641
- package/bin/runners/lib/scan-output-enhanced.js +0 -512
- package/bin/runners/lib/security/owasp-scanner.js +0 -939
- package/bin/runners/lib/validators/contract-validator.js +0 -283
- package/bin/runners/lib/validators/dead-export-detector.js +0 -279
- package/bin/runners/lib/validators/dep-audit.js +0 -245
- package/bin/runners/lib/validators/env-validator.js +0 -319
- package/bin/runners/lib/validators/index.js +0 -120
- package/bin/runners/lib/validators/license-checker.js +0 -252
- package/bin/runners/lib/validators/route-validator.js +0 -290
- package/bin/runners/runAuthority.js +0 -528
- package/bin/runners/runConductor.js +0 -772
- package/bin/runners/runContainer.js +0 -366
- package/bin/runners/runEasy.js +0 -410
- package/bin/runners/runIaC.js +0 -372
- package/bin/runners/runVibe.js +0 -791
- package/mcp-server/tools.js +0 -495
|
@@ -1,343 +0,0 @@
|
|
|
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 };
|