@vibecheckai/cli 3.5.1 → 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 +406 -154
- package/bin/runners/context/analyzer.js +52 -1
- package/bin/runners/context/generators/mcp.js +15 -13
- package/bin/runners/context/git-context.js +3 -1
- package/bin/runners/context/proof-context.js +248 -1
- package/bin/runners/context/team-conventions.js +33 -7
- package/bin/runners/lib/agent-firewall/ai/false-positive-analyzer.js +474 -0
- package/bin/runners/lib/agent-firewall/change-packet/builder.js +488 -0
- package/bin/runners/lib/agent-firewall/change-packet/schema.json +228 -0
- package/bin/runners/lib/agent-firewall/change-packet/store.js +200 -0
- package/bin/runners/lib/agent-firewall/claims/claim-types.js +21 -0
- package/bin/runners/lib/agent-firewall/claims/extractor.js +303 -0
- package/bin/runners/lib/agent-firewall/claims/patterns.js +24 -0
- package/bin/runners/lib/agent-firewall/critic/index.js +151 -0
- package/bin/runners/lib/agent-firewall/critic/judge.js +432 -0
- package/bin/runners/lib/agent-firewall/critic/prompts.js +305 -0
- package/bin/runners/lib/agent-firewall/evidence/auth-evidence.js +88 -0
- package/bin/runners/lib/agent-firewall/evidence/contract-evidence.js +75 -0
- package/bin/runners/lib/agent-firewall/evidence/env-evidence.js +127 -0
- package/bin/runners/lib/agent-firewall/evidence/resolver.js +102 -0
- package/bin/runners/lib/agent-firewall/evidence/route-evidence.js +213 -0
- package/bin/runners/lib/agent-firewall/evidence/side-effect-evidence.js +145 -0
- package/bin/runners/lib/agent-firewall/fs-hook/daemon.js +19 -0
- package/bin/runners/lib/agent-firewall/fs-hook/installer.js +87 -0
- package/bin/runners/lib/agent-firewall/fs-hook/watcher.js +184 -0
- package/bin/runners/lib/agent-firewall/git-hook/pre-commit.js +163 -0
- package/bin/runners/lib/agent-firewall/ide-extension/cursor.js +107 -0
- package/bin/runners/lib/agent-firewall/ide-extension/vscode.js +68 -0
- package/bin/runners/lib/agent-firewall/ide-extension/windsurf.js +66 -0
- package/bin/runners/lib/agent-firewall/interceptor/base.js +304 -0
- package/bin/runners/lib/agent-firewall/interceptor/cursor.js +35 -0
- package/bin/runners/lib/agent-firewall/interceptor/vscode.js +35 -0
- package/bin/runners/lib/agent-firewall/interceptor/windsurf.js +34 -0
- package/bin/runners/lib/agent-firewall/lawbook/distributor.js +465 -0
- package/bin/runners/lib/agent-firewall/lawbook/evaluator.js +604 -0
- package/bin/runners/lib/agent-firewall/lawbook/index.js +304 -0
- package/bin/runners/lib/agent-firewall/lawbook/registry.js +514 -0
- package/bin/runners/lib/agent-firewall/lawbook/schema.js +420 -0
- package/bin/runners/lib/agent-firewall/logger.js +141 -0
- package/bin/runners/lib/agent-firewall/policy/default-policy.json +90 -0
- package/bin/runners/lib/agent-firewall/policy/engine.js +103 -0
- package/bin/runners/lib/agent-firewall/policy/loader.js +451 -0
- package/bin/runners/lib/agent-firewall/policy/rules/auth-drift.js +50 -0
- package/bin/runners/lib/agent-firewall/policy/rules/contract-drift.js +50 -0
- package/bin/runners/lib/agent-firewall/policy/rules/fake-success.js +86 -0
- package/bin/runners/lib/agent-firewall/policy/rules/ghost-env.js +162 -0
- package/bin/runners/lib/agent-firewall/policy/rules/ghost-route.js +189 -0
- package/bin/runners/lib/agent-firewall/policy/rules/scope.js +93 -0
- package/bin/runners/lib/agent-firewall/policy/rules/unsafe-side-effect.js +57 -0
- package/bin/runners/lib/agent-firewall/policy/schema.json +183 -0
- package/bin/runners/lib/agent-firewall/policy/verdict.js +54 -0
- package/bin/runners/lib/agent-firewall/proposal/extractor.js +394 -0
- package/bin/runners/lib/agent-firewall/proposal/index.js +212 -0
- package/bin/runners/lib/agent-firewall/proposal/schema.js +251 -0
- package/bin/runners/lib/agent-firewall/proposal/validator.js +386 -0
- package/bin/runners/lib/agent-firewall/reality/index.js +332 -0
- package/bin/runners/lib/agent-firewall/reality/state.js +625 -0
- package/bin/runners/lib/agent-firewall/reality/watcher.js +322 -0
- package/bin/runners/lib/agent-firewall/risk/index.js +173 -0
- package/bin/runners/lib/agent-firewall/risk/scorer.js +328 -0
- package/bin/runners/lib/agent-firewall/risk/thresholds.js +321 -0
- package/bin/runners/lib/agent-firewall/risk/vectors.js +421 -0
- package/bin/runners/lib/agent-firewall/simulator/diff-simulator.js +472 -0
- package/bin/runners/lib/agent-firewall/simulator/import-resolver.js +346 -0
- package/bin/runners/lib/agent-firewall/simulator/index.js +181 -0
- package/bin/runners/lib/agent-firewall/simulator/route-validator.js +380 -0
- package/bin/runners/lib/agent-firewall/time-machine/incident-correlator.js +661 -0
- package/bin/runners/lib/agent-firewall/time-machine/index.js +267 -0
- package/bin/runners/lib/agent-firewall/time-machine/replay-engine.js +436 -0
- package/bin/runners/lib/agent-firewall/time-machine/state-reconstructor.js +490 -0
- package/bin/runners/lib/agent-firewall/time-machine/timeline-builder.js +530 -0
- package/bin/runners/lib/agent-firewall/truthpack/index.js +67 -0
- package/bin/runners/lib/agent-firewall/truthpack/loader.js +137 -0
- package/bin/runners/lib/agent-firewall/unblock/planner.js +337 -0
- package/bin/runners/lib/agent-firewall/utils/ignore-checker.js +118 -0
- package/bin/runners/lib/analysis-core.js +220 -182
- package/bin/runners/lib/analyzers.js +2145 -224
- package/bin/runners/lib/api-client.js +269 -0
- package/bin/runners/lib/authority-badge.js +425 -0
- package/bin/runners/lib/cli-output.js +242 -210
- package/bin/runners/lib/default-config.js +127 -0
- package/bin/runners/lib/detectors-v2.js +547 -785
- 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 +190 -0
- package/bin/runners/lib/engines/api-consistency-engine.js +162 -0
- package/bin/runners/lib/engines/ast-cache.js +99 -0
- package/bin/runners/lib/engines/code-quality-engine.js +255 -0
- package/bin/runners/lib/engines/console-logs-engine.js +115 -0
- package/bin/runners/lib/engines/cross-file-analysis-engine.js +268 -0
- package/bin/runners/lib/engines/dead-code-engine.js +198 -0
- package/bin/runners/lib/engines/deprecated-api-engine.js +226 -0
- package/bin/runners/lib/engines/empty-catch-engine.js +150 -0
- package/bin/runners/lib/engines/file-filter.js +131 -0
- package/bin/runners/lib/engines/hardcoded-secrets-engine.js +251 -0
- package/bin/runners/lib/engines/mock-data-engine.js +272 -0
- package/bin/runners/lib/engines/parallel-processor.js +71 -0
- package/bin/runners/lib/engines/performance-issues-engine.js +265 -0
- package/bin/runners/lib/engines/security-vulnerabilities-engine.js +243 -0
- package/bin/runners/lib/engines/todo-fixme-engine.js +115 -0
- package/bin/runners/lib/engines/type-aware-engine.js +152 -0
- package/bin/runners/lib/engines/unsafe-regex-engine.js +225 -0
- package/bin/runners/lib/engines/vibecheck-engines/README.md +53 -0
- package/bin/runners/lib/engines/vibecheck-engines/index.js +15 -0
- 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 +139 -0
- 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/engines/vibecheck-engines/package.json +13 -0
- package/bin/runners/lib/entitlements-v2.js +152 -446
- package/bin/runners/lib/error-handler.js +60 -12
- package/bin/runners/lib/error-messages.js +289 -0
- package/bin/runners/lib/evidence-pack.js +7 -1
- package/bin/runners/lib/exit-codes.js +275 -0
- package/bin/runners/lib/finding-id.js +69 -0
- package/bin/runners/lib/finding-sorter.js +89 -0
- package/bin/runners/lib/fingerprint.js +377 -0
- package/bin/runners/lib/global-flags.js +37 -0
- package/bin/runners/lib/help-formatter.js +413 -0
- package/bin/runners/lib/logger.js +38 -0
- 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/route-truth.js +1167 -322
- package/bin/runners/lib/scan-output.js +504 -463
- 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 +239 -0
- package/bin/runners/lib/ship-output.js +328 -31
- package/bin/runners/lib/terminal-ui.js +234 -731
- package/bin/runners/lib/truth.js +1332 -308
- package/bin/runners/lib/unified-cli-output.js +604 -0
- package/bin/runners/lib/unified-output.js +163 -155
- package/bin/runners/lib/upsell.js +104 -204
- package/bin/runners/runAgent.d.ts +5 -0
- package/bin/runners/runAgent.js +161 -0
- package/bin/runners/runAllowlist.js +166 -101
- package/bin/runners/runApprove.js +1200 -0
- package/bin/runners/runAuth.js +373 -95
- package/bin/runners/runCheckpoint.js +59 -21
- package/bin/runners/runClassify.js +926 -0
- package/bin/runners/runContext.d.ts +4 -0
- package/bin/runners/runContext.js +136 -24
- package/bin/runners/runDoctor.js +115 -67
- package/bin/runners/runEvidencePack.js +239 -96
- package/bin/runners/runFirewall.d.ts +5 -0
- package/bin/runners/runFirewall.js +134 -0
- package/bin/runners/runFirewallHook.d.ts +5 -0
- package/bin/runners/runFirewallHook.js +56 -0
- package/bin/runners/runFix.js +6 -5
- package/bin/runners/runGuard.js +212 -118
- package/bin/runners/runInit.js +66 -21
- package/bin/runners/runLabs.js +204 -121
- package/bin/runners/runMcp.js +131 -60
- package/bin/runners/runPolish.d.ts +4 -0
- package/bin/runners/runPolish.js +43 -20
- package/bin/runners/runProof.zip +0 -0
- package/bin/runners/runProve.js +15 -5
- package/bin/runners/runQuickstart.js +531 -0
- package/bin/runners/runReality.js +14 -0
- package/bin/runners/runReport.js +36 -4
- package/bin/runners/runScan.js +689 -91
- package/bin/runners/runShip.js +96 -40
- package/bin/runners/runTruth.d.ts +5 -0
- package/bin/runners/runTruth.js +101 -0
- package/bin/runners/runValidate.js +21 -4
- package/bin/runners/runWatch.js +118 -54
- package/bin/scan.js +6 -1
- package/bin/vibecheck.js +297 -52
- package/mcp-server/HARDENING_SUMMARY.md +299 -0
- package/mcp-server/agent-firewall-interceptor.js +500 -0
- package/mcp-server/authority-tools.js +569 -0
- package/mcp-server/conductor/conflict-resolver.js +588 -0
- package/mcp-server/conductor/execution-planner.js +544 -0
- package/mcp-server/conductor/index.js +377 -0
- package/mcp-server/conductor/lock-manager.js +615 -0
- package/mcp-server/conductor/request-queue.js +550 -0
- package/mcp-server/conductor/session-manager.js +500 -0
- package/mcp-server/conductor/tools.js +510 -0
- package/mcp-server/deprecation-middleware.js +282 -0
- package/mcp-server/handlers/index.ts +15 -0
- package/mcp-server/handlers/tool-handler.ts +474 -591
- package/mcp-server/index.js +1748 -1099
- package/mcp-server/lib/api-client.cjs +13 -0
- package/mcp-server/lib/cache-wrapper.cjs +383 -0
- package/mcp-server/lib/error-envelope.js +138 -0
- package/mcp-server/lib/executor.ts +428 -721
- package/mcp-server/lib/index.ts +19 -0
- package/mcp-server/lib/logger.cjs +30 -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 +342 -284
- package/mcp-server/lib/types.ts +267 -0
- package/mcp-server/logger.js +173 -0
- package/mcp-server/package.json +11 -27
- package/mcp-server/premium-tools.js +2 -2
- package/mcp-server/registry/tool-registry.js +794 -0
- package/mcp-server/registry/tools.json +507 -378
- package/mcp-server/registry.test.ts +334 -0
- package/mcp-server/tests/tier-gating.test.js +297 -0
- package/mcp-server/tier-auth.js +492 -347
- package/mcp-server/tools-v3.js +950 -0
- package/mcp-server/truth-context.js +131 -90
- package/mcp-server/truth-firewall-tools.js +1612 -1001
- package/mcp-server/tsconfig.json +8 -5
- package/mcp-server/vibecheck-2.0-tools.js +14 -1
- package/mcp-server/vibecheck-mcp-server-3.2.0.tgz +0 -0
- package/mcp-server/vibecheck-tools.js +2 -2
- package/package.json +4 -3
- package/bin/runners/runInstall.js +0 -281
- package/mcp-server/ARCHITECTURE.md +0 -339
- package/mcp-server/__tests__/cache.test.ts +0 -313
- package/mcp-server/__tests__/executor.test.ts +0 -239
- package/mcp-server/__tests__/fixtures/exclusion-test/.cache/webpack/cache.pack +0 -1
- package/mcp-server/__tests__/fixtures/exclusion-test/.next/server/chunk.js +0 -3
- package/mcp-server/__tests__/fixtures/exclusion-test/.turbo/cache.json +0 -3
- package/mcp-server/__tests__/fixtures/exclusion-test/.venv/lib/env.py +0 -3
- package/mcp-server/__tests__/fixtures/exclusion-test/dist/bundle.js +0 -3
- package/mcp-server/__tests__/fixtures/exclusion-test/package.json +0 -5
- package/mcp-server/__tests__/fixtures/exclusion-test/src/app.ts +0 -5
- package/mcp-server/__tests__/fixtures/exclusion-test/venv/lib/config.py +0 -4
- package/mcp-server/__tests__/ids.test.ts +0 -345
- package/mcp-server/__tests__/integration/tools.test.ts +0 -410
- package/mcp-server/__tests__/registry.test.ts +0 -365
- package/mcp-server/__tests__/sandbox.test.ts +0 -323
- package/mcp-server/__tests__/schemas.test.ts +0 -372
- package/mcp-server/benchmarks/run-benchmarks.ts +0 -304
- package/mcp-server/examples/doctor.request.json +0 -14
- package/mcp-server/examples/doctor.response.json +0 -53
- package/mcp-server/examples/error.response.json +0 -15
- package/mcp-server/examples/scan.request.json +0 -14
- package/mcp-server/examples/scan.response.json +0 -108
- package/mcp-server/index-v3.ts +0 -293
- package/mcp-server/index.old.js +0 -4137
- package/mcp-server/lib/cache.ts +0 -341
- package/mcp-server/lib/errors.ts +0 -346
- package/mcp-server/lib/ids.ts +0 -238
- package/mcp-server/lib/logger.ts +0 -368
- package/mcp-server/lib/metrics.ts +0 -365
- package/mcp-server/lib/validator.ts +0 -229
- package/mcp-server/package-lock.json +0 -165
- package/mcp-server/schemas/error-envelope.schema.json +0 -125
- package/mcp-server/schemas/finding.schema.json +0 -167
- package/mcp-server/schemas/report-artifact.schema.json +0 -88
- package/mcp-server/schemas/run-request.schema.json +0 -75
- package/mcp-server/schemas/verdict.schema.json +0 -168
- package/mcp-server/tier-auth.d.ts +0 -71
- package/mcp-server/vitest.config.ts +0 -16
package/bin/runners/runGuard.js
CHANGED
|
@@ -1,73 +1,127 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* vibecheck guard - Unified trust boundary enforcement
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
* vibecheck guard # Run all checks
|
|
8
|
-
* vibecheck guard --claims # Verify AI claims against truthpack
|
|
9
|
-
* vibecheck guard --prompts # Check for prompt injection
|
|
10
|
-
* vibecheck guard --hallucinations # Detect AI hallucination patterns
|
|
4
|
+
* ═══════════════════════════════════════════════════════════════════════════════
|
|
5
|
+
* World-Class AI Guardrails
|
|
6
|
+
* ═══════════════════════════════════════════════════════════════════════════════
|
|
11
7
|
*/
|
|
12
8
|
|
|
13
9
|
const path = require("path");
|
|
14
10
|
const fs = require("fs");
|
|
11
|
+
const { parseGlobalFlags, shouldSuppressOutput, isJsonMode } = require("./lib/global-flags");
|
|
12
|
+
const { EXIT } = require("./lib/exit-codes");
|
|
13
|
+
const {
|
|
14
|
+
ansi,
|
|
15
|
+
sym,
|
|
16
|
+
renderMinimalHeader,
|
|
17
|
+
renderSectionHeader,
|
|
18
|
+
renderVerdict,
|
|
19
|
+
renderSuccess,
|
|
20
|
+
renderError,
|
|
21
|
+
renderWarning,
|
|
22
|
+
renderFooter,
|
|
23
|
+
Spinner,
|
|
24
|
+
getTierFromKey,
|
|
25
|
+
} = require("./lib/unified-cli-output");
|
|
15
26
|
|
|
16
27
|
// Import underlying implementations
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
red: "\x1b[31m",
|
|
29
|
-
magenta: "\x1b[35m",
|
|
30
|
-
};
|
|
28
|
+
let runValidate, runPromptFirewall;
|
|
29
|
+
try {
|
|
30
|
+
runValidate = require("./runValidate").runValidate;
|
|
31
|
+
} catch {
|
|
32
|
+
runValidate = null;
|
|
33
|
+
}
|
|
34
|
+
try {
|
|
35
|
+
runPromptFirewall = require("./runPromptFirewall").runPromptFirewall;
|
|
36
|
+
} catch {
|
|
37
|
+
runPromptFirewall = null;
|
|
38
|
+
}
|
|
31
39
|
|
|
32
40
|
function printHelp() {
|
|
33
41
|
console.log(`
|
|
34
|
-
${
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
${
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
42
|
+
${ansi.bold}USAGE${ansi.reset}
|
|
43
|
+
${ansi.cyan}vibecheck guard${ansi.reset} [options]
|
|
44
|
+
|
|
45
|
+
${ansi.dim}Aliases: ai-guard, firewall, validate${ansi.reset}
|
|
46
|
+
|
|
47
|
+
Validate AI-generated code and prompts. Detects prompt injection attempts,
|
|
48
|
+
verifies claims against your codebase (hallucination checking), and ensures
|
|
49
|
+
AI outputs meet your standards.
|
|
50
|
+
|
|
51
|
+
${ansi.bold}CHECK MODES${ansi.reset}
|
|
52
|
+
${ansi.cyan}--claims${ansi.reset} Verify AI claims against truthpack
|
|
53
|
+
${ansi.cyan}--prompts${ansi.reset} Check code for prompt injection
|
|
54
|
+
${ansi.cyan}--hallucinations${ansi.reset} Detect AI hallucination patterns
|
|
55
|
+
${ansi.dim}(default: run all checks)${ansi.reset}
|
|
56
|
+
|
|
57
|
+
${ansi.bold}OPTIONS${ansi.reset}
|
|
58
|
+
${ansi.cyan}--file <path>${ansi.reset} Check specific file(s)
|
|
59
|
+
${ansi.cyan}--strict${ansi.reset} Fail on warnings (default: fail on errors only)
|
|
60
|
+
${ansi.cyan}--json${ansi.reset} Output as JSON (CI integration)
|
|
61
|
+
${ansi.cyan}--quiet, -q${ansi.reset} Suppress non-essential output
|
|
62
|
+
${ansi.cyan}--help, -h${ansi.reset} Show this help
|
|
63
|
+
|
|
64
|
+
${ansi.bold}EXAMPLES${ansi.reset}
|
|
65
|
+
${ansi.dim}# Run all guardrail checks${ansi.reset}
|
|
66
|
+
vibecheck guard
|
|
67
|
+
|
|
68
|
+
${ansi.dim}# Verify AI claims in specific file${ansi.reset}
|
|
69
|
+
vibecheck guard --claims --file api.ts
|
|
70
|
+
|
|
71
|
+
${ansi.dim}# Prompt injection scan only${ansi.reset}
|
|
72
|
+
vibecheck guard --prompts
|
|
73
|
+
|
|
74
|
+
${ansi.dim}# CI pipeline (strict, JSON output)${ansi.reset}
|
|
75
|
+
vibecheck guard --strict --json
|
|
76
|
+
|
|
77
|
+
${ansi.bold}EXIT CODES${ansi.reset}
|
|
78
|
+
0 All checks passed
|
|
79
|
+
1 Warnings found (non-blocking)
|
|
80
|
+
2 Errors found (blocking issues)
|
|
81
|
+
|
|
82
|
+
${ansi.dim}────────────────────────────────────────────────────────────────────${ansi.reset}
|
|
83
|
+
${ansi.dim}Documentation: https://docs.vibecheckai.dev/cli/guard${ansi.reset}
|
|
56
84
|
`);
|
|
57
85
|
}
|
|
58
86
|
|
|
59
87
|
async function runGuard(args = []) {
|
|
88
|
+
const { flags: globalFlags } = parseGlobalFlags(args);
|
|
89
|
+
const quiet = shouldSuppressOutput(globalFlags);
|
|
90
|
+
const json = isJsonMode(globalFlags) || args.includes("--json");
|
|
91
|
+
const startTime = Date.now();
|
|
92
|
+
|
|
60
93
|
// Parse arguments
|
|
61
|
-
if (args.includes("--help") || args.includes("-h")) {
|
|
94
|
+
if (globalFlags.help || args.includes("--help") || args.includes("-h")) {
|
|
62
95
|
printHelp();
|
|
63
|
-
return
|
|
96
|
+
return EXIT.SUCCESS;
|
|
64
97
|
}
|
|
65
98
|
|
|
66
99
|
const runClaims = args.includes("--claims") || (!args.includes("--prompts") && !args.includes("--hallucinations"));
|
|
67
100
|
const runPrompts = args.includes("--prompts") || (!args.includes("--claims") && !args.includes("--hallucinations"));
|
|
68
101
|
const runHallucinations = args.includes("--hallucinations") || (!args.includes("--claims") && !args.includes("--prompts"));
|
|
69
|
-
const jsonOutput = args.includes("--json");
|
|
70
102
|
const strict = args.includes("--strict");
|
|
103
|
+
|
|
104
|
+
// Validate --file if provided
|
|
105
|
+
const fileIndex = args.indexOf("--file");
|
|
106
|
+
if (fileIndex !== -1) {
|
|
107
|
+
const filePath = args[fileIndex + 1];
|
|
108
|
+
if (!filePath || filePath.startsWith("--")) {
|
|
109
|
+
if (json) {
|
|
110
|
+
console.log(JSON.stringify({ success: false, error: "--file requires a path argument" }));
|
|
111
|
+
} else {
|
|
112
|
+
renderError("--file requires a path argument");
|
|
113
|
+
}
|
|
114
|
+
return EXIT.USER_ERROR;
|
|
115
|
+
}
|
|
116
|
+
if (!fs.existsSync(filePath)) {
|
|
117
|
+
if (json) {
|
|
118
|
+
console.log(JSON.stringify({ success: false, error: `File not found: ${filePath}` }));
|
|
119
|
+
} else {
|
|
120
|
+
renderError(`File not found: ${filePath}`);
|
|
121
|
+
}
|
|
122
|
+
return EXIT.NOT_FOUND;
|
|
123
|
+
}
|
|
124
|
+
}
|
|
71
125
|
|
|
72
126
|
const results = {
|
|
73
127
|
claims: null,
|
|
@@ -78,91 +132,131 @@ async function runGuard(args = []) {
|
|
|
78
132
|
warnings: 0,
|
|
79
133
|
};
|
|
80
134
|
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
135
|
+
try {
|
|
136
|
+
if (!quiet && !json) {
|
|
137
|
+
renderMinimalHeader("guard", "starter");
|
|
138
|
+
renderSectionHeader("Trust Boundary Checks", sym.shield);
|
|
139
|
+
}
|
|
86
140
|
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
141
|
+
// Run claims verification
|
|
142
|
+
if (runClaims) {
|
|
143
|
+
const spinner = !quiet && !json ? new Spinner("Verifying AI claims against truthpack").start() : null;
|
|
144
|
+
|
|
145
|
+
if (!runValidate) {
|
|
146
|
+
results.claims = { skipped: true, reason: "Validator module not available" };
|
|
147
|
+
spinner?.warn("Claims check skipped: module not available");
|
|
148
|
+
} else {
|
|
149
|
+
try {
|
|
150
|
+
const validateArgs = args.filter(a => !["--claims", "--prompts", "--hallucinations"].includes(a));
|
|
151
|
+
const exitCode = await runValidate(validateArgs);
|
|
152
|
+
results.claims = { exitCode, status: exitCode === 0 ? "pass" : "fail" };
|
|
153
|
+
if (exitCode !== 0) {
|
|
154
|
+
results.errors++;
|
|
155
|
+
results.verdict = "FAIL";
|
|
156
|
+
spinner?.fail("Claim verification failed");
|
|
157
|
+
} else {
|
|
158
|
+
spinner?.succeed("Claims verified");
|
|
159
|
+
}
|
|
160
|
+
} catch (e) {
|
|
161
|
+
results.claims = { error: e.message };
|
|
162
|
+
spinner?.warn(`Claims check failed: ${e.message}`);
|
|
163
|
+
}
|
|
97
164
|
}
|
|
98
|
-
console.log(exitCode === 0
|
|
99
|
-
? ` ${c.green}✓${c.reset} Claims verified`
|
|
100
|
-
: ` ${c.red}✗${c.reset} Claim verification failed`);
|
|
101
|
-
} catch (e) {
|
|
102
|
-
results.claims = { error: e.message };
|
|
103
|
-
console.log(` ${c.yellow}⚠${c.reset} Claims check skipped: ${e.message}`);
|
|
104
165
|
}
|
|
105
|
-
}
|
|
106
166
|
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
167
|
+
// Run prompt injection detection
|
|
168
|
+
if (runPrompts) {
|
|
169
|
+
const spinner = !quiet && !json ? new Spinner("Scanning for prompt injection vulnerabilities").start() : null;
|
|
170
|
+
|
|
171
|
+
if (!runPromptFirewall) {
|
|
172
|
+
results.prompts = { skipped: true, reason: "Firewall module not available" };
|
|
173
|
+
spinner?.warn("Prompt check skipped: module not available");
|
|
174
|
+
} else {
|
|
175
|
+
try {
|
|
176
|
+
const firewallArgs = args.filter(a => !["--claims", "--prompts", "--hallucinations"].includes(a));
|
|
177
|
+
const exitCode = await runPromptFirewall(firewallArgs);
|
|
178
|
+
results.prompts = { exitCode, status: exitCode === 0 ? "pass" : "fail" };
|
|
179
|
+
if (exitCode !== 0) {
|
|
180
|
+
results.warnings++;
|
|
181
|
+
if (strict) results.verdict = "FAIL";
|
|
182
|
+
spinner?.warn("Prompt injection risks detected");
|
|
183
|
+
} else {
|
|
184
|
+
spinner?.succeed("No prompt injection risks");
|
|
185
|
+
}
|
|
186
|
+
} catch (e) {
|
|
187
|
+
results.prompts = { error: e.message };
|
|
188
|
+
spinner?.warn(`Prompt check failed: ${e.message}`);
|
|
189
|
+
}
|
|
117
190
|
}
|
|
118
|
-
console.log(exitCode === 0
|
|
119
|
-
? ` ${c.green}✓${c.reset} No prompt injection risks`
|
|
120
|
-
: ` ${c.yellow}⚠${c.reset} Prompt injection risks detected`);
|
|
121
|
-
} catch (e) {
|
|
122
|
-
results.prompts = { error: e.message };
|
|
123
|
-
console.log(` ${c.yellow}⚠${c.reset} Prompt check skipped: ${e.message}`);
|
|
124
191
|
}
|
|
125
|
-
}
|
|
126
192
|
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
193
|
+
// Run hallucination detection
|
|
194
|
+
if (runHallucinations) {
|
|
195
|
+
const spinner = !quiet && !json ? new Spinner("Detecting hallucination patterns").start() : null;
|
|
196
|
+
|
|
197
|
+
if (!runValidate) {
|
|
198
|
+
results.hallucinations = { skipped: true, reason: "Validator module not available" };
|
|
199
|
+
spinner?.warn("Hallucination check skipped: module not available");
|
|
200
|
+
} else {
|
|
201
|
+
try {
|
|
202
|
+
const validateArgs = ["--hallucinations", ...args.filter(a => !["--claims", "--prompts", "--hallucinations"].includes(a))];
|
|
203
|
+
const exitCode = await runValidate(validateArgs);
|
|
204
|
+
results.hallucinations = { exitCode, status: exitCode === 0 ? "pass" : "fail" };
|
|
205
|
+
if (exitCode !== 0) {
|
|
206
|
+
results.warnings++;
|
|
207
|
+
if (strict) results.verdict = "FAIL";
|
|
208
|
+
spinner?.warn("Potential hallucinations detected");
|
|
209
|
+
} else {
|
|
210
|
+
spinner?.succeed("No hallucination patterns");
|
|
211
|
+
}
|
|
212
|
+
} catch (e) {
|
|
213
|
+
results.hallucinations = { error: e.message };
|
|
214
|
+
spinner?.warn(`Hallucination check failed: ${e.message}`);
|
|
215
|
+
}
|
|
138
216
|
}
|
|
139
|
-
console.log(exitCode === 0
|
|
140
|
-
? ` ${c.green}✓${c.reset} No hallucination patterns`
|
|
141
|
-
: ` ${c.yellow}⚠${c.reset} Potential hallucinations detected`);
|
|
142
|
-
} catch (e) {
|
|
143
|
-
results.hallucinations = { error: e.message };
|
|
144
|
-
console.log(` ${c.yellow}⚠${c.reset} Hallucination check skipped: ${e.message}`);
|
|
145
217
|
}
|
|
146
|
-
}
|
|
147
218
|
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
219
|
+
// Summary
|
|
220
|
+
const duration = Date.now() - startTime;
|
|
221
|
+
|
|
222
|
+
if (!quiet && !json) {
|
|
223
|
+
renderVerdict(results.verdict === "PASS" ? "PASS" : "FAIL", {
|
|
224
|
+
warnings: results.warnings,
|
|
225
|
+
critical: results.errors,
|
|
226
|
+
duration,
|
|
227
|
+
});
|
|
228
|
+
|
|
229
|
+
renderFooter({
|
|
230
|
+
nextSteps: results.verdict === "PASS" ? [
|
|
231
|
+
{ cmd: "vibecheck scan", desc: "run full code analysis" },
|
|
232
|
+
{ cmd: "vibecheck ship", desc: "get ship verdict" },
|
|
233
|
+
] : [
|
|
234
|
+
{ cmd: "vibecheck fix --plan-only", desc: "view fix recommendations" },
|
|
235
|
+
],
|
|
236
|
+
docsUrl: "https://docs.vibecheckai.dev/cli/guard",
|
|
237
|
+
});
|
|
238
|
+
}
|
|
157
239
|
|
|
158
|
-
|
|
159
|
-
|
|
240
|
+
if (json) {
|
|
241
|
+
console.log(JSON.stringify({ ...results, duration }, null, 2));
|
|
242
|
+
}
|
|
160
243
|
|
|
161
|
-
|
|
162
|
-
|
|
244
|
+
// Return appropriate exit code
|
|
245
|
+
if (results.verdict === "PASS") {
|
|
246
|
+
return EXIT.SUCCESS;
|
|
247
|
+
} else if (results.errors > 0) {
|
|
248
|
+
return EXIT.BLOCKING;
|
|
249
|
+
} else {
|
|
250
|
+
return EXIT.WARNINGS;
|
|
251
|
+
}
|
|
252
|
+
} catch (error) {
|
|
253
|
+
if (json) {
|
|
254
|
+
console.log(JSON.stringify({ success: false, error: error.message }));
|
|
255
|
+
} else {
|
|
256
|
+
renderError(`Guard check failed: ${error.message}`);
|
|
257
|
+
}
|
|
258
|
+
return EXIT.INTERNAL_ERROR;
|
|
163
259
|
}
|
|
164
|
-
|
|
165
|
-
return results.verdict === "PASS" ? 0 : (results.errors > 0 ? 2 : 1);
|
|
166
260
|
}
|
|
167
261
|
|
|
168
262
|
module.exports = { runGuard };
|
package/bin/runners/runInit.js
CHANGED
|
@@ -12,6 +12,7 @@
|
|
|
12
12
|
const fs = require("fs");
|
|
13
13
|
const path = require("path");
|
|
14
14
|
const { parseGlobalFlags, shouldShowBanner } = require("./lib/global-flags");
|
|
15
|
+
const { EXIT } = require("./lib/exit-codes");
|
|
15
16
|
|
|
16
17
|
// Use enhanced wizard if available
|
|
17
18
|
let InitWizard;
|
|
@@ -693,8 +694,8 @@ async function runRepairMode(targetDir, projectName, opts) {
|
|
|
693
694
|
if (!opts.dryRun) {
|
|
694
695
|
startSpinner('Generating truthpack...', colors.accent);
|
|
695
696
|
try {
|
|
696
|
-
const {
|
|
697
|
-
await
|
|
697
|
+
const { runContext } = require("./runContext");
|
|
698
|
+
await runContext(["--path", targetDir, "--quiet"]);
|
|
698
699
|
stopSpinner('Truthpack generated', true);
|
|
699
700
|
fixes.push("Generated: .vibecheck/truthpack.json");
|
|
700
701
|
} catch (e) {
|
|
@@ -1054,6 +1055,17 @@ function printNextSteps(options = {}) {
|
|
|
1054
1055
|
console.log();
|
|
1055
1056
|
console.log(` ${c.dim}Full docs:${c.reset} ${colors.info}https://docs.vibecheckai.dev${c.reset}`);
|
|
1056
1057
|
console.log();
|
|
1058
|
+
|
|
1059
|
+
// Upsell box
|
|
1060
|
+
console.log(` ${c.dim}╭────────────────────────────────────────────────────────────╮${c.reset}`);
|
|
1061
|
+
console.log(` ${c.dim}│${c.reset} ${c.dim}│${c.reset}`);
|
|
1062
|
+
console.log(` ${c.dim}│${c.reset} ${colors.accent}⚡ STARTER${c.reset} ${c.dim}•${c.reset} AI-powered fixes, GitHub CI, MCP tools ${c.dim}│${c.reset}`);
|
|
1063
|
+
console.log(` ${c.dim}│${c.reset} ${colors.accent}🏆 PRO${c.reset} ${c.dim}•${c.reset} Runtime proof, verified badges, AI testing ${c.dim}│${c.reset}`);
|
|
1064
|
+
console.log(` ${c.dim}│${c.reset} ${c.dim}│${c.reset}`);
|
|
1065
|
+
console.log(` ${c.dim}│${c.reset} ${colors.info}vibecheck login${c.reset} ${c.dim}to upgrade • vibecheck.dev/pricing${c.reset} ${c.dim}│${c.reset}`);
|
|
1066
|
+
console.log(` ${c.dim}│${c.reset} ${c.dim}│${c.reset}`);
|
|
1067
|
+
console.log(` ${c.dim}╰────────────────────────────────────────────────────────────╯${c.reset}`);
|
|
1068
|
+
console.log();
|
|
1057
1069
|
}
|
|
1058
1070
|
|
|
1059
1071
|
// ═══════════════════════════════════════════════════════════════════════════════
|
|
@@ -1398,13 +1410,17 @@ async function runLocalSetup(targetDir, projectName, opts, filesCreated) {
|
|
|
1398
1410
|
if (!opts.dryRun) {
|
|
1399
1411
|
startSpinner('Building truthpack...', colors.accent);
|
|
1400
1412
|
try {
|
|
1401
|
-
const {
|
|
1402
|
-
await
|
|
1413
|
+
const { runContext } = require("./runContext");
|
|
1414
|
+
await runContext(["--path", targetDir, "--quiet"]);
|
|
1403
1415
|
stopSpinner('Truthpack generated', true);
|
|
1404
1416
|
filesCreated.push('.vibecheck/truthpack.json');
|
|
1405
1417
|
} catch (e) {
|
|
1406
1418
|
stopSpinner('Truthpack generation failed', false);
|
|
1407
|
-
throw
|
|
1419
|
+
// Don't throw - truthpack generation is optional for init
|
|
1420
|
+
if (!opts.json) {
|
|
1421
|
+
console.log(` ${colors.warning}${ICONS.warning}${c.reset} ${e.message}`);
|
|
1422
|
+
console.log(` ${c.dim}Run 'vibecheck context' manually to generate truthpack${c.reset}`);
|
|
1423
|
+
}
|
|
1408
1424
|
}
|
|
1409
1425
|
} else {
|
|
1410
1426
|
printSetupStep('truthpack.json', 'dry-run', 'would generate via vibecheck ctx build');
|
|
@@ -1472,21 +1488,36 @@ async function runLocalSetup(targetDir, projectName, opts, filesCreated) {
|
|
|
1472
1488
|
printSetupStep('IDE rules', 'dry-run', 'would generate via vibecheck context');
|
|
1473
1489
|
}
|
|
1474
1490
|
|
|
1475
|
-
// 6. Create .vibecheckrc at project root
|
|
1491
|
+
// 6. Create .vibecheckrc at project root (create both for compatibility)
|
|
1476
1492
|
logStep('Creating root config');
|
|
1477
|
-
const
|
|
1478
|
-
|
|
1479
|
-
|
|
1480
|
-
|
|
1481
|
-
|
|
1482
|
-
|
|
1493
|
+
const rcPathJson = path.join(targetDir, ".vibecheckrc.json");
|
|
1494
|
+
const rcPath = path.join(targetDir, ".vibecheckrc");
|
|
1495
|
+
const rc = {
|
|
1496
|
+
extends: ".vibecheck/config.json",
|
|
1497
|
+
tier: "free",
|
|
1498
|
+
};
|
|
1499
|
+
|
|
1500
|
+
if (!fs.existsSync(rcPathJson) && !fs.existsSync(rcPath)) {
|
|
1483
1501
|
if (opts.dryRun) {
|
|
1502
|
+
printSetupStep('.vibecheckrc', 'dry-run', 'would create');
|
|
1484
1503
|
printSetupStep('.vibecheckrc.json', 'dry-run', 'would create');
|
|
1485
1504
|
} else {
|
|
1505
|
+
// Create .vibecheckrc (without .json) for compatibility with tests/expectations
|
|
1486
1506
|
fs.writeFileSync(rcPath, JSON.stringify(rc, null, 2));
|
|
1487
|
-
printSetupStep('.vibecheckrc
|
|
1507
|
+
printSetupStep('.vibecheckrc', 'success', 'root config created');
|
|
1508
|
+
filesCreated.push('.vibecheckrc');
|
|
1509
|
+
|
|
1510
|
+
// Also create .vibecheckrc.json for backward compatibility
|
|
1511
|
+
fs.writeFileSync(rcPathJson, JSON.stringify(rc, null, 2));
|
|
1488
1512
|
filesCreated.push('.vibecheckrc.json');
|
|
1489
1513
|
}
|
|
1514
|
+
} else if (fs.existsSync(rcPathJson) && !fs.existsSync(rcPath)) {
|
|
1515
|
+
// If only .vibecheckrc.json exists, create .vibecheckrc for compatibility
|
|
1516
|
+
if (!opts.dryRun) {
|
|
1517
|
+
fs.writeFileSync(rcPath, JSON.stringify(rc, null, 2));
|
|
1518
|
+
printSetupStep('.vibecheckrc', 'success', 'root config created (compatibility)');
|
|
1519
|
+
filesCreated.push('.vibecheckrc');
|
|
1520
|
+
}
|
|
1490
1521
|
}
|
|
1491
1522
|
|
|
1492
1523
|
// 7. Update .gitignore
|
|
@@ -1510,7 +1541,8 @@ async function runLocalSetup(targetDir, projectName, opts, filesCreated) {
|
|
|
1510
1541
|
}
|
|
1511
1542
|
}
|
|
1512
1543
|
|
|
1513
|
-
|
|
1544
|
+
// Return both filesCreated and detection for use in main function
|
|
1545
|
+
return { filesCreated, detection };
|
|
1514
1546
|
}
|
|
1515
1547
|
|
|
1516
1548
|
// ═══════════════════════════════════════════════════════════════════════════════
|
|
@@ -1611,10 +1643,11 @@ async function runInit(args) {
|
|
|
1611
1643
|
return 0;
|
|
1612
1644
|
}
|
|
1613
1645
|
|
|
1614
|
-
// --quick mode
|
|
1646
|
+
// --quick mode runs local setup with non-interactive defaults
|
|
1615
1647
|
if (opts.quick) {
|
|
1616
|
-
|
|
1617
|
-
|
|
1648
|
+
opts.local = true;
|
|
1649
|
+
opts.nonInteractive = true;
|
|
1650
|
+
// Continue with normal init flow below
|
|
1618
1651
|
}
|
|
1619
1652
|
|
|
1620
1653
|
const targetDir = path.resolve(opts.path);
|
|
@@ -1712,6 +1745,7 @@ async function runInit(args) {
|
|
|
1712
1745
|
}
|
|
1713
1746
|
|
|
1714
1747
|
let filesCreated = [];
|
|
1748
|
+
let detection = null; // Declare detection in main function scope
|
|
1715
1749
|
const result = {
|
|
1716
1750
|
success: true,
|
|
1717
1751
|
project: projectName,
|
|
@@ -1725,7 +1759,15 @@ async function runInit(args) {
|
|
|
1725
1759
|
// Always run local setup first
|
|
1726
1760
|
if (opts.local || opts.connect) {
|
|
1727
1761
|
try {
|
|
1728
|
-
|
|
1762
|
+
// runLocalSetup returns both filesCreated and detection
|
|
1763
|
+
const setupResult = await runLocalSetup(targetDir, projectName, opts, filesCreated);
|
|
1764
|
+
if (setupResult && typeof setupResult === 'object' && 'filesCreated' in setupResult) {
|
|
1765
|
+
filesCreated = setupResult.filesCreated;
|
|
1766
|
+
detection = setupResult.detection || null;
|
|
1767
|
+
} else {
|
|
1768
|
+
// Backward compatibility: if it returns just an array, use it
|
|
1769
|
+
filesCreated = Array.isArray(setupResult) ? setupResult : filesCreated;
|
|
1770
|
+
}
|
|
1729
1771
|
} catch (e) {
|
|
1730
1772
|
result.errors.push({ step: 'local', error: e.message, stack: e.stack });
|
|
1731
1773
|
if (!opts.json) {
|
|
@@ -1735,8 +1777,11 @@ async function runInit(args) {
|
|
|
1735
1777
|
}
|
|
1736
1778
|
console.log(` ${colors.info}${ICONS.info}${c.reset} Run ${c.cyan}vibecheck init --repair${c.reset} to fix partial state`);
|
|
1737
1779
|
}
|
|
1738
|
-
|
|
1739
|
-
|
|
1780
|
+
// Don't exit on error - continue and report errors in result
|
|
1781
|
+
// Only exit if critical setup failed AND we're not in dry-run mode
|
|
1782
|
+
if (!opts.dryRun && result.errors.length > 0 && filesCreated.length === 0) {
|
|
1783
|
+
// Only exit if NO files were created at all (complete failure)
|
|
1784
|
+
return EXIT.INTERNAL_ERROR;
|
|
1740
1785
|
}
|
|
1741
1786
|
}
|
|
1742
1787
|
}
|
|
@@ -1754,7 +1799,7 @@ async function runInit(args) {
|
|
|
1754
1799
|
}
|
|
1755
1800
|
}
|
|
1756
1801
|
if (!opts.dryRun) {
|
|
1757
|
-
return
|
|
1802
|
+
return EXIT.INTERNAL_ERROR;
|
|
1758
1803
|
}
|
|
1759
1804
|
}
|
|
1760
1805
|
}
|