@vibecheckai/cli 3.5.0 → 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.
Files changed (224) hide show
  1. package/bin/registry.js +214 -237
  2. package/bin/runners/cli-utils.js +33 -2
  3. package/bin/runners/context/analyzer.js +52 -1
  4. package/bin/runners/context/generators/cursor.js +2 -49
  5. package/bin/runners/context/git-context.js +3 -1
  6. package/bin/runners/context/team-conventions.js +33 -7
  7. package/bin/runners/lib/analysis-core.js +25 -5
  8. package/bin/runners/lib/analyzers.js +431 -481
  9. package/bin/runners/lib/default-config.js +127 -0
  10. package/bin/runners/lib/doctor/modules/security.js +3 -1
  11. package/bin/runners/lib/engine/ast-cache.js +210 -0
  12. package/bin/runners/lib/engine/auth-extractor.js +211 -0
  13. package/bin/runners/lib/engine/billing-extractor.js +112 -0
  14. package/bin/runners/lib/engine/enforcement-extractor.js +100 -0
  15. package/bin/runners/lib/engine/env-extractor.js +207 -0
  16. package/bin/runners/lib/engine/express-extractor.js +208 -0
  17. package/bin/runners/lib/engine/extractors.js +849 -0
  18. package/bin/runners/lib/engine/index.js +207 -0
  19. package/bin/runners/lib/engine/repo-index.js +514 -0
  20. package/bin/runners/lib/engine/types.js +124 -0
  21. package/bin/runners/lib/engines/accessibility-engine.js +18 -218
  22. package/bin/runners/lib/engines/api-consistency-engine.js +30 -335
  23. package/bin/runners/lib/engines/cross-file-analysis-engine.js +27 -292
  24. package/bin/runners/lib/engines/empty-catch-engine.js +17 -127
  25. package/bin/runners/lib/engines/mock-data-engine.js +10 -53
  26. package/bin/runners/lib/engines/performance-issues-engine.js +36 -176
  27. package/bin/runners/lib/engines/security-vulnerabilities-engine.js +54 -382
  28. package/bin/runners/lib/engines/type-aware-engine.js +39 -263
  29. package/bin/runners/lib/engines/vibecheck-engines/index.js +13 -122
  30. package/bin/runners/lib/engines/vibecheck-engines/lib/ast-cache.js +164 -0
  31. package/bin/runners/lib/engines/vibecheck-engines/lib/code-quality-engine.js +291 -0
  32. package/bin/runners/lib/engines/vibecheck-engines/lib/console-logs-engine.js +83 -0
  33. package/bin/runners/lib/engines/vibecheck-engines/lib/dead-code-engine.js +198 -0
  34. package/bin/runners/lib/engines/vibecheck-engines/lib/deprecated-api-engine.js +275 -0
  35. package/bin/runners/lib/engines/vibecheck-engines/lib/empty-catch-engine.js +167 -0
  36. package/bin/runners/lib/engines/vibecheck-engines/lib/file-filter.js +217 -0
  37. package/bin/runners/lib/engines/vibecheck-engines/lib/hardcoded-secrets-engine.js +73 -373
  38. package/bin/runners/lib/engines/vibecheck-engines/lib/mock-data-engine.js +140 -0
  39. package/bin/runners/lib/engines/vibecheck-engines/lib/parallel-processor.js +164 -0
  40. package/bin/runners/lib/engines/vibecheck-engines/lib/performance-issues-engine.js +234 -0
  41. package/bin/runners/lib/engines/vibecheck-engines/lib/type-aware-engine.js +217 -0
  42. package/bin/runners/lib/engines/vibecheck-engines/lib/unsafe-regex-engine.js +78 -0
  43. package/bin/runners/lib/entitlements-v2.js +73 -97
  44. package/bin/runners/lib/error-handler.js +44 -3
  45. package/bin/runners/lib/error-messages.js +289 -0
  46. package/bin/runners/lib/evidence-pack.js +7 -1
  47. package/bin/runners/lib/finding-id.js +69 -0
  48. package/bin/runners/lib/finding-sorter.js +89 -0
  49. package/bin/runners/lib/html-proof-report.js +700 -350
  50. package/bin/runners/lib/missions/plan.js +6 -46
  51. package/bin/runners/lib/missions/templates.js +0 -232
  52. package/bin/runners/lib/next-action.js +560 -0
  53. package/bin/runners/lib/prerequisites.js +149 -0
  54. package/bin/runners/lib/route-detection.js +137 -68
  55. package/bin/runners/lib/scan-output.js +91 -76
  56. package/bin/runners/lib/scan-runner.js +135 -0
  57. package/bin/runners/lib/schemas/ajv-validator.js +464 -0
  58. package/bin/runners/lib/schemas/error-envelope.schema.json +105 -0
  59. package/bin/runners/lib/schemas/finding-v3.schema.json +151 -0
  60. package/bin/runners/lib/schemas/report-artifact.schema.json +120 -0
  61. package/bin/runners/lib/schemas/run-request.schema.json +108 -0
  62. package/bin/runners/lib/schemas/validator.js +27 -0
  63. package/bin/runners/lib/schemas/verdict.schema.json +140 -0
  64. package/bin/runners/lib/ship-output-enterprise.js +23 -23
  65. package/bin/runners/lib/ship-output.js +75 -31
  66. package/bin/runners/lib/terminal-ui.js +6 -113
  67. package/bin/runners/lib/truth.js +351 -10
  68. package/bin/runners/lib/unified-cli-output.js +430 -603
  69. package/bin/runners/lib/unified-output.js +13 -9
  70. package/bin/runners/runAIAgent.js +10 -5
  71. package/bin/runners/runAgent.js +0 -3
  72. package/bin/runners/runAllowlist.js +389 -0
  73. package/bin/runners/runApprove.js +0 -33
  74. package/bin/runners/runAuth.js +73 -45
  75. package/bin/runners/runCheckpoint.js +51 -11
  76. package/bin/runners/runClassify.js +85 -21
  77. package/bin/runners/runContext.js +0 -3
  78. package/bin/runners/runDoctor.js +41 -28
  79. package/bin/runners/runEvidencePack.js +362 -0
  80. package/bin/runners/runFirewall.js +0 -3
  81. package/bin/runners/runFirewallHook.js +0 -3
  82. package/bin/runners/runFix.js +66 -76
  83. package/bin/runners/runGuard.js +18 -411
  84. package/bin/runners/runInit.js +113 -30
  85. package/bin/runners/runLabs.js +424 -0
  86. package/bin/runners/runMcp.js +19 -25
  87. package/bin/runners/runPolish.js +64 -240
  88. package/bin/runners/runPromptFirewall.js +12 -5
  89. package/bin/runners/runProve.js +57 -22
  90. package/bin/runners/runQuickstart.js +531 -0
  91. package/bin/runners/runReality.js +59 -68
  92. package/bin/runners/runReport.js +38 -33
  93. package/bin/runners/runRuntime.js +8 -5
  94. package/bin/runners/runScan.js +1413 -190
  95. package/bin/runners/runShip.js +113 -719
  96. package/bin/runners/runTruth.js +0 -3
  97. package/bin/runners/runValidate.js +13 -9
  98. package/bin/runners/runWatch.js +23 -14
  99. package/bin/scan.js +6 -1
  100. package/bin/vibecheck.js +204 -185
  101. package/mcp-server/deprecation-middleware.js +282 -0
  102. package/mcp-server/handlers/index.ts +15 -0
  103. package/mcp-server/handlers/tool-handler.ts +554 -0
  104. package/mcp-server/index-v1.js +698 -0
  105. package/mcp-server/index.js +210 -238
  106. package/mcp-server/lib/cache-wrapper.cjs +383 -0
  107. package/mcp-server/lib/error-envelope.js +138 -0
  108. package/mcp-server/lib/executor.ts +499 -0
  109. package/mcp-server/lib/index.ts +19 -0
  110. package/mcp-server/lib/rate-limiter.js +166 -0
  111. package/mcp-server/lib/sandbox.test.ts +519 -0
  112. package/mcp-server/lib/sandbox.ts +395 -0
  113. package/mcp-server/lib/types.ts +267 -0
  114. package/mcp-server/package.json +12 -3
  115. package/mcp-server/registry/tool-registry.js +794 -0
  116. package/mcp-server/registry/tools.json +605 -0
  117. package/mcp-server/registry.test.ts +334 -0
  118. package/mcp-server/tests/tier-gating.test.js +297 -0
  119. package/mcp-server/tier-auth.js +378 -45
  120. package/mcp-server/tools-v3.js +353 -442
  121. package/mcp-server/tsconfig.json +37 -0
  122. package/mcp-server/vibecheck-2.0-tools.js +14 -1
  123. package/package.json +1 -1
  124. package/bin/runners/lib/agent-firewall/learning/learning-engine.js +0 -849
  125. package/bin/runners/lib/audit-logger.js +0 -532
  126. package/bin/runners/lib/authority/authorities/architecture.js +0 -364
  127. package/bin/runners/lib/authority/authorities/compliance.js +0 -341
  128. package/bin/runners/lib/authority/authorities/human.js +0 -343
  129. package/bin/runners/lib/authority/authorities/quality.js +0 -420
  130. package/bin/runners/lib/authority/authorities/security.js +0 -228
  131. package/bin/runners/lib/authority/index.js +0 -293
  132. package/bin/runners/lib/bundle/bundle-intelligence.js +0 -846
  133. package/bin/runners/lib/cli-charts.js +0 -368
  134. package/bin/runners/lib/cli-config-display.js +0 -405
  135. package/bin/runners/lib/cli-demo.js +0 -275
  136. package/bin/runners/lib/cli-errors.js +0 -438
  137. package/bin/runners/lib/cli-help-formatter.js +0 -439
  138. package/bin/runners/lib/cli-interactive-menu.js +0 -509
  139. package/bin/runners/lib/cli-prompts.js +0 -441
  140. package/bin/runners/lib/cli-scan-cards.js +0 -362
  141. package/bin/runners/lib/compliance-reporter.js +0 -710
  142. package/bin/runners/lib/conductor/index.js +0 -671
  143. package/bin/runners/lib/easy/README.md +0 -123
  144. package/bin/runners/lib/easy/index.js +0 -140
  145. package/bin/runners/lib/easy/interactive-wizard.js +0 -788
  146. package/bin/runners/lib/easy/one-click-firewall.js +0 -564
  147. package/bin/runners/lib/easy/zero-config-reality.js +0 -714
  148. package/bin/runners/lib/engines/async-patterns-engine.js +0 -444
  149. package/bin/runners/lib/engines/bundle-size-engine.js +0 -433
  150. package/bin/runners/lib/engines/confidence-scoring.js +0 -276
  151. package/bin/runners/lib/engines/context-detection.js +0 -264
  152. package/bin/runners/lib/engines/database-patterns-engine.js +0 -429
  153. package/bin/runners/lib/engines/duplicate-code-engine.js +0 -354
  154. package/bin/runners/lib/engines/env-variables-engine.js +0 -458
  155. package/bin/runners/lib/engines/error-handling-engine.js +0 -437
  156. package/bin/runners/lib/engines/false-positive-prevention.js +0 -630
  157. package/bin/runners/lib/engines/framework-adapters/index.js +0 -607
  158. package/bin/runners/lib/engines/framework-detection.js +0 -508
  159. package/bin/runners/lib/engines/import-order-engine.js +0 -429
  160. package/bin/runners/lib/engines/naming-conventions-engine.js +0 -544
  161. package/bin/runners/lib/engines/noise-reduction-engine.js +0 -452
  162. package/bin/runners/lib/engines/orchestrator.js +0 -334
  163. package/bin/runners/lib/engines/react-patterns-engine.js +0 -457
  164. package/bin/runners/lib/engines/vibecheck-engines/lib/ai-hallucination-engine.js +0 -806
  165. package/bin/runners/lib/engines/vibecheck-engines/lib/smart-fix-engine.js +0 -577
  166. package/bin/runners/lib/engines/vibecheck-engines/lib/vibe-score-engine.js +0 -543
  167. package/bin/runners/lib/engines/vibecheck-engines.js +0 -514
  168. package/bin/runners/lib/enhanced-features/index.js +0 -305
  169. package/bin/runners/lib/enhanced-output.js +0 -631
  170. package/bin/runners/lib/enterprise.js +0 -300
  171. package/bin/runners/lib/firewall/command-validator.js +0 -351
  172. package/bin/runners/lib/firewall/config.js +0 -341
  173. package/bin/runners/lib/firewall/content-validator.js +0 -519
  174. package/bin/runners/lib/firewall/index.js +0 -101
  175. package/bin/runners/lib/firewall/path-validator.js +0 -256
  176. package/bin/runners/lib/intelligence/cross-repo-intelligence.js +0 -817
  177. package/bin/runners/lib/mcp-utils.js +0 -425
  178. package/bin/runners/lib/output/index.js +0 -1022
  179. package/bin/runners/lib/policy-engine.js +0 -652
  180. package/bin/runners/lib/polish/autofix/accessibility-fixes.js +0 -333
  181. package/bin/runners/lib/polish/autofix/async-handlers.js +0 -273
  182. package/bin/runners/lib/polish/autofix/dead-code.js +0 -280
  183. package/bin/runners/lib/polish/autofix/imports-optimizer.js +0 -344
  184. package/bin/runners/lib/polish/autofix/index.js +0 -200
  185. package/bin/runners/lib/polish/autofix/remove-consoles.js +0 -209
  186. package/bin/runners/lib/polish/autofix/strengthen-types.js +0 -245
  187. package/bin/runners/lib/polish/backend-checks.js +0 -148
  188. package/bin/runners/lib/polish/documentation-checks.js +0 -111
  189. package/bin/runners/lib/polish/frontend-checks.js +0 -168
  190. package/bin/runners/lib/polish/index.js +0 -71
  191. package/bin/runners/lib/polish/infrastructure-checks.js +0 -131
  192. package/bin/runners/lib/polish/library-detection.js +0 -175
  193. package/bin/runners/lib/polish/performance-checks.js +0 -100
  194. package/bin/runners/lib/polish/security-checks.js +0 -148
  195. package/bin/runners/lib/polish/utils.js +0 -203
  196. package/bin/runners/lib/prompt-builder.js +0 -540
  197. package/bin/runners/lib/proof-certificate.js +0 -634
  198. package/bin/runners/lib/reality/accessibility-audit.js +0 -946
  199. package/bin/runners/lib/reality/api-contract-validator.js +0 -1012
  200. package/bin/runners/lib/reality/chaos-engineering.js +0 -1084
  201. package/bin/runners/lib/reality/performance-tracker.js +0 -1077
  202. package/bin/runners/lib/reality/scenario-generator.js +0 -1404
  203. package/bin/runners/lib/reality/visual-regression.js +0 -852
  204. package/bin/runners/lib/reality-profiler.js +0 -717
  205. package/bin/runners/lib/replay/flight-recorder-viewer.js +0 -1160
  206. package/bin/runners/lib/review/ai-code-review.js +0 -832
  207. package/bin/runners/lib/rules/custom-rule-engine.js +0 -985
  208. package/bin/runners/lib/sbom-generator.js +0 -641
  209. package/bin/runners/lib/scan-output-enhanced.js +0 -512
  210. package/bin/runners/lib/security/owasp-scanner.js +0 -939
  211. package/bin/runners/lib/validators/contract-validator.js +0 -283
  212. package/bin/runners/lib/validators/dead-export-detector.js +0 -279
  213. package/bin/runners/lib/validators/dep-audit.js +0 -245
  214. package/bin/runners/lib/validators/env-validator.js +0 -319
  215. package/bin/runners/lib/validators/index.js +0 -120
  216. package/bin/runners/lib/validators/license-checker.js +0 -252
  217. package/bin/runners/lib/validators/route-validator.js +0 -290
  218. package/bin/runners/runAuthority.js +0 -528
  219. package/bin/runners/runConductor.js +0 -772
  220. package/bin/runners/runContainer.js +0 -366
  221. package/bin/runners/runEasy.js +0 -410
  222. package/bin/runners/runIaC.js +0 -372
  223. package/bin/runners/runVibe.js +0 -791
  224. package/mcp-server/tools.js +0 -495
