@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.
Files changed (84) hide show
  1. package/bin/registry.js +192 -5
  2. package/bin/runners/lib/agent-firewall/change-packet/builder.js +280 -6
  3. package/bin/runners/lib/agent-firewall/critic/index.js +151 -0
  4. package/bin/runners/lib/agent-firewall/critic/judge.js +432 -0
  5. package/bin/runners/lib/agent-firewall/critic/prompts.js +305 -0
  6. package/bin/runners/lib/agent-firewall/lawbook/distributor.js +465 -0
  7. package/bin/runners/lib/agent-firewall/lawbook/evaluator.js +604 -0
  8. package/bin/runners/lib/agent-firewall/lawbook/index.js +304 -0
  9. package/bin/runners/lib/agent-firewall/lawbook/registry.js +514 -0
  10. package/bin/runners/lib/agent-firewall/lawbook/schema.js +420 -0
  11. package/bin/runners/lib/agent-firewall/logger.js +141 -0
  12. package/bin/runners/lib/agent-firewall/policy/loader.js +312 -4
  13. package/bin/runners/lib/agent-firewall/policy/rules/ghost-env.js +113 -1
  14. package/bin/runners/lib/agent-firewall/policy/rules/ghost-route.js +133 -6
  15. package/bin/runners/lib/agent-firewall/proposal/extractor.js +394 -0
  16. package/bin/runners/lib/agent-firewall/proposal/index.js +212 -0
  17. package/bin/runners/lib/agent-firewall/proposal/schema.js +251 -0
  18. package/bin/runners/lib/agent-firewall/proposal/validator.js +386 -0
  19. package/bin/runners/lib/agent-firewall/reality/index.js +332 -0
  20. package/bin/runners/lib/agent-firewall/reality/state.js +625 -0
  21. package/bin/runners/lib/agent-firewall/reality/watcher.js +322 -0
  22. package/bin/runners/lib/agent-firewall/risk/index.js +173 -0
  23. package/bin/runners/lib/agent-firewall/risk/scorer.js +328 -0
  24. package/bin/runners/lib/agent-firewall/risk/thresholds.js +321 -0
  25. package/bin/runners/lib/agent-firewall/risk/vectors.js +421 -0
  26. package/bin/runners/lib/agent-firewall/simulator/diff-simulator.js +472 -0
  27. package/bin/runners/lib/agent-firewall/simulator/import-resolver.js +346 -0
  28. package/bin/runners/lib/agent-firewall/simulator/index.js +181 -0
  29. package/bin/runners/lib/agent-firewall/simulator/route-validator.js +380 -0
  30. package/bin/runners/lib/agent-firewall/time-machine/incident-correlator.js +661 -0
  31. package/bin/runners/lib/agent-firewall/time-machine/index.js +267 -0
  32. package/bin/runners/lib/agent-firewall/time-machine/replay-engine.js +436 -0
  33. package/bin/runners/lib/agent-firewall/time-machine/state-reconstructor.js +490 -0
  34. package/bin/runners/lib/agent-firewall/time-machine/timeline-builder.js +530 -0
  35. package/bin/runners/lib/analyzers.js +81 -18
  36. package/bin/runners/lib/authority-badge.js +425 -0
  37. package/bin/runners/lib/cli-output.js +7 -1
  38. package/bin/runners/lib/error-handler.js +16 -9
  39. package/bin/runners/lib/exit-codes.js +275 -0
  40. package/bin/runners/lib/global-flags.js +37 -0
  41. package/bin/runners/lib/help-formatter.js +413 -0
  42. package/bin/runners/lib/logger.js +38 -0
  43. package/bin/runners/lib/unified-cli-output.js +604 -0
  44. package/bin/runners/lib/upsell.js +148 -0
  45. package/bin/runners/runApprove.js +1200 -0
  46. package/bin/runners/runAuth.js +324 -95
  47. package/bin/runners/runCheckpoint.js +39 -21
  48. package/bin/runners/runClassify.js +859 -0
  49. package/bin/runners/runContext.js +136 -24
  50. package/bin/runners/runDoctor.js +108 -68
  51. package/bin/runners/runFix.js +6 -5
  52. package/bin/runners/runGuard.js +212 -118
  53. package/bin/runners/runInit.js +3 -2
  54. package/bin/runners/runMcp.js +130 -52
  55. package/bin/runners/runPolish.js +43 -20
  56. package/bin/runners/runProve.js +1 -2
  57. package/bin/runners/runReport.js +3 -2
  58. package/bin/runners/runScan.js +63 -44
  59. package/bin/runners/runShip.js +3 -4
  60. package/bin/runners/runValidate.js +19 -2
  61. package/bin/runners/runWatch.js +104 -53
  62. package/bin/vibecheck.js +106 -19
  63. package/mcp-server/HARDENING_SUMMARY.md +299 -0
  64. package/mcp-server/agent-firewall-interceptor.js +367 -31
  65. package/mcp-server/authority-tools.js +569 -0
  66. package/mcp-server/conductor/conflict-resolver.js +588 -0
  67. package/mcp-server/conductor/execution-planner.js +544 -0
  68. package/mcp-server/conductor/index.js +377 -0
  69. package/mcp-server/conductor/lock-manager.js +615 -0
  70. package/mcp-server/conductor/request-queue.js +550 -0
  71. package/mcp-server/conductor/session-manager.js +500 -0
  72. package/mcp-server/conductor/tools.js +510 -0
  73. package/mcp-server/index.js +1149 -243
  74. package/mcp-server/lib/{api-client.js → api-client.cjs} +40 -4
  75. package/mcp-server/lib/logger.cjs +30 -0
  76. package/mcp-server/logger.js +173 -0
  77. package/mcp-server/package.json +2 -2
  78. package/mcp-server/premium-tools.js +2 -2
  79. package/mcp-server/tier-auth.js +245 -35
  80. package/mcp-server/truth-firewall-tools.js +145 -15
  81. package/mcp-server/vibecheck-tools.js +2 -2
  82. package/package.json +2 -3
  83. package/mcp-server/index.old.js +0 -4137
  84. 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,