@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.
Files changed (58) hide show
  1. package/bin/dev/run-v2-torture.js +30 -0
  2. package/bin/guardrail.js +9 -0
  3. package/bin/runners/lib/analyzers.js +38 -0
  4. package/bin/runners/lib/assets/vibecheck-logo.png +0 -0
  5. package/bin/runners/lib/contracts/auth-contract.js +8 -0
  6. package/bin/runners/lib/contracts/env-contract.js +3 -0
  7. package/bin/runners/lib/contracts/external-contract.js +10 -2
  8. package/bin/runners/lib/contracts/route-contract.js +7 -0
  9. package/bin/runners/lib/contracts.js +804 -0
  10. package/bin/runners/lib/detectors-v2.js +703 -0
  11. package/bin/runners/lib/drift.js +425 -0
  12. package/bin/runners/lib/entitlements.js +8 -3
  13. package/bin/runners/lib/env-resolver.js +417 -0
  14. package/bin/runners/lib/extractors/client-calls.js +990 -0
  15. package/bin/runners/lib/extractors/fastify-route-dump.js +573 -0
  16. package/bin/runners/lib/extractors/fastify-routes.js +426 -0
  17. package/bin/runners/lib/extractors/index.js +363 -0
  18. package/bin/runners/lib/extractors/next-routes.js +524 -0
  19. package/bin/runners/lib/extractors/proof-graph.js +431 -0
  20. package/bin/runners/lib/extractors/route-matcher.js +451 -0
  21. package/bin/runners/lib/extractors/truthpack-v2.js +377 -0
  22. package/bin/runners/lib/extractors/ui-bindings.js +547 -0
  23. package/bin/runners/lib/findings-schema.js +281 -0
  24. package/bin/runners/lib/html-report.js +650 -0
  25. package/bin/runners/lib/missions/templates.js +45 -0
  26. package/bin/runners/lib/policy.js +295 -0
  27. package/bin/runners/lib/reality/correlation-detectors.js +359 -0
  28. package/bin/runners/lib/reality/index.js +318 -0
  29. package/bin/runners/lib/reality/request-hashing.js +416 -0
  30. package/bin/runners/lib/reality/request-mapper.js +453 -0
  31. package/bin/runners/lib/reality/safety-rails.js +463 -0
  32. package/bin/runners/lib/reality/semantic-snapshot.js +408 -0
  33. package/bin/runners/lib/reality/toast-detector.js +393 -0
  34. package/bin/runners/lib/route-truth.js +10 -10
  35. package/bin/runners/lib/schema-validator.js +350 -0
  36. package/bin/runners/lib/schemas/contracts.schema.json +160 -0
  37. package/bin/runners/lib/schemas/finding.schema.json +100 -0
  38. package/bin/runners/lib/schemas/mission-pack.schema.json +206 -0
  39. package/bin/runners/lib/schemas/proof-graph.schema.json +176 -0
  40. package/bin/runners/lib/schemas/reality-report.schema.json +162 -0
  41. package/bin/runners/lib/schemas/share-pack.schema.json +180 -0
  42. package/bin/runners/lib/schemas/ship-report.schema.json +117 -0
  43. package/bin/runners/lib/schemas/truthpack-v2.schema.json +303 -0
  44. package/bin/runners/lib/schemas/validator.js +438 -0
  45. package/bin/runners/lib/verdict-engine.js +628 -0
  46. package/bin/runners/runAIAgent.js +228 -1
  47. package/bin/runners/runBadge.js +181 -1
  48. package/bin/runners/runCtxDiff.js +301 -0
  49. package/bin/runners/runInitGha.js +78 -15
  50. package/bin/runners/runLaunch.js +180 -1
  51. package/bin/runners/runProve.js +23 -0
  52. package/bin/runners/runReplay.js +114 -84
  53. package/bin/runners/runScan.js +111 -32
  54. package/bin/runners/runShip.js +23 -2
  55. package/bin/runners/runTruthpack.js +9 -7
  56. package/bin/runners/runValidate.js +161 -1
  57. package/bin/vibecheck.js +6 -1
  58. 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({
@@ -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
 
@@ -46,6 +46,9 @@ function buildEnvContract(truthpack) {
46
46
  }
47
47
  }
48
48
 
49
+ // Deterministic output: sort vars by name
50
+ contract.vars.sort((a, b) => a.name.localeCompare(b.name));
51
+
49
52
  return contract;
50
53
  }
51
54
 
@@ -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