@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.
- package/bin/registry.js +214 -237
- package/bin/runners/cli-utils.js +33 -2
- package/bin/runners/context/analyzer.js +52 -1
- package/bin/runners/context/generators/cursor.js +2 -49
- package/bin/runners/context/git-context.js +3 -1
- package/bin/runners/context/team-conventions.js +33 -7
- package/bin/runners/lib/analysis-core.js +25 -5
- package/bin/runners/lib/analyzers.js +431 -481
- package/bin/runners/lib/default-config.js +127 -0
- package/bin/runners/lib/doctor/modules/security.js +3 -1
- package/bin/runners/lib/engine/ast-cache.js +210 -0
- package/bin/runners/lib/engine/auth-extractor.js +211 -0
- package/bin/runners/lib/engine/billing-extractor.js +112 -0
- package/bin/runners/lib/engine/enforcement-extractor.js +100 -0
- package/bin/runners/lib/engine/env-extractor.js +207 -0
- package/bin/runners/lib/engine/express-extractor.js +208 -0
- package/bin/runners/lib/engine/extractors.js +849 -0
- package/bin/runners/lib/engine/index.js +207 -0
- package/bin/runners/lib/engine/repo-index.js +514 -0
- package/bin/runners/lib/engine/types.js +124 -0
- package/bin/runners/lib/engines/accessibility-engine.js +18 -218
- package/bin/runners/lib/engines/api-consistency-engine.js +30 -335
- package/bin/runners/lib/engines/cross-file-analysis-engine.js +27 -292
- package/bin/runners/lib/engines/empty-catch-engine.js +17 -127
- package/bin/runners/lib/engines/mock-data-engine.js +10 -53
- package/bin/runners/lib/engines/performance-issues-engine.js +36 -176
- package/bin/runners/lib/engines/security-vulnerabilities-engine.js +54 -382
- package/bin/runners/lib/engines/type-aware-engine.js +39 -263
- package/bin/runners/lib/engines/vibecheck-engines/index.js +13 -122
- package/bin/runners/lib/engines/vibecheck-engines/lib/ast-cache.js +164 -0
- package/bin/runners/lib/engines/vibecheck-engines/lib/code-quality-engine.js +291 -0
- package/bin/runners/lib/engines/vibecheck-engines/lib/console-logs-engine.js +83 -0
- package/bin/runners/lib/engines/vibecheck-engines/lib/dead-code-engine.js +198 -0
- package/bin/runners/lib/engines/vibecheck-engines/lib/deprecated-api-engine.js +275 -0
- package/bin/runners/lib/engines/vibecheck-engines/lib/empty-catch-engine.js +167 -0
- package/bin/runners/lib/engines/vibecheck-engines/lib/file-filter.js +217 -0
- package/bin/runners/lib/engines/vibecheck-engines/lib/hardcoded-secrets-engine.js +73 -373
- package/bin/runners/lib/engines/vibecheck-engines/lib/mock-data-engine.js +140 -0
- package/bin/runners/lib/engines/vibecheck-engines/lib/parallel-processor.js +164 -0
- package/bin/runners/lib/engines/vibecheck-engines/lib/performance-issues-engine.js +234 -0
- package/bin/runners/lib/engines/vibecheck-engines/lib/type-aware-engine.js +217 -0
- package/bin/runners/lib/engines/vibecheck-engines/lib/unsafe-regex-engine.js +78 -0
- package/bin/runners/lib/entitlements-v2.js +73 -97
- package/bin/runners/lib/error-handler.js +44 -3
- package/bin/runners/lib/error-messages.js +289 -0
- package/bin/runners/lib/evidence-pack.js +7 -1
- package/bin/runners/lib/finding-id.js +69 -0
- package/bin/runners/lib/finding-sorter.js +89 -0
- package/bin/runners/lib/html-proof-report.js +700 -350
- package/bin/runners/lib/missions/plan.js +6 -46
- package/bin/runners/lib/missions/templates.js +0 -232
- package/bin/runners/lib/next-action.js +560 -0
- package/bin/runners/lib/prerequisites.js +149 -0
- package/bin/runners/lib/route-detection.js +137 -68
- package/bin/runners/lib/scan-output.js +91 -76
- package/bin/runners/lib/scan-runner.js +135 -0
- package/bin/runners/lib/schemas/ajv-validator.js +464 -0
- package/bin/runners/lib/schemas/error-envelope.schema.json +105 -0
- package/bin/runners/lib/schemas/finding-v3.schema.json +151 -0
- package/bin/runners/lib/schemas/report-artifact.schema.json +120 -0
- package/bin/runners/lib/schemas/run-request.schema.json +108 -0
- package/bin/runners/lib/schemas/validator.js +27 -0
- package/bin/runners/lib/schemas/verdict.schema.json +140 -0
- package/bin/runners/lib/ship-output-enterprise.js +23 -23
- package/bin/runners/lib/ship-output.js +75 -31
- package/bin/runners/lib/terminal-ui.js +6 -113
- package/bin/runners/lib/truth.js +351 -10
- package/bin/runners/lib/unified-cli-output.js +430 -603
- package/bin/runners/lib/unified-output.js +13 -9
- package/bin/runners/runAIAgent.js +10 -5
- package/bin/runners/runAgent.js +0 -3
- package/bin/runners/runAllowlist.js +389 -0
- package/bin/runners/runApprove.js +0 -33
- package/bin/runners/runAuth.js +73 -45
- package/bin/runners/runCheckpoint.js +51 -11
- package/bin/runners/runClassify.js +85 -21
- package/bin/runners/runContext.js +0 -3
- package/bin/runners/runDoctor.js +41 -28
- package/bin/runners/runEvidencePack.js +362 -0
- package/bin/runners/runFirewall.js +0 -3
- package/bin/runners/runFirewallHook.js +0 -3
- package/bin/runners/runFix.js +66 -76
- package/bin/runners/runGuard.js +18 -411
- package/bin/runners/runInit.js +113 -30
- package/bin/runners/runLabs.js +424 -0
- package/bin/runners/runMcp.js +19 -25
- package/bin/runners/runPolish.js +64 -240
- package/bin/runners/runPromptFirewall.js +12 -5
- package/bin/runners/runProve.js +57 -22
- package/bin/runners/runQuickstart.js +531 -0
- package/bin/runners/runReality.js +59 -68
- package/bin/runners/runReport.js +38 -33
- package/bin/runners/runRuntime.js +8 -5
- package/bin/runners/runScan.js +1413 -190
- package/bin/runners/runShip.js +113 -719
- package/bin/runners/runTruth.js +0 -3
- package/bin/runners/runValidate.js +13 -9
- package/bin/runners/runWatch.js +23 -14
- package/bin/scan.js +6 -1
- package/bin/vibecheck.js +204 -185
- package/mcp-server/deprecation-middleware.js +282 -0
- package/mcp-server/handlers/index.ts +15 -0
- package/mcp-server/handlers/tool-handler.ts +554 -0
- package/mcp-server/index-v1.js +698 -0
- package/mcp-server/index.js +210 -238
- package/mcp-server/lib/cache-wrapper.cjs +383 -0
- package/mcp-server/lib/error-envelope.js +138 -0
- package/mcp-server/lib/executor.ts +499 -0
- package/mcp-server/lib/index.ts +19 -0
- package/mcp-server/lib/rate-limiter.js +166 -0
- package/mcp-server/lib/sandbox.test.ts +519 -0
- package/mcp-server/lib/sandbox.ts +395 -0
- package/mcp-server/lib/types.ts +267 -0
- package/mcp-server/package.json +12 -3
- package/mcp-server/registry/tool-registry.js +794 -0
- package/mcp-server/registry/tools.json +605 -0
- package/mcp-server/registry.test.ts +334 -0
- package/mcp-server/tests/tier-gating.test.js +297 -0
- package/mcp-server/tier-auth.js +378 -45
- package/mcp-server/tools-v3.js +353 -442
- package/mcp-server/tsconfig.json +37 -0
- package/mcp-server/vibecheck-2.0-tools.js +14 -1
- package/package.json +1 -1
- package/bin/runners/lib/agent-firewall/learning/learning-engine.js +0 -849
- package/bin/runners/lib/audit-logger.js +0 -532
- package/bin/runners/lib/authority/authorities/architecture.js +0 -364
- package/bin/runners/lib/authority/authorities/compliance.js +0 -341
- package/bin/runners/lib/authority/authorities/human.js +0 -343
- package/bin/runners/lib/authority/authorities/quality.js +0 -420
- package/bin/runners/lib/authority/authorities/security.js +0 -228
- package/bin/runners/lib/authority/index.js +0 -293
- package/bin/runners/lib/bundle/bundle-intelligence.js +0 -846
- package/bin/runners/lib/cli-charts.js +0 -368
- package/bin/runners/lib/cli-config-display.js +0 -405
- package/bin/runners/lib/cli-demo.js +0 -275
- package/bin/runners/lib/cli-errors.js +0 -438
- package/bin/runners/lib/cli-help-formatter.js +0 -439
- package/bin/runners/lib/cli-interactive-menu.js +0 -509
- package/bin/runners/lib/cli-prompts.js +0 -441
- package/bin/runners/lib/cli-scan-cards.js +0 -362
- package/bin/runners/lib/compliance-reporter.js +0 -710
- package/bin/runners/lib/conductor/index.js +0 -671
- package/bin/runners/lib/easy/README.md +0 -123
- package/bin/runners/lib/easy/index.js +0 -140
- package/bin/runners/lib/easy/interactive-wizard.js +0 -788
- package/bin/runners/lib/easy/one-click-firewall.js +0 -564
- package/bin/runners/lib/easy/zero-config-reality.js +0 -714
- package/bin/runners/lib/engines/async-patterns-engine.js +0 -444
- package/bin/runners/lib/engines/bundle-size-engine.js +0 -433
- package/bin/runners/lib/engines/confidence-scoring.js +0 -276
- package/bin/runners/lib/engines/context-detection.js +0 -264
- package/bin/runners/lib/engines/database-patterns-engine.js +0 -429
- package/bin/runners/lib/engines/duplicate-code-engine.js +0 -354
- package/bin/runners/lib/engines/env-variables-engine.js +0 -458
- package/bin/runners/lib/engines/error-handling-engine.js +0 -437
- package/bin/runners/lib/engines/false-positive-prevention.js +0 -630
- package/bin/runners/lib/engines/framework-adapters/index.js +0 -607
- package/bin/runners/lib/engines/framework-detection.js +0 -508
- package/bin/runners/lib/engines/import-order-engine.js +0 -429
- package/bin/runners/lib/engines/naming-conventions-engine.js +0 -544
- package/bin/runners/lib/engines/noise-reduction-engine.js +0 -452
- package/bin/runners/lib/engines/orchestrator.js +0 -334
- package/bin/runners/lib/engines/react-patterns-engine.js +0 -457
- package/bin/runners/lib/engines/vibecheck-engines/lib/ai-hallucination-engine.js +0 -806
- package/bin/runners/lib/engines/vibecheck-engines/lib/smart-fix-engine.js +0 -577
- package/bin/runners/lib/engines/vibecheck-engines/lib/vibe-score-engine.js +0 -543
- package/bin/runners/lib/engines/vibecheck-engines.js +0 -514
- package/bin/runners/lib/enhanced-features/index.js +0 -305
- package/bin/runners/lib/enhanced-output.js +0 -631
- package/bin/runners/lib/enterprise.js +0 -300
- package/bin/runners/lib/firewall/command-validator.js +0 -351
- package/bin/runners/lib/firewall/config.js +0 -341
- package/bin/runners/lib/firewall/content-validator.js +0 -519
- package/bin/runners/lib/firewall/index.js +0 -101
- package/bin/runners/lib/firewall/path-validator.js +0 -256
- package/bin/runners/lib/intelligence/cross-repo-intelligence.js +0 -817
- package/bin/runners/lib/mcp-utils.js +0 -425
- package/bin/runners/lib/output/index.js +0 -1022
- package/bin/runners/lib/policy-engine.js +0 -652
- package/bin/runners/lib/polish/autofix/accessibility-fixes.js +0 -333
- package/bin/runners/lib/polish/autofix/async-handlers.js +0 -273
- package/bin/runners/lib/polish/autofix/dead-code.js +0 -280
- package/bin/runners/lib/polish/autofix/imports-optimizer.js +0 -344
- package/bin/runners/lib/polish/autofix/index.js +0 -200
- package/bin/runners/lib/polish/autofix/remove-consoles.js +0 -209
- package/bin/runners/lib/polish/autofix/strengthen-types.js +0 -245
- package/bin/runners/lib/polish/backend-checks.js +0 -148
- package/bin/runners/lib/polish/documentation-checks.js +0 -111
- package/bin/runners/lib/polish/frontend-checks.js +0 -168
- package/bin/runners/lib/polish/index.js +0 -71
- package/bin/runners/lib/polish/infrastructure-checks.js +0 -131
- package/bin/runners/lib/polish/library-detection.js +0 -175
- package/bin/runners/lib/polish/performance-checks.js +0 -100
- package/bin/runners/lib/polish/security-checks.js +0 -148
- package/bin/runners/lib/polish/utils.js +0 -203
- package/bin/runners/lib/prompt-builder.js +0 -540
- package/bin/runners/lib/proof-certificate.js +0 -634
- package/bin/runners/lib/reality/accessibility-audit.js +0 -946
- package/bin/runners/lib/reality/api-contract-validator.js +0 -1012
- package/bin/runners/lib/reality/chaos-engineering.js +0 -1084
- package/bin/runners/lib/reality/performance-tracker.js +0 -1077
- package/bin/runners/lib/reality/scenario-generator.js +0 -1404
- package/bin/runners/lib/reality/visual-regression.js +0 -852
- package/bin/runners/lib/reality-profiler.js +0 -717
- package/bin/runners/lib/replay/flight-recorder-viewer.js +0 -1160
- package/bin/runners/lib/review/ai-code-review.js +0 -832
- package/bin/runners/lib/rules/custom-rule-engine.js +0 -985
- package/bin/runners/lib/sbom-generator.js +0 -641
- package/bin/runners/lib/scan-output-enhanced.js +0 -512
- package/bin/runners/lib/security/owasp-scanner.js +0 -939
- package/bin/runners/lib/validators/contract-validator.js +0 -283
- package/bin/runners/lib/validators/dead-export-detector.js +0 -279
- package/bin/runners/lib/validators/dep-audit.js +0 -245
- package/bin/runners/lib/validators/env-validator.js +0 -319
- package/bin/runners/lib/validators/index.js +0 -120
- package/bin/runners/lib/validators/license-checker.js +0 -252
- package/bin/runners/lib/validators/route-validator.js +0 -290
- package/bin/runners/runAuthority.js +0 -528
- package/bin/runners/runConductor.js +0 -772
- package/bin/runners/runContainer.js +0 -366
- package/bin/runners/runEasy.js +0 -410
- package/bin/runners/runIaC.js +0 -372
- package/bin/runners/runVibe.js +0 -791
- package/mcp-server/tools.js +0 -495
|
@@ -1,543 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Vibe Score Engine
|
|
3
|
-
*
|
|
4
|
-
* The ultimate metric for vibecoding quality. Aggregates findings from all
|
|
5
|
-
* analysis engines and produces a comprehensive "production readiness" score.
|
|
6
|
-
*
|
|
7
|
-
* The Vibe Score answers: "How much of this code was vibe-coded vs properly implemented?"
|
|
8
|
-
*
|
|
9
|
-
* Score Components:
|
|
10
|
-
* - Implementation Completeness (30%) - Are functions actually implemented?
|
|
11
|
-
* - Error Handling Quality (25%) - Are errors properly handled?
|
|
12
|
-
* - API/Data Integrity (20%) - Are API calls real and data valid?
|
|
13
|
-
* - Code Quality (15%) - Standard code quality metrics
|
|
14
|
-
* - Security Posture (10%) - Basic security checks
|
|
15
|
-
*
|
|
16
|
-
* @module vibe-score-engine
|
|
17
|
-
*/
|
|
18
|
-
|
|
19
|
-
"use strict";
|
|
20
|
-
|
|
21
|
-
// ═══════════════════════════════════════════════════════════════════════════════
|
|
22
|
-
// SCORE WEIGHTS - How much each category contributes to final score
|
|
23
|
-
// ═══════════════════════════════════════════════════════════════════════════════
|
|
24
|
-
|
|
25
|
-
const SCORE_WEIGHTS = {
|
|
26
|
-
implementationCompleteness: 0.30, // Functions actually do what they claim
|
|
27
|
-
errorHandling: 0.25, // Errors are properly caught and handled
|
|
28
|
-
apiDataIntegrity: 0.20, // API calls are real, data is valid
|
|
29
|
-
codeQuality: 0.15, // Standard quality metrics
|
|
30
|
-
securityPosture: 0.10, // Basic security checks
|
|
31
|
-
};
|
|
32
|
-
|
|
33
|
-
// ═══════════════════════════════════════════════════════════════════════════════
|
|
34
|
-
// SEVERITY IMPACT - How much each severity level impacts the score
|
|
35
|
-
// ═══════════════════════════════════════════════════════════════════════════════
|
|
36
|
-
|
|
37
|
-
const SEVERITY_IMPACT = {
|
|
38
|
-
BLOCK: 15, // Critical issues
|
|
39
|
-
critical: 15,
|
|
40
|
-
WARN: 8, // Warnings
|
|
41
|
-
warning: 8,
|
|
42
|
-
high: 10,
|
|
43
|
-
medium: 5,
|
|
44
|
-
low: 2,
|
|
45
|
-
INFO: 1,
|
|
46
|
-
info: 1,
|
|
47
|
-
};
|
|
48
|
-
|
|
49
|
-
// ═══════════════════════════════════════════════════════════════════════════════
|
|
50
|
-
// CATEGORY MAPPING - Map finding categories to score components
|
|
51
|
-
// ═══════════════════════════════════════════════════════════════════════════════
|
|
52
|
-
|
|
53
|
-
const CATEGORY_TO_COMPONENT = {
|
|
54
|
-
// Implementation Completeness
|
|
55
|
-
AIHallucination: "implementationCompleteness",
|
|
56
|
-
stubImplementations: "implementationCompleteness",
|
|
57
|
-
DeadCode: "implementationCompleteness",
|
|
58
|
-
emptyFunction: "implementationCompleteness",
|
|
59
|
-
FakeSuccess: "implementationCompleteness",
|
|
60
|
-
placeholder: "implementationCompleteness",
|
|
61
|
-
|
|
62
|
-
// Error Handling
|
|
63
|
-
EmptyCatch: "errorHandling",
|
|
64
|
-
SilentFailure: "errorHandling",
|
|
65
|
-
optimisticErrors: "errorHandling",
|
|
66
|
-
swallowedErrors: "errorHandling",
|
|
67
|
-
empty_async_catch: "errorHandling",
|
|
68
|
-
|
|
69
|
-
// API/Data Integrity
|
|
70
|
-
FakeDomain: "apiDataIntegrity",
|
|
71
|
-
FakeResponse: "apiDataIntegrity",
|
|
72
|
-
MockData: "apiDataIntegrity",
|
|
73
|
-
hallucinatedAPIs: "apiDataIntegrity",
|
|
74
|
-
fakeData: "apiDataIntegrity",
|
|
75
|
-
MissingRoute: "apiDataIntegrity",
|
|
76
|
-
ContractDrift: "apiDataIntegrity",
|
|
77
|
-
|
|
78
|
-
// Code Quality
|
|
79
|
-
CodeQuality: "codeQuality",
|
|
80
|
-
ConsoleLog: "codeQuality",
|
|
81
|
-
DeprecatedAPI: "codeQuality",
|
|
82
|
-
TypeAware: "codeQuality",
|
|
83
|
-
copyPaste: "codeQuality",
|
|
84
|
-
NamingConventions: "codeQuality",
|
|
85
|
-
naming_convention: "codeQuality",
|
|
86
|
-
boolean_naming: "codeQuality",
|
|
87
|
-
constant_naming: "codeQuality",
|
|
88
|
-
file_naming: "codeQuality",
|
|
89
|
-
non_descriptive_name: "codeQuality",
|
|
90
|
-
|
|
91
|
-
// Security
|
|
92
|
-
HardcodedSecret: "securityPosture",
|
|
93
|
-
Security: "securityPosture",
|
|
94
|
-
AuthBypass: "securityPosture",
|
|
95
|
-
GhostAuth: "securityPosture",
|
|
96
|
-
UnsafeRegex: "securityPosture",
|
|
97
|
-
dangerous_default: "securityPosture",
|
|
98
|
-
exposed_secret: "securityPosture",
|
|
99
|
-
env_not_gitignored: "securityPosture",
|
|
100
|
-
insecure_default: "securityPosture",
|
|
101
|
-
insecure_env_default: "securityPosture",
|
|
102
|
-
|
|
103
|
-
// Async Patterns (affects error handling and implementation)
|
|
104
|
-
AsyncPatterns: "errorHandling",
|
|
105
|
-
floating_promise: "errorHandling",
|
|
106
|
-
await_outside_async: "implementationCompleteness",
|
|
107
|
-
async_promise_executor: "errorHandling",
|
|
108
|
-
then_in_async: "codeQuality",
|
|
109
|
-
await_in_loop: "codeQuality",
|
|
110
|
-
sequential_await: "codeQuality",
|
|
111
|
-
|
|
112
|
-
// Environment Variables (affects security and configuration)
|
|
113
|
-
EnvVariable: "securityPosture",
|
|
114
|
-
EnvSetup: "securityPosture",
|
|
115
|
-
unvalidated_env_var: "securityPosture",
|
|
116
|
-
env_type_coercion: "codeQuality",
|
|
117
|
-
empty_env_var: "codeQuality",
|
|
118
|
-
missing_env_example: "codeQuality",
|
|
119
|
-
|
|
120
|
-
// React Patterns (affects implementation and code quality)
|
|
121
|
-
ReactPatterns: "implementationCompleteness",
|
|
122
|
-
missing_key: "implementationCompleteness",
|
|
123
|
-
index_as_key: "codeQuality",
|
|
124
|
-
conditional_hook: "implementationCompleteness",
|
|
125
|
-
hook_in_loop: "implementationCompleteness",
|
|
126
|
-
missing_deps_array: "errorHandling",
|
|
127
|
-
stale_closure: "errorHandling",
|
|
128
|
-
direct_state_mutation: "implementationCompleteness",
|
|
129
|
-
mutating_state_array: "implementationCompleteness",
|
|
130
|
-
props_spreading_dom: "codeQuality",
|
|
131
|
-
|
|
132
|
-
// Database Patterns (affects API integrity and security)
|
|
133
|
-
DatabasePatterns: "apiDataIntegrity",
|
|
134
|
-
n_plus_1_query: "apiDataIntegrity",
|
|
135
|
-
query_in_loop: "apiDataIntegrity",
|
|
136
|
-
unbounded_query: "apiDataIntegrity",
|
|
137
|
-
missing_transaction: "apiDataIntegrity",
|
|
138
|
-
raw_query_interpolation: "securityPosture",
|
|
139
|
-
db_no_error_handling: "errorHandling",
|
|
140
|
-
|
|
141
|
-
// Import Order (affects code quality)
|
|
142
|
-
ImportOrder: "codeQuality",
|
|
143
|
-
import_order: "codeQuality",
|
|
144
|
-
mixed_imports: "codeQuality",
|
|
145
|
-
code_between_imports: "codeQuality",
|
|
146
|
-
side_effect_import: "codeQuality",
|
|
147
|
-
unused_import: "codeQuality",
|
|
148
|
-
should_be_type_import: "codeQuality",
|
|
149
|
-
|
|
150
|
-
// Error Handling Engine (complements existing)
|
|
151
|
-
empty_catch: "errorHandling",
|
|
152
|
-
untyped_catch: "codeQuality",
|
|
153
|
-
console_log_in_catch: "errorHandling",
|
|
154
|
-
rethrow_without_context: "errorHandling",
|
|
155
|
-
try_without_catch: "errorHandling",
|
|
156
|
-
generic_error_message: "errorHandling",
|
|
157
|
-
inconsistent_error_response: "apiDataIntegrity",
|
|
158
|
-
then_without_catch: "errorHandling",
|
|
159
|
-
};
|
|
160
|
-
|
|
161
|
-
// ═══════════════════════════════════════════════════════════════════════════════
|
|
162
|
-
// GRADE THRESHOLDS
|
|
163
|
-
// ═══════════════════════════════════════════════════════════════════════════════
|
|
164
|
-
|
|
165
|
-
const GRADE_THRESHOLDS = {
|
|
166
|
-
A: { min: 90, label: "Production Ready", emoji: "🚀", riskLevel: "minimal" },
|
|
167
|
-
B: { min: 80, label: "Minor Polish Needed", emoji: "✅", riskLevel: "low" },
|
|
168
|
-
C: { min: 70, label: "Review Recommended", emoji: "⚠️", riskLevel: "medium" },
|
|
169
|
-
D: { min: 50, label: "Significant Issues", emoji: "🔧", riskLevel: "high" },
|
|
170
|
-
F: { min: 0, label: "Not Ship Ready", emoji: "🛑", riskLevel: "critical" },
|
|
171
|
-
};
|
|
172
|
-
|
|
173
|
-
// ═══════════════════════════════════════════════════════════════════════════════
|
|
174
|
-
// VIBE SCORE CALCULATOR
|
|
175
|
-
// ═══════════════════════════════════════════════════════════════════════════════
|
|
176
|
-
|
|
177
|
-
/**
|
|
178
|
-
* Calculate comprehensive vibe score from all findings
|
|
179
|
-
* @param {Array} allFindings - Combined findings from all engines
|
|
180
|
-
* @param {object} options - Calculation options
|
|
181
|
-
* @returns {object} Comprehensive vibe score report
|
|
182
|
-
*/
|
|
183
|
-
function calculateVibeScore(allFindings, options = {}) {
|
|
184
|
-
const {
|
|
185
|
-
filesAnalyzed = 0,
|
|
186
|
-
linesOfCode = 0,
|
|
187
|
-
truthpack = null,
|
|
188
|
-
} = options;
|
|
189
|
-
|
|
190
|
-
// Initialize component scores (start at 100 for each)
|
|
191
|
-
const componentScores = {
|
|
192
|
-
implementationCompleteness: 100,
|
|
193
|
-
errorHandling: 100,
|
|
194
|
-
apiDataIntegrity: 100,
|
|
195
|
-
codeQuality: 100,
|
|
196
|
-
securityPosture: 100,
|
|
197
|
-
};
|
|
198
|
-
|
|
199
|
-
// Track deductions per component
|
|
200
|
-
const componentDeductions = {
|
|
201
|
-
implementationCompleteness: [],
|
|
202
|
-
errorHandling: [],
|
|
203
|
-
apiDataIntegrity: [],
|
|
204
|
-
codeQuality: [],
|
|
205
|
-
securityPosture: [],
|
|
206
|
-
};
|
|
207
|
-
|
|
208
|
-
// Process each finding
|
|
209
|
-
for (const finding of allFindings) {
|
|
210
|
-
// Determine which component this finding affects
|
|
211
|
-
const category = finding.category || finding.type || "Other";
|
|
212
|
-
const component = CATEGORY_TO_COMPONENT[category] ||
|
|
213
|
-
CATEGORY_TO_COMPONENT[finding.category_detail] ||
|
|
214
|
-
"codeQuality"; // Default to code quality
|
|
215
|
-
|
|
216
|
-
// Calculate deduction based on severity and confidence
|
|
217
|
-
const severity = finding.severity || "WARN";
|
|
218
|
-
const confidence = finding.confidence || 0.8;
|
|
219
|
-
const baseDeduction = SEVERITY_IMPACT[severity] || 5;
|
|
220
|
-
const deduction = baseDeduction * confidence;
|
|
221
|
-
|
|
222
|
-
// Apply deduction
|
|
223
|
-
componentScores[component] = Math.max(0, componentScores[component] - deduction);
|
|
224
|
-
|
|
225
|
-
// Track for reporting
|
|
226
|
-
componentDeductions[component].push({
|
|
227
|
-
finding: finding.id || finding.type,
|
|
228
|
-
severity,
|
|
229
|
-
confidence,
|
|
230
|
-
deduction: Math.round(deduction * 10) / 10,
|
|
231
|
-
message: finding.message || finding.title,
|
|
232
|
-
file: finding.file,
|
|
233
|
-
line: finding.line,
|
|
234
|
-
});
|
|
235
|
-
}
|
|
236
|
-
|
|
237
|
-
// Calculate weighted final score
|
|
238
|
-
let finalScore = 0;
|
|
239
|
-
for (const [component, weight] of Object.entries(SCORE_WEIGHTS)) {
|
|
240
|
-
finalScore += componentScores[component] * weight;
|
|
241
|
-
}
|
|
242
|
-
finalScore = Math.round(finalScore);
|
|
243
|
-
|
|
244
|
-
// Determine grade
|
|
245
|
-
let grade = "F";
|
|
246
|
-
let gradeInfo = GRADE_THRESHOLDS.F;
|
|
247
|
-
for (const [g, info] of Object.entries(GRADE_THRESHOLDS)) {
|
|
248
|
-
if (finalScore >= info.min) {
|
|
249
|
-
grade = g;
|
|
250
|
-
gradeInfo = info;
|
|
251
|
-
break;
|
|
252
|
-
}
|
|
253
|
-
}
|
|
254
|
-
|
|
255
|
-
// Calculate component summaries
|
|
256
|
-
const componentSummaries = {};
|
|
257
|
-
for (const [component, score] of Object.entries(componentScores)) {
|
|
258
|
-
const deductions = componentDeductions[component];
|
|
259
|
-
componentSummaries[component] = {
|
|
260
|
-
score: Math.round(score),
|
|
261
|
-
weight: SCORE_WEIGHTS[component],
|
|
262
|
-
contribution: Math.round(score * SCORE_WEIGHTS[component]),
|
|
263
|
-
issueCount: deductions.length,
|
|
264
|
-
topIssues: deductions
|
|
265
|
-
.sort((a, b) => b.deduction - a.deduction)
|
|
266
|
-
.slice(0, 3),
|
|
267
|
-
status: score >= 90 ? "excellent" : score >= 70 ? "good" : score >= 50 ? "needs-work" : "critical",
|
|
268
|
-
};
|
|
269
|
-
}
|
|
270
|
-
|
|
271
|
-
// Generate insights
|
|
272
|
-
const insights = generateInsights(componentScores, componentDeductions, allFindings);
|
|
273
|
-
|
|
274
|
-
// Calculate risk metrics
|
|
275
|
-
const riskMetrics = calculateRiskMetrics(allFindings, componentScores);
|
|
276
|
-
|
|
277
|
-
return {
|
|
278
|
-
// Core score
|
|
279
|
-
score: finalScore,
|
|
280
|
-
grade,
|
|
281
|
-
label: gradeInfo.label,
|
|
282
|
-
emoji: gradeInfo.emoji,
|
|
283
|
-
riskLevel: gradeInfo.riskLevel,
|
|
284
|
-
|
|
285
|
-
// Component breakdown
|
|
286
|
-
components: componentSummaries,
|
|
287
|
-
|
|
288
|
-
// Finding summaries
|
|
289
|
-
summary: {
|
|
290
|
-
total: allFindings.length,
|
|
291
|
-
blockers: allFindings.filter(f => f.severity === "BLOCK" || f.severity === "critical").length,
|
|
292
|
-
warnings: allFindings.filter(f => f.severity === "WARN" || f.severity === "warning").length,
|
|
293
|
-
info: allFindings.filter(f => f.severity === "INFO" || f.severity === "info").length,
|
|
294
|
-
},
|
|
295
|
-
|
|
296
|
-
// Risk metrics
|
|
297
|
-
risk: riskMetrics,
|
|
298
|
-
|
|
299
|
-
// Actionable insights
|
|
300
|
-
insights,
|
|
301
|
-
|
|
302
|
-
// Metadata
|
|
303
|
-
meta: {
|
|
304
|
-
filesAnalyzed,
|
|
305
|
-
linesOfCode,
|
|
306
|
-
calculatedAt: new Date().toISOString(),
|
|
307
|
-
version: "1.0.0",
|
|
308
|
-
},
|
|
309
|
-
};
|
|
310
|
-
}
|
|
311
|
-
|
|
312
|
-
/**
|
|
313
|
-
* Generate actionable insights from the analysis
|
|
314
|
-
*/
|
|
315
|
-
function generateInsights(componentScores, componentDeductions, allFindings) {
|
|
316
|
-
const insights = [];
|
|
317
|
-
|
|
318
|
-
// Check each component for issues
|
|
319
|
-
if (componentScores.implementationCompleteness < 70) {
|
|
320
|
-
insights.push({
|
|
321
|
-
type: "critical",
|
|
322
|
-
category: "implementation",
|
|
323
|
-
title: "Incomplete Implementations Detected",
|
|
324
|
-
message: "Several functions appear to be stubs or return fake success without doing actual work.",
|
|
325
|
-
action: "Review functions flagged as 'fake success' or 'stub implementation' and complete them.",
|
|
326
|
-
impact: "high",
|
|
327
|
-
});
|
|
328
|
-
}
|
|
329
|
-
|
|
330
|
-
if (componentScores.errorHandling < 70) {
|
|
331
|
-
insights.push({
|
|
332
|
-
type: "critical",
|
|
333
|
-
category: "reliability",
|
|
334
|
-
title: "Poor Error Handling",
|
|
335
|
-
message: "Errors are being silently swallowed or logged without proper handling.",
|
|
336
|
-
action: "Add proper error handling - either rethrow, return error responses, or implement recovery logic.",
|
|
337
|
-
impact: "high",
|
|
338
|
-
});
|
|
339
|
-
}
|
|
340
|
-
|
|
341
|
-
if (componentScores.apiDataIntegrity < 70) {
|
|
342
|
-
insights.push({
|
|
343
|
-
type: "critical",
|
|
344
|
-
category: "integrity",
|
|
345
|
-
title: "Fake/Placeholder Data Detected",
|
|
346
|
-
message: "API calls may be pointing to fake endpoints or using placeholder data.",
|
|
347
|
-
action: "Replace placeholder URLs and data with real values from environment variables.",
|
|
348
|
-
impact: "high",
|
|
349
|
-
});
|
|
350
|
-
}
|
|
351
|
-
|
|
352
|
-
if (componentScores.securityPosture < 70) {
|
|
353
|
-
insights.push({
|
|
354
|
-
type: "critical",
|
|
355
|
-
category: "security",
|
|
356
|
-
title: "Security Issues Found",
|
|
357
|
-
message: "Hardcoded secrets or auth bypasses detected.",
|
|
358
|
-
action: "Move secrets to environment variables and remove any auth bypass code.",
|
|
359
|
-
impact: "critical",
|
|
360
|
-
});
|
|
361
|
-
}
|
|
362
|
-
|
|
363
|
-
// Check for common patterns
|
|
364
|
-
const fakeSuccessCount = allFindings.filter(f =>
|
|
365
|
-
f.type?.includes("fake-success") || f.type?.includes("fakeSuccess")
|
|
366
|
-
).length;
|
|
367
|
-
|
|
368
|
-
if (fakeSuccessCount >= 3) {
|
|
369
|
-
insights.push({
|
|
370
|
-
type: "pattern",
|
|
371
|
-
category: "vibe-coding",
|
|
372
|
-
title: "Vibe Coding Pattern Detected",
|
|
373
|
-
message: `Found ${fakeSuccessCount} instances of fake success returns - common AI generation pattern.`,
|
|
374
|
-
action: "These functions need real implementation. Consider using vibecheck fix to generate fixes.",
|
|
375
|
-
impact: "high",
|
|
376
|
-
});
|
|
377
|
-
}
|
|
378
|
-
|
|
379
|
-
// Positive insights
|
|
380
|
-
if (componentScores.implementationCompleteness >= 90 && componentScores.errorHandling >= 90) {
|
|
381
|
-
insights.push({
|
|
382
|
-
type: "positive",
|
|
383
|
-
category: "quality",
|
|
384
|
-
title: "Well-Implemented Codebase",
|
|
385
|
-
message: "Functions are properly implemented with good error handling.",
|
|
386
|
-
action: "Keep up the good practices!",
|
|
387
|
-
impact: "positive",
|
|
388
|
-
});
|
|
389
|
-
}
|
|
390
|
-
|
|
391
|
-
return insights;
|
|
392
|
-
}
|
|
393
|
-
|
|
394
|
-
/**
|
|
395
|
-
* Calculate risk metrics
|
|
396
|
-
*/
|
|
397
|
-
function calculateRiskMetrics(allFindings, componentScores) {
|
|
398
|
-
// Calculate technical debt estimate
|
|
399
|
-
const blockerHours = allFindings.filter(f => f.severity === "BLOCK").length * 2; // ~2 hours per blocker
|
|
400
|
-
const warningHours = allFindings.filter(f => f.severity === "WARN").length * 0.5; // ~30 min per warning
|
|
401
|
-
const technicalDebtHours = blockerHours + warningHours;
|
|
402
|
-
|
|
403
|
-
// Categorize risks
|
|
404
|
-
const securityRisks = allFindings.filter(f =>
|
|
405
|
-
CATEGORY_TO_COMPONENT[f.category] === "securityPosture"
|
|
406
|
-
);
|
|
407
|
-
|
|
408
|
-
const reliabilityRisks = allFindings.filter(f =>
|
|
409
|
-
CATEGORY_TO_COMPONENT[f.category] === "errorHandling"
|
|
410
|
-
);
|
|
411
|
-
|
|
412
|
-
const integrityRisks = allFindings.filter(f =>
|
|
413
|
-
CATEGORY_TO_COMPONENT[f.category] === "apiDataIntegrity"
|
|
414
|
-
);
|
|
415
|
-
|
|
416
|
-
return {
|
|
417
|
-
technicalDebtHours: Math.round(technicalDebtHours * 10) / 10,
|
|
418
|
-
technicalDebtLabel: technicalDebtHours > 40 ? "high" : technicalDebtHours > 10 ? "medium" : "low",
|
|
419
|
-
|
|
420
|
-
securityRiskCount: securityRisks.length,
|
|
421
|
-
securityRiskLevel: securityRisks.some(r => r.severity === "BLOCK") ? "critical" :
|
|
422
|
-
securityRisks.length > 0 ? "elevated" : "normal",
|
|
423
|
-
|
|
424
|
-
reliabilityRiskCount: reliabilityRisks.length,
|
|
425
|
-
reliabilityRiskLevel: reliabilityRisks.filter(r => r.severity === "BLOCK").length > 3 ? "high" :
|
|
426
|
-
reliabilityRisks.length > 5 ? "medium" : "low",
|
|
427
|
-
|
|
428
|
-
integrityRiskCount: integrityRisks.length,
|
|
429
|
-
integrityRiskLevel: integrityRisks.some(r => r.severity === "BLOCK") ? "high" :
|
|
430
|
-
integrityRisks.length > 3 ? "medium" : "low",
|
|
431
|
-
|
|
432
|
-
// Overall deployment risk
|
|
433
|
-
deploymentRisk: componentScores.securityPosture < 50 ? "do-not-deploy" :
|
|
434
|
-
componentScores.implementationCompleteness < 50 ? "high-risk" :
|
|
435
|
-
componentScores.errorHandling < 50 ? "medium-risk" : "acceptable",
|
|
436
|
-
};
|
|
437
|
-
}
|
|
438
|
-
|
|
439
|
-
// ═══════════════════════════════════════════════════════════════════════════════
|
|
440
|
-
// VIBE REPORT GENERATOR
|
|
441
|
-
// ═══════════════════════════════════════════════════════════════════════════════
|
|
442
|
-
|
|
443
|
-
/**
|
|
444
|
-
* Generate a human-readable vibe report
|
|
445
|
-
*/
|
|
446
|
-
function generateVibeReport(vibeScore) {
|
|
447
|
-
const lines = [];
|
|
448
|
-
|
|
449
|
-
// Header
|
|
450
|
-
lines.push(`═══════════════════════════════════════════════════════════════`);
|
|
451
|
-
lines.push(` VIBE SCORE REPORT `);
|
|
452
|
-
lines.push(`═══════════════════════════════════════════════════════════════`);
|
|
453
|
-
lines.push(``);
|
|
454
|
-
|
|
455
|
-
// Main score
|
|
456
|
-
lines.push(` ${vibeScore.emoji} Overall Score: ${vibeScore.score}/100 (Grade: ${vibeScore.grade})`);
|
|
457
|
-
lines.push(` ${vibeScore.label}`);
|
|
458
|
-
lines.push(``);
|
|
459
|
-
|
|
460
|
-
// Component breakdown
|
|
461
|
-
lines.push(` COMPONENT BREAKDOWN:`);
|
|
462
|
-
lines.push(` ─────────────────────────────────────────────────────────────`);
|
|
463
|
-
|
|
464
|
-
for (const [name, data] of Object.entries(vibeScore.components)) {
|
|
465
|
-
const status = data.status === "excellent" ? "✅" :
|
|
466
|
-
data.status === "good" ? "👍" :
|
|
467
|
-
data.status === "needs-work" ? "⚠️" : "🛑";
|
|
468
|
-
|
|
469
|
-
const displayName = name.replace(/([A-Z])/g, " $1").trim();
|
|
470
|
-
lines.push(` ${status} ${displayName.padEnd(28)} ${data.score}/100 (${data.issueCount} issues)`);
|
|
471
|
-
}
|
|
472
|
-
|
|
473
|
-
lines.push(``);
|
|
474
|
-
|
|
475
|
-
// Risk metrics
|
|
476
|
-
lines.push(` RISK ASSESSMENT:`);
|
|
477
|
-
lines.push(` ─────────────────────────────────────────────────────────────`);
|
|
478
|
-
lines.push(` Technical Debt: ~${vibeScore.risk.technicalDebtHours} hours (${vibeScore.risk.technicalDebtLabel})`);
|
|
479
|
-
lines.push(` Security Risk: ${vibeScore.risk.securityRiskLevel}`);
|
|
480
|
-
lines.push(` Reliability: ${vibeScore.risk.reliabilityRiskLevel}`);
|
|
481
|
-
lines.push(` Deployment: ${vibeScore.risk.deploymentRisk}`);
|
|
482
|
-
lines.push(``);
|
|
483
|
-
|
|
484
|
-
// Insights
|
|
485
|
-
if (vibeScore.insights.length > 0) {
|
|
486
|
-
lines.push(` INSIGHTS:`);
|
|
487
|
-
lines.push(` ─────────────────────────────────────────────────────────────`);
|
|
488
|
-
|
|
489
|
-
for (const insight of vibeScore.insights.slice(0, 5)) {
|
|
490
|
-
const icon = insight.type === "critical" ? "🚨" :
|
|
491
|
-
insight.type === "pattern" ? "🔍" :
|
|
492
|
-
insight.type === "positive" ? "✨" : "💡";
|
|
493
|
-
lines.push(` ${icon} ${insight.title}`);
|
|
494
|
-
lines.push(` ${insight.message}`);
|
|
495
|
-
lines.push(` → ${insight.action}`);
|
|
496
|
-
lines.push(``);
|
|
497
|
-
}
|
|
498
|
-
}
|
|
499
|
-
|
|
500
|
-
// Summary
|
|
501
|
-
lines.push(` SUMMARY:`);
|
|
502
|
-
lines.push(` ─────────────────────────────────────────────────────────────`);
|
|
503
|
-
lines.push(` ${vibeScore.summary.blockers} blockers | ${vibeScore.summary.warnings} warnings | ${vibeScore.summary.info} info`);
|
|
504
|
-
lines.push(` Files analyzed: ${vibeScore.meta.filesAnalyzed || "N/A"}`);
|
|
505
|
-
lines.push(``);
|
|
506
|
-
lines.push(`═══════════════════════════════════════════════════════════════`);
|
|
507
|
-
|
|
508
|
-
return lines.join("\n");
|
|
509
|
-
}
|
|
510
|
-
|
|
511
|
-
/**
|
|
512
|
-
* Generate JSON-compatible vibe report for CI/CD
|
|
513
|
-
*/
|
|
514
|
-
function generateVibeReportJSON(vibeScore) {
|
|
515
|
-
return {
|
|
516
|
-
vibecheck: {
|
|
517
|
-
score: vibeScore.score,
|
|
518
|
-
grade: vibeScore.grade,
|
|
519
|
-
status: vibeScore.riskLevel,
|
|
520
|
-
summary: vibeScore.summary,
|
|
521
|
-
},
|
|
522
|
-
components: Object.fromEntries(
|
|
523
|
-
Object.entries(vibeScore.components).map(([k, v]) => [k, v.score])
|
|
524
|
-
),
|
|
525
|
-
risk: vibeScore.risk,
|
|
526
|
-
insights: vibeScore.insights,
|
|
527
|
-
meta: vibeScore.meta,
|
|
528
|
-
};
|
|
529
|
-
}
|
|
530
|
-
|
|
531
|
-
// ═══════════════════════════════════════════════════════════════════════════════
|
|
532
|
-
// EXPORTS
|
|
533
|
-
// ═══════════════════════════════════════════════════════════════════════════════
|
|
534
|
-
|
|
535
|
-
module.exports = {
|
|
536
|
-
calculateVibeScore,
|
|
537
|
-
generateVibeReport,
|
|
538
|
-
generateVibeReportJSON,
|
|
539
|
-
SCORE_WEIGHTS,
|
|
540
|
-
SEVERITY_IMPACT,
|
|
541
|
-
CATEGORY_TO_COMPONENT,
|
|
542
|
-
GRADE_THRESHOLDS,
|
|
543
|
-
};
|