@vibecheckai/cli 3.2.6 → 3.3.0
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 +192 -5
- package/bin/runners/lib/agent-firewall/change-packet/builder.js +280 -6
- 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/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/loader.js +312 -4
- package/bin/runners/lib/agent-firewall/policy/rules/ghost-env.js +113 -1
- package/bin/runners/lib/agent-firewall/policy/rules/ghost-route.js +133 -6
- 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/analyzers.js +81 -18
- package/bin/runners/lib/authority-badge.js +425 -0
- package/bin/runners/lib/cli-output.js +7 -1
- package/bin/runners/lib/error-handler.js +16 -9
- package/bin/runners/lib/exit-codes.js +275 -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/unified-cli-output.js +604 -0
- package/bin/runners/lib/upsell.js +148 -0
- package/bin/runners/runApprove.js +1200 -0
- package/bin/runners/runAuth.js +324 -95
- package/bin/runners/runCheckpoint.js +39 -21
- package/bin/runners/runClassify.js +859 -0
- package/bin/runners/runContext.js +136 -24
- package/bin/runners/runDoctor.js +108 -68
- package/bin/runners/runFix.js +6 -5
- package/bin/runners/runGuard.js +212 -118
- package/bin/runners/runInit.js +3 -2
- package/bin/runners/runMcp.js +130 -52
- package/bin/runners/runPolish.js +43 -20
- package/bin/runners/runProve.js +1 -2
- package/bin/runners/runReport.js +3 -2
- package/bin/runners/runScan.js +63 -44
- package/bin/runners/runShip.js +3 -4
- package/bin/runners/runValidate.js +19 -2
- package/bin/runners/runWatch.js +104 -53
- package/bin/vibecheck.js +106 -19
- package/mcp-server/HARDENING_SUMMARY.md +299 -0
- package/mcp-server/agent-firewall-interceptor.js +367 -31
- 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/index.js +1149 -243
- package/mcp-server/lib/{api-client.js → api-client.cjs} +40 -4
- package/mcp-server/lib/logger.cjs +30 -0
- package/mcp-server/logger.js +173 -0
- package/mcp-server/package.json +2 -2
- package/mcp-server/premium-tools.js +2 -2
- package/mcp-server/tier-auth.js +245 -35
- package/mcp-server/truth-firewall-tools.js +145 -15
- package/mcp-server/vibecheck-tools.js +2 -2
- package/package.json +2 -3
- package/mcp-server/index.old.js +0 -4137
- package/mcp-server/package-lock.json +0 -165
|
@@ -0,0 +1,275 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Vibecheck CLI Exit Codes - Standardized for World-Class UX
|
|
3
|
+
*
|
|
4
|
+
* ═══════════════════════════════════════════════════════════════════════════════
|
|
5
|
+
* EXIT CODE REFERENCE
|
|
6
|
+
* ═══════════════════════════════════════════════════════════════════════════════
|
|
7
|
+
*
|
|
8
|
+
* Standard Unix conventions extended for CLI tooling:
|
|
9
|
+
*
|
|
10
|
+
* 0 SUCCESS Command completed successfully, no issues found
|
|
11
|
+
* 1 WARNINGS Command completed with warnings (non-blocking issues)
|
|
12
|
+
* 2 BLOCKING Command found blocking issues (critical/high severity)
|
|
13
|
+
* 3 USER_ERROR Invalid arguments, missing required flags, bad input
|
|
14
|
+
* 4 NOT_FOUND Command not found, file not found, resource missing
|
|
15
|
+
* 5 AUTH_REQUIRED Authentication required but not provided
|
|
16
|
+
* 6 AUTH_FAILED Authentication failed (invalid/expired credentials)
|
|
17
|
+
* 7 TIER_REQUIRED Feature requires higher subscription tier
|
|
18
|
+
* 8 RATE_LIMITED API rate limit exceeded
|
|
19
|
+
* 9 NETWORK_ERROR Network connectivity issue
|
|
20
|
+
* 10 INTERNAL_ERROR Unexpected internal error
|
|
21
|
+
*
|
|
22
|
+
* CI-Friendly: Exit codes 0-2 are "soft" (scan results), 3+ are "hard" (errors)
|
|
23
|
+
* ═══════════════════════════════════════════════════════════════════════════════
|
|
24
|
+
*/
|
|
25
|
+
|
|
26
|
+
"use strict";
|
|
27
|
+
|
|
28
|
+
// ═══════════════════════════════════════════════════════════════════════════════
|
|
29
|
+
// EXIT CODE CONSTANTS
|
|
30
|
+
// ═══════════════════════════════════════════════════════════════════════════════
|
|
31
|
+
|
|
32
|
+
const EXIT = {
|
|
33
|
+
// Success states (0-2)
|
|
34
|
+
SUCCESS: 0, // All good, no issues
|
|
35
|
+
WARNINGS: 1, // Completed with warnings (medium/low severity)
|
|
36
|
+
BLOCKING: 2, // Blocking issues found (critical/high severity)
|
|
37
|
+
|
|
38
|
+
// User errors (3-4)
|
|
39
|
+
USER_ERROR: 3, // Bad args, invalid input, usage error
|
|
40
|
+
NOT_FOUND: 4, // Resource/command/file not found
|
|
41
|
+
|
|
42
|
+
// Auth errors (5-7)
|
|
43
|
+
AUTH_REQUIRED: 5, // Need to log in
|
|
44
|
+
AUTH_FAILED: 6, // Bad credentials
|
|
45
|
+
TIER_REQUIRED: 7, // Need higher plan
|
|
46
|
+
|
|
47
|
+
// Transient errors (8-9)
|
|
48
|
+
RATE_LIMITED: 8, // Try again later
|
|
49
|
+
NETWORK_ERROR: 9, // Connectivity issue
|
|
50
|
+
|
|
51
|
+
// Fatal errors (10+)
|
|
52
|
+
INTERNAL_ERROR: 10, // Bug, unexpected error
|
|
53
|
+
|
|
54
|
+
// Process signals (standard Unix)
|
|
55
|
+
SIGINT: 130, // Ctrl+C
|
|
56
|
+
SIGTERM: 143, // kill
|
|
57
|
+
};
|
|
58
|
+
|
|
59
|
+
// ═══════════════════════════════════════════════════════════════════════════════
|
|
60
|
+
// EXIT CODE METADATA
|
|
61
|
+
// ═══════════════════════════════════════════════════════════════════════════════
|
|
62
|
+
|
|
63
|
+
const EXIT_INFO = {
|
|
64
|
+
[EXIT.SUCCESS]: {
|
|
65
|
+
name: "SUCCESS",
|
|
66
|
+
description: "Command completed successfully",
|
|
67
|
+
ciStatus: "success",
|
|
68
|
+
recoverable: true,
|
|
69
|
+
},
|
|
70
|
+
[EXIT.WARNINGS]: {
|
|
71
|
+
name: "WARNINGS",
|
|
72
|
+
description: "Completed with warnings (non-blocking issues)",
|
|
73
|
+
ciStatus: "warning",
|
|
74
|
+
recoverable: true,
|
|
75
|
+
},
|
|
76
|
+
[EXIT.BLOCKING]: {
|
|
77
|
+
name: "BLOCKING",
|
|
78
|
+
description: "Blocking issues found (critical/high severity)",
|
|
79
|
+
ciStatus: "failure",
|
|
80
|
+
recoverable: true,
|
|
81
|
+
},
|
|
82
|
+
[EXIT.USER_ERROR]: {
|
|
83
|
+
name: "USER_ERROR",
|
|
84
|
+
description: "Invalid arguments or usage",
|
|
85
|
+
ciStatus: "failure",
|
|
86
|
+
recoverable: true,
|
|
87
|
+
hint: "Check command usage with --help",
|
|
88
|
+
},
|
|
89
|
+
[EXIT.NOT_FOUND]: {
|
|
90
|
+
name: "NOT_FOUND",
|
|
91
|
+
description: "Resource not found",
|
|
92
|
+
ciStatus: "failure",
|
|
93
|
+
recoverable: true,
|
|
94
|
+
hint: "Verify the path or resource exists",
|
|
95
|
+
},
|
|
96
|
+
[EXIT.AUTH_REQUIRED]: {
|
|
97
|
+
name: "AUTH_REQUIRED",
|
|
98
|
+
description: "Authentication required",
|
|
99
|
+
ciStatus: "failure",
|
|
100
|
+
recoverable: true,
|
|
101
|
+
hint: "Run 'vibecheck login' to authenticate",
|
|
102
|
+
},
|
|
103
|
+
[EXIT.AUTH_FAILED]: {
|
|
104
|
+
name: "AUTH_FAILED",
|
|
105
|
+
description: "Authentication failed",
|
|
106
|
+
ciStatus: "failure",
|
|
107
|
+
recoverable: true,
|
|
108
|
+
hint: "Check your API key or run 'vibecheck login' again",
|
|
109
|
+
},
|
|
110
|
+
[EXIT.TIER_REQUIRED]: {
|
|
111
|
+
name: "TIER_REQUIRED",
|
|
112
|
+
description: "Higher subscription tier required",
|
|
113
|
+
ciStatus: "failure",
|
|
114
|
+
recoverable: true,
|
|
115
|
+
hint: "Upgrade at https://vibecheckai.dev/pricing",
|
|
116
|
+
},
|
|
117
|
+
[EXIT.RATE_LIMITED]: {
|
|
118
|
+
name: "RATE_LIMITED",
|
|
119
|
+
description: "Rate limit exceeded",
|
|
120
|
+
ciStatus: "failure",
|
|
121
|
+
recoverable: true,
|
|
122
|
+
hint: "Wait a moment and try again",
|
|
123
|
+
},
|
|
124
|
+
[EXIT.NETWORK_ERROR]: {
|
|
125
|
+
name: "NETWORK_ERROR",
|
|
126
|
+
description: "Network connectivity issue",
|
|
127
|
+
ciStatus: "failure",
|
|
128
|
+
recoverable: true,
|
|
129
|
+
hint: "Check your internet connection or try --offline mode",
|
|
130
|
+
},
|
|
131
|
+
[EXIT.INTERNAL_ERROR]: {
|
|
132
|
+
name: "INTERNAL_ERROR",
|
|
133
|
+
description: "Unexpected internal error",
|
|
134
|
+
ciStatus: "failure",
|
|
135
|
+
recoverable: false,
|
|
136
|
+
hint: "Please report this issue at https://github.com/vibecheckai/vibecheck/issues",
|
|
137
|
+
},
|
|
138
|
+
};
|
|
139
|
+
|
|
140
|
+
// ═══════════════════════════════════════════════════════════════════════════════
|
|
141
|
+
// HELPER FUNCTIONS
|
|
142
|
+
// ═══════════════════════════════════════════════════════════════════════════════
|
|
143
|
+
|
|
144
|
+
/**
|
|
145
|
+
* Convert verdict string to exit code
|
|
146
|
+
* @param {string} verdict - SHIP, WARN, BLOCK, PASS, FAIL
|
|
147
|
+
* @returns {number} exit code
|
|
148
|
+
*/
|
|
149
|
+
function verdictToExitCode(verdict) {
|
|
150
|
+
const v = String(verdict).toUpperCase();
|
|
151
|
+
if (v === "SHIP" || v === "PASS" || v === "SUCCESS" || v === "OK") {
|
|
152
|
+
return EXIT.SUCCESS;
|
|
153
|
+
}
|
|
154
|
+
if (v === "WARN" || v === "WARNING" || v === "WARNINGS") {
|
|
155
|
+
return EXIT.WARNINGS;
|
|
156
|
+
}
|
|
157
|
+
if (v === "BLOCK" || v === "FAIL" || v === "FAILURE" || v === "ERROR") {
|
|
158
|
+
return EXIT.BLOCKING;
|
|
159
|
+
}
|
|
160
|
+
return EXIT.WARNINGS; // Default to warnings for unknown
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
/**
|
|
164
|
+
* Convert exit code to verdict string
|
|
165
|
+
* @param {number} exitCode
|
|
166
|
+
* @returns {string} verdict
|
|
167
|
+
*/
|
|
168
|
+
function exitCodeToVerdict(exitCode) {
|
|
169
|
+
switch (exitCode) {
|
|
170
|
+
case EXIT.SUCCESS: return "SHIP";
|
|
171
|
+
case EXIT.WARNINGS: return "WARN";
|
|
172
|
+
case EXIT.BLOCKING: return "BLOCK";
|
|
173
|
+
default: return "BLOCK";
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
/**
|
|
178
|
+
* Get exit info for an exit code
|
|
179
|
+
* @param {number} exitCode
|
|
180
|
+
* @returns {object} exit info
|
|
181
|
+
*/
|
|
182
|
+
function getExitInfo(exitCode) {
|
|
183
|
+
return EXIT_INFO[exitCode] || EXIT_INFO[EXIT.INTERNAL_ERROR];
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
/**
|
|
187
|
+
* Check if exit code represents success (including warnings)
|
|
188
|
+
* @param {number} exitCode
|
|
189
|
+
* @returns {boolean}
|
|
190
|
+
*/
|
|
191
|
+
function isSuccess(exitCode) {
|
|
192
|
+
return exitCode === EXIT.SUCCESS;
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
/**
|
|
196
|
+
* Check if exit code represents a "soft" failure (scan results, not errors)
|
|
197
|
+
* @param {number} exitCode
|
|
198
|
+
* @returns {boolean}
|
|
199
|
+
*/
|
|
200
|
+
function isSoftFailure(exitCode) {
|
|
201
|
+
return exitCode === EXIT.WARNINGS || exitCode === EXIT.BLOCKING;
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
/**
|
|
205
|
+
* Check if exit code represents a "hard" failure (errors)
|
|
206
|
+
* @param {number} exitCode
|
|
207
|
+
* @returns {boolean}
|
|
208
|
+
*/
|
|
209
|
+
function isHardFailure(exitCode) {
|
|
210
|
+
return exitCode >= EXIT.USER_ERROR;
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
/**
|
|
214
|
+
* Check if the error is recoverable (user can fix and retry)
|
|
215
|
+
* @param {number} exitCode
|
|
216
|
+
* @returns {boolean}
|
|
217
|
+
*/
|
|
218
|
+
function isRecoverable(exitCode) {
|
|
219
|
+
const info = EXIT_INFO[exitCode];
|
|
220
|
+
return info ? info.recoverable : false;
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
/**
|
|
224
|
+
* Get hint message for exit code
|
|
225
|
+
* @param {number} exitCode
|
|
226
|
+
* @returns {string|null}
|
|
227
|
+
*/
|
|
228
|
+
function getHint(exitCode) {
|
|
229
|
+
const info = EXIT_INFO[exitCode];
|
|
230
|
+
return info?.hint || null;
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
/**
|
|
234
|
+
* Get CI status for exit code
|
|
235
|
+
* @param {number} exitCode
|
|
236
|
+
* @returns {string} "success" | "warning" | "failure"
|
|
237
|
+
*/
|
|
238
|
+
function getCIStatus(exitCode) {
|
|
239
|
+
const info = EXIT_INFO[exitCode];
|
|
240
|
+
return info?.ciStatus || "failure";
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
/**
|
|
244
|
+
* Create an error object with proper exit code
|
|
245
|
+
* @param {string} message
|
|
246
|
+
* @param {number} exitCode
|
|
247
|
+
* @param {object} details
|
|
248
|
+
* @returns {Error}
|
|
249
|
+
*/
|
|
250
|
+
function createExitError(message, exitCode, details = {}) {
|
|
251
|
+
const error = new Error(message);
|
|
252
|
+
error.exitCode = exitCode;
|
|
253
|
+
error.exitInfo = getExitInfo(exitCode);
|
|
254
|
+
Object.assign(error, details);
|
|
255
|
+
return error;
|
|
256
|
+
}
|
|
257
|
+
|
|
258
|
+
// ═══════════════════════════════════════════════════════════════════════════════
|
|
259
|
+
// EXPORTS
|
|
260
|
+
// ═══════════════════════════════════════════════════════════════════════════════
|
|
261
|
+
|
|
262
|
+
module.exports = {
|
|
263
|
+
EXIT,
|
|
264
|
+
EXIT_INFO,
|
|
265
|
+
verdictToExitCode,
|
|
266
|
+
exitCodeToVerdict,
|
|
267
|
+
getExitInfo,
|
|
268
|
+
isSuccess,
|
|
269
|
+
isSoftFailure,
|
|
270
|
+
isHardFailure,
|
|
271
|
+
isRecoverable,
|
|
272
|
+
getHint,
|
|
273
|
+
getCIStatus,
|
|
274
|
+
createExitError,
|
|
275
|
+
};
|
|
@@ -128,6 +128,41 @@ function shouldShowBanner(flags = {}) {
|
|
|
128
128
|
return true;
|
|
129
129
|
}
|
|
130
130
|
|
|
131
|
+
// ═══════════════════════════════════════════════════════════════════════════════
|
|
132
|
+
// OUTPUT SUPPRESSION CHECK
|
|
133
|
+
// ═══════════════════════════════════════════════════════════════════════════════
|
|
134
|
+
|
|
135
|
+
/**
|
|
136
|
+
* Check if non-essential output should be suppressed
|
|
137
|
+
* Use this before any console output that isn't errors or JSON
|
|
138
|
+
*
|
|
139
|
+
* @param {object} flags - Parsed flags object
|
|
140
|
+
* @returns {boolean} true if output should be suppressed
|
|
141
|
+
*/
|
|
142
|
+
function shouldSuppressOutput(flags = {}) {
|
|
143
|
+
// Suppress if quiet or CI mode
|
|
144
|
+
if (flags.quiet || flags.ci) return true;
|
|
145
|
+
|
|
146
|
+
// Suppress if JSON mode (only structured output allowed)
|
|
147
|
+
if (flags.json) return true;
|
|
148
|
+
|
|
149
|
+
// Check environment
|
|
150
|
+
if (process.env.VIBECHECK_QUIET === "true") return true;
|
|
151
|
+
|
|
152
|
+
return false;
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
/**
|
|
156
|
+
* Check if we're in JSON output mode
|
|
157
|
+
* Use this to decide between pretty output and structured JSON
|
|
158
|
+
*
|
|
159
|
+
* @param {object} flags - Parsed flags object
|
|
160
|
+
* @returns {boolean} true if JSON output is requested
|
|
161
|
+
*/
|
|
162
|
+
function isJsonMode(flags = {}) {
|
|
163
|
+
return flags.json === true;
|
|
164
|
+
}
|
|
165
|
+
|
|
131
166
|
// ═══════════════════════════════════════════════════════════════════════════════
|
|
132
167
|
// CI DETECTION
|
|
133
168
|
// ═══════════════════════════════════════════════════════════════════════════════
|
|
@@ -204,6 +239,8 @@ function loadConfig(flags = {}) {
|
|
|
204
239
|
module.exports = {
|
|
205
240
|
parseGlobalFlags,
|
|
206
241
|
shouldShowBanner,
|
|
242
|
+
shouldSuppressOutput,
|
|
243
|
+
isJsonMode,
|
|
207
244
|
isCI,
|
|
208
245
|
loadConfig,
|
|
209
246
|
lazy,
|