@vibecheckai/cli 3.5.1 → 3.5.3

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 (272) hide show
  1. package/bin/registry.js +406 -154
  2. package/bin/runners/context/analyzer.js +52 -1
  3. package/bin/runners/context/generators/mcp.js +15 -13
  4. package/bin/runners/context/git-context.js +3 -1
  5. package/bin/runners/context/proof-context.js +248 -1
  6. package/bin/runners/context/team-conventions.js +33 -7
  7. package/bin/runners/lib/agent-firewall/ai/false-positive-analyzer.js +474 -0
  8. package/bin/runners/lib/agent-firewall/change-packet/builder.js +488 -0
  9. package/bin/runners/lib/agent-firewall/change-packet/schema.json +228 -0
  10. package/bin/runners/lib/agent-firewall/change-packet/store.js +200 -0
  11. package/bin/runners/lib/agent-firewall/claims/claim-types.js +21 -0
  12. package/bin/runners/lib/agent-firewall/claims/extractor.js +303 -0
  13. package/bin/runners/lib/agent-firewall/claims/patterns.js +24 -0
  14. package/bin/runners/lib/agent-firewall/critic/index.js +151 -0
  15. package/bin/runners/lib/agent-firewall/critic/judge.js +432 -0
  16. package/bin/runners/lib/agent-firewall/critic/prompts.js +305 -0
  17. package/bin/runners/lib/agent-firewall/evidence/auth-evidence.js +88 -0
  18. package/bin/runners/lib/agent-firewall/evidence/contract-evidence.js +75 -0
  19. package/bin/runners/lib/agent-firewall/evidence/env-evidence.js +127 -0
  20. package/bin/runners/lib/agent-firewall/evidence/resolver.js +102 -0
  21. package/bin/runners/lib/agent-firewall/evidence/route-evidence.js +213 -0
  22. package/bin/runners/lib/agent-firewall/evidence/side-effect-evidence.js +145 -0
  23. package/bin/runners/lib/agent-firewall/fs-hook/daemon.js +19 -0
  24. package/bin/runners/lib/agent-firewall/fs-hook/installer.js +87 -0
  25. package/bin/runners/lib/agent-firewall/fs-hook/watcher.js +184 -0
  26. package/bin/runners/lib/agent-firewall/git-hook/pre-commit.js +163 -0
  27. package/bin/runners/lib/agent-firewall/ide-extension/cursor.js +107 -0
  28. package/bin/runners/lib/agent-firewall/ide-extension/vscode.js +68 -0
  29. package/bin/runners/lib/agent-firewall/ide-extension/windsurf.js +66 -0
  30. package/bin/runners/lib/agent-firewall/interceptor/base.js +304 -0
  31. package/bin/runners/lib/agent-firewall/interceptor/cursor.js +35 -0
  32. package/bin/runners/lib/agent-firewall/interceptor/vscode.js +35 -0
  33. package/bin/runners/lib/agent-firewall/interceptor/windsurf.js +34 -0
  34. package/bin/runners/lib/agent-firewall/lawbook/distributor.js +465 -0
  35. package/bin/runners/lib/agent-firewall/lawbook/evaluator.js +604 -0
  36. package/bin/runners/lib/agent-firewall/lawbook/index.js +304 -0
  37. package/bin/runners/lib/agent-firewall/lawbook/registry.js +514 -0
  38. package/bin/runners/lib/agent-firewall/lawbook/schema.js +420 -0
  39. package/bin/runners/lib/agent-firewall/logger.js +141 -0
  40. package/bin/runners/lib/agent-firewall/policy/default-policy.json +90 -0
  41. package/bin/runners/lib/agent-firewall/policy/engine.js +103 -0
  42. package/bin/runners/lib/agent-firewall/policy/loader.js +451 -0
  43. package/bin/runners/lib/agent-firewall/policy/rules/auth-drift.js +50 -0
  44. package/bin/runners/lib/agent-firewall/policy/rules/contract-drift.js +50 -0
  45. package/bin/runners/lib/agent-firewall/policy/rules/fake-success.js +86 -0
  46. package/bin/runners/lib/agent-firewall/policy/rules/ghost-env.js +162 -0
  47. package/bin/runners/lib/agent-firewall/policy/rules/ghost-route.js +189 -0
  48. package/bin/runners/lib/agent-firewall/policy/rules/scope.js +93 -0
  49. package/bin/runners/lib/agent-firewall/policy/rules/unsafe-side-effect.js +57 -0
  50. package/bin/runners/lib/agent-firewall/policy/schema.json +183 -0
  51. package/bin/runners/lib/agent-firewall/policy/verdict.js +54 -0
  52. package/bin/runners/lib/agent-firewall/proposal/extractor.js +394 -0
  53. package/bin/runners/lib/agent-firewall/proposal/index.js +212 -0
  54. package/bin/runners/lib/agent-firewall/proposal/schema.js +251 -0
  55. package/bin/runners/lib/agent-firewall/proposal/validator.js +386 -0
  56. package/bin/runners/lib/agent-firewall/reality/index.js +332 -0
  57. package/bin/runners/lib/agent-firewall/reality/state.js +625 -0
  58. package/bin/runners/lib/agent-firewall/reality/watcher.js +322 -0
  59. package/bin/runners/lib/agent-firewall/risk/index.js +173 -0
  60. package/bin/runners/lib/agent-firewall/risk/scorer.js +328 -0
  61. package/bin/runners/lib/agent-firewall/risk/thresholds.js +321 -0
  62. package/bin/runners/lib/agent-firewall/risk/vectors.js +421 -0
  63. package/bin/runners/lib/agent-firewall/simulator/diff-simulator.js +472 -0
  64. package/bin/runners/lib/agent-firewall/simulator/import-resolver.js +346 -0
  65. package/bin/runners/lib/agent-firewall/simulator/index.js +181 -0
  66. package/bin/runners/lib/agent-firewall/simulator/route-validator.js +380 -0
  67. package/bin/runners/lib/agent-firewall/time-machine/incident-correlator.js +661 -0
  68. package/bin/runners/lib/agent-firewall/time-machine/index.js +267 -0
  69. package/bin/runners/lib/agent-firewall/time-machine/replay-engine.js +436 -0
  70. package/bin/runners/lib/agent-firewall/time-machine/state-reconstructor.js +490 -0
  71. package/bin/runners/lib/agent-firewall/time-machine/timeline-builder.js +530 -0
  72. package/bin/runners/lib/agent-firewall/truthpack/index.js +67 -0
  73. package/bin/runners/lib/agent-firewall/truthpack/loader.js +137 -0
  74. package/bin/runners/lib/agent-firewall/unblock/planner.js +337 -0
  75. package/bin/runners/lib/agent-firewall/utils/ignore-checker.js +118 -0
  76. package/bin/runners/lib/analysis-core.js +220 -182
  77. package/bin/runners/lib/analyzers.js +2145 -224
  78. package/bin/runners/lib/api-client.js +269 -0
  79. package/bin/runners/lib/authority-badge.js +425 -0
  80. package/bin/runners/lib/cli-output.js +242 -210
  81. package/bin/runners/lib/default-config.js +127 -0
  82. package/bin/runners/lib/detectors-v2.js +547 -785
  83. package/bin/runners/lib/doctor/modules/security.js +3 -1
  84. package/bin/runners/lib/engine/ast-cache.js +210 -0
  85. package/bin/runners/lib/engine/auth-extractor.js +211 -0
  86. package/bin/runners/lib/engine/billing-extractor.js +112 -0
  87. package/bin/runners/lib/engine/enforcement-extractor.js +100 -0
  88. package/bin/runners/lib/engine/env-extractor.js +207 -0
  89. package/bin/runners/lib/engine/express-extractor.js +208 -0
  90. package/bin/runners/lib/engine/extractors.js +849 -0
  91. package/bin/runners/lib/engine/index.js +207 -0
  92. package/bin/runners/lib/engine/repo-index.js +514 -0
  93. package/bin/runners/lib/engine/types.js +124 -0
  94. package/bin/runners/lib/engines/accessibility-engine.js +190 -0
  95. package/bin/runners/lib/engines/api-consistency-engine.js +162 -0
  96. package/bin/runners/lib/engines/ast-cache.js +99 -0
  97. package/bin/runners/lib/engines/code-quality-engine.js +255 -0
  98. package/bin/runners/lib/engines/console-logs-engine.js +115 -0
  99. package/bin/runners/lib/engines/cross-file-analysis-engine.js +268 -0
  100. package/bin/runners/lib/engines/dead-code-engine.js +198 -0
  101. package/bin/runners/lib/engines/deprecated-api-engine.js +226 -0
  102. package/bin/runners/lib/engines/empty-catch-engine.js +150 -0
  103. package/bin/runners/lib/engines/file-filter.js +131 -0
  104. package/bin/runners/lib/engines/hardcoded-secrets-engine.js +251 -0
  105. package/bin/runners/lib/engines/mock-data-engine.js +272 -0
  106. package/bin/runners/lib/engines/parallel-processor.js +71 -0
  107. package/bin/runners/lib/engines/performance-issues-engine.js +265 -0
  108. package/bin/runners/lib/engines/security-vulnerabilities-engine.js +243 -0
  109. package/bin/runners/lib/engines/todo-fixme-engine.js +115 -0
  110. package/bin/runners/lib/engines/type-aware-engine.js +152 -0
  111. package/bin/runners/lib/engines/unsafe-regex-engine.js +225 -0
  112. package/bin/runners/lib/engines/vibecheck-engines/README.md +53 -0
  113. package/bin/runners/lib/engines/vibecheck-engines/index.js +15 -0
  114. package/bin/runners/lib/engines/vibecheck-engines/lib/ast-cache.js +164 -0
  115. package/bin/runners/lib/engines/vibecheck-engines/lib/code-quality-engine.js +291 -0
  116. package/bin/runners/lib/engines/vibecheck-engines/lib/console-logs-engine.js +83 -0
  117. package/bin/runners/lib/engines/vibecheck-engines/lib/dead-code-engine.js +198 -0
  118. package/bin/runners/lib/engines/vibecheck-engines/lib/deprecated-api-engine.js +275 -0
  119. package/bin/runners/lib/engines/vibecheck-engines/lib/empty-catch-engine.js +167 -0
  120. package/bin/runners/lib/engines/vibecheck-engines/lib/file-filter.js +217 -0
  121. package/bin/runners/lib/engines/vibecheck-engines/lib/hardcoded-secrets-engine.js +139 -0
  122. package/bin/runners/lib/engines/vibecheck-engines/lib/mock-data-engine.js +140 -0
  123. package/bin/runners/lib/engines/vibecheck-engines/lib/parallel-processor.js +164 -0
  124. package/bin/runners/lib/engines/vibecheck-engines/lib/performance-issues-engine.js +234 -0
  125. package/bin/runners/lib/engines/vibecheck-engines/lib/type-aware-engine.js +217 -0
  126. package/bin/runners/lib/engines/vibecheck-engines/lib/unsafe-regex-engine.js +78 -0
  127. package/bin/runners/lib/engines/vibecheck-engines/package.json +13 -0
  128. package/bin/runners/lib/entitlements-v2.js +152 -446
  129. package/bin/runners/lib/error-handler.js +60 -12
  130. package/bin/runners/lib/error-messages.js +289 -0
  131. package/bin/runners/lib/evidence-pack.js +7 -1
  132. package/bin/runners/lib/exit-codes.js +275 -0
  133. package/bin/runners/lib/finding-id.js +69 -0
  134. package/bin/runners/lib/finding-sorter.js +89 -0
  135. package/bin/runners/lib/fingerprint.js +377 -0
  136. package/bin/runners/lib/global-flags.js +37 -0
  137. package/bin/runners/lib/help-formatter.js +413 -0
  138. package/bin/runners/lib/logger.js +38 -0
  139. package/bin/runners/lib/next-action.js +560 -0
  140. package/bin/runners/lib/prerequisites.js +149 -0
  141. package/bin/runners/lib/route-detection.js +137 -68
  142. package/bin/runners/lib/route-truth.js +1167 -322
  143. package/bin/runners/lib/scan-output.js +504 -463
  144. package/bin/runners/lib/scan-runner.js +135 -0
  145. package/bin/runners/lib/schemas/ajv-validator.js +464 -0
  146. package/bin/runners/lib/schemas/error-envelope.schema.json +105 -0
  147. package/bin/runners/lib/schemas/finding-v3.schema.json +151 -0
  148. package/bin/runners/lib/schemas/report-artifact.schema.json +120 -0
  149. package/bin/runners/lib/schemas/run-request.schema.json +108 -0
  150. package/bin/runners/lib/schemas/validator.js +27 -0
  151. package/bin/runners/lib/schemas/verdict.schema.json +140 -0
  152. package/bin/runners/lib/ship-output-enterprise.js +239 -0
  153. package/bin/runners/lib/ship-output.js +328 -31
  154. package/bin/runners/lib/terminal-ui.js +234 -731
  155. package/bin/runners/lib/truth.js +1332 -308
  156. package/bin/runners/lib/unified-cli-output.js +604 -0
  157. package/bin/runners/lib/unified-output.js +163 -155
  158. package/bin/runners/lib/upsell.js +104 -204
  159. package/bin/runners/runAgent.d.ts +5 -0
  160. package/bin/runners/runAgent.js +161 -0
  161. package/bin/runners/runAllowlist.js +166 -101
  162. package/bin/runners/runApprove.js +1200 -0
  163. package/bin/runners/runAuth.js +373 -95
  164. package/bin/runners/runCheckpoint.js +59 -21
  165. package/bin/runners/runClassify.js +926 -0
  166. package/bin/runners/runContext.d.ts +4 -0
  167. package/bin/runners/runContext.js +136 -24
  168. package/bin/runners/runDoctor.js +115 -67
  169. package/bin/runners/runEvidencePack.js +239 -96
  170. package/bin/runners/runFirewall.d.ts +5 -0
  171. package/bin/runners/runFirewall.js +134 -0
  172. package/bin/runners/runFirewallHook.d.ts +5 -0
  173. package/bin/runners/runFirewallHook.js +56 -0
  174. package/bin/runners/runFix.js +6 -5
  175. package/bin/runners/runGuard.js +212 -118
  176. package/bin/runners/runInit.js +66 -21
  177. package/bin/runners/runLabs.js +204 -121
  178. package/bin/runners/runMcp.js +131 -60
  179. package/bin/runners/runPolish.d.ts +4 -0
  180. package/bin/runners/runPolish.js +43 -20
  181. package/bin/runners/runProof.zip +0 -0
  182. package/bin/runners/runProve.js +15 -5
  183. package/bin/runners/runQuickstart.js +531 -0
  184. package/bin/runners/runReality.js +14 -0
  185. package/bin/runners/runReport.js +36 -4
  186. package/bin/runners/runScan.js +689 -91
  187. package/bin/runners/runShip.js +96 -40
  188. package/bin/runners/runTruth.d.ts +5 -0
  189. package/bin/runners/runTruth.js +101 -0
  190. package/bin/runners/runValidate.js +21 -4
  191. package/bin/runners/runWatch.js +118 -54
  192. package/bin/scan.js +6 -1
  193. package/bin/vibecheck.js +297 -52
  194. package/mcp-server/HARDENING_SUMMARY.md +299 -0
  195. package/mcp-server/agent-firewall-interceptor.js +500 -0
  196. package/mcp-server/authority-tools.js +569 -0
  197. package/mcp-server/conductor/conflict-resolver.js +588 -0
  198. package/mcp-server/conductor/execution-planner.js +544 -0
  199. package/mcp-server/conductor/index.js +377 -0
  200. package/mcp-server/conductor/lock-manager.js +615 -0
  201. package/mcp-server/conductor/request-queue.js +550 -0
  202. package/mcp-server/conductor/session-manager.js +500 -0
  203. package/mcp-server/conductor/tools.js +510 -0
  204. package/mcp-server/deprecation-middleware.js +282 -0
  205. package/mcp-server/handlers/index.ts +15 -0
  206. package/mcp-server/handlers/tool-handler.ts +474 -591
  207. package/mcp-server/index.js +1748 -1099
  208. package/mcp-server/lib/api-client.cjs +13 -0
  209. package/mcp-server/lib/cache-wrapper.cjs +383 -0
  210. package/mcp-server/lib/error-envelope.js +138 -0
  211. package/mcp-server/lib/executor.ts +428 -721
  212. package/mcp-server/lib/index.ts +19 -0
  213. package/mcp-server/lib/logger.cjs +30 -0
  214. package/mcp-server/lib/rate-limiter.js +166 -0
  215. package/mcp-server/lib/sandbox.test.ts +519 -0
  216. package/mcp-server/lib/sandbox.ts +342 -284
  217. package/mcp-server/lib/types.ts +267 -0
  218. package/mcp-server/logger.js +173 -0
  219. package/mcp-server/package.json +11 -27
  220. package/mcp-server/premium-tools.js +2 -2
  221. package/mcp-server/registry/tool-registry.js +794 -0
  222. package/mcp-server/registry/tools.json +507 -378
  223. package/mcp-server/registry.test.ts +334 -0
  224. package/mcp-server/tests/tier-gating.test.js +297 -0
  225. package/mcp-server/tier-auth.js +492 -347
  226. package/mcp-server/tools-v3.js +950 -0
  227. package/mcp-server/truth-context.js +131 -90
  228. package/mcp-server/truth-firewall-tools.js +1612 -1001
  229. package/mcp-server/tsconfig.json +8 -5
  230. package/mcp-server/vibecheck-2.0-tools.js +14 -1
  231. package/mcp-server/vibecheck-mcp-server-3.2.0.tgz +0 -0
  232. package/mcp-server/vibecheck-tools.js +2 -2
  233. package/package.json +4 -3
  234. package/bin/runners/runInstall.js +0 -281
  235. package/mcp-server/ARCHITECTURE.md +0 -339
  236. package/mcp-server/__tests__/cache.test.ts +0 -313
  237. package/mcp-server/__tests__/executor.test.ts +0 -239
  238. package/mcp-server/__tests__/fixtures/exclusion-test/.cache/webpack/cache.pack +0 -1
  239. package/mcp-server/__tests__/fixtures/exclusion-test/.next/server/chunk.js +0 -3
  240. package/mcp-server/__tests__/fixtures/exclusion-test/.turbo/cache.json +0 -3
  241. package/mcp-server/__tests__/fixtures/exclusion-test/.venv/lib/env.py +0 -3
  242. package/mcp-server/__tests__/fixtures/exclusion-test/dist/bundle.js +0 -3
  243. package/mcp-server/__tests__/fixtures/exclusion-test/package.json +0 -5
  244. package/mcp-server/__tests__/fixtures/exclusion-test/src/app.ts +0 -5
  245. package/mcp-server/__tests__/fixtures/exclusion-test/venv/lib/config.py +0 -4
  246. package/mcp-server/__tests__/ids.test.ts +0 -345
  247. package/mcp-server/__tests__/integration/tools.test.ts +0 -410
  248. package/mcp-server/__tests__/registry.test.ts +0 -365
  249. package/mcp-server/__tests__/sandbox.test.ts +0 -323
  250. package/mcp-server/__tests__/schemas.test.ts +0 -372
  251. package/mcp-server/benchmarks/run-benchmarks.ts +0 -304
  252. package/mcp-server/examples/doctor.request.json +0 -14
  253. package/mcp-server/examples/doctor.response.json +0 -53
  254. package/mcp-server/examples/error.response.json +0 -15
  255. package/mcp-server/examples/scan.request.json +0 -14
  256. package/mcp-server/examples/scan.response.json +0 -108
  257. package/mcp-server/index-v3.ts +0 -293
  258. package/mcp-server/index.old.js +0 -4137
  259. package/mcp-server/lib/cache.ts +0 -341
  260. package/mcp-server/lib/errors.ts +0 -346
  261. package/mcp-server/lib/ids.ts +0 -238
  262. package/mcp-server/lib/logger.ts +0 -368
  263. package/mcp-server/lib/metrics.ts +0 -365
  264. package/mcp-server/lib/validator.ts +0 -229
  265. package/mcp-server/package-lock.json +0 -165
  266. package/mcp-server/schemas/error-envelope.schema.json +0 -125
  267. package/mcp-server/schemas/finding.schema.json +0 -167
  268. package/mcp-server/schemas/report-artifact.schema.json +0 -88
  269. package/mcp-server/schemas/run-request.schema.json +0 -75
  270. package/mcp-server/schemas/verdict.schema.json +0 -168
  271. package/mcp-server/tier-auth.d.ts +0 -71
  272. package/mcp-server/vitest.config.ts +0 -16
