@vibecheck-ai/mcp 24.5.6 → 24.5.9

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/dist/index.js CHANGED
@@ -219066,27 +219066,29 @@ var require_has_flag = __commonJS({
219066
219066
  }
219067
219067
  });
219068
219068
 
219069
- // ../../node_modules/.pnpm/supports-color@7.2.0/node_modules/supports-color/index.js
219069
+ // ../../node_modules/.pnpm/supports-color@8.1.1/node_modules/supports-color/index.js
219070
219070
  var require_supports_color = __commonJS({
219071
- "../../node_modules/.pnpm/supports-color@7.2.0/node_modules/supports-color/index.js"(exports2, module2) {
219071
+ "../../node_modules/.pnpm/supports-color@8.1.1/node_modules/supports-color/index.js"(exports2, module2) {
219072
219072
  "use strict";
219073
219073
  var os2 = __require("os");
219074
219074
  var tty = __require("tty");
219075
219075
  var hasFlag = require_has_flag();
219076
219076
  var { env: env3 } = process;
219077
- var forceColor;
219077
+ var flagForceColor;
219078
219078
  if (hasFlag("no-color") || hasFlag("no-colors") || hasFlag("color=false") || hasFlag("color=never")) {
219079
- forceColor = 0;
219079
+ flagForceColor = 0;
219080
219080
  } else if (hasFlag("color") || hasFlag("colors") || hasFlag("color=true") || hasFlag("color=always")) {
219081
- forceColor = 1;
219081
+ flagForceColor = 1;
219082
219082
  }
219083
- if ("FORCE_COLOR" in env3) {
219084
- if (env3.FORCE_COLOR === "true") {
219085
- forceColor = 1;
219086
- } else if (env3.FORCE_COLOR === "false") {
219087
- forceColor = 0;
219088
- } else {
219089
- forceColor = env3.FORCE_COLOR.length === 0 ? 1 : Math.min(parseInt(env3.FORCE_COLOR, 10), 3);
219083
+ function envForceColor() {
219084
+ if ("FORCE_COLOR" in env3) {
219085
+ if (env3.FORCE_COLOR === "true") {
219086
+ return 1;
219087
+ }
219088
+ if (env3.FORCE_COLOR === "false") {
219089
+ return 0;
219090
+ }
219091
+ return env3.FORCE_COLOR.length === 0 ? 1 : Math.min(Number.parseInt(env3.FORCE_COLOR, 10), 3);
219090
219092
  }
219091
219093
  }
219092
219094
  function translateLevel(level) {
@@ -219100,15 +219102,22 @@ var require_supports_color = __commonJS({
219100
219102
  has16m: level >= 3
219101
219103
  };
219102
219104
  }
219103
- function supportsColor(haveStream, streamIsTTY) {
219105
+ function supportsColor(haveStream, { streamIsTTY, sniffFlags = true } = {}) {
219106
+ const noFlagForceColor = envForceColor();
219107
+ if (noFlagForceColor !== void 0) {
219108
+ flagForceColor = noFlagForceColor;
219109
+ }
219110
+ const forceColor = sniffFlags ? flagForceColor : noFlagForceColor;
219104
219111
  if (forceColor === 0) {
219105
219112
  return 0;
219106
219113
  }
219107
- if (hasFlag("color=16m") || hasFlag("color=full") || hasFlag("color=truecolor")) {
219108
- return 3;
219109
- }
219110
- if (hasFlag("color=256")) {
219111
- return 2;
219114
+ if (sniffFlags) {
219115
+ if (hasFlag("color=16m") || hasFlag("color=full") || hasFlag("color=truecolor")) {
219116
+ return 3;
219117
+ }
219118
+ if (hasFlag("color=256")) {
219119
+ return 2;
219120
+ }
219112
219121
  }
219113
219122
  if (haveStream && !streamIsTTY && forceColor === void 0) {
219114
219123
  return 0;
@@ -219125,7 +219134,7 @@ var require_supports_color = __commonJS({
219125
219134
  return 1;
219126
219135
  }
219127
219136
  if ("CI" in env3) {
219128
- if (["TRAVIS", "CIRCLECI", "APPVEYOR", "GITLAB_CI", "GITHUB_ACTIONS", "BUILDKITE"].some((sign) => sign in env3) || env3.CI_NAME === "codeship") {
219137
+ if (["TRAVIS", "CIRCLECI", "APPVEYOR", "GITLAB_CI", "GITHUB_ACTIONS", "BUILDKITE", "DRONE"].some((sign) => sign in env3) || env3.CI_NAME === "codeship") {
219129
219138
  return 1;
219130
219139
  }
219131
219140
  return min2;
@@ -219137,7 +219146,7 @@ var require_supports_color = __commonJS({
219137
219146
  return 3;
219138
219147
  }
219139
219148
  if ("TERM_PROGRAM" in env3) {
219140
- const version3 = parseInt((env3.TERM_PROGRAM_VERSION || "").split(".")[0], 10);
219149
+ const version3 = Number.parseInt((env3.TERM_PROGRAM_VERSION || "").split(".")[0], 10);
219141
219150
  switch (env3.TERM_PROGRAM) {
219142
219151
  case "iTerm.app":
219143
219152
  return version3 >= 3 ? 3 : 2;
@@ -219156,14 +219165,17 @@ var require_supports_color = __commonJS({
219156
219165
  }
219157
219166
  return min2;
219158
219167
  }
219159
- function getSupportLevel(stream) {
219160
- const level = supportsColor(stream, stream && stream.isTTY);
219168
+ function getSupportLevel(stream, options = {}) {
219169
+ const level = supportsColor(stream, {
219170
+ streamIsTTY: stream && stream.isTTY,
219171
+ ...options
219172
+ });
219161
219173
  return translateLevel(level);
219162
219174
  }
219163
219175
  module2.exports = {
219164
219176
  supportsColor: getSupportLevel,
219165
- stdout: translateLevel(supportsColor(true, tty.isatty(1))),
219166
- stderr: translateLevel(supportsColor(true, tty.isatty(2)))
219177
+ stdout: getSupportLevel({ isTTY: tty.isatty(1) }),
219178
+ stderr: getSupportLevel({ isTTY: tty.isatty(2) })
219167
219179
  };
219168
219180
  }
219169
219181
  });
@@ -219676,7 +219688,7 @@ var require_wrappers = __commonJS({
219676
219688
  exports2.prepare = function prepare(sql) {
219677
219689
  return this[cppdb].prepare(sql, this, false);
219678
219690
  };
219679
- exports2.exec = function exec2(sql) {
219691
+ exports2.exec = function exec(sql) {
219680
219692
  this[cppdb].exec(sql);
219681
219693
  return this;
219682
219694
  };
@@ -278734,7 +278746,7 @@ import { pathToFileURL } from "url";
278734
278746
  // src/server.ts
278735
278747
  import * as path9 from "path";
278736
278748
  import * as fs6 from "fs";
278737
- import { exec } from "child_process";
278749
+ import { execFile } from "child_process";
278738
278750
  import { promisify } from "util";
278739
278751
  import { Server } from "@modelcontextprotocol/sdk/server/index.js";
278740
278752
  import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
@@ -278752,6 +278764,8 @@ import {
278752
278764
  gateCanonicalScanReportFindings,
278753
278765
  normalizeCanonicalScanReport
278754
278766
  } from "@repo/shared-types";
278767
+ import { formatTrustScoreMcp, getTrustScoreStatus } from "@repo/shared-types";
278768
+ import { dashboardFindingUrl } from "@repo/shared-types";
278755
278769
 
278756
278770
  // ../codegraph/dist/index.js
278757
278771
  var import_fast_glob = __toESM(require_out4(), 1);
@@ -291811,7 +291825,7 @@ var ContextEngine = class {
291811
291825
  // src/server.ts
291812
291826
  init_dist();
291813
291827
 
291814
- // ../subscriptions/dist/chunk-EQ52N5FM.js
291828
+ // ../subscriptions/dist/chunk-IRYOMNQT.js
291815
291829
  var PLAN_IDS = ["free", "pro", "team", "enterprise"];
291816
291830
  var PLAN_RANK = Object.fromEntries(
291817
291831
  PLAN_IDS.map((id, index2) => [id, index2])
@@ -291896,9 +291910,9 @@ var PLAN_DEFINITIONS = {
291896
291910
  },
291897
291911
  pro: {
291898
291912
  displayName: "Pro",
291899
- tagline: "$9.99/mo or $99.99/yr (save 17%).",
291900
- monthlyPriceUsd: 9.99,
291901
- priceLabel: "$9.99/mo",
291913
+ tagline: "$19.00/mo or $189.99/yr (save 17%).",
291914
+ monthlyPriceUsd: 19,
291915
+ priceLabel: "$19.00/mo",
291902
291916
  billingInterval: "month",
291903
291917
  badgeToken: "tier-pro",
291904
291918
  highlights: [
@@ -293109,6 +293123,8 @@ var FEATURE_NAMES = {
293109
293123
  REVIEW_WORKFLOWS: "Review Workflows",
293110
293124
  FLOW_WORKFLOWS: "Flow Workflows",
293111
293125
  WIKICODE_ATLAS: "WikiCode Atlas",
293126
+ /** Truthpack generate/validate — local CLI + IDE; registry key matches {@link FEATURE_REGISTRY} */
293127
+ TRUTHPACK: "Truthpack",
293112
293128
  /** LLM guided routes — use getAccessMode for free taste vs Pro unlimited */
293113
293129
  GUIDED_ROUTE: "Guided Route",
293114
293130
  SHIP_SCORE: "Ship Score",
@@ -293657,9 +293673,6 @@ var InputValidator = class {
293657
293673
  errors.push("Path traversal detected");
293658
293674
  logger.warn("Path traversal attempt blocked", { input, normalized });
293659
293675
  }
293660
- if (path7.isAbsolute(input)) {
293661
- errors.push("Absolute paths not allowed");
293662
- }
293663
293676
  if (input.includes("\0")) {
293664
293677
  errors.push("Null byte detected in path");
293665
293678
  logger.warn("Null byte injection attempt blocked", { input });
@@ -293955,7 +293968,7 @@ var TOOL_FEATURE_MAP = {
293955
293968
  vibecheck_docguard: FEATURE_NAMES.DOCGUARD,
293956
293969
  vibecheck_commitshield: FEATURE_NAMES.COMMIT_SHIELD,
293957
293970
  vibecheck_polish: FEATURE_NAMES.POLISH,
293958
- vibecheck_truthpack: "Truthpack",
293971
+ vibecheck_truthpack: FEATURE_NAMES.TRUTHPACK,
293959
293972
  vibecheck_review: FEATURE_NAMES.COMMIT_SHIELD
293960
293973
  };
293961
293974
  function getToolApiSurface(toolName) {
@@ -294231,6 +294244,84 @@ var MCP_TOOLS = [
294231
294244
  },
294232
294245
  required: ["file"]
294233
294246
  }
294247
+ },
294248
+ // ── Platform Unification Tools ─────────────────────────────────────
294249
+ {
294250
+ name: "vibecheck_trust_score",
294251
+ description: "Get the current/latest trust score for a project. Returns score (0-100), grade, and status (PASSING/WARNING/FAILING). Alias for vibecheck_score with markdown formatting.",
294252
+ inputSchema: {
294253
+ type: "object",
294254
+ properties: {
294255
+ path: { type: "string", description: "Project path. Defaults to current directory." }
294256
+ }
294257
+ }
294258
+ },
294259
+ {
294260
+ name: "vibecheck_findings",
294261
+ description: 'List findings for the current project, filterable by severity, engine, or file path. Supports natural queries like "show me all critical findings in src/api/".',
294262
+ inputSchema: {
294263
+ type: "object",
294264
+ properties: {
294265
+ path: { type: "string", description: "Project path. Defaults to current directory." },
294266
+ severity: { type: "string", enum: ["critical", "high", "medium", "low", "info"], description: "Filter by severity." },
294267
+ engine: { type: "string", description: 'Filter by engine ID (e.g. "phantom_dep", "ghost_route").' },
294268
+ file: { type: "string", description: "Filter findings to a specific file or directory path." }
294269
+ }
294270
+ }
294271
+ },
294272
+ {
294273
+ name: "vibecheck_finding",
294274
+ description: "Get full detail on a specific finding by ID, including evidence, fix suggestion, and dashboard URL.",
294275
+ inputSchema: {
294276
+ type: "object",
294277
+ properties: {
294278
+ id: { type: "string", description: "Finding ID." },
294279
+ path: { type: "string", description: "Project path. Defaults to current directory." }
294280
+ },
294281
+ required: ["id"]
294282
+ }
294283
+ },
294284
+ {
294285
+ name: "vibecheck_dismiss",
294286
+ description: "Dismiss a finding (mark as false positive or acknowledged). Syncs across all surfaces when authenticated.",
294287
+ inputSchema: {
294288
+ type: "object",
294289
+ properties: {
294290
+ id: { type: "string", description: "Finding ID to dismiss." },
294291
+ reason: { type: "string", description: "Reason for dismissal." },
294292
+ path: { type: "string", description: "Project path. Defaults to current directory." }
294293
+ },
294294
+ required: ["id"]
294295
+ }
294296
+ },
294297
+ {
294298
+ name: "vibecheck_history",
294299
+ description: "Get scan history for a project. Returns recent scans with trust scores and finding counts.",
294300
+ inputSchema: {
294301
+ type: "object",
294302
+ properties: {
294303
+ path: { type: "string", description: "Project path. Defaults to current directory." },
294304
+ limit: { type: "number", description: "Max scans to return. Default 10." }
294305
+ }
294306
+ }
294307
+ },
294308
+ {
294309
+ name: "vibecheck_engines",
294310
+ description: "List available scan engines and their descriptions. Shows which engines are active.",
294311
+ inputSchema: {
294312
+ type: "object",
294313
+ properties: {}
294314
+ }
294315
+ },
294316
+ {
294317
+ name: "vibecheck_status",
294318
+ description: "Check auth status, tier, and entitlements. Returns whether the user is authenticated and their current plan.",
294319
+ inputSchema: {
294320
+ type: "object",
294321
+ properties: {
294322
+ path: { type: "string", description: "Workspace root path. Defaults to current directory." }
294323
+ }
294324
+ }
294234
294325
  }
294235
294326
  ];
294236
294327
  function isKnownToolName(toolName) {
@@ -294379,12 +294470,12 @@ function createScanIdempotencyKey(prefix) {
294379
294470
  // src/mcp-scan-meter-client.ts
294380
294471
  var MCP_SCAN_METER_CLIENT = {
294381
294472
  type: "mcp",
294382
- version: "24.5.6"
294473
+ version: "24.5.9"
294383
294474
  };
294384
294475
 
294385
294476
  // src/server.ts
294386
294477
  import { uploadScanToApi } from "@repo/shared/sync/upload-scan";
294387
- var execAsync = promisify(exec);
294478
+ var execFileAsync = promisify(execFile);
294388
294479
  async function executeScan(targetPath, engineToggles = null) {
294389
294480
  const resolved = path9.resolve(targetPath);
294390
294481
  const stat4 = fs6.statSync(resolved);
@@ -294911,6 +295002,216 @@ ${validation.errors.join("\n")}`
294911
295002
  ]
294912
295003
  };
294913
295004
  }
295005
+ // ── Platform Unification Tool Handlers ──────────────────────────────
295006
+ case "vibecheck_trust_score": {
295007
+ const result = await withTimeout(
295008
+ runtime.runScore(targetPath),
295009
+ MCP_TOOL_TIMEOUT_MS,
295010
+ "vibecheck_trust_score"
295011
+ );
295012
+ const status = getTrustScoreStatus(result.score);
295013
+ const emoji = status === "passing" ? "\u2705" : status === "warning" ? "\u26A0\uFE0F" : "\u{1F6A8}";
295014
+ const text = [
295015
+ `## Trust Score`,
295016
+ "",
295017
+ `**${result.score}/100** (${status.toUpperCase()}) ${emoji}`,
295018
+ `**Grade:** ${result.grade}`,
295019
+ `**Decision:** ${result.decision}`,
295020
+ "",
295021
+ `> ${formatTrustScoreMcp(result.score)}`
295022
+ ].join("\n");
295023
+ return { content: [{ type: "text", text }] };
295024
+ }
295025
+ case "vibecheck_findings": {
295026
+ const report = await withTimeout(
295027
+ runtime.runScan(targetPath, { enginePreset: "full" }),
295028
+ MCP_TOOL_TIMEOUT_MS,
295029
+ "vibecheck_findings"
295030
+ );
295031
+ const gatedReport = gateCanonicalScanReportFindings(report, userPlan);
295032
+ let filtered = gatedReport.findings;
295033
+ if (args2.severity) {
295034
+ filtered = filtered.filter((f) => f.severity === args2.severity);
295035
+ }
295036
+ if (args2.engine) {
295037
+ filtered = filtered.filter((f) => f.engine === args2.engine);
295038
+ }
295039
+ if (args2.file) {
295040
+ const fileFilter = args2.file;
295041
+ filtered = filtered.filter((f) => f.file?.includes(fileFilter));
295042
+ }
295043
+ const lines = [
295044
+ `## Findings (${filtered.length} of ${gatedReport.summary.total})`,
295045
+ ""
295046
+ ];
295047
+ for (const f of filtered.slice(0, 50)) {
295048
+ const loc = f.file ? `${f.file}${f.line ? `:${f.line}` : ""}` : "unknown";
295049
+ lines.push(`- **[${f.severity.toUpperCase()}]** ${f.message}`);
295050
+ lines.push(` \`${loc}\` (${f.engine})`);
295051
+ if (f.suggestion) lines.push(` Fix: ${f.suggestion}`);
295052
+ }
295053
+ if (filtered.length > 50) {
295054
+ lines.push("", `_...and ${filtered.length - 50} more findings_`);
295055
+ }
295056
+ return { content: [{ type: "text", text: lines.join("\n") }] };
295057
+ }
295058
+ case "vibecheck_finding": {
295059
+ const findingId = args2.id;
295060
+ if (!findingId) {
295061
+ return buildErrorResponse('vibecheck_finding requires "id"');
295062
+ }
295063
+ const report = await withTimeout(
295064
+ runtime.runScan(targetPath, { enginePreset: "full" }),
295065
+ MCP_TOOL_TIMEOUT_MS,
295066
+ "vibecheck_finding"
295067
+ );
295068
+ const finding = report.findings.find((f) => f.id === findingId);
295069
+ if (!finding) {
295070
+ return buildErrorResponse(`Finding "${findingId}" not found in current scan results.`);
295071
+ }
295072
+ const loc = finding.file ? `${finding.file}${finding.line ? `:${finding.line}` : ""}` : "unknown";
295073
+ const text = [
295074
+ `## Finding: ${finding.message}`,
295075
+ "",
295076
+ `| Field | Value |`,
295077
+ `|-------|-------|`,
295078
+ `| ID | \`${finding.id}\` |`,
295079
+ `| Severity | ${finding.severity.toUpperCase()} |`,
295080
+ `| Engine | ${finding.engine} |`,
295081
+ `| Location | \`${loc}\` |`,
295082
+ `| Confidence | ${finding.confidence ?? "N/A"} |`,
295083
+ finding.suggestion ? `| Suggestion | ${finding.suggestion} |` : "",
295084
+ "",
295085
+ report.runId ? `**Dashboard:** ${dashboardFindingUrl(report.runId, finding.id)}` : ""
295086
+ ].filter(Boolean).join("\n");
295087
+ return { content: [{ type: "text", text }] };
295088
+ }
295089
+ case "vibecheck_dismiss": {
295090
+ const findingId = args2.id;
295091
+ if (!findingId) {
295092
+ return buildErrorResponse('vibecheck_dismiss requires "id"');
295093
+ }
295094
+ const reason = args2.reason ?? "Dismissed via MCP";
295095
+ const token = process.env.VIBECHECK_TOKEN?.trim();
295096
+ if (!token) {
295097
+ return {
295098
+ content: [{
295099
+ type: "text",
295100
+ text: JSON.stringify({
295101
+ ok: false,
295102
+ message: "Authentication required to dismiss findings across surfaces. Set VIBECHECK_TOKEN or run `vibecheck auth login`.",
295103
+ localOnly: true,
295104
+ findingId,
295105
+ reason
295106
+ }, null, 2)
295107
+ }]
295108
+ };
295109
+ }
295110
+ try {
295111
+ const apiBase = process.env.VIBECHECK_API_URL || "https://api.vibecheckai.dev";
295112
+ const resp = await fetch(`${apiBase}/api/v1/findings/${findingId}`, {
295113
+ method: "PATCH",
295114
+ headers: {
295115
+ "Authorization": `Bearer ${token}`,
295116
+ "Content-Type": "application/json"
295117
+ },
295118
+ body: JSON.stringify({ resolved: true })
295119
+ });
295120
+ if (!resp.ok) {
295121
+ return buildErrorResponse(`Failed to dismiss finding: HTTP ${resp.status}`);
295122
+ }
295123
+ return {
295124
+ content: [{
295125
+ type: "text",
295126
+ text: `Finding \`${findingId}\` dismissed. Reason: ${reason}
295127
+ This change is synced across all surfaces.`
295128
+ }]
295129
+ };
295130
+ } catch (err2) {
295131
+ return buildErrorResponse(`Failed to dismiss finding: ${err2 instanceof Error ? err2.message : String(err2)}`);
295132
+ }
295133
+ }
295134
+ case "vibecheck_history": {
295135
+ const token = process.env.VIBECHECK_TOKEN?.trim();
295136
+ if (!token) {
295137
+ return {
295138
+ content: [{
295139
+ type: "text",
295140
+ text: "Scan history requires authentication. Set VIBECHECK_TOKEN or run `vibecheck auth login`."
295141
+ }]
295142
+ };
295143
+ }
295144
+ try {
295145
+ const apiBase = process.env.VIBECHECK_API_URL || "https://api.vibecheckai.dev";
295146
+ const limit = args2.limit ?? 10;
295147
+ const resp = await fetch(`${apiBase}/api/v1/scans/recent?limit=${limit}`, {
295148
+ headers: { "Authorization": `Bearer ${token}` }
295149
+ });
295150
+ if (!resp.ok) {
295151
+ return buildErrorResponse(`Failed to fetch scan history: HTTP ${resp.status}`);
295152
+ }
295153
+ const body2 = await resp.json();
295154
+ const scans = body2.data ?? [];
295155
+ if (scans.length === 0) {
295156
+ return { content: [{ type: "text", text: "No scan history found. Run `vibecheck scan .` to create your first scan." }] };
295157
+ }
295158
+ const lines = [`## Scan History (${scans.length} most recent)`, ""];
295159
+ for (const s of scans) {
295160
+ const status = s.status ?? "unknown";
295161
+ const created = s.createdAt ?? "";
295162
+ const id = s.id ?? "";
295163
+ lines.push(`- **${status}** \u2014 ${created} (\`${id}\`)`);
295164
+ }
295165
+ return { content: [{ type: "text", text: lines.join("\n") }] };
295166
+ } catch (err2) {
295167
+ return buildErrorResponse(`Failed to fetch history: ${err2 instanceof Error ? err2.message : String(err2)}`);
295168
+ }
295169
+ }
295170
+ case "vibecheck_engines": {
295171
+ const engineIds = [
295172
+ "type-contract",
295173
+ "security-pattern",
295174
+ "perf-antipattern",
295175
+ "env_var",
295176
+ "ghost_route",
295177
+ "phantom_dep",
295178
+ "api_truth",
295179
+ "credentials",
295180
+ "security",
295181
+ "framework_packs",
295182
+ "fake_features",
295183
+ "version_hallucination",
295184
+ "logic_gap",
295185
+ "error_handling",
295186
+ "outcome_verification",
295187
+ "incomplete_impl"
295188
+ ];
295189
+ const lines = [
295190
+ `## Available Engines (${engineIds.length})`,
295191
+ "",
295192
+ "| Engine ID | Status |",
295193
+ "|-----------|--------|"
295194
+ ];
295195
+ for (const id of engineIds) {
295196
+ lines.push(`| \`${id}\` | Active |`);
295197
+ }
295198
+ lines.push("", "All engines are included in the free tier.");
295199
+ return { content: [{ type: "text", text: lines.join("\n") }] };
295200
+ }
295201
+ case "vibecheck_status": {
295202
+ const token = process.env.VIBECHECK_TOKEN?.trim();
295203
+ const authenticated = !!token;
295204
+ const text = [
295205
+ `## VibeCheck Status`,
295206
+ "",
295207
+ `**Authenticated:** ${authenticated ? "Yes" : "No"}`,
295208
+ `**Tier:** ${userPlan}`,
295209
+ `**MCP Server:** Active`,
295210
+ "",
295211
+ authenticated ? "All scans are synced to the dashboard." : "Run `vibecheck auth login` to sync scans across devices."
295212
+ ].join("\n");
295213
+ return { content: [{ type: "text", text }] };
295214
+ }
294914
295215
  case "vibecheck_forge":
294915
295216
  case "vibecheck_reality":
294916
295217
  case "vibecheck_ship":
@@ -294926,10 +295227,16 @@ ${validation.errors.join("\n")}`
294926
295227
  case "vibecheck_explain_file":
294927
295228
  case "vibecheck_review": {
294928
295229
  const cmdName = name2.replace("vibecheck_", "");
294929
- const cliArgs = Object.entries(args2).filter(([k]) => k !== "path").map(([k, v]) => `--${k}="${String(v)}"`).join(" ");
295230
+ const cliArgv = [cmdName];
295231
+ for (const [k, v] of Object.entries(args2)) {
295232
+ if (k === "path") continue;
295233
+ cliArgv.push(`--${k}`, String(v));
295234
+ }
294930
295235
  const workDir = targetPath || workspaceRoot;
295236
+ const vibecheckBin = new URL("../node_modules/.bin/vibecheck", import.meta.url).pathname;
295237
+ const binPath = fs6.existsSync(vibecheckBin) ? vibecheckBin : "vibecheck";
294931
295238
  try {
294932
- const { stdout, stderr } = await execAsync(`npx vibecheck ${cmdName} ${cliArgs}`, { cwd: workDir });
295239
+ const { stdout, stderr } = await execFileAsync(binPath, cliArgv, { cwd: workDir });
294933
295240
  return {
294934
295241
  content: [
294935
295242
  {
@@ -294939,7 +295246,8 @@ ${validation.errors.join("\n")}`
294939
295246
  ]
294940
295247
  };
294941
295248
  } catch (error) {
294942
- return buildErrorResponse(`CLI Execution Error: ${error.message || error.stdout || error.stderr || String(error)}`);
295249
+ const err2 = error;
295250
+ return buildErrorResponse(`CLI Execution Error: ${err2.message ?? err2.stdout ?? err2.stderr ?? String(error)}`);
294943
295251
  }
294944
295252
  }
294945
295253
  default:
@@ -294955,7 +295263,7 @@ function createMcpServer(runtimeOverrides = {}) {
294955
295263
  const server2 = new Server(
294956
295264
  {
294957
295265
  name: "vibecheck-mcp",
294958
- version: "2.0.0-alpha"
295266
+ version: "24.5.9"
294959
295267
  },
294960
295268
  {
294961
295269
  capabilities: {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@vibecheck-ai/mcp",
3
- "version": "24.5.6",
3
+ "version": "24.5.9",
4
4
  "description": "The trust layer for AI-generated software. Catches phantom dependencies, ghost API routes, fake SDK methods, and hardcoded secrets — before they ship.",
5
5
  "mcpName": "io.github.guardiavault-oss/vibecheck-mcp",
6
6
  "type": "module",
@@ -8,6 +8,12 @@
8
8
  "access": "public"
9
9
  },
10
10
  "main": "./dist/index.js",
11
+ "exports": {
12
+ ".": {
13
+ "import": "./dist/index.js",
14
+ "types": "./dist/index.d.ts"
15
+ }
16
+ },
11
17
  "keywords": [
12
18
  "vibecheck",
13
19
  "mcp",
@@ -29,7 +35,10 @@
29
35
  "url": "https://github.com/vibecheck-oss/vibecheck/issues"
30
36
  },
31
37
  "files": [
32
- "dist/index.js"
38
+ "dist/index.js",
39
+ "dist/index.d.ts",
40
+ "dist/index.d.ts.map",
41
+ "dist/*.node"
33
42
  ],
34
43
  "bin": {
35
44
  "vibecheck-mcp": "./dist/index.js"