@vibecheckai/cli 3.0.4 → 3.0.5
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/guardrail.js +9 -0
- 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.js +8 -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/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/verdict-engine.js +628 -0
- package/bin/runners/runAIAgent.js +228 -1
- package/bin/runners/runBadge.js +181 -1
- package/bin/runners/runCtxDiff.js +301 -0
- package/bin/runners/runInitGha.js +78 -15
- package/bin/runners/runLaunch.js +180 -1
- 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 +6 -1
- package/package.json +9 -8
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* Run Spec v2 Torture Suite
|
|
4
|
+
*
|
|
5
|
+
* Quick confidence builder for spec v2 implementation.
|
|
6
|
+
*
|
|
7
|
+
* Usage:
|
|
8
|
+
* node bin/dev/run-v2-torture.js
|
|
9
|
+
* pnpm test:v2
|
|
10
|
+
*/
|
|
11
|
+
|
|
12
|
+
"use strict";
|
|
13
|
+
|
|
14
|
+
const path = require("path");
|
|
15
|
+
|
|
16
|
+
// Run the torture suite
|
|
17
|
+
const { TortureTestRunner } = require("../../tests/e2e/spec-v2.torture.test.js");
|
|
18
|
+
|
|
19
|
+
async function main() {
|
|
20
|
+
const runner = new TortureTestRunner();
|
|
21
|
+
const results = await runner.run();
|
|
22
|
+
|
|
23
|
+
// Exit with appropriate code
|
|
24
|
+
process.exit(results.failed > 0 ? 1 : 0);
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
main().catch(err => {
|
|
28
|
+
console.error("❌ Torture suite crashed:", err);
|
|
29
|
+
process.exit(1);
|
|
30
|
+
});
|
package/bin/guardrail.js
CHANGED
|
@@ -90,6 +90,7 @@ const { runReplay } = require("./runners/runReplay");
|
|
|
90
90
|
// Context Contracts commands
|
|
91
91
|
const { runCtxSync } = require("./runners/runCtxSync");
|
|
92
92
|
const { runCtxGuard } = require("./runners/runCtxGuard");
|
|
93
|
+
const { runCtxDiff } = require("./runners/runCtxDiff");
|
|
93
94
|
|
|
94
95
|
// Truth Pack v1 - Core truth system
|
|
95
96
|
let runTruthpack;
|
|
@@ -472,6 +473,9 @@ ${c.blue}🔧 FIX & AUTOMATE${c.reset}
|
|
|
472
473
|
${c.dim}📦 TRUTH SYSTEM${c.reset}
|
|
473
474
|
|
|
474
475
|
${c.cyan}ctx${c.reset} Generate Truth Pack - ground truth for AI agents
|
|
476
|
+
${c.cyan}ctx sync${c.reset} Generate contracts from truthpack (routes/env/auth/external)
|
|
477
|
+
${c.cyan}ctx guard${c.reset} CI gate - fail on contract drift (BLOCK on route/env/auth drift)
|
|
478
|
+
${c.cyan}ctx diff${c.reset} Preview contract changes before syncing
|
|
475
479
|
${c.cyan}ctx --snapshot${c.reset} Save snapshot to .vibecheck/truth/snapshots/
|
|
476
480
|
${c.cyan}graph${c.reset} Build Reality Proof Graph - end-to-end causal chains
|
|
477
481
|
|
|
@@ -800,6 +804,11 @@ ${c.dim}Run 'vibecheck <command> --help' for details.${c.reset}
|
|
|
800
804
|
exitCode = await runCtxGuard.main(args.slice(1));
|
|
801
805
|
break;
|
|
802
806
|
}
|
|
807
|
+
if (args[0] === "diff") {
|
|
808
|
+
const { main: ctxDiffMain } = require("./runners/runCtxDiff");
|
|
809
|
+
exitCode = await ctxDiffMain(args.slice(1));
|
|
810
|
+
break;
|
|
811
|
+
}
|
|
803
812
|
// Parse args for ctx command - use Route Truth v1
|
|
804
813
|
const fastifyEntryIdx = args.indexOf('--fastify-entry');
|
|
805
814
|
const fastifyEntry = fastifyEntryIdx !== -1 ? args[fastifyEntryIdx + 1] : undefined;
|
|
@@ -131,9 +131,47 @@ function findEnvGaps(truthpack) {
|
|
|
131
131
|
const declared = new Set(truthpack?.env?.declared || []);
|
|
132
132
|
const declaredSources = truthpack?.env?.declaredSources || [];
|
|
133
133
|
|
|
134
|
+
// Well-known system/CI env vars that shouldn't be flagged as undeclared
|
|
135
|
+
const systemEnvVars = new Set([
|
|
136
|
+
// System
|
|
137
|
+
'HOME', 'USER', 'PATH', 'PWD', 'SHELL', 'TERM', 'LANG', 'TZ', 'TMPDIR', 'TEMP', 'TMP',
|
|
138
|
+
'COLORTERM', 'FORCE_COLOR', 'NO_COLOR', 'TERM_PROGRAM', 'TERM_PROGRAM_VERSION',
|
|
139
|
+
// Windows
|
|
140
|
+
'APPDATA', 'LOCALAPPDATA', 'USERPROFILE', 'COMPUTERNAME', 'USERNAME', 'HOMEDRIVE', 'HOMEPATH',
|
|
141
|
+
'SYSTEMROOT', 'WINDIR', 'PROGRAMFILES', 'PROGRAMDATA', 'COMMONPROGRAMFILES',
|
|
142
|
+
// Node.js
|
|
143
|
+
'NODE_ENV', 'NODE_OPTIONS', 'NODE_PATH', 'NODE_DEBUG', 'NODE_NO_WARNINGS',
|
|
144
|
+
// CI/CD platforms
|
|
145
|
+
'CI', 'CONTINUOUS_INTEGRATION', 'BUILD_NUMBER', 'BUILD_ID',
|
|
146
|
+
'GITHUB_ACTIONS', 'GITHUB_WORKFLOW', 'GITHUB_RUN_ID', 'GITHUB_RUN_NUMBER', 'GITHUB_SHA', 'GITHUB_REF',
|
|
147
|
+
'GITLAB_CI', 'CI_COMMIT_SHA', 'CI_PIPELINE_ID', 'CI_JOB_ID',
|
|
148
|
+
'CIRCLECI', 'CIRCLE_BUILD_NUM', 'CIRCLE_SHA1', 'CIRCLE_BRANCH',
|
|
149
|
+
'TRAVIS', 'TRAVIS_BUILD_NUMBER', 'TRAVIS_COMMIT',
|
|
150
|
+
'JENKINS_URL', 'BUILD_TAG', 'GIT_COMMIT',
|
|
151
|
+
'BUILDKITE', 'BUILDKITE_BUILD_NUMBER', 'BUILDKITE_COMMIT',
|
|
152
|
+
'CODEBUILD_BUILD_ID', 'CODEBUILD_RESOLVED_SOURCE_VERSION',
|
|
153
|
+
'VERCEL', 'VERCEL_ENV', 'VERCEL_URL', 'VERCEL_GIT_COMMIT_SHA',
|
|
154
|
+
'NETLIFY', 'CONTEXT', 'DEPLOY_PRIME_URL',
|
|
155
|
+
'RAILWAY_ENVIRONMENT', 'RAILWAY_GIT_COMMIT_SHA',
|
|
156
|
+
'HEROKU', 'DYNO', 'RENDER', 'FLY_APP_NAME',
|
|
157
|
+
// CI user info
|
|
158
|
+
'GITHUB_ACTOR', 'GITLAB_USER_LOGIN', 'GITLAB_USER_NAME', 'GITLAB_USER_EMAIL',
|
|
159
|
+
// Network/proxy
|
|
160
|
+
'HTTP_PROXY', 'HTTPS_PROXY', 'NO_PROXY', 'http_proxy', 'https_proxy', 'no_proxy',
|
|
161
|
+
'HOSTNAME', 'HOST',
|
|
162
|
+
// Debug/logging
|
|
163
|
+
'DEBUG', 'VERBOSE', 'LOG_LEVEL',
|
|
164
|
+
// Editor/IDE
|
|
165
|
+
'EDITOR', 'VISUAL', 'VSCODE_PID', 'TERM_SESSION_ID',
|
|
166
|
+
// Common optional vars that are often checked but not required
|
|
167
|
+
'PORT', 'npm_package_version', 'npm_package_name',
|
|
168
|
+
]);
|
|
169
|
+
|
|
134
170
|
// 1) USED but not declared in templates/examples => WARN (or BLOCK if required)
|
|
135
171
|
for (const v of used) {
|
|
136
172
|
if (declared.has(v.name)) continue;
|
|
173
|
+
// Skip well-known system/CI env vars
|
|
174
|
+
if (systemEnvVars.has(v.name)) continue;
|
|
137
175
|
|
|
138
176
|
const sev = v.required ? "BLOCK" : "WARN";
|
|
139
177
|
findings.push({
|
|
Binary file
|
|
@@ -58,6 +58,14 @@ function buildAuthContract(truthpack) {
|
|
|
58
58
|
"/favicon.ico"
|
|
59
59
|
];
|
|
60
60
|
|
|
61
|
+
// Deterministic output: sort all arrays
|
|
62
|
+
contract.protectedPatterns.sort();
|
|
63
|
+
contract.publicPatterns.sort();
|
|
64
|
+
contract.roles.sort((a, b) => a.name.localeCompare(b.name));
|
|
65
|
+
for (const role of contract.roles) {
|
|
66
|
+
if (role.routes) role.routes.sort();
|
|
67
|
+
}
|
|
68
|
+
|
|
61
69
|
return contract;
|
|
62
70
|
}
|
|
63
71
|
|
|
@@ -84,12 +84,20 @@ function buildExternalContract(truthpack) {
|
|
|
84
84
|
if (supabaseVars.length) {
|
|
85
85
|
contract.services.push({
|
|
86
86
|
name: "supabase",
|
|
87
|
-
envVars: supabaseVars.map(v => v.name),
|
|
88
|
-
usedIn: supabaseVars.flatMap(v => v.references?.map(r => r.file) || []),
|
|
87
|
+
envVars: supabaseVars.map(v => v.name).sort(),
|
|
88
|
+
usedIn: [...new Set(supabaseVars.flatMap(v => v.references?.map(r => r.file) || []))].sort(),
|
|
89
89
|
evidence: supabaseVars.flatMap(v => v.references || [])
|
|
90
90
|
});
|
|
91
91
|
}
|
|
92
92
|
|
|
93
|
+
// Deterministic output: sort services by name, and their internal arrays
|
|
94
|
+
contract.services.sort((a, b) => a.name.localeCompare(b.name));
|
|
95
|
+
for (const svc of contract.services) {
|
|
96
|
+
if (svc.envVars) svc.envVars.sort();
|
|
97
|
+
if (svc.usedIn) svc.usedIn = [...new Set(svc.usedIn)].sort();
|
|
98
|
+
if (svc.webhooks) svc.webhooks.sort((a, b) => a.path.localeCompare(b.path));
|
|
99
|
+
}
|
|
100
|
+
|
|
93
101
|
return contract;
|
|
94
102
|
}
|
|
95
103
|
|
|
@@ -38,6 +38,13 @@ function buildRouteContract(truthpack) {
|
|
|
38
38
|
contract.routes.push(routeSpec);
|
|
39
39
|
}
|
|
40
40
|
|
|
41
|
+
// Deterministic output: sort routes by method + path
|
|
42
|
+
contract.routes.sort((a, b) => {
|
|
43
|
+
const keyA = `${a.method}_${a.path}`;
|
|
44
|
+
const keyB = `${b.method}_${b.path}`;
|
|
45
|
+
return keyA.localeCompare(keyB);
|
|
46
|
+
});
|
|
47
|
+
|
|
41
48
|
return contract;
|
|
42
49
|
}
|
|
43
50
|
|