@@ -0,0 +1,4 @@
1
+ /**
2
+ * Type declarations for runContext.js
3
+ */
4
+ export function runContext(args: string[]): Promise<number>;
@@ -1,22 +1,39 @@
1
1
  /**
2
2
  * runContext.js - AI Rules Generator
3
3
  *
4
- * Generates .cursorrules, .windsurf/rules, and other AI context files.
4
+ * ═══════════════════════════════════════════════════════════════════════════════
5
+ * World-Class AI Context Generation
6
+ * ═══════════════════════════════════════════════════════════════════════════════
5
7
  */
6
8
 
7
9
  const path = require("path");
10
+ const fs = require("fs");
8
11
  const { runContext: contextRunner } = require("./context");
9
- const { parseGlobalFlags, shouldShowBanner } = require("./lib/global-flags");
12
+ const { parseGlobalFlags, shouldShowBanner, shouldSuppressOutput, isJsonMode } = require("./lib/global-flags");
13
+ const { EXIT } = require("./lib/exit-codes");
14
+ const {
15
+ ansi,
16
+ sym,
17
+ renderMinimalHeader,
18
+ renderSectionHeader,
19
+ renderSuccess,
20
+ renderError,
21
+ renderBullet,
22
+ renderFooter,
23
+ Spinner,
24
+ getTierFromKey,
25
+ } = require("./lib/unified-cli-output");
10
26
 
