@vibecheckai/cli 2.8.2 → 3.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +8 -8
- package/bin/_deprecations.js +35 -0
- package/bin/_router.js +46 -0
- package/bin/cli-hygiene.js +241 -0
- package/bin/guardrail.js +834 -0
- package/bin/runners/cli-utils.js +1070 -0
- package/bin/runners/context/ai-task-decomposer.js +337 -0
- package/bin/runners/context/analyzer.js +462 -0
- package/bin/runners/context/api-contracts.js +427 -0
- package/bin/runners/context/context-diff.js +342 -0
- package/bin/runners/context/context-pruner.js +291 -0
- package/bin/runners/context/dependency-graph.js +414 -0
- package/bin/runners/context/generators/claude.js +107 -0
- package/bin/runners/context/generators/codex.js +108 -0
- package/bin/runners/context/generators/copilot.js +119 -0
- package/bin/runners/context/generators/cursor.js +514 -0
- package/bin/runners/context/generators/mcp.js +151 -0
- package/bin/runners/context/generators/windsurf.js +180 -0
- package/bin/runners/context/git-context.js +302 -0
- package/bin/runners/context/index.js +1042 -0
- package/bin/runners/context/insights.js +173 -0
- package/bin/runners/context/mcp-server/generate-rules.js +337 -0
- package/bin/runners/context/mcp-server/index.js +1176 -0
- package/bin/runners/context/mcp-server/package.json +24 -0
- package/bin/runners/context/memory.js +200 -0
- package/bin/runners/context/monorepo.js +215 -0
- package/bin/runners/context/multi-repo-federation.js +404 -0
- package/bin/runners/context/patterns.js +253 -0
- package/bin/runners/context/proof-context.js +972 -0
- package/bin/runners/context/security-scanner.js +303 -0
- package/bin/runners/context/semantic-search.js +350 -0
- package/bin/runners/context/shared.js +264 -0
- package/bin/runners/context/team-conventions.js +310 -0
- package/bin/runners/lib/ai-bridge.js +416 -0
- package/bin/runners/lib/analysis-core.js +271 -0
- package/bin/runners/lib/analyzers.js +541 -0
- package/bin/runners/lib/audit-bridge.js +391 -0
- package/bin/runners/lib/auth-truth.js +193 -0
- package/bin/runners/lib/auth.js +215 -0
- package/bin/runners/lib/backup.js +62 -0
- package/bin/runners/lib/billing.js +107 -0
- package/bin/runners/lib/claims.js +118 -0
- package/bin/runners/lib/cli-ui.js +540 -0
- package/bin/runners/lib/compliance-bridge-new.js +0 -0
- package/bin/runners/lib/compliance-bridge.js +165 -0
- package/bin/runners/lib/contracts/auth-contract.js +194 -0
- package/bin/runners/lib/contracts/env-contract.js +178 -0
- package/bin/runners/lib/contracts/external-contract.js +198 -0
- package/bin/runners/lib/contracts/guard.js +168 -0
- package/bin/runners/lib/contracts/index.js +89 -0
- package/bin/runners/lib/contracts/plan-validator.js +311 -0
- package/bin/runners/lib/contracts/route-contract.js +192 -0
- package/bin/runners/lib/detect.js +89 -0
- package/bin/runners/lib/doctor/autofix.js +254 -0
- package/bin/runners/lib/doctor/index.js +37 -0
- package/bin/runners/lib/doctor/modules/dependencies.js +325 -0
- package/bin/runners/lib/doctor/modules/index.js +46 -0
- package/bin/runners/lib/doctor/modules/network.js +250 -0
- package/bin/runners/lib/doctor/modules/project.js +312 -0
- package/bin/runners/lib/doctor/modules/runtime.js +224 -0
- package/bin/runners/lib/doctor/modules/security.js +348 -0
- package/bin/runners/lib/doctor/modules/system.js +213 -0
- package/bin/runners/lib/doctor/modules/vibecheck.js +394 -0
- package/bin/runners/lib/doctor/reporter.js +262 -0
- package/bin/runners/lib/doctor/service.js +262 -0
- package/bin/runners/lib/doctor/types.js +113 -0
- package/bin/runners/lib/doctor/ui.js +263 -0
- package/bin/runners/lib/doctor-enhanced.js +233 -0
- package/bin/runners/lib/doctor-v2.js +608 -0
- package/bin/runners/lib/enforcement.js +72 -0
- package/bin/runners/lib/enterprise-detect.js +603 -0
- package/bin/runners/lib/enterprise-init.js +942 -0
- package/bin/runners/lib/entitlements-v2.js +381 -0
- package/bin/runners/lib/entitlements.generated.js +0 -0
- package/bin/runners/lib/entitlements.js +332 -0
- package/bin/runners/lib/env-template.js +66 -0
- package/bin/runners/lib/env.js +189 -0
- package/bin/runners/lib/error-handler.js +320 -0
- package/bin/runners/lib/firewall-prompt.js +50 -0
- package/bin/runners/lib/graph/graph-builder.js +265 -0
- package/bin/runners/lib/graph/html-renderer.js +413 -0
- package/bin/runners/lib/graph/index.js +32 -0
- package/bin/runners/lib/graph/runtime-collector.js +215 -0
- package/bin/runners/lib/graph/static-extractor.js +518 -0
- package/bin/runners/lib/init-wizard.js +308 -0
- package/bin/runners/lib/json-output.js +76 -0
- package/bin/runners/lib/llm.js +75 -0
- package/bin/runners/lib/meter.js +61 -0
- package/bin/runners/lib/missions/evidence.js +126 -0
- package/bin/runners/lib/missions/plan.js +69 -0
- package/bin/runners/lib/missions/templates.js +147 -0
- package/bin/runners/lib/patch.js +40 -0
- package/bin/runners/lib/permissions/auth-model.js +213 -0
- package/bin/runners/lib/permissions/idor-prover.js +205 -0
- package/bin/runners/lib/permissions/index.js +45 -0
- package/bin/runners/lib/permissions/matrix-builder.js +198 -0
- package/bin/runners/lib/pkgjson.js +28 -0
- package/bin/runners/lib/preflight.js +142 -0
- package/bin/runners/lib/reality-findings.js +84 -0
- package/bin/runners/lib/redact.js +29 -0
- package/bin/runners/lib/replay/capsule-manager.js +154 -0
- package/bin/runners/lib/replay/index.js +263 -0
- package/bin/runners/lib/replay/player.js +348 -0
- package/bin/runners/lib/replay/recorder.js +331 -0
- package/bin/runners/lib/report-engine.js +447 -0
- package/bin/runners/lib/report-html.js +1117 -0
- package/bin/runners/lib/report-templates.js +964 -0
- package/bin/runners/lib/route-detection.js +1140 -0
- package/bin/runners/lib/route-truth.js +477 -0
- package/bin/runners/lib/sandbox/index.js +59 -0
- package/bin/runners/lib/sandbox/proof-chain.js +399 -0
- package/bin/runners/lib/sandbox/sandbox-runner.js +205 -0
- package/bin/runners/lib/sandbox/worktree.js +174 -0
- package/bin/runners/lib/scan-cache.js +330 -0
- package/bin/runners/lib/scan-output-schema.js +344 -0
- package/bin/runners/lib/score-history.js +282 -0
- package/bin/runners/lib/security-bridge.js +249 -0
- package/bin/runners/lib/server-usage.js +513 -0
- package/bin/runners/lib/share-pack.js +239 -0
- package/bin/runners/lib/snippets.js +67 -0
- package/bin/runners/lib/truth.js +667 -0
- package/bin/runners/lib/unified-output.js +189 -0
- package/bin/runners/lib/validate-patch.js +156 -0
- package/bin/runners/lib/verification.js +345 -0
- package/bin/runners/reality/engine.js +917 -0
- package/bin/runners/reality/flows.js +122 -0
- package/bin/runners/reality/report.js +378 -0
- package/bin/runners/reality/session.js +193 -0
- package/bin/runners/runAIAgent.js +2 -0
- package/bin/runners/runAudit.js +2 -0
- package/bin/runners/runAuth.js +106 -0
- package/bin/runners/runAutopilot.js +2 -0
- package/bin/runners/runBadge.js +2 -0
- package/bin/runners/runCertify.js +2 -0
- package/bin/runners/runClaimVerifier.js +483 -0
- package/bin/runners/runContext.js +56 -0
- package/bin/runners/runContextCompiler.js +385 -0
- package/bin/runners/runCtx.js +187 -0
- package/bin/runners/runCtxGuard.js +176 -0
- package/bin/runners/runCtxSync.js +116 -0
- package/bin/runners/runDashboard.js +10 -0
- package/bin/runners/runDoctor.js +245 -0
- package/bin/runners/runEnhancedShip.js +2 -0
- package/bin/runners/runFix.js +735 -0
- package/bin/runners/runFixPacks.js +2 -0
- package/bin/runners/runGate.js +17 -0
- package/bin/runners/runGraph.js +283 -0
- package/bin/runners/runInit.js +260 -0
- package/bin/runners/runInitGha.js +101 -0
- package/bin/runners/runInstall.js +76 -0
- package/bin/runners/runInteractive.js +388 -0
- package/bin/runners/runLaunch.js +2 -0
- package/bin/runners/runMcp.js +19 -0
- package/bin/runners/runMdc.js +2 -0
- package/bin/runners/runMissionGenerator.js +282 -0
- package/bin/runners/runNaturalLanguage.js +3 -0
- package/bin/runners/runPR.js +96 -0
- package/bin/runners/runPermissions.js +290 -0
- package/bin/runners/runPromptFirewall.js +211 -0
- package/bin/runners/runProof.js +2 -0
- package/bin/runners/runProve.js +392 -0
- package/bin/runners/runReality.js +489 -0
- package/bin/runners/runRealitySniff.js +2 -0
- package/bin/runners/runReplay.js +469 -0
- package/bin/runners/runReport.js +478 -0
- package/bin/runners/runScan.js +835 -0
- package/bin/runners/runShare.js +34 -0
- package/bin/runners/runShip.js +1062 -0
- package/bin/runners/runStatus.js +136 -0
- package/bin/runners/runTruthpack.js +634 -0
- package/bin/runners/runUpgrade.js +2 -0
- package/bin/runners/runValidate.js +2 -0
- package/bin/runners/runVerifyAgentOutput.js +2 -0
- package/bin/runners/runWatch.js +230 -0
- package/bin/runners/utils.js +360 -0
- package/bin/scan.js +612 -0
- package/bin/vibecheck.js +834 -0
- package/package.json +11 -11
- package/dist/autopatch/verified-autopatch.d.ts +0 -111
- package/dist/autopatch/verified-autopatch.d.ts.map +0 -1
- package/dist/autopatch/verified-autopatch.js +0 -503
- package/dist/autopatch/verified-autopatch.js.map +0 -1
- package/dist/bundles/index.js +0 -8
- package/dist/bundles/vibecheck-core.js +0 -25799
- package/dist/bundles/vibecheck-security.js +0 -208693
- package/dist/bundles/vibecheck-ship.js +0 -2318
- package/dist/commands/baseline.d.ts +0 -7
- package/dist/commands/baseline.d.ts.map +0 -1
- package/dist/commands/baseline.js +0 -79
- package/dist/commands/baseline.js.map +0 -1
- package/dist/commands/cache.d.ts +0 -13
- package/dist/commands/cache.d.ts.map +0 -1
- package/dist/commands/cache.js +0 -165
- package/dist/commands/cache.js.map +0 -1
- package/dist/commands/checkpoint.d.ts +0 -8
- package/dist/commands/checkpoint.d.ts.map +0 -1
- package/dist/commands/checkpoint.js +0 -35
- package/dist/commands/checkpoint.js.map +0 -1
- package/dist/commands/doctor.d.ts +0 -17
- package/dist/commands/doctor.d.ts.map +0 -1
- package/dist/commands/doctor.js +0 -226
- package/dist/commands/doctor.js.map +0 -1
- package/dist/commands/evidence.d.ts +0 -45
- package/dist/commands/evidence.d.ts.map +0 -1
- package/dist/commands/evidence.js +0 -197
- package/dist/commands/evidence.js.map +0 -1
- package/dist/commands/explain.d.ts +0 -8
- package/dist/commands/explain.d.ts.map +0 -1
- package/dist/commands/explain.js +0 -52
- package/dist/commands/explain.js.map +0 -1
- package/dist/commands/fix-consolidated.d.ts +0 -19
- package/dist/commands/fix-consolidated.d.ts.map +0 -1
- package/dist/commands/fix-consolidated.js +0 -165
- package/dist/commands/fix-consolidated.js.map +0 -1
- package/dist/commands/index.d.ts +0 -8
- package/dist/commands/index.d.ts.map +0 -1
- package/dist/commands/index.js +0 -15
- package/dist/commands/index.js.map +0 -1
- package/dist/commands/init.d.ts +0 -8
- package/dist/commands/init.d.ts.map +0 -1
- package/dist/commands/init.js +0 -125
- package/dist/commands/init.js.map +0 -1
- package/dist/commands/launcher.d.ts +0 -10
- package/dist/commands/launcher.d.ts.map +0 -1
- package/dist/commands/launcher.js +0 -174
- package/dist/commands/launcher.js.map +0 -1
- package/dist/commands/on.d.ts +0 -8
- package/dist/commands/on.d.ts.map +0 -1
- package/dist/commands/on.js +0 -123
- package/dist/commands/on.js.map +0 -1
- package/dist/commands/replay.d.ts +0 -8
- package/dist/commands/replay.d.ts.map +0 -1
- package/dist/commands/replay.js +0 -52
- package/dist/commands/replay.js.map +0 -1
- package/dist/commands/scan-consolidated.d.ts +0 -61
- package/dist/commands/scan-consolidated.d.ts.map +0 -1
- package/dist/commands/scan-consolidated.js +0 -243
- package/dist/commands/scan-consolidated.js.map +0 -1
- package/dist/commands/scan-secrets.d.ts +0 -47
- package/dist/commands/scan-secrets.d.ts.map +0 -1
- package/dist/commands/scan-secrets.js +0 -225
- package/dist/commands/scan-secrets.js.map +0 -1
- package/dist/commands/scan-vulnerabilities-enhanced.d.ts +0 -41
- package/dist/commands/scan-vulnerabilities-enhanced.d.ts.map +0 -1
- package/dist/commands/scan-vulnerabilities-enhanced.js +0 -368
- package/dist/commands/scan-vulnerabilities-enhanced.js.map +0 -1
- package/dist/commands/scan-vulnerabilities-osv.d.ts +0 -58
- package/dist/commands/scan-vulnerabilities-osv.d.ts.map +0 -1
- package/dist/commands/scan-vulnerabilities-osv.js +0 -722
- package/dist/commands/scan-vulnerabilities-osv.js.map +0 -1
- package/dist/commands/scan-vulnerabilities.d.ts +0 -32
- package/dist/commands/scan-vulnerabilities.d.ts.map +0 -1
- package/dist/commands/scan-vulnerabilities.js +0 -283
- package/dist/commands/scan-vulnerabilities.js.map +0 -1
- package/dist/commands/secrets-allowlist.d.ts +0 -7
- package/dist/commands/secrets-allowlist.d.ts.map +0 -1
- package/dist/commands/secrets-allowlist.js +0 -85
- package/dist/commands/secrets-allowlist.js.map +0 -1
- package/dist/commands/ship-consolidated.d.ts +0 -58
- package/dist/commands/ship-consolidated.d.ts.map +0 -1
- package/dist/commands/ship-consolidated.js +0 -515
- package/dist/commands/ship-consolidated.js.map +0 -1
- package/dist/commands/stats.d.ts +0 -8
- package/dist/commands/stats.d.ts.map +0 -1
- package/dist/commands/stats.js +0 -134
- package/dist/commands/stats.js.map +0 -1
- package/dist/commands/upgrade.d.ts +0 -8
- package/dist/commands/upgrade.d.ts.map +0 -1
- package/dist/commands/upgrade.js +0 -30
- package/dist/commands/upgrade.js.map +0 -1
- package/dist/fix/applicator.d.ts +0 -44
- package/dist/fix/applicator.d.ts.map +0 -1
- package/dist/fix/applicator.js +0 -144
- package/dist/fix/applicator.js.map +0 -1
- package/dist/fix/backup.d.ts +0 -38
- package/dist/fix/backup.d.ts.map +0 -1
- package/dist/fix/backup.js +0 -154
- package/dist/fix/backup.js.map +0 -1
- package/dist/fix/engine.d.ts +0 -55
- package/dist/fix/engine.d.ts.map +0 -1
- package/dist/fix/engine.js +0 -285
- package/dist/fix/engine.js.map +0 -1
- package/dist/fix/index.d.ts +0 -5
- package/dist/fix/index.d.ts.map +0 -1
- package/dist/fix/index.js +0 -12
- package/dist/fix/index.js.map +0 -1
- package/dist/fix/interactive.d.ts +0 -22
- package/dist/fix/interactive.d.ts.map +0 -1
- package/dist/fix/interactive.js +0 -172
- package/dist/fix/interactive.js.map +0 -1
- package/dist/formatters/index.d.ts +0 -6
- package/dist/formatters/index.d.ts.map +0 -1
- package/dist/formatters/index.js +0 -11
- package/dist/formatters/index.js.map +0 -1
- package/dist/formatters/sarif-enhanced.d.ts +0 -78
- package/dist/formatters/sarif-enhanced.d.ts.map +0 -1
- package/dist/formatters/sarif-enhanced.js +0 -144
- package/dist/formatters/sarif-enhanced.js.map +0 -1
- package/dist/formatters/sarif-v2.d.ts +0 -121
- package/dist/formatters/sarif-v2.d.ts.map +0 -1
- package/dist/formatters/sarif-v2.js +0 -356
- package/dist/formatters/sarif-v2.js.map +0 -1
- package/dist/formatters/sarif.d.ts +0 -72
- package/dist/formatters/sarif.d.ts.map +0 -1
- package/dist/formatters/sarif.js +0 -146
- package/dist/formatters/sarif.js.map +0 -1
- package/dist/index.d.ts +0 -61
- package/dist/index.d.ts.map +0 -1
- package/dist/index.js +0 -4388
- package/dist/index.js.map +0 -1
- package/dist/init/ci-generator.d.ts +0 -18
- package/dist/init/ci-generator.d.ts.map +0 -1
- package/dist/init/ci-generator.js +0 -317
- package/dist/init/ci-generator.js.map +0 -1
- package/dist/init/detect-framework.d.ts +0 -15
- package/dist/init/detect-framework.d.ts.map +0 -1
- package/dist/init/detect-framework.js +0 -301
- package/dist/init/detect-framework.js.map +0 -1
- package/dist/init/hooks-installer.d.ts +0 -22
- package/dist/init/hooks-installer.d.ts.map +0 -1
- package/dist/init/hooks-installer.js +0 -310
- package/dist/init/hooks-installer.js.map +0 -1
- package/dist/init/index.d.ts +0 -8
- package/dist/init/index.d.ts.map +0 -1
- package/dist/init/index.js +0 -22
- package/dist/init/index.js.map +0 -1
- package/dist/init/templates.d.ts +0 -402
- package/dist/init/templates.d.ts.map +0 -1
- package/dist/init/templates.js +0 -240
- package/dist/init/templates.js.map +0 -1
- package/dist/mcp/server.d.ts +0 -12
- package/dist/mcp/server.d.ts.map +0 -1
- package/dist/mcp/server.js +0 -42
- package/dist/mcp/server.js.map +0 -1
- package/dist/mcp/telemetry.d.ts +0 -40
- package/dist/mcp/telemetry.d.ts.map +0 -1
- package/dist/mcp/telemetry.js +0 -98
- package/dist/mcp/telemetry.js.map +0 -1
- package/dist/reality/no-dead-buttons/button-sweep-generator.d.ts +0 -32
- package/dist/reality/no-dead-buttons/button-sweep-generator.d.ts.map +0 -1
- package/dist/reality/no-dead-buttons/button-sweep-generator.js +0 -236
- package/dist/reality/no-dead-buttons/button-sweep-generator.js.map +0 -1
- package/dist/reality/no-dead-buttons/index.d.ts +0 -11
- package/dist/reality/no-dead-buttons/index.d.ts.map +0 -1
- package/dist/reality/no-dead-buttons/index.js +0 -18
- package/dist/reality/no-dead-buttons/index.js.map +0 -1
- package/dist/reality/no-dead-buttons/static-scanner.d.ts +0 -34
- package/dist/reality/no-dead-buttons/static-scanner.d.ts.map +0 -1
- package/dist/reality/no-dead-buttons/static-scanner.js +0 -230
- package/dist/reality/no-dead-buttons/static-scanner.js.map +0 -1
- package/dist/reality/reality-graph.d.ts +0 -192
- package/dist/reality/reality-graph.d.ts.map +0 -1
- package/dist/reality/reality-graph.js +0 -600
- package/dist/reality/reality-graph.js.map +0 -1
- package/dist/reality/reality-runner.d.ts +0 -89
- package/dist/reality/reality-runner.d.ts.map +0 -1
- package/dist/reality/reality-runner.js +0 -540
- package/dist/reality/reality-runner.js.map +0 -1
- package/dist/reality/receipt-generator.d.ts +0 -152
- package/dist/reality/receipt-generator.d.ts.map +0 -1
- package/dist/reality/receipt-generator.js +0 -495
- package/dist/reality/receipt-generator.js.map +0 -1
- package/dist/reality/runtime-tracer.d.ts +0 -75
- package/dist/reality/runtime-tracer.d.ts.map +0 -1
- package/dist/reality/runtime-tracer.js +0 -109
- package/dist/reality/runtime-tracer.js.map +0 -1
- package/dist/runtime/auth-utils.d.ts +0 -43
- package/dist/runtime/auth-utils.d.ts.map +0 -1
- package/dist/runtime/auth-utils.js +0 -130
- package/dist/runtime/auth-utils.js.map +0 -1
- package/dist/runtime/client.d.ts +0 -74
- package/dist/runtime/client.d.ts.map +0 -1
- package/dist/runtime/client.js +0 -222
- package/dist/runtime/client.js.map +0 -1
- package/dist/runtime/creds.d.ts +0 -48
- package/dist/runtime/creds.d.ts.map +0 -1
- package/dist/runtime/creds.js +0 -245
- package/dist/runtime/creds.js.map +0 -1
- package/dist/runtime/exit-codes.d.ts +0 -49
- package/dist/runtime/exit-codes.d.ts.map +0 -1
- package/dist/runtime/exit-codes.js +0 -93
- package/dist/runtime/exit-codes.js.map +0 -1
- package/dist/runtime/index.d.ts +0 -9
- package/dist/runtime/index.d.ts.map +0 -1
- package/dist/runtime/index.js +0 -25
- package/dist/runtime/index.js.map +0 -1
- package/dist/runtime/json-output.d.ts +0 -42
- package/dist/runtime/json-output.d.ts.map +0 -1
- package/dist/runtime/json-output.js +0 -59
- package/dist/runtime/json-output.js.map +0 -1
- package/dist/runtime/semver.d.ts +0 -37
- package/dist/runtime/semver.d.ts.map +0 -1
- package/dist/runtime/semver.js +0 -110
- package/dist/runtime/semver.js.map +0 -1
- package/dist/scan/dead-ui-detector.d.ts +0 -48
- package/dist/scan/dead-ui-detector.d.ts.map +0 -1
- package/dist/scan/dead-ui-detector.js +0 -170
- package/dist/scan/dead-ui-detector.js.map +0 -1
- package/dist/scan/playwright-sweep.d.ts +0 -40
- package/dist/scan/playwright-sweep.d.ts.map +0 -1
- package/dist/scan/playwright-sweep.js +0 -216
- package/dist/scan/playwright-sweep.js.map +0 -1
- package/dist/scan/proof-bundle.d.ts +0 -25
- package/dist/scan/proof-bundle.d.ts.map +0 -1
- package/dist/scan/proof-bundle.js +0 -203
- package/dist/scan/proof-bundle.js.map +0 -1
- package/dist/scan/proof-graph.d.ts +0 -59
- package/dist/scan/proof-graph.d.ts.map +0 -1
- package/dist/scan/proof-graph.js +0 -64
- package/dist/scan/proof-graph.js.map +0 -1
- package/dist/scan/reality-sniff.d.ts +0 -56
- package/dist/scan/reality-sniff.d.ts.map +0 -1
- package/dist/scan/reality-sniff.js +0 -200
- package/dist/scan/reality-sniff.js.map +0 -1
- package/dist/scan/structural-verifier.d.ts +0 -20
- package/dist/scan/structural-verifier.d.ts.map +0 -1
- package/dist/scan/structural-verifier.js +0 -112
- package/dist/scan/structural-verifier.js.map +0 -1
- package/dist/scan/verification-engine.d.ts +0 -47
- package/dist/scan/verification-engine.d.ts.map +0 -1
- package/dist/scan/verification-engine.js +0 -141
- package/dist/scan/verification-engine.js.map +0 -1
- package/dist/scanner/baseline.d.ts +0 -52
- package/dist/scanner/baseline.d.ts.map +0 -1
- package/dist/scanner/baseline.js +0 -85
- package/dist/scanner/baseline.js.map +0 -1
- package/dist/scanner/incremental.d.ts +0 -30
- package/dist/scanner/incremental.d.ts.map +0 -1
- package/dist/scanner/incremental.js +0 -82
- package/dist/scanner/incremental.js.map +0 -1
- package/dist/scanner/parallel.d.ts +0 -43
- package/dist/scanner/parallel.d.ts.map +0 -1
- package/dist/scanner/parallel.js +0 -99
- package/dist/scanner/parallel.js.map +0 -1
- package/dist/standalone.d.ts +0 -1
- package/dist/standalone.d.ts.map +0 -1
- package/dist/standalone.js +0 -1
- package/dist/standalone.js.map +0 -1
- package/dist/truth-pack/index.d.ts +0 -102
- package/dist/truth-pack/index.d.ts.map +0 -1
- package/dist/truth-pack/index.js +0 -694
- package/dist/truth-pack/index.js.map +0 -1
- package/dist/ui/frame.d.ts +0 -68
- package/dist/ui/frame.d.ts.map +0 -1
- package/dist/ui/frame.js +0 -165
- package/dist/ui/frame.js.map +0 -1
- package/dist/ui/index.d.ts +0 -5
- package/dist/ui/index.d.ts.map +0 -1
- package/dist/ui/index.js +0 -16
- package/dist/ui/index.js.map +0 -1
- package/dist/ui.d.ts +0 -36
- package/dist/ui.d.ts.map +0 -1
- package/dist/ui.js +0 -45
- package/dist/ui.js.map +0 -1
|
@@ -0,0 +1,964 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Enhanced Report Templates
|
|
3
|
+
*
|
|
4
|
+
* Beautiful, professional report generation with:
|
|
5
|
+
* - Modern design with gradients and shadows
|
|
6
|
+
* - Visual score gauges (SVG)
|
|
7
|
+
* - Category progress bars
|
|
8
|
+
* - Severity breakdown charts
|
|
9
|
+
* - Trend sparklines
|
|
10
|
+
* - Professional branding
|
|
11
|
+
*/
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* Generate SVG score gauge
|
|
15
|
+
*/
|
|
16
|
+
function generateScoreGauge(score, size = 180) {
|
|
17
|
+
const radius = (size - 20) / 2;
|
|
18
|
+
const circumference = 2 * Math.PI * radius;
|
|
19
|
+
const progress = (score / 100) * circumference;
|
|
20
|
+
const remaining = circumference - progress;
|
|
21
|
+
|
|
22
|
+
const color = score >= 80 ? '#22c55e' : score >= 60 ? '#eab308' : '#ef4444';
|
|
23
|
+
const bgColor = '#e2e8f0';
|
|
24
|
+
|
|
25
|
+
return `
|
|
26
|
+
<svg width="${size}" height="${size}" viewBox="0 0 ${size} ${size}" class="score-gauge">
|
|
27
|
+
<circle
|
|
28
|
+
cx="${size/2}" cy="${size/2}" r="${radius}"
|
|
29
|
+
fill="none" stroke="${bgColor}" stroke-width="12"
|
|
30
|
+
/>
|
|
31
|
+
<circle
|
|
32
|
+
cx="${size/2}" cy="${size/2}" r="${radius}"
|
|
33
|
+
fill="none" stroke="${color}" stroke-width="12"
|
|
34
|
+
stroke-dasharray="${progress} ${remaining}"
|
|
35
|
+
stroke-linecap="round"
|
|
36
|
+
transform="rotate(-90 ${size/2} ${size/2})"
|
|
37
|
+
class="gauge-progress"
|
|
38
|
+
/>
|
|
39
|
+
<text x="${size/2}" y="${size/2 + 8}" text-anchor="middle" class="gauge-score">${score}</text>
|
|
40
|
+
<text x="${size/2}" y="${size/2 + 28}" text-anchor="middle" class="gauge-label">/ 100</text>
|
|
41
|
+
</svg>
|
|
42
|
+
`;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
/**
|
|
46
|
+
* Generate category bar chart
|
|
47
|
+
*/
|
|
48
|
+
function generateCategoryBars(categories) {
|
|
49
|
+
let html = '<div class="category-bars">';
|
|
50
|
+
|
|
51
|
+
for (const [name, score] of Object.entries(categories)) {
|
|
52
|
+
const color = score >= 80 ? '#22c55e' : score >= 60 ? '#eab308' : '#ef4444';
|
|
53
|
+
const icon = score >= 80 ? '✓' : score >= 60 ? '!' : '✗';
|
|
54
|
+
const displayName = formatCategoryName(name);
|
|
55
|
+
|
|
56
|
+
html += `
|
|
57
|
+
<div class="category-bar-item">
|
|
58
|
+
<div class="category-bar-header">
|
|
59
|
+
<span class="category-icon" style="color: ${color}">${icon}</span>
|
|
60
|
+
<span class="category-name">${displayName}</span>
|
|
61
|
+
<span class="category-score" style="color: ${color}">${score}%</span>
|
|
62
|
+
</div>
|
|
63
|
+
<div class="category-bar-track">
|
|
64
|
+
<div class="category-bar-fill" style="width: ${score}%; background: ${color}"></div>
|
|
65
|
+
</div>
|
|
66
|
+
</div>
|
|
67
|
+
`;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
html += '</div>';
|
|
71
|
+
return html;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
/**
|
|
75
|
+
* Generate severity breakdown
|
|
76
|
+
*/
|
|
77
|
+
function generateSeverityBreakdown(findings) {
|
|
78
|
+
const counts = {
|
|
79
|
+
critical: findings.filter(f => f.severity === 'critical').length,
|
|
80
|
+
high: findings.filter(f => f.severity === 'high').length,
|
|
81
|
+
medium: findings.filter(f => f.severity === 'medium').length,
|
|
82
|
+
low: findings.filter(f => f.severity === 'low').length,
|
|
83
|
+
};
|
|
84
|
+
|
|
85
|
+
const total = counts.critical + counts.high + counts.medium + counts.low;
|
|
86
|
+
|
|
87
|
+
const colors = {
|
|
88
|
+
critical: '#dc2626',
|
|
89
|
+
high: '#f97316',
|
|
90
|
+
medium: '#eab308',
|
|
91
|
+
low: '#94a3b8',
|
|
92
|
+
};
|
|
93
|
+
|
|
94
|
+
const icons = {
|
|
95
|
+
critical: '🔴',
|
|
96
|
+
high: '🟠',
|
|
97
|
+
medium: '🟡',
|
|
98
|
+
low: '⚪',
|
|
99
|
+
};
|
|
100
|
+
|
|
101
|
+
let html = `
|
|
102
|
+
<div class="severity-breakdown">
|
|
103
|
+
<div class="severity-chart">
|
|
104
|
+
`;
|
|
105
|
+
|
|
106
|
+
// Stacked bar
|
|
107
|
+
if (total > 0) {
|
|
108
|
+
html += '<div class="severity-bar">';
|
|
109
|
+
for (const [sev, count] of Object.entries(counts)) {
|
|
110
|
+
if (count > 0) {
|
|
111
|
+
const width = (count / total) * 100;
|
|
112
|
+
html += `<div class="severity-segment" style="width: ${width}%; background: ${colors[sev]}" title="${sev}: ${count}"></div>`;
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
html += '</div>';
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
html += '</div><div class="severity-legend">';
|
|
119
|
+
|
|
120
|
+
for (const [sev, count] of Object.entries(counts)) {
|
|
121
|
+
html += `
|
|
122
|
+
<div class="severity-item">
|
|
123
|
+
<span class="severity-icon">${icons[sev]}</span>
|
|
124
|
+
<span class="severity-label">${sev.charAt(0).toUpperCase() + sev.slice(1)}</span>
|
|
125
|
+
<span class="severity-count">${count}</span>
|
|
126
|
+
</div>
|
|
127
|
+
`;
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
html += '</div></div>';
|
|
131
|
+
return html;
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
/**
|
|
135
|
+
* Generate findings list
|
|
136
|
+
*/
|
|
137
|
+
function generateFindingsList(findings, options = {}) {
|
|
138
|
+
const limit = options.limit || 10;
|
|
139
|
+
const showFile = !options.redactPaths;
|
|
140
|
+
|
|
141
|
+
const severityColors = {
|
|
142
|
+
critical: '#dc2626',
|
|
143
|
+
high: '#f97316',
|
|
144
|
+
medium: '#eab308',
|
|
145
|
+
low: '#94a3b8',
|
|
146
|
+
};
|
|
147
|
+
|
|
148
|
+
let html = '<div class="findings-list">';
|
|
149
|
+
|
|
150
|
+
const displayFindings = findings.slice(0, limit);
|
|
151
|
+
|
|
152
|
+
for (const finding of displayFindings) {
|
|
153
|
+
const color = severityColors[finding.severity] || '#94a3b8';
|
|
154
|
+
const sevLabel = (finding.severity || 'medium').toUpperCase();
|
|
155
|
+
|
|
156
|
+
html += `
|
|
157
|
+
<div class="finding-card" style="border-left-color: ${color}">
|
|
158
|
+
<div class="finding-header">
|
|
159
|
+
<span class="finding-severity" style="background: ${color}">${sevLabel}</span>
|
|
160
|
+
<span class="finding-title">${finding.message || finding.title || 'Finding'}</span>
|
|
161
|
+
</div>
|
|
162
|
+
${finding.description ? `<p class="finding-description">${finding.description}</p>` : ''}
|
|
163
|
+
${showFile && finding.file ? `<code class="finding-file">${finding.file}${finding.line ? ':' + finding.line : ''}</code>` : ''}
|
|
164
|
+
${finding.fix ? `<div class="finding-fix"><strong>Fix:</strong> ${finding.fix}</div>` : ''}
|
|
165
|
+
</div>
|
|
166
|
+
`;
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
if (findings.length > limit) {
|
|
170
|
+
html += `<div class="findings-more">+ ${findings.length - limit} more findings...</div>`;
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
html += '</div>';
|
|
174
|
+
return html;
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
/**
|
|
178
|
+
* Get enhanced CSS styles
|
|
179
|
+
*/
|
|
180
|
+
function getEnhancedStyles() {
|
|
181
|
+
return `
|
|
182
|
+
:root {
|
|
183
|
+
--primary: #3b82f6;
|
|
184
|
+
--primary-dark: #1d4ed8;
|
|
185
|
+
--success: #22c55e;
|
|
186
|
+
--warning: #eab308;
|
|
187
|
+
--danger: #ef4444;
|
|
188
|
+
--gray-50: #f8fafc;
|
|
189
|
+
--gray-100: #f1f5f9;
|
|
190
|
+
--gray-200: #e2e8f0;
|
|
191
|
+
--gray-300: #cbd5e1;
|
|
192
|
+
--gray-600: #475569;
|
|
193
|
+
--gray-800: #1e293b;
|
|
194
|
+
--gray-900: #0f172a;
|
|
195
|
+
--shadow: 0 4px 6px -1px rgb(0 0 0 / 0.1), 0 2px 4px -2px rgb(0 0 0 / 0.1);
|
|
196
|
+
--shadow-lg: 0 10px 15px -3px rgb(0 0 0 / 0.1), 0 4px 6px -4px rgb(0 0 0 / 0.1);
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
* { box-sizing: border-box; margin: 0; padding: 0; }
|
|
200
|
+
|
|
201
|
+
body {
|
|
202
|
+
font-family: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;
|
|
203
|
+
color: var(--gray-800);
|
|
204
|
+
line-height: 1.6;
|
|
205
|
+
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
|
|
206
|
+
min-height: 100vh;
|
|
207
|
+
padding: 40px 20px;
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
.report {
|
|
211
|
+
max-width: 900px;
|
|
212
|
+
margin: 0 auto;
|
|
213
|
+
background: white;
|
|
214
|
+
border-radius: 24px;
|
|
215
|
+
box-shadow: var(--shadow-lg);
|
|
216
|
+
overflow: hidden;
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
/* Header */
|
|
220
|
+
.report-header {
|
|
221
|
+
background: linear-gradient(135deg, var(--gray-900) 0%, var(--gray-800) 100%);
|
|
222
|
+
color: white;
|
|
223
|
+
padding: 48px;
|
|
224
|
+
position: relative;
|
|
225
|
+
overflow: hidden;
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
.report-header::before {
|
|
229
|
+
content: '';
|
|
230
|
+
position: absolute;
|
|
231
|
+
top: -50%;
|
|
232
|
+
right: -20%;
|
|
233
|
+
width: 60%;
|
|
234
|
+
height: 200%;
|
|
235
|
+
background: linear-gradient(135deg, rgba(255,255,255,0.1) 0%, transparent 100%);
|
|
236
|
+
transform: rotate(-15deg);
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
.report-header h1 {
|
|
240
|
+
font-size: 32px;
|
|
241
|
+
font-weight: 700;
|
|
242
|
+
margin-bottom: 8px;
|
|
243
|
+
position: relative;
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
.report-meta {
|
|
247
|
+
opacity: 0.8;
|
|
248
|
+
font-size: 14px;
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
.report-logo {
|
|
252
|
+
position: absolute;
|
|
253
|
+
top: 48px;
|
|
254
|
+
right: 48px;
|
|
255
|
+
font-size: 24px;
|
|
256
|
+
font-weight: 700;
|
|
257
|
+
opacity: 0.3;
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
/* Score Section */
|
|
261
|
+
.score-section {
|
|
262
|
+
display: flex;
|
|
263
|
+
align-items: center;
|
|
264
|
+
justify-content: space-between;
|
|
265
|
+
padding: 48px;
|
|
266
|
+
background: var(--gray-50);
|
|
267
|
+
border-bottom: 1px solid var(--gray-200);
|
|
268
|
+
}
|
|
269
|
+
|
|
270
|
+
.score-main {
|
|
271
|
+
display: flex;
|
|
272
|
+
align-items: center;
|
|
273
|
+
gap: 32px;
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
.score-gauge {
|
|
277
|
+
filter: drop-shadow(0 4px 6px rgb(0 0 0 / 0.1));
|
|
278
|
+
}
|
|
279
|
+
|
|
280
|
+
.gauge-progress {
|
|
281
|
+
transition: stroke-dasharray 1s ease-out;
|
|
282
|
+
}
|
|
283
|
+
|
|
284
|
+
.gauge-score {
|
|
285
|
+
font-size: 42px;
|
|
286
|
+
font-weight: 700;
|
|
287
|
+
fill: var(--gray-900);
|
|
288
|
+
}
|
|
289
|
+
|
|
290
|
+
.gauge-label {
|
|
291
|
+
font-size: 14px;
|
|
292
|
+
fill: var(--gray-600);
|
|
293
|
+
}
|
|
294
|
+
|
|
295
|
+
.verdict-badge {
|
|
296
|
+
padding: 12px 28px;
|
|
297
|
+
border-radius: 50px;
|
|
298
|
+
font-weight: 600;
|
|
299
|
+
font-size: 18px;
|
|
300
|
+
text-transform: uppercase;
|
|
301
|
+
letter-spacing: 0.5px;
|
|
302
|
+
box-shadow: var(--shadow);
|
|
303
|
+
}
|
|
304
|
+
|
|
305
|
+
.verdict-badge.ship {
|
|
306
|
+
background: linear-gradient(135deg, #22c55e 0%, #16a34a 100%);
|
|
307
|
+
color: white;
|
|
308
|
+
}
|
|
309
|
+
|
|
310
|
+
.verdict-badge.warn {
|
|
311
|
+
background: linear-gradient(135deg, #eab308 0%, #ca8a04 100%);
|
|
312
|
+
color: white;
|
|
313
|
+
}
|
|
314
|
+
|
|
315
|
+
.verdict-badge.block {
|
|
316
|
+
background: linear-gradient(135deg, #ef4444 0%, #dc2626 100%);
|
|
317
|
+
color: white;
|
|
318
|
+
}
|
|
319
|
+
|
|
320
|
+
.score-info h2 {
|
|
321
|
+
font-size: 24px;
|
|
322
|
+
margin-bottom: 4px;
|
|
323
|
+
}
|
|
324
|
+
|
|
325
|
+
.score-info p {
|
|
326
|
+
color: var(--gray-600);
|
|
327
|
+
font-size: 14px;
|
|
328
|
+
}
|
|
329
|
+
|
|
330
|
+
/* Content Sections */
|
|
331
|
+
.report-content {
|
|
332
|
+
padding: 48px;
|
|
333
|
+
}
|
|
334
|
+
|
|
335
|
+
.section {
|
|
336
|
+
margin-bottom: 48px;
|
|
337
|
+
}
|
|
338
|
+
|
|
339
|
+
.section-header {
|
|
340
|
+
display: flex;
|
|
341
|
+
align-items: center;
|
|
342
|
+
gap: 12px;
|
|
343
|
+
margin-bottom: 24px;
|
|
344
|
+
}
|
|
345
|
+
|
|
346
|
+
.section-icon {
|
|
347
|
+
width: 40px;
|
|
348
|
+
height: 40px;
|
|
349
|
+
border-radius: 10px;
|
|
350
|
+
display: flex;
|
|
351
|
+
align-items: center;
|
|
352
|
+
justify-content: center;
|
|
353
|
+
font-size: 20px;
|
|
354
|
+
background: var(--primary);
|
|
355
|
+
color: white;
|
|
356
|
+
}
|
|
357
|
+
|
|
358
|
+
.section-title {
|
|
359
|
+
font-size: 20px;
|
|
360
|
+
font-weight: 600;
|
|
361
|
+
}
|
|
362
|
+
|
|
363
|
+
/* Category Bars */
|
|
364
|
+
.category-bars {
|
|
365
|
+
display: flex;
|
|
366
|
+
flex-direction: column;
|
|
367
|
+
gap: 16px;
|
|
368
|
+
}
|
|
369
|
+
|
|
370
|
+
.category-bar-item {
|
|
371
|
+
background: var(--gray-50);
|
|
372
|
+
padding: 16px;
|
|
373
|
+
border-radius: 12px;
|
|
374
|
+
}
|
|
375
|
+
|
|
376
|
+
.category-bar-header {
|
|
377
|
+
display: flex;
|
|
378
|
+
align-items: center;
|
|
379
|
+
gap: 8px;
|
|
380
|
+
margin-bottom: 8px;
|
|
381
|
+
}
|
|
382
|
+
|
|
383
|
+
.category-icon {
|
|
384
|
+
font-weight: 600;
|
|
385
|
+
}
|
|
386
|
+
|
|
387
|
+
.category-name {
|
|
388
|
+
flex: 1;
|
|
389
|
+
font-weight: 500;
|
|
390
|
+
}
|
|
391
|
+
|
|
392
|
+
.category-score {
|
|
393
|
+
font-weight: 700;
|
|
394
|
+
}
|
|
395
|
+
|
|
396
|
+
.category-bar-track {
|
|
397
|
+
height: 8px;
|
|
398
|
+
background: var(--gray-200);
|
|
399
|
+
border-radius: 4px;
|
|
400
|
+
overflow: hidden;
|
|
401
|
+
}
|
|
402
|
+
|
|
403
|
+
.category-bar-fill {
|
|
404
|
+
height: 100%;
|
|
405
|
+
border-radius: 4px;
|
|
406
|
+
transition: width 0.5s ease-out;
|
|
407
|
+
}
|
|
408
|
+
|
|
409
|
+
/* Severity Breakdown */
|
|
410
|
+
.severity-breakdown {
|
|
411
|
+
background: var(--gray-50);
|
|
412
|
+
padding: 24px;
|
|
413
|
+
border-radius: 12px;
|
|
414
|
+
}
|
|
415
|
+
|
|
416
|
+
.severity-bar {
|
|
417
|
+
display: flex;
|
|
418
|
+
height: 24px;
|
|
419
|
+
border-radius: 12px;
|
|
420
|
+
overflow: hidden;
|
|
421
|
+
margin-bottom: 20px;
|
|
422
|
+
}
|
|
423
|
+
|
|
424
|
+
.severity-segment {
|
|
425
|
+
transition: width 0.5s ease-out;
|
|
426
|
+
}
|
|
427
|
+
|
|
428
|
+
.severity-legend {
|
|
429
|
+
display: grid;
|
|
430
|
+
grid-template-columns: repeat(4, 1fr);
|
|
431
|
+
gap: 16px;
|
|
432
|
+
}
|
|
433
|
+
|
|
434
|
+
.severity-item {
|
|
435
|
+
display: flex;
|
|
436
|
+
align-items: center;
|
|
437
|
+
gap: 8px;
|
|
438
|
+
}
|
|
439
|
+
|
|
440
|
+
.severity-label {
|
|
441
|
+
flex: 1;
|
|
442
|
+
font-size: 14px;
|
|
443
|
+
color: var(--gray-600);
|
|
444
|
+
}
|
|
445
|
+
|
|
446
|
+
.severity-count {
|
|
447
|
+
font-weight: 700;
|
|
448
|
+
font-size: 18px;
|
|
449
|
+
}
|
|
450
|
+
|
|
451
|
+
/* Findings List */
|
|
452
|
+
.findings-list {
|
|
453
|
+
display: flex;
|
|
454
|
+
flex-direction: column;
|
|
455
|
+
gap: 16px;
|
|
456
|
+
}
|
|
457
|
+
|
|
458
|
+
.finding-card {
|
|
459
|
+
background: var(--gray-50);
|
|
460
|
+
border-left: 4px solid;
|
|
461
|
+
padding: 16px 20px;
|
|
462
|
+
border-radius: 0 12px 12px 0;
|
|
463
|
+
}
|
|
464
|
+
|
|
465
|
+
.finding-header {
|
|
466
|
+
display: flex;
|
|
467
|
+
align-items: center;
|
|
468
|
+
gap: 12px;
|
|
469
|
+
margin-bottom: 8px;
|
|
470
|
+
}
|
|
471
|
+
|
|
472
|
+
.finding-severity {
|
|
473
|
+
padding: 2px 8px;
|
|
474
|
+
border-radius: 4px;
|
|
475
|
+
font-size: 10px;
|
|
476
|
+
font-weight: 700;
|
|
477
|
+
color: white;
|
|
478
|
+
}
|
|
479
|
+
|
|
480
|
+
.finding-title {
|
|
481
|
+
font-weight: 600;
|
|
482
|
+
}
|
|
483
|
+
|
|
484
|
+
.finding-description {
|
|
485
|
+
color: var(--gray-600);
|
|
486
|
+
font-size: 14px;
|
|
487
|
+
margin-bottom: 8px;
|
|
488
|
+
}
|
|
489
|
+
|
|
490
|
+
.finding-file {
|
|
491
|
+
display: inline-block;
|
|
492
|
+
background: var(--gray-200);
|
|
493
|
+
padding: 4px 8px;
|
|
494
|
+
border-radius: 4px;
|
|
495
|
+
font-size: 12px;
|
|
496
|
+
color: var(--gray-600);
|
|
497
|
+
}
|
|
498
|
+
|
|
499
|
+
.finding-fix {
|
|
500
|
+
margin-top: 8px;
|
|
501
|
+
padding: 8px 12px;
|
|
502
|
+
background: rgba(34, 197, 94, 0.1);
|
|
503
|
+
border-radius: 6px;
|
|
504
|
+
font-size: 13px;
|
|
505
|
+
color: #166534;
|
|
506
|
+
}
|
|
507
|
+
|
|
508
|
+
.findings-more {
|
|
509
|
+
text-align: center;
|
|
510
|
+
padding: 16px;
|
|
511
|
+
color: var(--gray-600);
|
|
512
|
+
font-style: italic;
|
|
513
|
+
}
|
|
514
|
+
|
|
515
|
+
/* Footer */
|
|
516
|
+
.report-footer {
|
|
517
|
+
background: var(--gray-900);
|
|
518
|
+
color: white;
|
|
519
|
+
padding: 32px 48px;
|
|
520
|
+
display: flex;
|
|
521
|
+
justify-content: space-between;
|
|
522
|
+
align-items: center;
|
|
523
|
+
}
|
|
524
|
+
|
|
525
|
+
.footer-brand {
|
|
526
|
+
display: flex;
|
|
527
|
+
align-items: center;
|
|
528
|
+
gap: 8px;
|
|
529
|
+
font-weight: 600;
|
|
530
|
+
}
|
|
531
|
+
|
|
532
|
+
.footer-meta {
|
|
533
|
+
font-size: 12px;
|
|
534
|
+
opacity: 0.6;
|
|
535
|
+
}
|
|
536
|
+
|
|
537
|
+
/* Recommendation */
|
|
538
|
+
.recommendation {
|
|
539
|
+
background: linear-gradient(135deg, var(--gray-50) 0%, var(--gray-100) 100%);
|
|
540
|
+
padding: 24px;
|
|
541
|
+
border-radius: 12px;
|
|
542
|
+
border: 1px solid var(--gray-200);
|
|
543
|
+
}
|
|
544
|
+
|
|
545
|
+
.recommendation h3 {
|
|
546
|
+
margin-bottom: 8px;
|
|
547
|
+
}
|
|
548
|
+
|
|
549
|
+
.recommendation p {
|
|
550
|
+
color: var(--gray-600);
|
|
551
|
+
}
|
|
552
|
+
|
|
553
|
+
@media print {
|
|
554
|
+
body {
|
|
555
|
+
background: white;
|
|
556
|
+
padding: 0;
|
|
557
|
+
}
|
|
558
|
+
.report {
|
|
559
|
+
box-shadow: none;
|
|
560
|
+
border-radius: 0;
|
|
561
|
+
}
|
|
562
|
+
}
|
|
563
|
+
`;
|
|
564
|
+
}
|
|
565
|
+
|
|
566
|
+
/**
|
|
567
|
+
* Format category name
|
|
568
|
+
*/
|
|
569
|
+
function formatCategoryName(name) {
|
|
570
|
+
const names = {
|
|
571
|
+
functionality: 'Core Functionality',
|
|
572
|
+
auth: 'Authentication',
|
|
573
|
+
billing: 'Payment Integration',
|
|
574
|
+
reality: 'Runtime Verification',
|
|
575
|
+
code_quality: 'Code Quality',
|
|
576
|
+
};
|
|
577
|
+
return names[name] || name.charAt(0).toUpperCase() + name.slice(1).replace(/_/g, ' ');
|
|
578
|
+
}
|
|
579
|
+
|
|
580
|
+
/**
|
|
581
|
+
* Generate enhanced executive report
|
|
582
|
+
*/
|
|
583
|
+
function generateEnhancedExecutiveReport(data, options = {}) {
|
|
584
|
+
const verdictClass = data.verdict === 'SHIP' ? 'ship' : data.verdict === 'WARN' ? 'warn' : 'block';
|
|
585
|
+
const verdictText = data.verdict === 'SHIP' ? '✅ Ready to Ship' :
|
|
586
|
+
data.verdict === 'WARN' ? '⚠️ Ship with Caution' : '🚫 Not Ready';
|
|
587
|
+
const verdictMessage = data.verdict === 'SHIP'
|
|
588
|
+
? 'All systems go. This application is ready for production.'
|
|
589
|
+
: data.verdict === 'WARN'
|
|
590
|
+
? 'Minor issues detected. Review recommended before deployment.'
|
|
591
|
+
: 'Critical issues found. Remediation required before shipping.';
|
|
592
|
+
|
|
593
|
+
return `<!DOCTYPE html>
|
|
594
|
+
<html lang="en">
|
|
595
|
+
<head>
|
|
596
|
+
<meta charset="UTF-8">
|
|
597
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
598
|
+
<title>Ship Readiness Report - ${data.projectName}</title>
|
|
599
|
+
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&display=swap" rel="stylesheet">
|
|
600
|
+
<style>${getEnhancedStyles()}</style>
|
|
601
|
+
</head>
|
|
602
|
+
<body>
|
|
603
|
+
<div class="report">
|
|
604
|
+
<header class="report-header">
|
|
605
|
+
<h1>Ship Readiness Report</h1>
|
|
606
|
+
<div class="report-meta">
|
|
607
|
+
<p><strong>Project:</strong> ${data.projectName}</p>
|
|
608
|
+
<p><strong>Generated:</strong> ${new Date(data.generatedAt).toLocaleString()}</p>
|
|
609
|
+
${options.company ? `<p><strong>Prepared for:</strong> ${options.company}</p>` : ''}
|
|
610
|
+
</div>
|
|
611
|
+
<div class="report-logo">VIBECHECK</div>
|
|
612
|
+
</header>
|
|
613
|
+
|
|
614
|
+
<section class="score-section">
|
|
615
|
+
<div class="score-main">
|
|
616
|
+
${generateScoreGauge(data.score)}
|
|
617
|
+
<div class="score-info">
|
|
618
|
+
<h2>Vibe Score</h2>
|
|
619
|
+
<p>${verdictMessage}</p>
|
|
620
|
+
</div>
|
|
621
|
+
</div>
|
|
622
|
+
<div class="verdict-badge ${verdictClass}">${verdictText}</div>
|
|
623
|
+
</section>
|
|
624
|
+
|
|
625
|
+
<div class="report-content">
|
|
626
|
+
<section class="section">
|
|
627
|
+
<div class="section-header">
|
|
628
|
+
<div class="section-icon">📊</div>
|
|
629
|
+
<h3 class="section-title">Category Breakdown</h3>
|
|
630
|
+
</div>
|
|
631
|
+
${generateCategoryBars(data.categoryScores)}
|
|
632
|
+
</section>
|
|
633
|
+
|
|
634
|
+
<section class="section">
|
|
635
|
+
<div class="section-header">
|
|
636
|
+
<div class="section-icon">🎯</div>
|
|
637
|
+
<h3 class="section-title">Issues by Severity</h3>
|
|
638
|
+
</div>
|
|
639
|
+
${generateSeverityBreakdown(data.findings)}
|
|
640
|
+
</section>
|
|
641
|
+
|
|
642
|
+
${data.findings.length > 0 ? `
|
|
643
|
+
<section class="section">
|
|
644
|
+
<div class="section-header">
|
|
645
|
+
<div class="section-icon">🔍</div>
|
|
646
|
+
<h3 class="section-title">Key Findings</h3>
|
|
647
|
+
</div>
|
|
648
|
+
${generateFindingsList(data.findings, { limit: 5, redactPaths: options.redactPaths })}
|
|
649
|
+
</section>
|
|
650
|
+
` : ''}
|
|
651
|
+
|
|
652
|
+
<section class="section">
|
|
653
|
+
<div class="recommendation">
|
|
654
|
+
<h3>📋 Recommendation</h3>
|
|
655
|
+
<p>${data.verdict === 'SHIP'
|
|
656
|
+
? 'This application has passed all quality checks and is ready for production deployment. Continue monitoring after launch.'
|
|
657
|
+
: data.verdict === 'WARN'
|
|
658
|
+
? 'This application can be deployed, but the identified issues should be addressed in the next sprint to ensure long-term stability.'
|
|
659
|
+
: 'This application requires immediate attention. Critical issues must be resolved before deployment to prevent production incidents.'
|
|
660
|
+
}</p>
|
|
661
|
+
</div>
|
|
662
|
+
</section>
|
|
663
|
+
</div>
|
|
664
|
+
|
|
665
|
+
<footer class="report-footer">
|
|
666
|
+
<div class="footer-brand">
|
|
667
|
+
<span>⚡</span>
|
|
668
|
+
<span>Vibecheck</span>
|
|
669
|
+
</div>
|
|
670
|
+
<div class="footer-meta">
|
|
671
|
+
Report ID: VC-${Date.now().toString(36).toUpperCase()} · vibecheck.dev
|
|
672
|
+
</div>
|
|
673
|
+
</footer>
|
|
674
|
+
</div>
|
|
675
|
+
</body>
|
|
676
|
+
</html>`;
|
|
677
|
+
}
|
|
678
|
+
|
|
679
|
+
/**
|
|
680
|
+
* Generate enhanced technical report
|
|
681
|
+
*/
|
|
682
|
+
function generateEnhancedTechnicalReport(data, options = {}) {
|
|
683
|
+
const verdictClass = data.verdict === 'SHIP' ? 'ship' : data.verdict === 'WARN' ? 'warn' : 'block';
|
|
684
|
+
|
|
685
|
+
return `<!DOCTYPE html>
|
|
686
|
+
<html lang="en">
|
|
687
|
+
<head>
|
|
688
|
+
<meta charset="UTF-8">
|
|
689
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
690
|
+
<title>Technical Quality Report - ${data.projectName}</title>
|
|
691
|
+
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&family=JetBrains+Mono&display=swap" rel="stylesheet">
|
|
692
|
+
<style>
|
|
693
|
+
${getEnhancedStyles()}
|
|
694
|
+
.code-block { font-family: 'JetBrains Mono', monospace; background: #1e293b; color: #e2e8f0; padding: 16px; border-radius: 8px; overflow-x: auto; }
|
|
695
|
+
.finding-card { margin-bottom: 16px; }
|
|
696
|
+
.tech-table { width: 100%; border-collapse: collapse; margin: 16px 0; }
|
|
697
|
+
.tech-table th, .tech-table td { padding: 12px; text-align: left; border-bottom: 1px solid var(--gray-200); }
|
|
698
|
+
.tech-table th { background: var(--gray-100); font-weight: 600; }
|
|
699
|
+
.badge { display: inline-block; padding: 2px 8px; border-radius: 4px; font-size: 11px; font-weight: 600; }
|
|
700
|
+
.badge-critical { background: #fee2e2; color: #991b1b; }
|
|
701
|
+
.badge-high { background: #ffedd5; color: #9a3412; }
|
|
702
|
+
.badge-medium { background: #fef9c3; color: #854d0e; }
|
|
703
|
+
.badge-low { background: #f1f5f9; color: #475569; }
|
|
704
|
+
</style>
|
|
705
|
+
</head>
|
|
706
|
+
<body>
|
|
707
|
+
<div class="report">
|
|
708
|
+
<header class="report-header">
|
|
709
|
+
<h1>Technical Quality Report</h1>
|
|
710
|
+
<div class="report-meta">
|
|
711
|
+
<p><strong>Project:</strong> ${data.projectName}</p>
|
|
712
|
+
<p><strong>Generated:</strong> ${new Date(data.generatedAt).toLocaleString()}</p>
|
|
713
|
+
<p><strong>Scan ID:</strong> VC-${Date.now().toString(36).toUpperCase()}</p>
|
|
714
|
+
</div>
|
|
715
|
+
<div class="report-logo">VIBECHECK</div>
|
|
716
|
+
</header>
|
|
717
|
+
|
|
718
|
+
<section class="score-section">
|
|
719
|
+
<div class="score-main">
|
|
720
|
+
${generateScoreGauge(data.score)}
|
|
721
|
+
<div class="score-info">
|
|
722
|
+
<h2>Technical Score</h2>
|
|
723
|
+
<p>${data.findings.length} issues found across ${Object.keys(data.categoryScores).length} categories</p>
|
|
724
|
+
</div>
|
|
725
|
+
</div>
|
|
726
|
+
<div class="verdict-badge ${verdictClass}">${data.verdict}</div>
|
|
727
|
+
</section>
|
|
728
|
+
|
|
729
|
+
<div class="report-content">
|
|
730
|
+
<section class="section">
|
|
731
|
+
<div class="section-header">
|
|
732
|
+
<div class="section-icon">📊</div>
|
|
733
|
+
<h3 class="section-title">Score Breakdown</h3>
|
|
734
|
+
</div>
|
|
735
|
+
<table class="tech-table">
|
|
736
|
+
<thead>
|
|
737
|
+
<tr><th>Category</th><th>Score</th><th>Status</th><th>Details</th></tr>
|
|
738
|
+
</thead>
|
|
739
|
+
<tbody>
|
|
740
|
+
${Object.entries(data.categoryScores).map(([cat, score]) => `
|
|
741
|
+
<tr>
|
|
742
|
+
<td>${formatCategoryName(cat)}</td>
|
|
743
|
+
<td><strong>${score}%</strong></td>
|
|
744
|
+
<td>${score >= 80 ? '✅ Pass' : score >= 60 ? '⚠️ Warning' : '❌ Fail'}</td>
|
|
745
|
+
<td>${score >= 80 ? 'No issues' : 'Requires attention'}</td>
|
|
746
|
+
</tr>
|
|
747
|
+
`).join('')}
|
|
748
|
+
</tbody>
|
|
749
|
+
</table>
|
|
750
|
+
</section>
|
|
751
|
+
|
|
752
|
+
<section class="section">
|
|
753
|
+
<div class="section-header">
|
|
754
|
+
<div class="section-icon">🎯</div>
|
|
755
|
+
<h3 class="section-title">Issues by Severity</h3>
|
|
756
|
+
</div>
|
|
757
|
+
${generateSeverityBreakdown(data.findings)}
|
|
758
|
+
</section>
|
|
759
|
+
|
|
760
|
+
<section class="section">
|
|
761
|
+
<div class="section-header">
|
|
762
|
+
<div class="section-icon">🔍</div>
|
|
763
|
+
<h3 class="section-title">All Findings (${data.findings.length})</h3>
|
|
764
|
+
</div>
|
|
765
|
+
${generateFindingsList(data.findings, { limit: 50, redactPaths: options.redactPaths })}
|
|
766
|
+
</section>
|
|
767
|
+
</div>
|
|
768
|
+
|
|
769
|
+
<footer class="report-footer">
|
|
770
|
+
<div class="footer-brand">
|
|
771
|
+
<span>⚡</span>
|
|
772
|
+
<span>Vibecheck Technical Report</span>
|
|
773
|
+
</div>
|
|
774
|
+
<div class="footer-meta">
|
|
775
|
+
vibecheck.dev
|
|
776
|
+
</div>
|
|
777
|
+
</footer>
|
|
778
|
+
</div>
|
|
779
|
+
</body>
|
|
780
|
+
</html>`;
|
|
781
|
+
}
|
|
782
|
+
|
|
783
|
+
/**
|
|
784
|
+
* Generate enhanced compliance report
|
|
785
|
+
*/
|
|
786
|
+
function generateEnhancedComplianceReport(data, options = {}) {
|
|
787
|
+
const assessmentId = `VC-${new Date().toISOString().split('T')[0].replace(/-/g, '')}-${Math.random().toString(36).substring(2, 8).toUpperCase()}`;
|
|
788
|
+
const verdictClass = data.verdict === 'SHIP' ? 'ship' : data.verdict === 'WARN' ? 'warn' : 'block';
|
|
789
|
+
|
|
790
|
+
const criticalCount = data.findings.filter(f => f.severity === 'critical').length;
|
|
791
|
+
const highCount = data.findings.filter(f => f.severity === 'high').length;
|
|
792
|
+
|
|
793
|
+
return `<!DOCTYPE html>
|
|
794
|
+
<html lang="en">
|
|
795
|
+
<head>
|
|
796
|
+
<meta charset="UTF-8">
|
|
797
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
798
|
+
<title>Security Assessment Report - ${data.projectName}</title>
|
|
799
|
+
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&display=swap" rel="stylesheet">
|
|
800
|
+
<style>
|
|
801
|
+
${getEnhancedStyles()}
|
|
802
|
+
.compliance-grid { display: grid; grid-template-columns: repeat(2, 1fr); gap: 16px; margin: 24px 0; }
|
|
803
|
+
.compliance-card { background: var(--gray-50); padding: 20px; border-radius: 12px; border: 1px solid var(--gray-200); }
|
|
804
|
+
.compliance-card h4 { margin-bottom: 12px; display: flex; align-items: center; gap: 8px; }
|
|
805
|
+
.control-item { display: flex; align-items: center; gap: 8px; padding: 8px 0; border-bottom: 1px solid var(--gray-200); }
|
|
806
|
+
.control-item:last-child { border-bottom: none; }
|
|
807
|
+
.control-status { width: 24px; text-align: center; }
|
|
808
|
+
.attestation { background: linear-gradient(135deg, #1e293b 0%, #334155 100%); color: white; padding: 32px; border-radius: 12px; margin-top: 32px; }
|
|
809
|
+
.attestation h3 { margin-bottom: 16px; }
|
|
810
|
+
.signature-line { margin-top: 32px; padding-top: 16px; border-top: 1px solid rgba(255,255,255,0.2); display: flex; justify-content: space-between; }
|
|
811
|
+
</style>
|
|
812
|
+
</head>
|
|
813
|
+
<body>
|
|
814
|
+
<div class="report">
|
|
815
|
+
<header class="report-header" style="background: linear-gradient(135deg, #1e3a5f 0%, #0f172a 100%);">
|
|
816
|
+
<h1>Application Security Assessment</h1>
|
|
817
|
+
<div class="report-meta">
|
|
818
|
+
<p><strong>Application:</strong> ${data.projectName}</p>
|
|
819
|
+
<p><strong>Assessment Date:</strong> ${new Date(data.generatedAt).toLocaleDateString()}</p>
|
|
820
|
+
<p><strong>Assessment ID:</strong> ${assessmentId}</p>
|
|
821
|
+
${options.company ? `<p><strong>Prepared For:</strong> ${options.company}</p>` : ''}
|
|
822
|
+
</div>
|
|
823
|
+
<div class="report-logo">VIBECHECK</div>
|
|
824
|
+
</header>
|
|
825
|
+
|
|
826
|
+
<section class="score-section">
|
|
827
|
+
<div class="score-main">
|
|
828
|
+
${generateScoreGauge(data.score)}
|
|
829
|
+
<div class="score-info">
|
|
830
|
+
<h2>Security Score</h2>
|
|
831
|
+
<p>Based on automated code analysis and security checks</p>
|
|
832
|
+
</div>
|
|
833
|
+
</div>
|
|
834
|
+
<div class="verdict-badge ${verdictClass}">${data.verdict === 'SHIP' ? '✅ COMPLIANT' : data.verdict === 'WARN' ? '⚠️ PARTIAL' : '🚫 NON-COMPLIANT'}</div>
|
|
835
|
+
</section>
|
|
836
|
+
|
|
837
|
+
<div class="report-content">
|
|
838
|
+
<section class="section">
|
|
839
|
+
<div class="section-header">
|
|
840
|
+
<div class="section-icon" style="background: #1e3a5f;">📋</div>
|
|
841
|
+
<h3 class="section-title">Executive Summary</h3>
|
|
842
|
+
</div>
|
|
843
|
+
<p style="margin-bottom: 16px;">
|
|
844
|
+
This assessment evaluates the application's compliance with security best practices
|
|
845
|
+
and industry standards. The analysis covers code quality, authentication mechanisms,
|
|
846
|
+
data protection, and operational security controls.
|
|
847
|
+
</p>
|
|
848
|
+
<div class="compliance-grid">
|
|
849
|
+
<div class="compliance-card">
|
|
850
|
+
<h4>🔴 Critical Findings</h4>
|
|
851
|
+
<div style="font-size: 32px; font-weight: 700; color: ${criticalCount > 0 ? '#dc2626' : '#22c55e'};">${criticalCount}</div>
|
|
852
|
+
<p style="color: var(--gray-600); font-size: 14px;">${criticalCount > 0 ? 'Immediate remediation required' : 'No critical issues'}</p>
|
|
853
|
+
</div>
|
|
854
|
+
<div class="compliance-card">
|
|
855
|
+
<h4>🟠 High Priority</h4>
|
|
856
|
+
<div style="font-size: 32px; font-weight: 700; color: ${highCount > 0 ? '#f97316' : '#22c55e'};">${highCount}</div>
|
|
857
|
+
<p style="color: var(--gray-600); font-size: 14px;">${highCount > 0 ? 'Should be addressed soon' : 'No high priority issues'}</p>
|
|
858
|
+
</div>
|
|
859
|
+
</div>
|
|
860
|
+
</section>
|
|
861
|
+
|
|
862
|
+
<section class="section">
|
|
863
|
+
<div class="section-header">
|
|
864
|
+
<div class="section-icon" style="background: #1e3a5f;">🔒</div>
|
|
865
|
+
<h3 class="section-title">Control Areas Assessed</h3>
|
|
866
|
+
</div>
|
|
867
|
+
<div class="compliance-grid">
|
|
868
|
+
<div class="compliance-card">
|
|
869
|
+
<h4>🔐 Access Control</h4>
|
|
870
|
+
<div class="control-item">
|
|
871
|
+
<span class="control-status">${data.categoryScores.auth >= 80 ? '✅' : '❌'}</span>
|
|
872
|
+
<span>Authentication required for protected routes</span>
|
|
873
|
+
</div>
|
|
874
|
+
<div class="control-item">
|
|
875
|
+
<span class="control-status">⬜</span>
|
|
876
|
+
<span>Session management (manual review)</span>
|
|
877
|
+
</div>
|
|
878
|
+
<div class="control-item">
|
|
879
|
+
<span class="control-status">⬜</span>
|
|
880
|
+
<span>Password hashing (manual review)</span>
|
|
881
|
+
</div>
|
|
882
|
+
</div>
|
|
883
|
+
<div class="compliance-card">
|
|
884
|
+
<h4>🛡️ Data Protection</h4>
|
|
885
|
+
<div class="control-item">
|
|
886
|
+
<span class="control-status">⬜</span>
|
|
887
|
+
<span>Encryption in transit (TLS)</span>
|
|
888
|
+
</div>
|
|
889
|
+
<div class="control-item">
|
|
890
|
+
<span class="control-status">${data.findings.filter(f => f.type === 'secret').length === 0 ? '✅' : '❌'}</span>
|
|
891
|
+
<span>No secrets in codebase</span>
|
|
892
|
+
</div>
|
|
893
|
+
</div>
|
|
894
|
+
<div class="compliance-card">
|
|
895
|
+
<h4>💳 Payment Security</h4>
|
|
896
|
+
<div class="control-item">
|
|
897
|
+
<span class="control-status">${data.categoryScores.billing >= 80 ? '✅' : '❌'}</span>
|
|
898
|
+
<span>Billing gates enforced server-side</span>
|
|
899
|
+
</div>
|
|
900
|
+
</div>
|
|
901
|
+
<div class="compliance-card">
|
|
902
|
+
<h4>📝 Code Quality</h4>
|
|
903
|
+
<div class="control-item">
|
|
904
|
+
<span class="control-status">${data.categoryScores.code_quality >= 80 ? '✅' : '❌'}</span>
|
|
905
|
+
<span>No mock/demo code in production paths</span>
|
|
906
|
+
</div>
|
|
907
|
+
</div>
|
|
908
|
+
</div>
|
|
909
|
+
</section>
|
|
910
|
+
|
|
911
|
+
${data.findings.length > 0 ? `
|
|
912
|
+
<section class="section">
|
|
913
|
+
<div class="section-header">
|
|
914
|
+
<div class="section-icon" style="background: #1e3a5f;">🔍</div>
|
|
915
|
+
<h3 class="section-title">Findings Detail</h3>
|
|
916
|
+
</div>
|
|
917
|
+
${generateFindingsList(data.findings, { limit: 10, redactPaths: options.redactPaths })}
|
|
918
|
+
</section>
|
|
919
|
+
` : ''}
|
|
920
|
+
|
|
921
|
+
<div class="attestation">
|
|
922
|
+
<h3>📜 Attestation</h3>
|
|
923
|
+
<p>
|
|
924
|
+
This assessment was conducted using automated static code analysis and security scanning tools.
|
|
925
|
+
${data.verdict === 'SHIP'
|
|
926
|
+
? 'The application meets the baseline security requirements for production deployment.'
|
|
927
|
+
: 'The application has identified issues that should be remediated before production deployment.'}
|
|
928
|
+
</p>
|
|
929
|
+
<div class="signature-line">
|
|
930
|
+
<div>
|
|
931
|
+
<strong>Assessment ID:</strong> ${assessmentId}
|
|
932
|
+
</div>
|
|
933
|
+
<div>
|
|
934
|
+
<strong>Verification:</strong> vibecheck.dev/verify/${assessmentId}
|
|
935
|
+
</div>
|
|
936
|
+
</div>
|
|
937
|
+
</div>
|
|
938
|
+
</div>
|
|
939
|
+
|
|
940
|
+
<footer class="report-footer">
|
|
941
|
+
<div class="footer-brand">
|
|
942
|
+
<span>🔒</span>
|
|
943
|
+
<span>Vibecheck Security Assessment</span>
|
|
944
|
+
</div>
|
|
945
|
+
<div class="footer-meta">
|
|
946
|
+
vibecheck.dev
|
|
947
|
+
</div>
|
|
948
|
+
</footer>
|
|
949
|
+
</div>
|
|
950
|
+
</body>
|
|
951
|
+
</html>`;
|
|
952
|
+
}
|
|
953
|
+
|
|
954
|
+
module.exports = {
|
|
955
|
+
generateScoreGauge,
|
|
956
|
+
generateCategoryBars,
|
|
957
|
+
generateSeverityBreakdown,
|
|
958
|
+
generateFindingsList,
|
|
959
|
+
getEnhancedStyles,
|
|
960
|
+
generateEnhancedExecutiveReport,
|
|
961
|
+
generateEnhancedTechnicalReport,
|
|
962
|
+
generateEnhancedComplianceReport,
|
|
963
|
+
formatCategoryName,
|
|
964
|
+
};
|