vibecheck-ai 2.0.2 → 5.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/bin/.generated +25 -0
- package/bin/_deprecations.js +463 -0
- package/bin/_router.js +46 -0
- package/bin/cli-hygiene.js +241 -0
- package/bin/dev/run-v2-torture.js +30 -0
- package/bin/registry.js +656 -0
- package/bin/runners/CLI_REFACTOR_SUMMARY.md +229 -0
- package/bin/runners/ENHANCEMENT_GUIDE.md +121 -0
- package/bin/runners/REPORT_AUDIT.md +64 -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 +513 -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-enhanced.js +2525 -0
- package/bin/runners/context/generators/cursor.js +514 -0
- package/bin/runners/context/generators/mcp.js +169 -0
- package/bin/runners/context/generators/windsurf.js +180 -0
- package/bin/runners/context/git-context.js +304 -0
- package/bin/runners/context/index.js +1110 -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 +1264 -0
- package/bin/runners/context/security-scanner.js +541 -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 +336 -0
- package/bin/runners/lib/__tests__/entitlements-v2.test.js +295 -0
- package/bin/runners/lib/agent-firewall/ai/false-positive-analyzer.js +474 -0
- package/bin/runners/lib/agent-firewall/change-packet/builder.js +488 -0
- package/bin/runners/lib/agent-firewall/change-packet/schema.json +228 -0
- package/bin/runners/lib/agent-firewall/change-packet/store.js +200 -0
- package/bin/runners/lib/agent-firewall/claims/claim-types.js +21 -0
- package/bin/runners/lib/agent-firewall/claims/extractor.js +303 -0
- package/bin/runners/lib/agent-firewall/claims/patterns.js +24 -0
- package/bin/runners/lib/agent-firewall/critic/index.js +151 -0
- package/bin/runners/lib/agent-firewall/critic/judge.js +432 -0
- package/bin/runners/lib/agent-firewall/critic/prompts.js +305 -0
- package/bin/runners/lib/agent-firewall/enforcement/gateway.js +1059 -0
- package/bin/runners/lib/agent-firewall/enforcement/index.js +98 -0
- package/bin/runners/lib/agent-firewall/enforcement/mode.js +318 -0
- package/bin/runners/lib/agent-firewall/enforcement/orchestrator.js +484 -0
- package/bin/runners/lib/agent-firewall/enforcement/proof-artifact.js +418 -0
- package/bin/runners/lib/agent-firewall/enforcement/schemas/change-event.schema.json +173 -0
- package/bin/runners/lib/agent-firewall/enforcement/schemas/intent.schema.json +181 -0
- package/bin/runners/lib/agent-firewall/enforcement/schemas/verdict.schema.json +222 -0
- package/bin/runners/lib/agent-firewall/enforcement/verdict-v2.js +333 -0
- package/bin/runners/lib/agent-firewall/evidence/auth-evidence.js +88 -0
- package/bin/runners/lib/agent-firewall/evidence/contract-evidence.js +75 -0
- package/bin/runners/lib/agent-firewall/evidence/env-evidence.js +127 -0
- package/bin/runners/lib/agent-firewall/evidence/resolver.js +102 -0
- package/bin/runners/lib/agent-firewall/evidence/route-evidence.js +213 -0
- package/bin/runners/lib/agent-firewall/evidence/side-effect-evidence.js +145 -0
- package/bin/runners/lib/agent-firewall/fs-hook/daemon.js +19 -0
- package/bin/runners/lib/agent-firewall/fs-hook/installer.js +87 -0
- package/bin/runners/lib/agent-firewall/fs-hook/watcher.js +184 -0
- package/bin/runners/lib/agent-firewall/git-hook/pre-commit.js +163 -0
- package/bin/runners/lib/agent-firewall/ide-extension/cursor.js +107 -0
- package/bin/runners/lib/agent-firewall/ide-extension/vscode.js +68 -0
- package/bin/runners/lib/agent-firewall/ide-extension/windsurf.js +66 -0
- package/bin/runners/lib/agent-firewall/index.js +200 -0
- package/bin/runners/lib/agent-firewall/integration/index.js +20 -0
- package/bin/runners/lib/agent-firewall/integration/ship-gate.js +437 -0
- package/bin/runners/lib/agent-firewall/intent/alignment-engine.js +634 -0
- package/bin/runners/lib/agent-firewall/intent/auto-detect.js +426 -0
- package/bin/runners/lib/agent-firewall/intent/index.js +102 -0
- package/bin/runners/lib/agent-firewall/intent/schema.js +352 -0
- package/bin/runners/lib/agent-firewall/intent/store.js +283 -0
- package/bin/runners/lib/agent-firewall/interception/fs-interceptor.js +502 -0
- package/bin/runners/lib/agent-firewall/interception/index.js +23 -0
- package/bin/runners/lib/agent-firewall/interceptor/base.js +308 -0
- package/bin/runners/lib/agent-firewall/interceptor/cursor.js +35 -0
- package/bin/runners/lib/agent-firewall/interceptor/vscode.js +35 -0
- package/bin/runners/lib/agent-firewall/interceptor/windsurf.js +34 -0
- package/bin/runners/lib/agent-firewall/lawbook/distributor.js +465 -0
- package/bin/runners/lib/agent-firewall/lawbook/evaluator.js +604 -0
- package/bin/runners/lib/agent-firewall/lawbook/index.js +304 -0
- package/bin/runners/lib/agent-firewall/lawbook/registry.js +514 -0
- package/bin/runners/lib/agent-firewall/lawbook/schema.js +420 -0
- package/bin/runners/lib/agent-firewall/logger.js +141 -0
- package/bin/runners/lib/agent-firewall/policy/default-policy.json +90 -0
- package/bin/runners/lib/agent-firewall/policy/engine.js +103 -0
- package/bin/runners/lib/agent-firewall/policy/loader.js +451 -0
- package/bin/runners/lib/agent-firewall/policy/rules/auth-drift.js +50 -0
- package/bin/runners/lib/agent-firewall/policy/rules/contract-drift.js +50 -0
- package/bin/runners/lib/agent-firewall/policy/rules/fake-success.js +79 -0
- package/bin/runners/lib/agent-firewall/policy/rules/ghost-env.js +227 -0
- package/bin/runners/lib/agent-firewall/policy/rules/ghost-route.js +191 -0
- package/bin/runners/lib/agent-firewall/policy/rules/scope.js +93 -0
- package/bin/runners/lib/agent-firewall/policy/rules/unsafe-side-effect.js +57 -0
- package/bin/runners/lib/agent-firewall/policy/schema.json +183 -0
- package/bin/runners/lib/agent-firewall/policy/verdict.js +54 -0
- package/bin/runners/lib/agent-firewall/proposal/extractor.js +394 -0
- package/bin/runners/lib/agent-firewall/proposal/index.js +212 -0
- package/bin/runners/lib/agent-firewall/proposal/schema.js +251 -0
- package/bin/runners/lib/agent-firewall/proposal/validator.js +386 -0
- package/bin/runners/lib/agent-firewall/reality/index.js +332 -0
- package/bin/runners/lib/agent-firewall/reality/state.js +625 -0
- package/bin/runners/lib/agent-firewall/reality/watcher.js +322 -0
- package/bin/runners/lib/agent-firewall/risk/index.js +173 -0
- package/bin/runners/lib/agent-firewall/risk/scorer.js +328 -0
- package/bin/runners/lib/agent-firewall/risk/thresholds.js +322 -0
- package/bin/runners/lib/agent-firewall/risk/vectors.js +421 -0
- package/bin/runners/lib/agent-firewall/session/collector.js +451 -0
- package/bin/runners/lib/agent-firewall/session/index.js +26 -0
- package/bin/runners/lib/agent-firewall/simulator/diff-simulator.js +472 -0
- package/bin/runners/lib/agent-firewall/simulator/import-resolver.js +346 -0
- package/bin/runners/lib/agent-firewall/simulator/index.js +181 -0
- package/bin/runners/lib/agent-firewall/simulator/route-validator.js +380 -0
- package/bin/runners/lib/agent-firewall/time-machine/incident-correlator.js +661 -0
- package/bin/runners/lib/agent-firewall/time-machine/index.js +267 -0
- package/bin/runners/lib/agent-firewall/time-machine/replay-engine.js +436 -0
- package/bin/runners/lib/agent-firewall/time-machine/state-reconstructor.js +490 -0
- package/bin/runners/lib/agent-firewall/time-machine/timeline-builder.js +530 -0
- package/bin/runners/lib/agent-firewall/truthpack/index.js +67 -0
- package/bin/runners/lib/agent-firewall/truthpack/loader.js +137 -0
- package/bin/runners/lib/agent-firewall/unblock/planner.js +337 -0
- package/bin/runners/lib/agent-firewall/utils/ignore-checker.js +118 -0
- package/bin/runners/lib/ai-bridge.js +416 -0
- package/bin/runners/lib/analysis-core.js +309 -0
- package/bin/runners/lib/analyzers.js +2500 -0
- package/bin/runners/lib/api-client.js +269 -0
- package/bin/runners/lib/approve-output.js +235 -0
- package/bin/runners/lib/artifact-envelope.js +540 -0
- package/bin/runners/lib/assets/vibecheck-logo.png +0 -0
- package/bin/runners/lib/audit-bridge.js +391 -0
- package/bin/runners/lib/auth-shared.js +977 -0
- package/bin/runners/lib/auth-truth.js +193 -0
- package/bin/runners/lib/auth.js +215 -0
- package/bin/runners/lib/authority-badge.js +425 -0
- package/bin/runners/lib/backup.js +62 -0
- package/bin/runners/lib/billing.js +107 -0
- package/bin/runners/lib/checkpoint.js +941 -0
- package/bin/runners/lib/claims.js +118 -0
- package/bin/runners/lib/classify-output.js +204 -0
- package/bin/runners/lib/cleanup/engine.js +571 -0
- package/bin/runners/lib/cleanup/index.js +53 -0
- package/bin/runners/lib/cleanup/output.js +375 -0
- package/bin/runners/lib/cleanup/rules.js +1060 -0
- package/bin/runners/lib/cli-output.js +400 -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 +202 -0
- package/bin/runners/lib/contracts/env-contract.js +181 -0
- package/bin/runners/lib/contracts/external-contract.js +206 -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 +199 -0
- package/bin/runners/lib/contracts.js +804 -0
- package/bin/runners/lib/default-config.js +127 -0
- package/bin/runners/lib/detect.js +89 -0
- package/bin/runners/lib/detectors-v2.js +622 -0
- package/bin/runners/lib/doctor/autofix.js +254 -0
- package/bin/runners/lib/doctor/diagnosis-receipt.js +454 -0
- package/bin/runners/lib/doctor/failure-signatures.js +526 -0
- package/bin/runners/lib/doctor/fix-script.js +336 -0
- package/bin/runners/lib/doctor/index.js +37 -0
- package/bin/runners/lib/doctor/modules/build-tools.js +453 -0
- package/bin/runners/lib/doctor/modules/dependencies.js +325 -0
- package/bin/runners/lib/doctor/modules/index.js +105 -0
- package/bin/runners/lib/doctor/modules/network.js +250 -0
- package/bin/runners/lib/doctor/modules/os-quirks.js +706 -0
- package/bin/runners/lib/doctor/modules/project.js +312 -0
- package/bin/runners/lib/doctor/modules/repo-integrity.js +485 -0
- package/bin/runners/lib/doctor/modules/runtime.js +224 -0
- package/bin/runners/lib/doctor/modules/security.js +350 -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/safe-repair.js +384 -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-output.js +226 -0
- package/bin/runners/lib/doctor-v2.js +608 -0
- package/bin/runners/lib/drift.js +425 -0
- package/bin/runners/lib/enforcement.js +72 -0
- 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 +190 -0
- package/bin/runners/lib/engines/api-consistency-engine.js +162 -0
- package/bin/runners/lib/engines/ast-cache.js +99 -0
- package/bin/runners/lib/engines/attack-detector.js +1192 -0
- package/bin/runners/lib/engines/code-quality-engine.js +255 -0
- package/bin/runners/lib/engines/console-logs-engine.js +115 -0
- package/bin/runners/lib/engines/cross-file-analysis-engine.js +268 -0
- package/bin/runners/lib/engines/dead-code-engine.js +198 -0
- package/bin/runners/lib/engines/deprecated-api-engine.js +226 -0
- package/bin/runners/lib/engines/empty-catch-engine.js +150 -0
- package/bin/runners/lib/engines/file-filter.js +131 -0
- package/bin/runners/lib/engines/hardcoded-secrets-engine.js +251 -0
- package/bin/runners/lib/engines/mock-data-engine.js +272 -0
- package/bin/runners/lib/engines/parallel-processor.js +71 -0
- package/bin/runners/lib/engines/performance-issues-engine.js +265 -0
- package/bin/runners/lib/engines/security-vulnerabilities-engine.js +243 -0
- package/bin/runners/lib/engines/todo-fixme-engine.js +115 -0
- package/bin/runners/lib/engines/type-aware-engine.js +152 -0
- package/bin/runners/lib/engines/unsafe-regex-engine.js +225 -0
- package/bin/runners/lib/engines/vibecheck-engines/README.md +53 -0
- package/bin/runners/lib/engines/vibecheck-engines/index.js +15 -0
- 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 +139 -0
- 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/engines/vibecheck-engines/package.json +13 -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 +265 -0
- package/bin/runners/lib/entitlements.generated.js +0 -0
- package/bin/runners/lib/entitlements.js +340 -0
- package/bin/runners/lib/env-resolver.js +417 -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 +368 -0
- package/bin/runners/lib/error-messages.js +289 -0
- package/bin/runners/lib/evidence-pack.js +684 -0
- package/bin/runners/lib/exit-codes.js +275 -0
- package/bin/runners/lib/extractors/client-calls.js +990 -0
- package/bin/runners/lib/extractors/fastify-route-dump.js +573 -0
- package/bin/runners/lib/extractors/fastify-routes.js +426 -0
- package/bin/runners/lib/extractors/index.js +363 -0
- package/bin/runners/lib/extractors/next-routes.js +524 -0
- package/bin/runners/lib/extractors/proof-graph.js +431 -0
- package/bin/runners/lib/extractors/route-matcher.js +451 -0
- package/bin/runners/lib/extractors/truthpack-v2.js +377 -0
- package/bin/runners/lib/extractors/ui-bindings.js +547 -0
- package/bin/runners/lib/finding-id.js +69 -0
- package/bin/runners/lib/finding-sorter.js +89 -0
- package/bin/runners/lib/findings-schema.js +281 -0
- package/bin/runners/lib/fingerprint.js +377 -0
- package/bin/runners/lib/firewall-prompt.js +50 -0
- package/bin/runners/lib/fix-output.js +228 -0
- package/bin/runners/lib/global-flags.js +250 -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/help-formatter.js +413 -0
- package/bin/runners/lib/html-proof-report.js +913 -0
- package/bin/runners/lib/html-report.js +650 -0
- package/bin/runners/lib/init-wizard.js +601 -0
- package/bin/runners/lib/interactive-menu.js +1496 -0
- package/bin/runners/lib/json-output.js +76 -0
- package/bin/runners/lib/llm.js +75 -0
- package/bin/runners/lib/logger.js +38 -0
- package/bin/runners/lib/meter.js +61 -0
- package/bin/runners/lib/missions/briefing.js +427 -0
- package/bin/runners/lib/missions/checkpoint.js +753 -0
- package/bin/runners/lib/missions/evidence.js +126 -0
- package/bin/runners/lib/missions/hardening.js +851 -0
- package/bin/runners/lib/missions/plan.js +648 -0
- package/bin/runners/lib/missions/safety-gates.js +645 -0
- package/bin/runners/lib/missions/schema.js +478 -0
- package/bin/runners/lib/missions/templates.js +317 -0
- package/bin/runners/lib/next-action.js +560 -0
- package/bin/runners/lib/packs/bundle.js +675 -0
- package/bin/runners/lib/packs/evidence-pack.js +671 -0
- package/bin/runners/lib/packs/pack-factory.js +837 -0
- package/bin/runners/lib/packs/permissions-pack.js +686 -0
- package/bin/runners/lib/packs/proof-graph-pack.js +779 -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/policy.js +295 -0
- package/bin/runners/lib/polish/accessibility.js +62 -0
- package/bin/runners/lib/polish/analyzer.js +93 -0
- package/bin/runners/lib/polish/backend.js +87 -0
- package/bin/runners/lib/polish/configuration.js +83 -0
- package/bin/runners/lib/polish/documentation.js +83 -0
- package/bin/runners/lib/polish/frontend.js +817 -0
- package/bin/runners/lib/polish/index.js +27 -0
- package/bin/runners/lib/polish/infrastructure.js +80 -0
- package/bin/runners/lib/polish/internationalization.js +85 -0
- package/bin/runners/lib/polish/libraries.js +180 -0
- package/bin/runners/lib/polish/observability.js +75 -0
- package/bin/runners/lib/polish/performance.js +64 -0
- package/bin/runners/lib/polish/privacy.js +110 -0
- package/bin/runners/lib/polish/resilience.js +92 -0
- package/bin/runners/lib/polish/security.js +78 -0
- package/bin/runners/lib/polish/seo.js +71 -0
- package/bin/runners/lib/polish/styles.js +62 -0
- package/bin/runners/lib/polish/utils.js +104 -0
- package/bin/runners/lib/preflight.js +142 -0
- package/bin/runners/lib/prerequisites.js +149 -0
- package/bin/runners/lib/prove-output.js +220 -0
- package/bin/runners/lib/reality/correlation-detectors.js +359 -0
- package/bin/runners/lib/reality/index.js +318 -0
- package/bin/runners/lib/reality/request-hashing.js +416 -0
- package/bin/runners/lib/reality/request-mapper.js +453 -0
- package/bin/runners/lib/reality/safety-rails.js +463 -0
- package/bin/runners/lib/reality/semantic-snapshot.js +408 -0
- package/bin/runners/lib/reality/toast-detector.js +393 -0
- package/bin/runners/lib/reality-findings.js +84 -0
- package/bin/runners/lib/reality-output.js +231 -0
- package/bin/runners/lib/receipts.js +179 -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 +626 -0
- package/bin/runners/lib/report-html.js +1233 -0
- package/bin/runners/lib/report-output.js +366 -0
- package/bin/runners/lib/report-templates.js +967 -0
- package/bin/runners/lib/report.js +135 -0
- package/bin/runners/lib/route-detection.js +1209 -0
- package/bin/runners/lib/route-truth.js +1322 -0
- package/bin/runners/lib/safelist/index.js +96 -0
- package/bin/runners/lib/safelist/integration.js +334 -0
- package/bin/runners/lib/safelist/matcher.js +696 -0
- package/bin/runners/lib/safelist/schema.js +948 -0
- package/bin/runners/lib/safelist/store.js +438 -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/scan-output.js +631 -0
- package/bin/runners/lib/scan-runner.js +135 -0
- package/bin/runners/lib/schema-validator.js +350 -0
- package/bin/runners/lib/schemas/ajv-validator.js +464 -0
- package/bin/runners/lib/schemas/contracts.schema.json +160 -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/finding.schema.json +100 -0
- package/bin/runners/lib/schemas/mission-pack.schema.json +206 -0
- package/bin/runners/lib/schemas/proof-graph.schema.json +176 -0
- package/bin/runners/lib/schemas/reality-report.schema.json +162 -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/share-pack.schema.json +180 -0
- package/bin/runners/lib/schemas/ship-manifest.schema.json +251 -0
- package/bin/runners/lib/schemas/ship-report.schema.json +117 -0
- package/bin/runners/lib/schemas/truthpack-v2.schema.json +303 -0
- package/bin/runners/lib/schemas/validator.js +465 -0
- package/bin/runners/lib/schemas/verdict.schema.json +140 -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/ship-gate.js +832 -0
- package/bin/runners/lib/ship-manifest.js +1153 -0
- package/bin/runners/lib/ship-output-enterprise.js +239 -0
- package/bin/runners/lib/ship-output.js +1128 -0
- package/bin/runners/lib/snippets.js +67 -0
- package/bin/runners/lib/status-output.js +340 -0
- package/bin/runners/lib/terminal-ui.js +356 -0
- package/bin/runners/lib/truth.js +1691 -0
- package/bin/runners/lib/ui.js +562 -0
- package/bin/runners/lib/unified-cli-output.js +947 -0
- package/bin/runners/lib/unified-output.js +197 -0
- package/bin/runners/lib/upsell.js +410 -0
- package/bin/runners/lib/usage.js +153 -0
- package/bin/runners/lib/validate-patch.js +156 -0
- package/bin/runners/lib/verdict-engine.js +628 -0
- package/bin/runners/lib/verification.js +345 -0
- package/bin/runners/lib/why-tree.js +650 -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 +229 -0
- package/bin/runners/runAgent.d.ts +5 -0
- package/bin/runners/runAgent.js +161 -0
- package/bin/runners/runAllowlist.js +418 -0
- package/bin/runners/runApprove.js +320 -0
- package/bin/runners/runAudit.js +692 -0
- package/bin/runners/runAuth.js +731 -0
- package/bin/runners/runCI.js +353 -0
- package/bin/runners/runCheckpoint.js +530 -0
- package/bin/runners/runClassify.js +928 -0
- package/bin/runners/runCleanup.js +343 -0
- package/bin/runners/runContext.d.ts +4 -0
- package/bin/runners/runContext.js +175 -0
- package/bin/runners/runDoctor.js +877 -0
- package/bin/runners/runEvidencePack.js +362 -0
- package/bin/runners/runFirewall.d.ts +5 -0
- package/bin/runners/runFirewall.js +134 -0
- package/bin/runners/runFirewallHook.d.ts +5 -0
- package/bin/runners/runFirewallHook.js +56 -0
- package/bin/runners/runFix.js +1355 -0
- package/bin/runners/runForge.js +451 -0
- package/bin/runners/runGuard.js +262 -0
- package/bin/runners/runInit.js +1927 -0
- package/bin/runners/runIntent.js +906 -0
- package/bin/runners/runKickoff.js +878 -0
- package/bin/runners/runLabs.js +424 -0
- package/bin/runners/runLaunch.js +2000 -0
- package/bin/runners/runLink.js +785 -0
- package/bin/runners/runMcp.js +1875 -0
- package/bin/runners/runPacks.js +2089 -0
- package/bin/runners/runPolish.d.ts +4 -0
- package/bin/runners/runPolish.js +390 -0
- package/bin/runners/runPromptFirewall.js +211 -0
- package/bin/runners/runProve.js +1411 -0
- package/bin/runners/runQuickstart.js +531 -0
- package/bin/runners/runReality.js +2260 -0
- package/bin/runners/runReport.js +726 -0
- package/bin/runners/runRuntime.js +110 -0
- package/bin/runners/runSafelist.js +1190 -0
- package/bin/runners/runScan.js +688 -0
- package/bin/runners/runShield.js +1282 -0
- package/bin/runners/runShip.js +1660 -0
- package/bin/runners/runTruth.d.ts +5 -0
- package/bin/runners/runTruth.js +101 -0
- package/bin/runners/runValidate.js +179 -0
- package/bin/runners/runWatch.js +478 -0
- package/bin/runners/utils.js +360 -0
- package/bin/scan.js +617 -0
- package/bin/vibecheck.js +1617 -0
- package/dist/guardrail/index.d.ts +2405 -0
- package/dist/guardrail/index.js +9747 -0
- package/dist/guardrail/index.js.map +1 -0
- package/dist/scanner/index.d.ts +282 -0
- package/dist/scanner/index.js +3395 -0
- package/dist/scanner/index.js.map +1 -0
- package/package.json +123 -104
- package/README.md +0 -491
- package/dist/index.js +0 -99711
- package/dist/index.js.map +0 -1
|
@@ -0,0 +1,251 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Hardcoded Secrets Detection Engine
|
|
3
|
+
* Uses AST analysis + entropy to detect hardcoded secrets
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
const { getAST, parseCode } = require("./ast-cache");
|
|
7
|
+
const traverse = require("@babel/traverse").default;
|
|
8
|
+
const t = require("@babel/types");
|
|
9
|
+
const crypto = require("crypto");
|
|
10
|
+
const { shouldExcludeFile } = require("./file-filter");
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* Calculate Shannon entropy for a string
|
|
14
|
+
*/
|
|
15
|
+
function getShannonEntropy(str) {
|
|
16
|
+
if (!str || str.length === 0) return 0;
|
|
17
|
+
const len = str.length;
|
|
18
|
+
const frequencies = {};
|
|
19
|
+
for (let i = 0; i < len; i++) {
|
|
20
|
+
const char = str[i];
|
|
21
|
+
frequencies[char] = (frequencies[char] || 0) + 1;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
let entropy = 0;
|
|
25
|
+
for (const char in frequencies) {
|
|
26
|
+
const p = frequencies[char] / len;
|
|
27
|
+
entropy -= p * Math.log2(p);
|
|
28
|
+
}
|
|
29
|
+
return entropy;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
/**
|
|
33
|
+
* Specific secret patterns (high confidence, no entropy needed)
|
|
34
|
+
*/
|
|
35
|
+
const SPECIFIC_PATTERNS = [
|
|
36
|
+
{
|
|
37
|
+
pattern: /^sk_live_[a-zA-Z0-9]{20,}$/,
|
|
38
|
+
label: "Stripe live secret key",
|
|
39
|
+
severity: "BLOCK",
|
|
40
|
+
},
|
|
41
|
+
{
|
|
42
|
+
pattern: /^sk_test_[a-zA-Z0-9]{20,}$/,
|
|
43
|
+
label: "Stripe test secret key",
|
|
44
|
+
severity: "WARN",
|
|
45
|
+
},
|
|
46
|
+
{
|
|
47
|
+
pattern: /^pk_live_[a-zA-Z0-9]{20,}$/,
|
|
48
|
+
label: "Stripe live publishable key",
|
|
49
|
+
severity: "BLOCK",
|
|
50
|
+
},
|
|
51
|
+
{
|
|
52
|
+
pattern: /^AKIA[0-9A-Z]{16}$/,
|
|
53
|
+
label: "AWS Access Key ID",
|
|
54
|
+
severity: "BLOCK",
|
|
55
|
+
},
|
|
56
|
+
{
|
|
57
|
+
pattern: /^ghp_[a-zA-Z0-9]{36}$/,
|
|
58
|
+
label: "GitHub Personal Access Token",
|
|
59
|
+
severity: "BLOCK",
|
|
60
|
+
},
|
|
61
|
+
{
|
|
62
|
+
pattern: /^gho_[a-zA-Z0-9]{36}$/,
|
|
63
|
+
label: "GitHub OAuth Token",
|
|
64
|
+
severity: "BLOCK",
|
|
65
|
+
},
|
|
66
|
+
{
|
|
67
|
+
pattern: /^xox[baprs]-[0-9]{10,13}-[0-9]{10,13}-[a-zA-Z0-9]{24}$/,
|
|
68
|
+
label: "Slack Token",
|
|
69
|
+
severity: "BLOCK",
|
|
70
|
+
},
|
|
71
|
+
{
|
|
72
|
+
pattern: /^eyJ[a-zA-Z0-9_-]{100,}\.[a-zA-Z0-9_-]{100,}\.[a-zA-Z0-9_-]{43,}$/,
|
|
73
|
+
label: "JWT Token (hardcoded)",
|
|
74
|
+
severity: "WARN",
|
|
75
|
+
},
|
|
76
|
+
];
|
|
77
|
+
|
|
78
|
+
/**
|
|
79
|
+
* Check if string matches a specific secret pattern
|
|
80
|
+
*/
|
|
81
|
+
function matchesSpecificPattern(value) {
|
|
82
|
+
for (const { pattern, label, severity } of SPECIFIC_PATTERNS) {
|
|
83
|
+
if (pattern.test(value)) {
|
|
84
|
+
return { label, severity, confidence: "high" };
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
return null;
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
/**
|
|
91
|
+
* Check if string looks like a secret based on context and entropy
|
|
92
|
+
*/
|
|
93
|
+
function looksLikeSecret(value, context = {}) {
|
|
94
|
+
// Skip common false positives
|
|
95
|
+
if (/^(undefined|null|true|false|localhost|example|placeholder|test|demo|development|production)$/i.test(value)) {
|
|
96
|
+
return null;
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
// Skip hex-only strings (likely Git SHAs, image IDs, hashes)
|
|
100
|
+
if (/^[a-f0-9]{32,}$/i.test(value)) {
|
|
101
|
+
return null;
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
// Skip UUIDs (they have high entropy but are not secrets)
|
|
105
|
+
if (/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i.test(value)) {
|
|
106
|
+
return null;
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
// Skip common test/example values
|
|
110
|
+
if (/^(test|example|sample|demo|placeholder|foo|bar|baz|qux)/i.test(value)) {
|
|
111
|
+
return null;
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
// Check entropy
|
|
115
|
+
const entropy = getShannonEntropy(value);
|
|
116
|
+
|
|
117
|
+
// Context-based checks - require explicit secret context
|
|
118
|
+
const hasSecretContext =
|
|
119
|
+
context.variableName && /(password|secret|key|token|credential|api[_-]?key|private[_-]?key|access[_-]?token)/i.test(context.variableName);
|
|
120
|
+
|
|
121
|
+
// Only flag if we have explicit secret context AND high entropy
|
|
122
|
+
if (hasSecretContext && value.length >= 12 && entropy >= 4.0) {
|
|
123
|
+
return {
|
|
124
|
+
label: `Hardcoded ${context.variableName.match(/(password|secret|key|token|credential|api[_-]?key|private[_-]?key|access[_-]?token)/i)?.[0] || "secret"}`,
|
|
125
|
+
severity: "WARN",
|
|
126
|
+
confidence: "med",
|
|
127
|
+
entropy,
|
|
128
|
+
};
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
// Generic high entropy check - be more conservative (require longer strings and higher entropy)
|
|
132
|
+
if (entropy >= 5.0 && value.length >= 32) {
|
|
133
|
+
return {
|
|
134
|
+
label: "Possible hardcoded secret (high entropy)",
|
|
135
|
+
severity: "WARN",
|
|
136
|
+
confidence: "low",
|
|
137
|
+
entropy,
|
|
138
|
+
};
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
return null;
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
/**
|
|
145
|
+
* Analyze a file for hardcoded secrets
|
|
146
|
+
*/
|
|
147
|
+
function analyzeHardcodedSecrets(code, filePath) {
|
|
148
|
+
const findings = [];
|
|
149
|
+
|
|
150
|
+
// Skip excluded files (includes .env files)
|
|
151
|
+
if (shouldExcludeFile(filePath)) return findings;
|
|
152
|
+
|
|
153
|
+
const ast = getAST(code, filePath);
|
|
154
|
+
if (!ast) return findings;
|
|
155
|
+
|
|
156
|
+
const lines = code.split("\n");
|
|
157
|
+
|
|
158
|
+
traverse(ast, {
|
|
159
|
+
// Check string literals
|
|
160
|
+
StringLiteral(path) {
|
|
161
|
+
const value = path.node.value;
|
|
162
|
+
if (!value || value.length < 8) return;
|
|
163
|
+
|
|
164
|
+
// Check specific patterns first
|
|
165
|
+
const specificMatch = matchesSpecificPattern(value);
|
|
166
|
+
if (specificMatch) {
|
|
167
|
+
const line = path.node.loc.start.line;
|
|
168
|
+
findings.push({
|
|
169
|
+
type: "specific_secret",
|
|
170
|
+
severity: specificMatch.severity,
|
|
171
|
+
category: "HardcodedSecret",
|
|
172
|
+
file: filePath,
|
|
173
|
+
line,
|
|
174
|
+
column: path.node.loc.start.column,
|
|
175
|
+
title: `${specificMatch.label} detected`,
|
|
176
|
+
message: `${specificMatch.label} found in code`,
|
|
177
|
+
codeSnippet: lines[line - 1]?.trim(),
|
|
178
|
+
confidence: specificMatch.confidence,
|
|
179
|
+
});
|
|
180
|
+
return;
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
// Check generic patterns with context
|
|
184
|
+
const parent = path.parent;
|
|
185
|
+
let variableName = null;
|
|
186
|
+
|
|
187
|
+
if (t.isVariableDeclarator(parent)) {
|
|
188
|
+
variableName = parent.id.name;
|
|
189
|
+
} else if (t.isObjectProperty(parent)) {
|
|
190
|
+
variableName = t.isIdentifier(parent.key) ? parent.key.name : null;
|
|
191
|
+
} else if (t.isAssignmentExpression(parent)) {
|
|
192
|
+
if (t.isIdentifier(parent.left)) {
|
|
193
|
+
variableName = parent.left.name;
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
const secretMatch = looksLikeSecret(value, { variableName });
|
|
198
|
+
if (secretMatch) {
|
|
199
|
+
const line = path.node.loc.start.line;
|
|
200
|
+
findings.push({
|
|
201
|
+
type: "generic_secret",
|
|
202
|
+
severity: secretMatch.severity,
|
|
203
|
+
category: "HardcodedSecret",
|
|
204
|
+
file: filePath,
|
|
205
|
+
line,
|
|
206
|
+
column: path.node.loc.start.column,
|
|
207
|
+
title: secretMatch.label,
|
|
208
|
+
message: `High entropy string (${secretMatch.entropy.toFixed(2)}) detected${variableName ? ` in variable "${variableName}"` : ""}`,
|
|
209
|
+
codeSnippet: lines[line - 1]?.trim(),
|
|
210
|
+
confidence: secretMatch.confidence,
|
|
211
|
+
});
|
|
212
|
+
}
|
|
213
|
+
},
|
|
214
|
+
|
|
215
|
+
// Check template literals
|
|
216
|
+
TemplateLiteral(path) {
|
|
217
|
+
const quasis = path.node.quasis;
|
|
218
|
+
for (const quasi of quasis) {
|
|
219
|
+
if (quasi.value && quasi.value.raw) {
|
|
220
|
+
const value = quasi.value.raw;
|
|
221
|
+
if (value.length >= 8) {
|
|
222
|
+
const specificMatch = matchesSpecificPattern(value);
|
|
223
|
+
if (specificMatch) {
|
|
224
|
+
const line = path.node.loc.start.line;
|
|
225
|
+
findings.push({
|
|
226
|
+
type: "specific_secret",
|
|
227
|
+
severity: specificMatch.severity,
|
|
228
|
+
category: "HardcodedSecret",
|
|
229
|
+
file: filePath,
|
|
230
|
+
line,
|
|
231
|
+
column: path.node.loc.start.column,
|
|
232
|
+
title: `${specificMatch.label} detected`,
|
|
233
|
+
message: `${specificMatch.label} found in template literal`,
|
|
234
|
+
codeSnippet: lines[line - 1]?.trim(),
|
|
235
|
+
confidence: specificMatch.confidence,
|
|
236
|
+
});
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
},
|
|
242
|
+
});
|
|
243
|
+
|
|
244
|
+
return findings;
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
module.exports = {
|
|
248
|
+
analyzeHardcodedSecrets,
|
|
249
|
+
parseCode,
|
|
250
|
+
getShannonEntropy,
|
|
251
|
+
};
|
|
@@ -0,0 +1,272 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Mock Data Detection Engine
|
|
3
|
+
* Uses AST analysis to detect mock/test data patterns in production code
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
const { getAST, parseCode } = require("./ast-cache");
|
|
7
|
+
const traverse = require("@babel/traverse").default;
|
|
8
|
+
const t = require("@babel/types");
|
|
9
|
+
const { shouldExcludeFile } = require("./file-filter");
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* Check if a string literal looks like mock/test data
|
|
13
|
+
*/
|
|
14
|
+
function isMockString(value) {
|
|
15
|
+
if (typeof value !== "string") return false;
|
|
16
|
+
|
|
17
|
+
const lower = value.toLowerCase();
|
|
18
|
+
|
|
19
|
+
// Mock data patterns
|
|
20
|
+
const mockPatterns = [
|
|
21
|
+
/^(fake|mock|dummy|test|sample|placeholder)[_-]?/i,
|
|
22
|
+
/@(test|example|fake|demo)\.com$/i,
|
|
23
|
+
/^(password|admin|test|secret)123$/i,
|
|
24
|
+
/^test@/i,
|
|
25
|
+
/^(MOCK|FAKE|DUMMY)_API/i,
|
|
26
|
+
];
|
|
27
|
+
|
|
28
|
+
return mockPatterns.some(pattern => pattern.test(value));
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* Check if a variable name suggests mock data
|
|
33
|
+
* Be more conservative - only flag explicit mock/test data variables
|
|
34
|
+
*/
|
|
35
|
+
function isMockVariableName(name) {
|
|
36
|
+
if (!name || typeof name !== "string") return false;
|
|
37
|
+
|
|
38
|
+
const lower = name.toLowerCase();
|
|
39
|
+
|
|
40
|
+
// Only flag explicit mock/test data variable names (exact matches or explicit prefixes)
|
|
41
|
+
const mockNamePatterns = [
|
|
42
|
+
/^(fake|mock|dummy)[_-]?(data|user|api|response|value|input)$/i, // Explicit mock prefixes
|
|
43
|
+
/^mockData$/i,
|
|
44
|
+
/^fakeData$/i,
|
|
45
|
+
];
|
|
46
|
+
|
|
47
|
+
// Exclude common legitimate patterns
|
|
48
|
+
const legitimatePatterns = [
|
|
49
|
+
/sample/i, // "sample" is often legitimate
|
|
50
|
+
/example/i, // "example" is often legitimate
|
|
51
|
+
/demo/i, // "demo" is often legitimate
|
|
52
|
+
/test/i, // "test" alone is often legitimate
|
|
53
|
+
];
|
|
54
|
+
|
|
55
|
+
// Don't flag if it matches legitimate patterns
|
|
56
|
+
if (legitimatePatterns.some(pattern => pattern.test(name))) {
|
|
57
|
+
return false;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
return mockNamePatterns.some(pattern => pattern.test(name));
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
/**
|
|
64
|
+
* Check if a call expression is generating random/mock data
|
|
65
|
+
*/
|
|
66
|
+
function isRandomDataGeneration(node) {
|
|
67
|
+
if (!t.isCallExpression(node)) return false;
|
|
68
|
+
|
|
69
|
+
const callee = node.callee;
|
|
70
|
+
|
|
71
|
+
// Math.random() with multiplication
|
|
72
|
+
if (t.isMemberExpression(callee) &&
|
|
73
|
+
t.isIdentifier(callee.object) && callee.object.name === "Math" &&
|
|
74
|
+
t.isIdentifier(callee.property) && callee.property.name === "random") {
|
|
75
|
+
|
|
76
|
+
// Check parent for multiplication or comparison
|
|
77
|
+
const parent = node.parent;
|
|
78
|
+
if (t.isBinaryExpression(parent) &&
|
|
79
|
+
(parent.operator === "*" || parent.operator === "<" || parent.operator === ">")) {
|
|
80
|
+
return true;
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
return false;
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
/**
|
|
88
|
+
* Check if setTimeout has suspiciously long delays (simulated delays)
|
|
89
|
+
*/
|
|
90
|
+
function isSuspiciousSetTimeout(node) {
|
|
91
|
+
if (!t.isCallExpression(node)) return false;
|
|
92
|
+
|
|
93
|
+
const callee = node.callee;
|
|
94
|
+
if (!t.isIdentifier(callee) || callee.name !== "setTimeout") return false;
|
|
95
|
+
|
|
96
|
+
const args = node.arguments;
|
|
97
|
+
if (args.length < 2) return false;
|
|
98
|
+
|
|
99
|
+
// Check delay argument
|
|
100
|
+
const delay = args[1];
|
|
101
|
+
if (t.isNumericLiteral(delay)) {
|
|
102
|
+
// Suspicious if > 5000ms (5 seconds)
|
|
103
|
+
return delay.value > 5000;
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
return false;
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
/**
|
|
110
|
+
* Analyze a file for mock data patterns
|
|
111
|
+
*/
|
|
112
|
+
function analyzeMockData(code, filePath) {
|
|
113
|
+
const findings = [];
|
|
114
|
+
|
|
115
|
+
// Skip excluded files (test files, examples, etc.)
|
|
116
|
+
if (shouldExcludeFile(filePath)) return findings;
|
|
117
|
+
|
|
118
|
+
const ast = getAST(code, filePath);
|
|
119
|
+
if (!ast) return findings;
|
|
120
|
+
|
|
121
|
+
const lines = code.split("\n");
|
|
122
|
+
|
|
123
|
+
traverse(ast, {
|
|
124
|
+
// Check variable declarations
|
|
125
|
+
VariableDeclarator(path) {
|
|
126
|
+
const id = path.node.id;
|
|
127
|
+
const init = path.node.init;
|
|
128
|
+
|
|
129
|
+
// Check variable name
|
|
130
|
+
if (t.isIdentifier(id) && isMockVariableName(id.name)) {
|
|
131
|
+
const line = getLineNumber(path.node, code);
|
|
132
|
+
findings.push({
|
|
133
|
+
type: "mock_variable",
|
|
134
|
+
severity: "WARN",
|
|
135
|
+
category: "MockData",
|
|
136
|
+
file: filePath,
|
|
137
|
+
line,
|
|
138
|
+
column: path.node.loc.start.column,
|
|
139
|
+
title: `Mock data variable: ${id.name}`,
|
|
140
|
+
message: `Variable name suggests mock/test data: ${id.name}`,
|
|
141
|
+
codeSnippet: lines[line - 1]?.trim(),
|
|
142
|
+
confidence: "high",
|
|
143
|
+
});
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
// Check initializer value
|
|
147
|
+
if (init && t.isStringLiteral(init) && isMockString(init.value)) {
|
|
148
|
+
const line = getLineNumber(path.node, code);
|
|
149
|
+
findings.push({
|
|
150
|
+
type: "mock_string_literal",
|
|
151
|
+
severity: "WARN",
|
|
152
|
+
category: "MockData",
|
|
153
|
+
file: filePath,
|
|
154
|
+
line,
|
|
155
|
+
column: path.node.loc.start.column,
|
|
156
|
+
title: "Mock/test string literal detected",
|
|
157
|
+
message: `String value appears to be mock data: "${init.value.substring(0, 50)}"`,
|
|
158
|
+
codeSnippet: lines[line - 1]?.trim(),
|
|
159
|
+
confidence: "med",
|
|
160
|
+
});
|
|
161
|
+
}
|
|
162
|
+
},
|
|
163
|
+
|
|
164
|
+
// Check object properties
|
|
165
|
+
ObjectProperty(path) {
|
|
166
|
+
const key = path.node.key;
|
|
167
|
+
const value = path.node.value;
|
|
168
|
+
|
|
169
|
+
if (t.isIdentifier(key) && isMockVariableName(key.name)) {
|
|
170
|
+
const line = getLineNumber(path.node, code);
|
|
171
|
+
findings.push({
|
|
172
|
+
type: "mock_object_property",
|
|
173
|
+
severity: "WARN",
|
|
174
|
+
category: "MockData",
|
|
175
|
+
file: filePath,
|
|
176
|
+
line,
|
|
177
|
+
column: path.node.loc.start.column,
|
|
178
|
+
title: `Mock data property: ${key.name}`,
|
|
179
|
+
message: `Object property name suggests mock data: ${key.name}`,
|
|
180
|
+
codeSnippet: lines[line - 1]?.trim(),
|
|
181
|
+
confidence: "med",
|
|
182
|
+
});
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
if (t.isStringLiteral(value) && isMockString(value.value)) {
|
|
186
|
+
const line = getLineNumber(path.node, code);
|
|
187
|
+
findings.push({
|
|
188
|
+
type: "mock_property_value",
|
|
189
|
+
severity: "WARN",
|
|
190
|
+
category: "MockData",
|
|
191
|
+
file: filePath,
|
|
192
|
+
line,
|
|
193
|
+
column: path.node.loc.start.column,
|
|
194
|
+
title: "Mock string in object property",
|
|
195
|
+
message: `Property value appears to be mock data: "${value.value.substring(0, 50)}"`,
|
|
196
|
+
codeSnippet: lines[line - 1]?.trim(),
|
|
197
|
+
confidence: "med",
|
|
198
|
+
});
|
|
199
|
+
}
|
|
200
|
+
},
|
|
201
|
+
|
|
202
|
+
// Check call expressions for random data generation
|
|
203
|
+
CallExpression(path) {
|
|
204
|
+
if (isRandomDataGeneration(path.node)) {
|
|
205
|
+
const line = getLineNumber(path.node, code);
|
|
206
|
+
findings.push({
|
|
207
|
+
type: "random_data_generation",
|
|
208
|
+
severity: "WARN",
|
|
209
|
+
category: "MockData",
|
|
210
|
+
file: filePath,
|
|
211
|
+
line,
|
|
212
|
+
column: path.node.loc.start.column,
|
|
213
|
+
title: "Random data generation detected",
|
|
214
|
+
message: "Math.random() used for data generation (may be mock data)",
|
|
215
|
+
codeSnippet: lines[line - 1]?.trim(),
|
|
216
|
+
confidence: "low",
|
|
217
|
+
});
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
if (isSuspiciousSetTimeout(path.node)) {
|
|
221
|
+
const line = getLineNumber(path.node, code);
|
|
222
|
+
findings.push({
|
|
223
|
+
type: "suspicious_settimeout",
|
|
224
|
+
severity: "WARN",
|
|
225
|
+
category: "MockData",
|
|
226
|
+
file: filePath,
|
|
227
|
+
line,
|
|
228
|
+
column: path.node.loc.start.column,
|
|
229
|
+
title: "Long setTimeout delay (possible simulated delay)",
|
|
230
|
+
message: "setTimeout with delay > 5000ms may indicate simulated/mock behavior",
|
|
231
|
+
codeSnippet: lines[line - 1]?.trim(),
|
|
232
|
+
confidence: "low",
|
|
233
|
+
});
|
|
234
|
+
}
|
|
235
|
+
},
|
|
236
|
+
|
|
237
|
+
// Check template literals
|
|
238
|
+
TemplateLiteral(path) {
|
|
239
|
+
const quasis = path.node.quasis;
|
|
240
|
+
for (const quasi of quasis) {
|
|
241
|
+
if (quasi.value && isMockString(quasi.value.raw)) {
|
|
242
|
+
const line = getLineNumber(path.node, code);
|
|
243
|
+
findings.push({
|
|
244
|
+
type: "mock_template_literal",
|
|
245
|
+
severity: "WARN",
|
|
246
|
+
category: "MockData",
|
|
247
|
+
file: filePath,
|
|
248
|
+
line,
|
|
249
|
+
column: path.node.loc.start.column,
|
|
250
|
+
title: "Mock data in template literal",
|
|
251
|
+
message: `Template literal contains mock/test data pattern`,
|
|
252
|
+
codeSnippet: lines[line - 1]?.trim(),
|
|
253
|
+
confidence: "med",
|
|
254
|
+
});
|
|
255
|
+
break;
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
},
|
|
259
|
+
});
|
|
260
|
+
|
|
261
|
+
return findings;
|
|
262
|
+
}
|
|
263
|
+
|
|
264
|
+
function getLineNumber(node, code) {
|
|
265
|
+
if (!node || !node.loc) return 1;
|
|
266
|
+
return node.loc.start.line;
|
|
267
|
+
}
|
|
268
|
+
|
|
269
|
+
module.exports = {
|
|
270
|
+
analyzeMockData,
|
|
271
|
+
parseCode,
|
|
272
|
+
};
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Parallel File Processor
|
|
3
|
+
* Processes files in parallel with configurable concurrency
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
const os = require("os");
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* Process files in parallel batches
|
|
10
|
+
*/
|
|
11
|
+
async function processFilesInParallel(files, processor, options = {}) {
|
|
12
|
+
const {
|
|
13
|
+
concurrency = Math.min(os.cpus().length, 8), // Default to CPU count, max 8
|
|
14
|
+
onProgress = null,
|
|
15
|
+
} = options;
|
|
16
|
+
|
|
17
|
+
const results = [];
|
|
18
|
+
const errors = [];
|
|
19
|
+
|
|
20
|
+
// Process in batches
|
|
21
|
+
for (let i = 0; i < files.length; i += concurrency) {
|
|
22
|
+
const batch = files.slice(i, i + concurrency);
|
|
23
|
+
|
|
24
|
+
const batchPromises = batch.map(async (file, index) => {
|
|
25
|
+
try {
|
|
26
|
+
const result = await processor(file);
|
|
27
|
+
if (onProgress) {
|
|
28
|
+
onProgress(i + index + 1, files.length);
|
|
29
|
+
}
|
|
30
|
+
return { file, result, error: null };
|
|
31
|
+
} catch (error) {
|
|
32
|
+
errors.push({ file, error });
|
|
33
|
+
return { file, result: null, error };
|
|
34
|
+
}
|
|
35
|
+
});
|
|
36
|
+
|
|
37
|
+
const batchResults = await Promise.all(batchPromises);
|
|
38
|
+
results.push(...batchResults);
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
return { results, errors };
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
/**
|
|
45
|
+
* Process files sequentially (fallback)
|
|
46
|
+
*/
|
|
47
|
+
async function processFilesSequentially(files, processor, onProgress = null) {
|
|
48
|
+
const results = [];
|
|
49
|
+
const errors = [];
|
|
50
|
+
|
|
51
|
+
for (let i = 0; i < files.length; i++) {
|
|
52
|
+
const file = files[i];
|
|
53
|
+
try {
|
|
54
|
+
const result = await processor(file);
|
|
55
|
+
if (onProgress) {
|
|
56
|
+
onProgress(i + 1, files.length);
|
|
57
|
+
}
|
|
58
|
+
results.push({ file, result, error: null });
|
|
59
|
+
} catch (error) {
|
|
60
|
+
errors.push({ file, error });
|
|
61
|
+
results.push({ file, result: null, error });
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
return { results, errors };
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
module.exports = {
|
|
69
|
+
processFilesInParallel,
|
|
70
|
+
processFilesSequentially,
|
|
71
|
+
};
|