11
27
  async function runContext(args) {
12
- // Parse global flags first
13
28
  const { flags: globalFlags, cleanArgs } = parseGlobalFlags(args);
14
-
29
+ const quiet = shouldSuppressOutput(globalFlags);
30
+ const json = isJsonMode(globalFlags);
15
31
  const root = globalFlags.path || process.cwd();
32
+ const startTime = Date.now();
16
33
 
17
34
  // Parse command-specific args
18
35
  const opts = {
19
- ...globalFlags, // Merge global flags (includes help, json, noBanner, etc.)
36
+ ...globalFlags,
20
37
  output: null,
21
38
  format: "all"
22
39
  };
@@ -29,34 +46,129 @@ async function runContext(args) {
29
46
  }
30
47
 
31
48
  if (opts.help) {
32
- const banner = shouldShowBanner(opts) ? `
33
- ${require('./lib/global-flags').BANNER || ''}
34
- ` : '';
35
- console.log(`${banner}
36
- vibecheck context - Generate AI rules files
37
-
38
- USAGE
39
- vibecheck context Generate all AI rules files
40
- vibecheck context --format X Generate specific format (cursor, windsurf, all)
41
-
42
- OPTIONS
43
- -o, --output <dir> Output directory (default: project root)
44
- -f, --format <fmt> Format: cursor, windsurf, all (default: all)
45
- -h, --help Show this help
49
+ console.log(`
50
+ ${ansi.bold}USAGE${ansi.reset}
51
+ ${ansi.cyan}vibecheck context${ansi.reset} [options]
52
+
53
+ ${ansi.dim}Aliases: rules, ai-rules, mdc${ansi.reset}
54
+
55
+ Generate project-aware AI coding rules for your IDE. These rules help
56
+ AI assistants understand your codebase conventions, preventing common
57
+ mistakes and enforcing patterns.
58
+
59
+ ${ansi.bold}FORMATS${ansi.reset}
60
+ ${ansi.cyan}cursor${ansi.reset} .cursorrules file for Cursor IDE
61
+ ${ansi.cyan}mdc${ansi.reset} MDC format (.cursor/rules/*.mdc)
62
+ ${ansi.cyan}windsurf${ansi.reset} Windsurf rules directory
63
+ ${ansi.cyan}copilot${ansi.reset} GitHub Copilot instructions
64
+ ${ansi.cyan}all${ansi.reset} Generate all formats (default)
65
+
66
+ ${ansi.bold}OPTIONS${ansi.reset}
67
+ ${ansi.cyan}-f, --format <fmt>${ansi.reset} Format to generate (default: all)
68
+ ${ansi.cyan}-o, --output <dir>${ansi.reset} Output directory (default: project root)
69
+ ${ansi.cyan}--json${ansi.reset} Output result as JSON
70
+ ${ansi.cyan}--quiet, -q${ansi.reset} Suppress non-essential output
71
+ ${ansi.cyan}--help, -h${ansi.reset} Show this help
72
+
73
+ ${ansi.bold}EXAMPLES${ansi.reset}
74
+ ${ansi.dim}# Generate all rule files${ansi.reset}
75
+ vibecheck context
76
+
77
+ ${ansi.dim}# Generate only Cursor rules${ansi.reset}
78
+ vibecheck context --format cursor
79
+
80
+ ${ansi.dim}# Custom output directory${ansi.reset}
81
+ vibecheck context --output ./ai-rules
82
+
83
+ ${ansi.bold}OUTPUT FILES${ansi.reset}
84
+ .cursorrules Cursor IDE rules
85
+ .cursor/rules/*.mdc MDC format rules
86
+ .windsurf/rules/*.md Windsurf rules
87
+ .github/copilot-instructions.md
88
+
89
+ ${ansi.dim}────────────────────────────────────────────────────────────────────${ansi.reset}
90
+ ${ansi.dim}Documentation: https://docs.vibecheckai.dev/cli/context${ansi.reset}
46
91
  `);
47
- return 0;
92
+ return EXIT.SUCCESS;
93
+ }
94
+
95
+ // Validate project path exists
96
+ if (!fs.existsSync(root)) {
97
+ if (json) {
98
+ console.log(JSON.stringify({ success: false, error: `Project path does not exist: ${root}` }));
99
+ } else {
100
+ renderError(`Project path does not exist: ${root}`);
101
+ console.log(` ${ansi.dim}Verify the path and try again.${ansi.reset}`);
102
+ }
103
+ return EXIT.NOT_FOUND;
104
+ }
105
+
106
+ // Validate format option
107
+ const validFormats = ["all", "cursor", "mdc", "windsurf", "copilot"];
108
+ if (!validFormats.includes(opts.format)) {
109
+ if (json) {
110
+ console.log(JSON.stringify({ success: false, error: `Unknown format: ${opts.format}`, validFormats }));
111
+ } else {
112
+ renderError(`Unknown format: ${opts.format}`);
113
+ console.log(` ${ansi.dim}Valid formats: ${validFormats.join(", ")}${ansi.reset}`);
114
+ }
115
+ return EXIT.USER_ERROR;
48
116
  }
49
117
 
50
118
  try {
51
- await contextRunner({
119
+ if (!quiet && !json) {
120
+ renderMinimalHeader("context", "starter");
121
+ renderSectionHeader("Generating AI Rules", sym.gear);
122
+ }
123
+
124
+ const spinner = !quiet && !json ? new Spinner(`Analyzing project and generating ${opts.format} rules`).start() : null;
125
+
126
+ const result = await contextRunner({
52
127
  repoRoot: root,
53
128
  output: opts.output,
54
129
  format: opts.format
55
130
  });
56
- return 0;
131
+
132
+ const duration = Date.now() - startTime;
133
+
134
+ if (json) {
135
+ console.log(JSON.stringify({
136
+ success: true,
137
+ format: opts.format,
138
+ files: result?.files || [],
139
+ path: root,
140
+ duration,
141
+ }));
142
+ } else if (!quiet) {
143
+ spinner?.succeed("AI rules generated successfully");
144
+
145
+ // Show generated files
146
+ if (result?.files && result.files.length > 0) {
147
+ console.log();
148
+ console.log(` ${ansi.bold}Generated files:${ansi.reset}`);
149
+ result.files.forEach(f => {
150
+ renderBullet(`${ansi.cyan}${f}${ansi.reset}`, 4);
151
+ });
152
+ }
153
+
154
+ renderFooter({
155
+ nextSteps: [
156
+ { cmd: "vibecheck scan", desc: "analyze code quality" },
157
+ { cmd: "vibecheck guard", desc: "validate AI outputs" },
158
+ ],
159
+ docsUrl: "https://docs.vibecheckai.dev/cli/context",
160
+ });
161
+ }
162
+
163
+ return EXIT.SUCCESS;
57
164
  } catch (error) {
58
- console.error("Error generating context:", error.message);
59
- return 1;
165
+ if (json) {
166
+ console.log(JSON.stringify({ success: false, error: error.message }));
167
+ } else {
168
+ renderError(`Failed to generate context: ${error.message}`);
169
+ console.log(` ${ansi.dim}Run "vibecheck doctor" to check your setup.${ansi.reset}`);
170
+ }
171
+ return EXIT.INTERNAL_ERROR;
60
172
  }
61
173
  }
62
174
 
@@ -18,7 +18,10 @@ const {
18
18
  verdictToExitCode,
19
19
  saveArtifact
20
20
  } = require("./lib/cli-output");
21
- const { parseGlobalFlags, shouldShowBanner } = require("./lib/global-flags");
21
+ const { parseGlobalFlags, shouldShowBanner, shouldSuppressOutput, isJsonMode } = require("./lib/global-flags");
22
+ const { EXIT } = require("./lib/exit-codes");
23
+ const { formatWorkflowUpsell } = require("./lib/upsell");
24
+ const { getApiKey } = require("./lib/auth");
22
25
 
23
26
  // ═══════════════════════════════════════════════════════════════════════════════
24
27
  // ADVANCED TERMINAL - ANSI CODES & UTILITIES
@@ -298,86 +301,110 @@ async function runDoctor(args, context = {}) {
298
301
  const startTime = context.startTime || new Date().toISOString();
299
302
 
300
303
  const opts = parseArgs(args);
304
+ const quiet = shouldSuppressOutput(opts);
305
+ const json = isJsonMode(opts);
301
306
  const executionStart = Date.now();
302
307
 
303
308
  if (opts.help) {
304
309
  printHelp(shouldShowBanner(opts));
305
- return 0;
310
+ return EXIT.SUCCESS;
306
311
  }
307
312
 
308
313
  const projectPath = path.resolve(opts.path || process.cwd());
309
- const projectName = path.basename(projectPath);
310
314
 
311
- // Print banner conditionally
312
- if (shouldShowBanner(opts)) {
313
- printBanner();
314
- console.log(` ${c.dim}Project:${c.reset} ${c.bold}${projectName}${c.reset}`);
315
- console.log(` ${c.dim}Path:${c.reset} ${projectPath}`);
316
- console.log();
315
+ // Validate project path exists
316
+ if (!fs.existsSync(projectPath)) {
317
+ if (json) {
318
+ console.log(JSON.stringify({ success: false, error: `Project path does not exist: ${projectPath}` }));
319
+ } else {
320
+ console.error(` ❌ Project path does not exist: ${projectPath}`);
321
+ }
322
+ return EXIT.NOT_FOUND;
317
323
  }
324
+ const projectName = path.basename(projectPath);
318
325
 
319
- // Use new DoctorService if available
320
- if (DoctorService.name === 'DoctorService') {
321
- const doctor = new DoctorService(projectPath, {
322
- json: opts.json,
323
- fix: opts.fix,
324
- fixDryRun: opts.dryRun,
325
- quiet: opts.quiet,
326
- verbose: opts.verbose,
327
- categories: opts.categories,
328
- skipNetwork: opts.skipNetwork,
329
- saveReport: opts.saveReport,
330
- failOnWarn: opts.failOnWarn,
331
- runId,
332
- });
333
-
334
- const results = await doctor.run();
326
+ try {
327
+ // Print banner conditionally
328
+ if (shouldShowBanner(opts) && !quiet) {
329
+ printBanner();
330
+ console.log(` ${c.dim}Project:${c.reset} ${c.bold}${projectName}${c.reset}`);
331
+ console.log(` ${c.dim}Path:${c.reset} ${projectPath}`);
332
+ console.log();
333
+ }
335
334
 
336
- // Apply CLI output conventions
337
- if (opts.json) {
338
- const output = createJsonOutput({
335
+ // Use new DoctorService if available
336
+ if (DoctorService.name === 'DoctorService') {
337
+ const doctor = new DoctorService(projectPath, {
338
+ json: opts.json,
339
+ fix: opts.fix,
340
+ fixDryRun: opts.dryRun,
341
+ quiet: opts.quiet || quiet,
342
+ verbose: opts.verbose,
343
+ categories: opts.categories,
344
+ skipNetwork: opts.skipNetwork,
345
+ saveReport: opts.saveReport,
346
+ failOnWarn: opts.failOnWarn,
339
347
  runId,
340
- command: "doctor",
341
- startTime,
342
- exitCode: results.exitCode || 0,
343
- verdict: exitCodeToVerdict(results.exitCode || 0),
344
- result: {
345
- health: results.health || "unknown",
346
- checks: results.checks || [],
347
- fixes: results.fixes || [],
348
- summary: {
349
- total: results.totalChecks || 0,
350
- passed: results.passedChecks || 0,
351
- warnings: results.warnings || 0,
352
- errors: results.errors || 0,
353
- }
354
- },
355
- tier: "free",
356
- version: require("../../package.json").version,
357
- artifacts: results.reportPath ? [{
358
- type: "report",
359
- path: results.reportPath,
360
- description: "Doctor report"
361
- }] : []
362
348
  });
363
349
 
364
- writeJsonOutput(output, opts.output);
350
+ const results = await doctor.run();
351
+
352
+ // Apply CLI output conventions
353
+ if (opts.json || json) {
354
+ const output = createJsonOutput({
355
+ runId,
356
+ command: "doctor",
357
+ startTime,
358
+ exitCode: results.exitCode || EXIT.SUCCESS,
359
+ verdict: exitCodeToVerdict(results.exitCode || EXIT.SUCCESS),
360
+ result: {
361
+ health: results.health || "unknown",
362
+ checks: results.checks || [],
363
+ fixes: results.fixes || [],
364
+ summary: {
365
+ total: results.totalChecks || 0,
366
+ passed: results.passedChecks || 0,
367
+ warnings: results.warnings || 0,
368
+ errors: results.errors || 0,
369
+ }
370
+ },
371
+ tier: "free",
372
+ version: require("../../package.json").version,
373
+ artifacts: results.reportPath ? [{
374
+ type: "report",
375
+ path: results.reportPath,
376
+ description: "Doctor report"
377
+ }] : []
378
+ });
379
+
380
+ writeJsonOutput(output, opts.output);
381
+ }
382
+
383
+ // Save artifacts
384
+ if (results.checks) {
385
+ saveArtifact(runId, "checks", results.checks);
386
+ }
387
+ if (results.fixes) {
388
+ saveArtifact(runId, "fixes", results.fixes);
389
+ }
390
+
391
+ // Map results to proper exit codes
392
+ if (results.errors > 0) return EXIT.BLOCKING;
393
+ if (results.warnings > 0) return EXIT.WARNINGS;
394
+ return EXIT.SUCCESS;
365
395
  }
366
396
 
367
- // Save artifacts
368
- if (results.checks) {
369
- saveArtifact(runId, "checks", results.checks);
370
- }
371
- if (results.fixes) {
372
- saveArtifact(runId, "fixes", results.fixes);
397
+ // Legacy fallback
398
+ const doctor = new DoctorService(projectPath, opts);
399
+ return await doctor.diagnose();
400
+ } catch (error) {
401
+ if (json) {
402
+ console.log(JSON.stringify({ success: false, error: error.message }));
403
+ } else {
404
+ console.error(` ❌ Doctor check failed: ${error.message}`);
373
405
  }
374
-
375
- return results.exitCode || 0;
406
+ return EXIT.INTERNAL_ERROR;
376
407
  }
377
-
378
- // Legacy fallback
379
- const doctor = new DoctorService(projectPath, opts);
380
- return await doctor.diagnose();
381
408
  }
382
409
 
383
410
  function parseArgs(args) {
@@ -573,12 +600,33 @@ function runDoctorLegacy() {
573
600
  }
574
601
 
575
602
  console.log("");
603
+
604
+ // Get tier for upsell
605
+ const { key } = getApiKey();
606
+ const currentTier = key ? "starter" : "free";
607
+
576
608
  if (hasIssues) {
577
- console.log(" ❌ Issues found. Fix them and run doctor again.\n");
578
- return 2;
609
+ console.log(" ❌ Issues found. Fix them and run doctor again.");
610
+ console.log();
611
+ console.log(` ${c.dim}Need help?${c.reset} ${colors.accent}vibecheck fix${c.reset} ${c.dim}can auto-repair many issues${c.reset}`);
612
+ if (currentTier === "free") {
613
+ console.log(` ${c.dim}Requires STARTER plan • vibecheckai.dev${c.reset}`);
614
+ }
615
+ console.log();
616
+ return EXIT.BLOCKING;
579
617
  } else {
580
- console.log(" ✅ Environment healthy!\n");
581
- return 0;
618
+ console.log(" ✅ Environment healthy!");
619
+ console.log();
620
+
621
+ // Workflow upsell
622
+ const workflow = formatWorkflowUpsell("doctor", currentTier);
623
+ if (workflow) {
624
+ console.log(` ${workflow}`);
625
+ } else {
626
+ console.log(` ${c.dim}Ready to scan?${c.reset} ${colors.accent}vibecheck scan${c.reset} ${c.dim}finds AI mistakes before they ship${c.reset}`);
627
+ }
628
+ console.log();
629
+ return EXIT.SUCCESS;
582
630
  }
583
631
  }
584
632