@@ -1,300 +0,0 @@
1
- /**
2
- * Enterprise Module Index
3
- *
4
- * All enterprise-grade features in one place:
5
- * - Proof Certificates
6
- * - Compliance Reporting (SOC2, HIPAA, PCI-DSS)
7
- * - Audit Logging
8
- * - Policy Enforcement
9
- * - SBOM Generation
10
- */
11
-
12
- "use strict";
13
-
14
- // Proof Certificates
15
- let proofCertificate;
16
- try {
17
- proofCertificate = require("./proof-certificate");
18
- } catch (e) {
19
- proofCertificate = null;
20
- }
21
-
22
- // Compliance Reporter
23
- let complianceReporter;
24
- try {
25
- complianceReporter = require("./compliance-reporter");
26
- } catch (e) {
27
- complianceReporter = null;
28
- }
29
-
30
- // Audit Logger
31
- let auditLogger;
32
- try {
33
- auditLogger = require("./audit-logger");
34
- } catch (e) {
35
- auditLogger = null;
36
- }
37
-
38
- // Policy Engine
39
- let policyEngine;
40
- try {
41
- policyEngine = require("./policy-engine");
42
- } catch (e) {
43
- policyEngine = null;
44
- }
45
-
46
- // SBOM Generator
47
- let sbomGenerator;
48
- try {
49
- sbomGenerator = require("./sbom-generator");
50
- } catch (e) {
51
- sbomGenerator = null;
52
- }
53
-
54
- /**
55
- * Check if all enterprise features are available
56
- */
57
- function isEnterpriseReady() {
58
- return !!(
59
- proofCertificate &&
60
- complianceReporter &&
61
- auditLogger &&
62
- policyEngine &&
63
- sbomGenerator
64
- );
65
- }
66
-
67
- /**
68
- * Get list of available enterprise features
69
- */
70
- function getAvailableFeatures() {
71
- const features = [];
72
-
73
- if (proofCertificate) {
74
- features.push({
75
- name: "Proof Certificates",
76
- module: "proof-certificate",
77
- description: "Cryptographic proof certificates with risk radar and pre-flight checklist",
78
- });
79
- }
80
-
81
- if (complianceReporter) {
82
- features.push({
83
- name: "Compliance Reporting",
84
- module: "compliance-reporter",
85
- description: "SOC 2, HIPAA, PCI-DSS compliance reports",
86
- });
87
- }
88
-
89
- if (auditLogger) {
90
- features.push({
91
- name: "Audit Logging",
92
- module: "audit-logger",
93
- description: "Tamper-evident audit logs with SIEM integration",
94
- });
95
- }
96
-
97
- if (policyEngine) {
98
- features.push({
99
- name: "Policy Enforcement",
100
- module: "policy-engine",
101
- description: "Custom security policies with override workflow",
102
- });
103
- }
104
-
105
- if (sbomGenerator) {
106
- features.push({
107
- name: "SBOM Generation",
108
- module: "sbom-generator",
109
- description: "CycloneDX and SPDX SBOMs with vulnerability correlation",
110
- });
111
- }
112
-
113
- return features;
114
- }
115
-
116
- /**
117
- * Run full enterprise scan
118
- */
119
- async function runEnterpriseScan(options = {}) {
120
- const {
121
- projectPath = process.cwd(),
122
- findings = [],
123
- proofGraph = null,
124
- tier = "pro",
125
- version = "1.0.0",
126
- } = options;
127
-
128
- const results = {
129
- certificate: null,
130
- compliance: {},
131
- audit: null,
132
- policy: null,
133
- sbom: null,
134
- };
135
-
136
- // Generate Proof Certificate
137
- if (proofCertificate) {
138
- const path = require("path");
139
- results.certificate = proofCertificate.generateProofCertificate({
140
- projectPath,
141
- projectName: path.basename(projectPath),
142
- verdict: findings.some(f => f.severity === "critical") ? "BLOCK" :
143
- findings.length > 5 ? "WARN" : "SHIP",
144
- score: Math.max(0, 100 - findings.length * 5),
145
- findings,
146
- proofGraph,
147
- duration: 0,
148
- tier,
149
- version,
150
- });
151
- }
152
-
153
- // Generate Compliance Reports
154
- if (complianceReporter) {
155
- results.compliance = {
156
- soc2: complianceReporter.generateSOC2Report(findings, { projectName: path.basename(projectPath) }),
157
- hipaa: complianceReporter.generateHIPAAReport(findings, { projectName: path.basename(projectPath) }),
158
- pciDss: complianceReporter.generatePCIDSSReport(findings, { projectName: path.basename(projectPath) }),
159
- };
160
- }
161
-
162
- // Log audit event
163
- if (auditLogger) {
164
- const logger = auditLogger.getAuditLogger();
165
- results.audit = logger.log("SCAN_COMPLETED", {
166
- projectPath,
167
- findingsCount: findings.length,
168
- critical: findings.filter(f => f.severity === "critical").length,
169
- high: findings.filter(f => f.severity === "high").length,
170
- });
171
- }
172
-
173
- // Evaluate policies
174
- if (policyEngine) {
175
- const engine = new policyEngine.PolicyEngine();
176
- const policyResults = engine.evaluate({
177
- findings,
178
- summary: {
179
- critical: findings.filter(f => f.severity === "critical").length,
180
- high: findings.filter(f => f.severity === "high").length,
181
- medium: findings.filter(f => f.severity === "warning" || f.severity === "medium").length,
182
- low: findings.filter(f => f.severity === "suggestion" || f.severity === "low").length,
183
- },
184
- score: Math.max(0, 100 - findings.length * 5),
185
- });
186
- results.policy = engine.generateSummary(policyResults);
187
- }
188
-
189
- // Generate SBOM
190
- if (sbomGenerator) {
191
- try {
192
- const cycloneDX = sbomGenerator.generateCycloneDX(projectPath, { version });
193
- results.sbom = {
194
- cycloneDX,
195
- summary: sbomGenerator.generateSBOMSummary(cycloneDX),
196
- };
197
- } catch (e) {
198
- // SBOM generation may fail if no package.json
199
- results.sbom = null;
200
- }
201
- }
202
-
203
- return results;
204
- }
205
-
206
- /**
207
- * Render enterprise dashboard for terminal
208
- */
209
- function renderEnterpriseDashboard(results) {
210
- const lines = [];
211
-
212
- // Terminal UI
213
- let terminalUI;
214
- try {
215
- terminalUI = require("./terminal-ui");
216
- } catch {
217
- terminalUI = {
218
- c: { reset: "", bold: "", dim: "" },
219
- rgb: () => "",
220
- };
221
- }
222
-
223
- const { c, rgb } = terminalUI;
224
- const accent = rgb(0, 200, 255);
225
- const success = rgb(0, 255, 150);
226
- const warn = rgb(255, 200, 0);
227
- const error = rgb(255, 80, 80);
228
-
229
- lines.push("");
230
- lines.push(` ${accent}╔${"═".repeat(62)}╗${c.reset}`);
231
- lines.push(` ${accent}║${c.reset} ${c.bold}🏢 ENTERPRISE SECURITY DASHBOARD${c.reset} ${accent}║${c.reset}`);
232
- lines.push(` ${accent}╠${"═".repeat(62)}╣${c.reset}`);
233
-
234
- // Certificate
235
- if (results.certificate) {
236
- const cert = results.certificate.certificate;
237
- const verdictColor = cert.verdict.status === "SHIP" ? success :
238
- cert.verdict.status === "WARN" ? warn : error;
239
- lines.push(` ${accent}║${c.reset} ${accent}║${c.reset}`);
240
- lines.push(` ${accent}║${c.reset} 📜 ${c.bold}Proof Certificate${c.reset} ${accent}║${c.reset}`);
241
- lines.push(` ${accent}║${c.reset} Verdict: ${verdictColor}${c.bold}${cert.verdict.status}${c.reset} Score: ${cert.verdict.score}/100 ${accent}║${c.reset}`);
242
- lines.push(` ${accent}║${c.reset} ID: ${c.dim}${cert.shortCode}${c.reset} ${accent}║${c.reset}`);
243
- }
244
-
245
- // Compliance
246
- if (results.compliance?.soc2) {
247
- const soc2 = results.compliance.soc2;
248
- const scoreColor = soc2.summary.complianceScore >= 80 ? success :
249
- soc2.summary.complianceScore >= 60 ? warn : error;
250
- lines.push(` ${accent}║${c.reset} ${accent}║${c.reset}`);
251
- lines.push(` ${accent}║${c.reset} 📋 ${c.bold}Compliance Status${c.reset} ${accent}║${c.reset}`);
252
- lines.push(` ${accent}║${c.reset} SOC 2: ${scoreColor}${soc2.summary.complianceScore}%${c.reset} HIPAA: ${scoreColor}${results.compliance.hipaa?.summary.complianceScore || 0}%${c.reset} PCI: ${scoreColor}${results.compliance.pciDss?.summary.complianceScore || 0}%${c.reset} ${accent}║${c.reset}`);
253
- }
254
-
255
- // Policy
256
- if (results.policy) {
257
- const actionColor = results.policy.finalAction === "allow" ? success :
258
- results.policy.finalAction === "warn" ? warn : error;
259
- lines.push(` ${accent}║${c.reset} ${accent}║${c.reset}`);
260
- lines.push(` ${accent}║${c.reset} 🛡️ ${c.bold}Policy Enforcement${c.reset} ${accent}║${c.reset}`);
261
- lines.push(` ${accent}║${c.reset} Action: ${actionColor}${results.policy.finalAction.toUpperCase()}${c.reset} Violations: ${results.policy.blocked} ${accent}║${c.reset}`);
262
- }
263
-
264
- // SBOM
265
- if (results.sbom) {
266
- const vulnColor = results.sbom.summary.vulnerabilities.total > 0 ? error : success;
267
- lines.push(` ${accent}║${c.reset} ${accent}║${c.reset}`);
268
- lines.push(` ${accent}║${c.reset} 📦 ${c.bold}Software Bill of Materials${c.reset} ${accent}║${c.reset}`);
269
- lines.push(` ${accent}║${c.reset} Components: ${results.sbom.summary.totalComponents} Vulnerabilities: ${vulnColor}${results.sbom.summary.vulnerabilities.total}${c.reset} ${accent}║${c.reset}`);
270
- }
271
-
272
- lines.push(` ${accent}║${c.reset} ${accent}║${c.reset}`);
273
- lines.push(` ${accent}╚${"═".repeat(62)}╝${c.reset}`);
274
- lines.push("");
275
-
276
- return lines.join("\n");
277
- }
278
-
279
- module.exports = {
280
- // Proof Certificates
281
- proofCertificate,
282
-
283
- // Compliance
284
- complianceReporter,
285
-
286
- // Audit
287
- auditLogger,
288
-
289
- // Policy
290
- policyEngine,
291
-
292
- // SBOM
293
- sbomGenerator,
294
-
295
- // Utilities
296
- isEnterpriseReady,
297
- getAvailableFeatures,
298
- runEnterpriseScan,
299
- renderEnterpriseDashboard,
300
- };
@@ -1,351 +0,0 @@
1
- /**
2
- * Command Validator
3
- *
4
- * Validates shell commands against:
5
- * - Dangerous commands (rm -rf, curl | bash, etc.)
6
- * - System-modifying commands
7
- * - Database destructive operations
8
- * - Commands requiring confirmation
9
- */
10
-
11
- "use strict";
12
-
13
- /**
14
- * CommandValidator class for validating shell commands
15
- */
16
- class CommandValidator {
17
- /**
18
- * Create a command validator
19
- * @param {object} config - Firewall configuration
20
- */
21
- constructor(config) {
22
- this.config = config;
23
-
24
- // Extract command configuration
25
- const commands = config.commands || {};
26
- this.blockedCommands = commands.blocked || [];
27
- this.requireConfirmation = commands.requireConfirmation || [];
28
-
29
- // Build blocked patterns
30
- this.blockedPatterns = this.buildBlockedPatterns();
31
- }
32
-
33
- /**
34
- * Build regex patterns for blocked commands
35
- * @returns {Array} Array of {pattern, name, severity} objects
36
- */
37
- buildBlockedPatterns() {
38
- const patterns = [];
39
-
40
- // Destructive file operations
41
- patterns.push({
42
- pattern: /rm\s+(-[rf]+\s+)*[\/~\.]\s*$/i,
43
- name: "destructive-rm",
44
- severity: "critical",
45
- message: "Destructive rm command detected",
46
- });
47
-
48
- patterns.push({
49
- pattern: /rm\s+-rf\s+\/(?!\w)/i,
50
- name: "rm-root",
51
- severity: "critical",
52
- message: "Attempting to remove root directory",
53
- });
54
-
55
- patterns.push({
56
- pattern: /rmdir\s+\/s\s+\/q/i,
57
- name: "rmdir-force",
58
- severity: "critical",
59
- message: "Windows recursive delete detected",
60
- });
61
-
62
- // Remote code execution
63
- patterns.push({
64
- pattern: /curl\s+.*\|\s*(ba)?sh/i,
65
- name: "curl-pipe-shell",
66
- severity: "critical",
67
- message: "Piping curl output to shell is dangerous",
68
- });
69
-
70
- patterns.push({
71
- pattern: /wget\s+.*\|\s*(ba)?sh/i,
72
- name: "wget-pipe-shell",
73
- severity: "critical",
74
- message: "Piping wget output to shell is dangerous",
75
- });
76
-
77
- patterns.push({
78
- pattern: /curl\s+-s\s+.*\|\s*(ba)?sh/i,
79
- name: "curl-silent-shell",
80
- severity: "critical",
81
- message: "Silent curl to shell is especially dangerous",
82
- });
83
-
84
- // Dangerous permissions
85
- patterns.push({
86
- pattern: /chmod\s+777/i,
87
- name: "chmod-777",
88
- severity: "high",
89
- message: "chmod 777 grants excessive permissions",
90
- });
91
-
92
- patterns.push({
93
- pattern: /chmod\s+\+s/i,
94
- name: "setuid-bit",
95
- severity: "critical",
96
- message: "Setting setuid bit is dangerous",
97
- });
98
-
99
- // Sudo operations
100
- patterns.push({
101
- pattern: /sudo\s+rm\s+-rf/i,
102
- name: "sudo-rm-rf",
103
- severity: "critical",
104
- message: "sudo rm -rf is extremely dangerous",
105
- });
106
-
107
- // Database operations
108
- patterns.push({
109
- pattern: /DROP\s+(DATABASE|TABLE|SCHEMA)/i,
110
- name: "drop-database",
111
- severity: "critical",
112
- message: "DROP operation detected - data loss risk",
113
- });
114
-
115
- patterns.push({
116
- pattern: /TRUNCATE\s+TABLE/i,
117
- name: "truncate-table",
118
- severity: "high",
119
- message: "TRUNCATE operation detected - data loss risk",
120
- });
121
-
122
- patterns.push({
123
- pattern: /DELETE\s+FROM\s+\w+\s*(?:WHERE\s+1\s*=\s*1)?$/i,
124
- name: "delete-all",
125
- severity: "high",
126
- message: "DELETE without proper WHERE clause",
127
- });
128
-
129
- // Git force operations
130
- patterns.push({
131
- pattern: /git\s+push\s+(-f|--force)/i,
132
- name: "git-force-push",
133
- severity: "high",
134
- message: "Force push can overwrite remote history",
135
- });
136
-
137
- patterns.push({
138
- pattern: /git\s+push\s+.*\s+(main|master)\s*$/i,
139
- name: "push-to-main",
140
- severity: "warn",
141
- message: "Direct push to main/master branch",
142
- });
143
-
144
- patterns.push({
145
- pattern: /git\s+reset\s+--hard/i,
146
- name: "git-reset-hard",
147
- severity: "high",
148
- message: "Hard reset can lose uncommitted changes",
149
- });
150
-
151
- // NPM/package operations
152
- patterns.push({
153
- pattern: /npm\s+publish\s*$/i,
154
- name: "npm-publish",
155
- severity: "warn",
156
- message: "Publishing package - ensure this is intentional",
157
- });
158
-
159
- // Eval and dynamic code
160
- patterns.push({
161
- pattern: /node\s+-e\s+['"]/i,
162
- name: "node-eval",
163
- severity: "warn",
164
- message: "Inline Node.js code execution",
165
- });
166
-
167
- patterns.push({
168
- pattern: /python\s+-c\s+['"]/i,
169
- name: "python-eval",
170
- severity: "warn",
171
- message: "Inline Python code execution",
172
- });
173
-
174
- return patterns;
175
- }
176
-
177
- /**
178
- * Validate a shell command
179
- * @param {object} params - Validation parameters
180
- * @param {string} params.command - Command to validate
181
- * @returns {object} Validation result
182
- */
183
- validate({ command }) {
184
- // Skip if no command provided
185
- if (!command) {
186
- return { valid: true };
187
- }
188
-
189
- // Normalize command
190
- const normalizedCommand = command.trim();
191
-
192
- // Check against blocked patterns
193
- for (const { pattern, name, severity, message } of this.blockedPatterns) {
194
- if (pattern.test(normalizedCommand)) {
195
- return {
196
- valid: false,
197
- rule: name,
198
- severity,
199
- message,
200
- details: {
201
- command: normalizedCommand,
202
- matchedPattern: pattern.toString(),
203
- suggestion: this.getSuggestion(name),
204
- },
205
- };
206
- }
207
- }
208
-
209
- // Check against user-configured blocked commands
210
- for (const blocked of this.blockedCommands) {
211
- if (normalizedCommand.toLowerCase().includes(blocked.toLowerCase())) {
212
- return {
213
- valid: false,
214
- rule: "blocked-command",
215
- severity: "high",
216
- message: `Command matches blocked pattern: "${blocked}"`,
217
- details: {
218
- command: normalizedCommand,
219
- blockedPattern: blocked,
220
- },
221
- };
222
- }
223
- }
224
-
225
- // Check for commands requiring confirmation
226
- const needsConfirmation = this.checkRequiresConfirmation(normalizedCommand);
227
- if (needsConfirmation) {
228
- return {
229
- valid: true,
230
- requiresConfirmation: true,
231
- rule: "requires-confirmation",
232
- severity: "warn",
233
- message: needsConfirmation.message,
234
- details: {
235
- command: normalizedCommand,
236
- pattern: needsConfirmation.pattern,
237
- },
238
- };
239
- }
240
-
241
- return { valid: true };
242
- }
243
-
244
- /**
245
- * Check if command requires confirmation
246
- * @param {string} command - Command to check
247
- * @returns {object|null} Confirmation requirement or null
248
- */
249
- checkRequiresConfirmation(command) {
250
- const confirmPatterns = [
251
- { pattern: /npm\s+install/i, message: "Installing npm packages" },
252
- { pattern: /yarn\s+add/i, message: "Installing yarn packages" },
253
- { pattern: /pnpm\s+add/i, message: "Installing pnpm packages" },
254
- { pattern: /git\s+checkout/i, message: "Switching git branches" },
255
- { pattern: /git\s+merge/i, message: "Merging git branches" },
256
- { pattern: /git\s+rebase/i, message: "Rebasing git history" },
257
- { pattern: /docker\s+run/i, message: "Running Docker container" },
258
- { pattern: /kubectl\s+apply/i, message: "Applying Kubernetes config" },
259
- ];
260
-
261
- for (const { pattern, message } of confirmPatterns) {
262
- if (pattern.test(command)) {
263
- return { pattern: pattern.toString(), message };
264
- }
265
- }
266
-
267
- // Check user-configured patterns
268
- for (const userPattern of this.requireConfirmation) {
269
- if (command.toLowerCase().includes(userPattern.toLowerCase())) {
270
- return {
271
- pattern: userPattern,
272
- message: `Command matches confirmation pattern: "${userPattern}"`
273
- };
274
- }
275
- }
276
-
277
- return null;
278
- }
279
-
280
- /**
281
- * Get suggestion for how to fix a blocked command
282
- * @param {string} ruleName - Name of the violated rule
283
- * @returns {string} Suggestion text
284
- */
285
- getSuggestion(ruleName) {
286
- const suggestions = {
287
- "destructive-rm": "Use specific file paths instead of wildcards",
288
- "rm-root": "Never remove root directory",
289
- "curl-pipe-shell": "Download the script first, review it, then execute",
290
- "wget-pipe-shell": "Download the script first, review it, then execute",
291
- "chmod-777": "Use more restrictive permissions (e.g., 755 or 644)",
292
- "sudo-rm-rf": "Be very specific about what you're removing",
293
- "drop-database": "Use migrations for schema changes",
294
- "truncate-table": "Use migrations for data changes",
295
- "git-force-push": "Use --force-with-lease for safer force push",
296
- "push-to-main": "Create a feature branch and open a PR",
297
- "git-reset-hard": "Make sure you've committed or stashed changes first",
298
- "npm-publish": "Review package contents with 'npm pack' first",
299
- };
300
-
301
- return suggestions[ruleName] || "Review the command and consider safer alternatives";
302
- }
303
-
304
- /**
305
- * Analyze command for potential risks
306
- * @param {string} command - Command to analyze
307
- * @returns {object} Risk analysis
308
- */
309
- analyzeRisk(command) {
310
- const result = this.validate({ command });
311
-
312
- if (!result.valid) {
313
- return {
314
- riskLevel: result.severity === "critical" ? "high" : "medium",
315
- blocked: true,
316
- reason: result.message,
317
- details: result.details,
318
- };
319
- }
320
-
321
- if (result.requiresConfirmation) {
322
- return {
323
- riskLevel: "low",
324
- blocked: false,
325
- requiresConfirmation: true,
326
- reason: result.message,
327
- };
328
- }
329
-
330
- return {
331
- riskLevel: "none",
332
- blocked: false,
333
- requiresConfirmation: false,
334
- };
335
- }
336
-
337
- /**
338
- * Get all blocked command patterns
339
- * @returns {string[]} Blocked patterns
340
- */
341
- getBlockedPatterns() {
342
- return [
343
- ...this.blockedCommands,
344
- ...this.blockedPatterns.map(p => p.pattern.toString()),
345
- ];
346
- }
347
- }
348
-
349
- module.exports = {
350
- CommandValidator,
351
- };