@vibecheckai/cli 3.0.4 → 3.0.7
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/dev/run-v2-torture.js +30 -0
- package/bin/runners/context/index.js +1 -1
- package/bin/runners/lib/analyzers.js +38 -0
- package/bin/runners/lib/assets/vibecheck-logo.png +0 -0
- package/bin/runners/lib/contracts/auth-contract.js +8 -0
- package/bin/runners/lib/contracts/env-contract.js +3 -0
- package/bin/runners/lib/contracts/external-contract.js +10 -2
- package/bin/runners/lib/contracts/route-contract.js +7 -0
- package/bin/runners/lib/contracts.js +804 -0
- package/bin/runners/lib/detectors-v2.js +703 -0
- package/bin/runners/lib/drift.js +425 -0
- package/bin/runners/lib/entitlements-v2.js +3 -1
- package/bin/runners/lib/entitlements.js +11 -3
- package/bin/runners/lib/env-resolver.js +417 -0
- package/bin/runners/lib/extractors/client-calls.js +990 -0
- package/bin/runners/lib/extractors/fastify-route-dump.js +573 -0
- package/bin/runners/lib/extractors/fastify-routes.js +426 -0
- package/bin/runners/lib/extractors/index.js +363 -0
- package/bin/runners/lib/extractors/next-routes.js +524 -0
- package/bin/runners/lib/extractors/proof-graph.js +431 -0
- package/bin/runners/lib/extractors/route-matcher.js +451 -0
- package/bin/runners/lib/extractors/truthpack-v2.js +377 -0
- package/bin/runners/lib/extractors/ui-bindings.js +547 -0
- package/bin/runners/lib/findings-schema.js +281 -0
- package/bin/runners/lib/html-report.js +650 -0
- package/bin/runners/lib/missions/templates.js +45 -0
- package/bin/runners/lib/policy.js +295 -0
- package/bin/runners/lib/reality/correlation-detectors.js +359 -0
- package/bin/runners/lib/reality/index.js +318 -0
- package/bin/runners/lib/reality/request-hashing.js +416 -0
- package/bin/runners/lib/reality/request-mapper.js +453 -0
- package/bin/runners/lib/reality/safety-rails.js +463 -0
- package/bin/runners/lib/reality/semantic-snapshot.js +408 -0
- package/bin/runners/lib/reality/toast-detector.js +393 -0
- package/bin/runners/lib/report-html.js +5 -0
- package/bin/runners/lib/report-templates.js +5 -0
- package/bin/runners/lib/report.js +135 -0
- package/bin/runners/lib/route-truth.js +10 -10
- package/bin/runners/lib/schema-validator.js +350 -0
- package/bin/runners/lib/schemas/contracts.schema.json +160 -0
- package/bin/runners/lib/schemas/finding.schema.json +100 -0
- package/bin/runners/lib/schemas/mission-pack.schema.json +206 -0
- package/bin/runners/lib/schemas/proof-graph.schema.json +176 -0
- package/bin/runners/lib/schemas/reality-report.schema.json +162 -0
- package/bin/runners/lib/schemas/share-pack.schema.json +180 -0
- package/bin/runners/lib/schemas/ship-report.schema.json +117 -0
- package/bin/runners/lib/schemas/truthpack-v2.schema.json +303 -0
- package/bin/runners/lib/schemas/validator.js +438 -0
- package/bin/runners/lib/ui.js +562 -0
- package/bin/runners/lib/verdict-engine.js +628 -0
- package/bin/runners/runAIAgent.js +228 -1
- package/bin/runners/runBadge.js +181 -1
- package/bin/runners/runCtx.js +7 -2
- package/bin/runners/runCtxDiff.js +301 -0
- package/bin/runners/runGuard.js +168 -0
- package/bin/runners/runInitGha.js +78 -15
- package/bin/runners/runLabs.js +341 -0
- package/bin/runners/runLaunch.js +180 -1
- package/bin/runners/runMdc.js +203 -1
- package/bin/runners/runProof.zip +0 -0
- package/bin/runners/runProve.js +23 -0
- package/bin/runners/runReplay.js +114 -84
- package/bin/runners/runScan.js +111 -32
- package/bin/runners/runShip.js +23 -2
- package/bin/runners/runTruthpack.js +9 -7
- package/bin/runners/runValidate.js +161 -1
- package/bin/vibecheck.js +416 -770
- package/mcp-server/.guardrail/audit/audit.log.jsonl +2 -0
- package/mcp-server/.specs/architecture.mdc +90 -0
- package/mcp-server/.specs/security.mdc +30 -0
- package/mcp-server/README.md +252 -0
- package/mcp-server/agent-checkpoint.js +364 -0
- package/mcp-server/architect-tools.js +707 -0
- package/mcp-server/audit-mcp.js +206 -0
- package/mcp-server/codebase-architect-tools.js +838 -0
- package/mcp-server/consolidated-tools.js +804 -0
- package/mcp-server/hygiene-tools.js +428 -0
- package/mcp-server/index-v1.js +698 -0
- package/mcp-server/index.js +2092 -0
- package/mcp-server/index.old.js +4137 -0
- package/mcp-server/intelligence-tools.js +664 -0
- package/mcp-server/intent-drift-tools.js +873 -0
- package/mcp-server/mdc-generator.js +298 -0
- package/mcp-server/package-lock.json +165 -0
- package/mcp-server/package.json +47 -0
- package/mcp-server/premium-tools.js +1275 -0
- package/mcp-server/test-mcp.js +108 -0
- package/mcp-server/test-tools.js +36 -0
- package/mcp-server/tier-auth.js +147 -0
- package/mcp-server/tools/index.js +72 -0
- package/mcp-server/tools-reorganized.ts +244 -0
- package/mcp-server/truth-context.js +581 -0
- package/mcp-server/truth-firewall-tools.js +1500 -0
- package/mcp-server/vibecheck-2.0-tools.js +748 -0
- package/mcp-server/vibecheck-tools.js +1075 -0
- package/package.json +10 -8
- package/bin/guardrail.js +0 -834
- package/bin/runners/runAudit.js +0 -2
- package/bin/runners/runAutopilot.js +0 -2
- package/bin/runners/runCertify.js +0 -2
- package/bin/runners/runDashboard.js +0 -10
- package/bin/runners/runEnhancedShip.js +0 -2
- package/bin/runners/runFixPacks.js +0 -2
- package/bin/runners/runNaturalLanguage.js +0 -3
- package/bin/runners/runProof.js +0 -2
- package/bin/runners/runRealitySniff.js +0 -2
- package/bin/runners/runUpgrade.js +0 -2
- package/bin/runners/runVerifyAgentOutput.js +0 -2
|
@@ -0,0 +1,281 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Findings Schema v2
|
|
3
|
+
*
|
|
4
|
+
* Per spec section 7.1, findings must include:
|
|
5
|
+
* - fingerprint: stable hash for dedupe across runs
|
|
6
|
+
* - scope: client|server|runtime|contracts
|
|
7
|
+
* - repro: minimal reproduction steps (for runtime findings)
|
|
8
|
+
* - related: linked finding IDs
|
|
9
|
+
*
|
|
10
|
+
* This module provides helpers to create and validate v2 findings.
|
|
11
|
+
*/
|
|
12
|
+
|
|
13
|
+
"use strict";
|
|
14
|
+
|
|
15
|
+
const crypto = require("crypto");
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* Generate a stable fingerprint for a finding
|
|
19
|
+
* Used for dedupe across runs - same issue = same fingerprint
|
|
20
|
+
*/
|
|
21
|
+
function generateFingerprint(category, ...identifiers) {
|
|
22
|
+
const data = [category, ...identifiers.filter(Boolean)].join("|");
|
|
23
|
+
return crypto.createHash("sha256").update(data).digest("hex").slice(0, 12);
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
/**
|
|
27
|
+
* Infer scope from finding category and evidence
|
|
28
|
+
*/
|
|
29
|
+
function inferScope(category, evidence = []) {
|
|
30
|
+
const scopeMap = {
|
|
31
|
+
// Client-side findings
|
|
32
|
+
'DeadUI': 'runtime',
|
|
33
|
+
'FakeSuccess': 'client',
|
|
34
|
+
|
|
35
|
+
// Server-side findings
|
|
36
|
+
'MissingRoute': 'server',
|
|
37
|
+
'GhostAuth': 'server',
|
|
38
|
+
'StripeWebhook': 'server',
|
|
39
|
+
'PaidSurface': 'server',
|
|
40
|
+
'OwnerModeBypass': 'server',
|
|
41
|
+
|
|
42
|
+
// Contract findings
|
|
43
|
+
'ContractDrift': 'contracts',
|
|
44
|
+
'EnvContract': 'contracts',
|
|
45
|
+
|
|
46
|
+
// Runtime findings
|
|
47
|
+
'AuthCoverage': 'runtime',
|
|
48
|
+
'RouteCoverage': 'runtime',
|
|
49
|
+
};
|
|
50
|
+
|
|
51
|
+
return scopeMap[category] || 'server';
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
/**
|
|
55
|
+
* Create a v2-compliant finding
|
|
56
|
+
*/
|
|
57
|
+
function createFinding({
|
|
58
|
+
id,
|
|
59
|
+
category,
|
|
60
|
+
type,
|
|
61
|
+
severity,
|
|
62
|
+
title,
|
|
63
|
+
message,
|
|
64
|
+
why,
|
|
65
|
+
confidence = 'med',
|
|
66
|
+
evidence = [],
|
|
67
|
+
fixHints = [],
|
|
68
|
+
repro = null,
|
|
69
|
+
related = [],
|
|
70
|
+
scope = null,
|
|
71
|
+
source = null,
|
|
72
|
+
}) {
|
|
73
|
+
// Generate stable fingerprint
|
|
74
|
+
const fingerprint = generateFingerprint(
|
|
75
|
+
category,
|
|
76
|
+
type || title,
|
|
77
|
+
evidence[0]?.file,
|
|
78
|
+
evidence[0]?.lines
|
|
79
|
+
);
|
|
80
|
+
|
|
81
|
+
// Infer scope if not provided
|
|
82
|
+
const resolvedScope = scope || inferScope(category, evidence);
|
|
83
|
+
|
|
84
|
+
return {
|
|
85
|
+
// Core fields
|
|
86
|
+
id: id || `F_${category.toUpperCase()}_${fingerprint}`,
|
|
87
|
+
category,
|
|
88
|
+
type: type || category.toLowerCase(),
|
|
89
|
+
severity,
|
|
90
|
+
title,
|
|
91
|
+
message: message || title,
|
|
92
|
+
why,
|
|
93
|
+
confidence,
|
|
94
|
+
|
|
95
|
+
// Evidence
|
|
96
|
+
evidence,
|
|
97
|
+
fixHints,
|
|
98
|
+
|
|
99
|
+
// v2 fields (spec 7.1)
|
|
100
|
+
fingerprint,
|
|
101
|
+
scope: resolvedScope,
|
|
102
|
+
repro: repro || null,
|
|
103
|
+
related: related || [],
|
|
104
|
+
|
|
105
|
+
// Metadata
|
|
106
|
+
source: source || 'static',
|
|
107
|
+
createdAt: new Date().toISOString(),
|
|
108
|
+
};
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
/**
|
|
112
|
+
* Create a runtime finding with reproduction steps
|
|
113
|
+
*/
|
|
114
|
+
function createRuntimeFinding({
|
|
115
|
+
category,
|
|
116
|
+
type,
|
|
117
|
+
severity,
|
|
118
|
+
title,
|
|
119
|
+
why,
|
|
120
|
+
url,
|
|
121
|
+
action,
|
|
122
|
+
expected,
|
|
123
|
+
actual,
|
|
124
|
+
screenshot = null,
|
|
125
|
+
trace = null,
|
|
126
|
+
evidence = [],
|
|
127
|
+
related = [],
|
|
128
|
+
}) {
|
|
129
|
+
const repro = {
|
|
130
|
+
url,
|
|
131
|
+
steps: [
|
|
132
|
+
`Navigate to ${url}`,
|
|
133
|
+
action ? `Action: ${action}` : null,
|
|
134
|
+
`Expected: ${expected}`,
|
|
135
|
+
`Actual: ${actual}`,
|
|
136
|
+
].filter(Boolean),
|
|
137
|
+
screenshot,
|
|
138
|
+
trace,
|
|
139
|
+
};
|
|
140
|
+
|
|
141
|
+
return createFinding({
|
|
142
|
+
category,
|
|
143
|
+
type,
|
|
144
|
+
severity,
|
|
145
|
+
title,
|
|
146
|
+
why,
|
|
147
|
+
evidence,
|
|
148
|
+
related,
|
|
149
|
+
repro,
|
|
150
|
+
scope: 'runtime',
|
|
151
|
+
source: 'reality',
|
|
152
|
+
});
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
/**
|
|
156
|
+
* Create a contract drift finding
|
|
157
|
+
*/
|
|
158
|
+
function createDriftFinding({
|
|
159
|
+
type,
|
|
160
|
+
severity,
|
|
161
|
+
title,
|
|
162
|
+
message,
|
|
163
|
+
subject,
|
|
164
|
+
contractFile,
|
|
165
|
+
evidence = [],
|
|
166
|
+
}) {
|
|
167
|
+
return createFinding({
|
|
168
|
+
category: 'ContractDrift',
|
|
169
|
+
type,
|
|
170
|
+
severity,
|
|
171
|
+
title,
|
|
172
|
+
message,
|
|
173
|
+
why: 'Contracts are the source of truth. Drift causes AI hallucinations.',
|
|
174
|
+
evidence: evidence.length > 0 ? evidence : [{
|
|
175
|
+
file: `.vibecheck/contracts/${contractFile || 'contracts'}`,
|
|
176
|
+
lines: '1',
|
|
177
|
+
reason: title,
|
|
178
|
+
}],
|
|
179
|
+
fixHints: [
|
|
180
|
+
"Run 'vibecheck ctx sync' to update contracts",
|
|
181
|
+
"Or revert the code change if unintended",
|
|
182
|
+
],
|
|
183
|
+
scope: 'contracts',
|
|
184
|
+
source: 'drift',
|
|
185
|
+
});
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
/**
|
|
189
|
+
* Link related findings
|
|
190
|
+
*/
|
|
191
|
+
function linkFindings(findings) {
|
|
192
|
+
// Group findings by file
|
|
193
|
+
const byFile = new Map();
|
|
194
|
+
for (const f of findings) {
|
|
195
|
+
for (const ev of f.evidence || []) {
|
|
196
|
+
if (ev.file) {
|
|
197
|
+
if (!byFile.has(ev.file)) byFile.set(ev.file, []);
|
|
198
|
+
byFile.get(ev.file).push(f.id);
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
// Link findings that share files
|
|
204
|
+
for (const f of findings) {
|
|
205
|
+
const relatedIds = new Set();
|
|
206
|
+
for (const ev of f.evidence || []) {
|
|
207
|
+
if (ev.file && byFile.has(ev.file)) {
|
|
208
|
+
for (const id of byFile.get(ev.file)) {
|
|
209
|
+
if (id !== f.id) relatedIds.add(id);
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
f.related = [...relatedIds].slice(0, 5); // Max 5 related
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
return findings;
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
/**
|
|
220
|
+
* Validate a finding against v2 schema
|
|
221
|
+
*/
|
|
222
|
+
function validateFinding(finding) {
|
|
223
|
+
const errors = [];
|
|
224
|
+
|
|
225
|
+
// Required fields
|
|
226
|
+
if (!finding.id) errors.push('Missing id');
|
|
227
|
+
if (!finding.category) errors.push('Missing category');
|
|
228
|
+
if (!finding.severity) errors.push('Missing severity');
|
|
229
|
+
if (!['BLOCK', 'WARN', 'INFO'].includes(finding.severity)) {
|
|
230
|
+
errors.push(`Invalid severity: ${finding.severity}`);
|
|
231
|
+
}
|
|
232
|
+
if (!finding.title) errors.push('Missing title');
|
|
233
|
+
|
|
234
|
+
// v2 fields
|
|
235
|
+
if (!finding.fingerprint) errors.push('Missing fingerprint (v2)');
|
|
236
|
+
if (!finding.scope) errors.push('Missing scope (v2)');
|
|
237
|
+
if (!['client', 'server', 'runtime', 'contracts'].includes(finding.scope)) {
|
|
238
|
+
errors.push(`Invalid scope: ${finding.scope}`);
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
return {
|
|
242
|
+
valid: errors.length === 0,
|
|
243
|
+
errors,
|
|
244
|
+
};
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
/**
|
|
248
|
+
* Migrate a v1 finding to v2 format
|
|
249
|
+
*/
|
|
250
|
+
function migrateFindingToV2(finding) {
|
|
251
|
+
// Already has fingerprint = already v2
|
|
252
|
+
if (finding.fingerprint && finding.scope) {
|
|
253
|
+
return finding;
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
// Generate fingerprint
|
|
257
|
+
const fingerprint = generateFingerprint(
|
|
258
|
+
finding.category || 'Unknown',
|
|
259
|
+
finding.type || finding.title,
|
|
260
|
+
finding.evidence?.[0]?.file
|
|
261
|
+
);
|
|
262
|
+
|
|
263
|
+
return {
|
|
264
|
+
...finding,
|
|
265
|
+
fingerprint,
|
|
266
|
+
scope: finding.scope || inferScope(finding.category, finding.evidence),
|
|
267
|
+
repro: finding.repro || null,
|
|
268
|
+
related: finding.related || [],
|
|
269
|
+
};
|
|
270
|
+
}
|
|
271
|
+
|
|
272
|
+
module.exports = {
|
|
273
|
+
generateFingerprint,
|
|
274
|
+
inferScope,
|
|
275
|
+
createFinding,
|
|
276
|
+
createRuntimeFinding,
|
|
277
|
+
createDriftFinding,
|
|
278
|
+
linkFindings,
|
|
279
|
+
validateFinding,
|
|
280
|
+
migrateFindingToV2,
|
|
281
|
+
};
|