vibecheck-ai 2.0.1 → 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,265 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Performance Issues Detection Engine
|
|
3
|
+
* Detects memory leaks, inefficient loops, large bundle sizes, and performance anti-patterns
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
const { getAST } = 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
|
+
* Analyze a file for performance issues
|
|
13
|
+
*/
|
|
14
|
+
function analyzePerformanceIssues(code, filePath) {
|
|
15
|
+
const findings = [];
|
|
16
|
+
|
|
17
|
+
// Skip excluded files
|
|
18
|
+
if (shouldExcludeFile(filePath)) return findings;
|
|
19
|
+
|
|
20
|
+
const ast = getAST(code, filePath);
|
|
21
|
+
if (!ast) return findings;
|
|
22
|
+
|
|
23
|
+
const lines = code.split("\n");
|
|
24
|
+
|
|
25
|
+
// Memory leaks: Event listeners not removed
|
|
26
|
+
traverse(ast, {
|
|
27
|
+
CallExpression(path) {
|
|
28
|
+
const node = path.node;
|
|
29
|
+
|
|
30
|
+
// Check for addEventListener without corresponding removeEventListener
|
|
31
|
+
if (t.isMemberExpression(node.callee)) {
|
|
32
|
+
const prop = node.callee.property;
|
|
33
|
+
|
|
34
|
+
if (t.isIdentifier(prop) && prop.name === "addEventListener") {
|
|
35
|
+
// Check if there's a corresponding removeEventListener in the same scope
|
|
36
|
+
const scope = path.scope;
|
|
37
|
+
const hasRemoveListener = scope.getAllBindings().some((binding, name) => {
|
|
38
|
+
return name.includes("removeEventListener") || name.includes("removeListener");
|
|
39
|
+
});
|
|
40
|
+
|
|
41
|
+
// Also check if it's in a useEffect cleanup (React)
|
|
42
|
+
const parent = path.findParent(p =>
|
|
43
|
+
t.isCallExpression(p.node) &&
|
|
44
|
+
t.isIdentifier(p.node.callee, { name: "useEffect" })
|
|
45
|
+
);
|
|
46
|
+
|
|
47
|
+
if (!hasRemoveListener && !parent) {
|
|
48
|
+
const line = node.loc.start.line;
|
|
49
|
+
findings.push({
|
|
50
|
+
type: "memory_leak",
|
|
51
|
+
severity: "WARN",
|
|
52
|
+
category: "Performance",
|
|
53
|
+
file: filePath,
|
|
54
|
+
line,
|
|
55
|
+
column: node.loc.start.column,
|
|
56
|
+
title: "Potential memory leak: Event listener not removed",
|
|
57
|
+
message: "addEventListener called without corresponding removeEventListener",
|
|
58
|
+
codeSnippet: lines[line - 1]?.trim(),
|
|
59
|
+
confidence: "med",
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
},
|
|
65
|
+
});
|
|
66
|
+
|
|
67
|
+
// Inefficient loops: nested loops with O(n²) complexity
|
|
68
|
+
// Only flag if depth >= 4 (3 levels is often acceptable)
|
|
69
|
+
let loopDepth = 0;
|
|
70
|
+
traverse(ast, {
|
|
71
|
+
enter(path) {
|
|
72
|
+
if (t.isForStatement(path.node) ||
|
|
73
|
+
t.isForInStatement(path.node) ||
|
|
74
|
+
t.isForOfStatement(path.node) ||
|
|
75
|
+
t.isWhileStatement(path.node)) {
|
|
76
|
+
loopDepth++;
|
|
77
|
+
|
|
78
|
+
// Only flag deeply nested loops (4+ levels)
|
|
79
|
+
if (loopDepth >= 4) {
|
|
80
|
+
const line = path.node.loc.start.line;
|
|
81
|
+
findings.push({
|
|
82
|
+
type: "nested_loops",
|
|
83
|
+
severity: "WARN",
|
|
84
|
+
category: "Performance",
|
|
85
|
+
file: filePath,
|
|
86
|
+
line,
|
|
87
|
+
column: path.node.loc.start.column,
|
|
88
|
+
title: "Deeply nested loops detected",
|
|
89
|
+
message: `Nested loop depth: ${loopDepth} - consider optimizing with early returns or data structures`,
|
|
90
|
+
codeSnippet: lines[line - 1]?.trim(),
|
|
91
|
+
confidence: "med",
|
|
92
|
+
});
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
},
|
|
96
|
+
exit(path) {
|
|
97
|
+
if (t.isForStatement(path.node) ||
|
|
98
|
+
t.isForInStatement(path.node) ||
|
|
99
|
+
t.isForOfStatement(path.node) ||
|
|
100
|
+
t.isWhileStatement(path.node)) {
|
|
101
|
+
loopDepth--;
|
|
102
|
+
}
|
|
103
|
+
},
|
|
104
|
+
});
|
|
105
|
+
|
|
106
|
+
// Large array operations without pagination
|
|
107
|
+
// Only flag if it's clearly a large dataset from API
|
|
108
|
+
traverse(ast, {
|
|
109
|
+
CallExpression(path) {
|
|
110
|
+
const node = path.node;
|
|
111
|
+
|
|
112
|
+
// Array methods that process all elements
|
|
113
|
+
if (t.isMemberExpression(node.callee)) {
|
|
114
|
+
const prop = node.callee.property;
|
|
115
|
+
|
|
116
|
+
if (t.isIdentifier(prop) &&
|
|
117
|
+
["map", "filter", "forEach", "reduce"].includes(prop.name)) {
|
|
118
|
+
|
|
119
|
+
// Only flag if array comes directly from fetch AND there's no pagination logic nearby
|
|
120
|
+
const obj = node.callee.object;
|
|
121
|
+
if (t.isCallExpression(obj) &&
|
|
122
|
+
t.isIdentifier(obj.callee, { name: "fetch" })) {
|
|
123
|
+
|
|
124
|
+
// Check if there's pagination logic in the same function
|
|
125
|
+
const functionParent = path.findParent(p =>
|
|
126
|
+
t.isFunctionDeclaration(p.node) ||
|
|
127
|
+
t.isArrowFunctionExpression(p.node) ||
|
|
128
|
+
t.isFunctionExpression(p.node)
|
|
129
|
+
);
|
|
130
|
+
|
|
131
|
+
if (functionParent) {
|
|
132
|
+
const funcCode = code.substring(functionParent.node.start, functionParent.node.end);
|
|
133
|
+
const hasPagination = /page|limit|offset|pagination/i.test(funcCode);
|
|
134
|
+
|
|
135
|
+
if (!hasPagination) {
|
|
136
|
+
const line = node.loc.start.line;
|
|
137
|
+
findings.push({
|
|
138
|
+
type: "large_array_operation",
|
|
139
|
+
severity: "WARN",
|
|
140
|
+
category: "Performance",
|
|
141
|
+
file: filePath,
|
|
142
|
+
line,
|
|
143
|
+
column: node.loc.start.column,
|
|
144
|
+
title: "Large array operation without pagination",
|
|
145
|
+
message: "Processing entire dataset from API - consider pagination or server-side filtering",
|
|
146
|
+
codeSnippet: lines[line - 1]?.trim(),
|
|
147
|
+
confidence: "low",
|
|
148
|
+
});
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
},
|
|
155
|
+
});
|
|
156
|
+
|
|
157
|
+
// Synchronous file operations in async contexts
|
|
158
|
+
traverse(ast, {
|
|
159
|
+
CallExpression(path) {
|
|
160
|
+
const node = path.node;
|
|
161
|
+
|
|
162
|
+
if (t.isMemberExpression(node.callee) &&
|
|
163
|
+
t.isIdentifier(node.callee.object, { name: "fs" })) {
|
|
164
|
+
const prop = node.callee.property;
|
|
165
|
+
|
|
166
|
+
if (t.isIdentifier(prop) && prop.name.endsWith("Sync")) {
|
|
167
|
+
// Check if we're in an async function
|
|
168
|
+
const asyncParent = path.findParent(p =>
|
|
169
|
+
t.isFunctionDeclaration(p.node) || t.isArrowFunctionExpression(p.node)
|
|
170
|
+
);
|
|
171
|
+
|
|
172
|
+
if (asyncParent && asyncParent.node.async) {
|
|
173
|
+
const line = node.loc.start.line;
|
|
174
|
+
findings.push({
|
|
175
|
+
type: "sync_in_async",
|
|
176
|
+
severity: "WARN",
|
|
177
|
+
category: "Performance",
|
|
178
|
+
file: filePath,
|
|
179
|
+
line,
|
|
180
|
+
column: node.loc.start.column,
|
|
181
|
+
title: "Synchronous operation in async context",
|
|
182
|
+
message: `Using ${prop.name} in async function - use async version instead`,
|
|
183
|
+
codeSnippet: lines[line - 1]?.trim(),
|
|
184
|
+
confidence: "med",
|
|
185
|
+
});
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
},
|
|
190
|
+
});
|
|
191
|
+
|
|
192
|
+
// Unnecessary re-renders: setState in render
|
|
193
|
+
traverse(ast, {
|
|
194
|
+
CallExpression(path) {
|
|
195
|
+
const node = path.node;
|
|
196
|
+
|
|
197
|
+
if (t.isMemberExpression(node.callee)) {
|
|
198
|
+
const prop = node.callee.property;
|
|
199
|
+
|
|
200
|
+
if (t.isIdentifier(prop) &&
|
|
201
|
+
(prop.name.startsWith("set") || prop.name === "forceUpdate")) {
|
|
202
|
+
|
|
203
|
+
// Check if we're in a render function or component body
|
|
204
|
+
const functionParent = path.findParent(p =>
|
|
205
|
+
t.isFunctionDeclaration(p.node) || t.isArrowFunctionExpression(p.node)
|
|
206
|
+
);
|
|
207
|
+
|
|
208
|
+
if (functionParent) {
|
|
209
|
+
const funcName = functionParent.node.id?.name || "";
|
|
210
|
+
if (funcName.includes("render") || funcName.includes("Render")) {
|
|
211
|
+
const line = node.loc.start.line;
|
|
212
|
+
findings.push({
|
|
213
|
+
type: "setstate_in_render",
|
|
214
|
+
severity: "WARN",
|
|
215
|
+
category: "Performance",
|
|
216
|
+
file: filePath,
|
|
217
|
+
line,
|
|
218
|
+
column: node.loc.start.column,
|
|
219
|
+
title: "State update in render function",
|
|
220
|
+
message: "Calling setState in render causes infinite re-render loop",
|
|
221
|
+
codeSnippet: lines[line - 1]?.trim(),
|
|
222
|
+
confidence: "high",
|
|
223
|
+
});
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
},
|
|
229
|
+
});
|
|
230
|
+
|
|
231
|
+
// Large bundle imports: importing entire libraries
|
|
232
|
+
traverse(ast, {
|
|
233
|
+
ImportDeclaration(path) {
|
|
234
|
+
const node = path.node;
|
|
235
|
+
|
|
236
|
+
// Check for wildcard imports from large libraries
|
|
237
|
+
if (node.specifiers.some(s => t.isImportNamespaceSpecifier(s))) {
|
|
238
|
+
const source = node.source.value;
|
|
239
|
+
const largeLibraries = ["lodash", "moment", "rxjs", "ramda"];
|
|
240
|
+
|
|
241
|
+
if (largeLibraries.some(lib => source.includes(lib))) {
|
|
242
|
+
const line = node.loc.start.line;
|
|
243
|
+
findings.push({
|
|
244
|
+
type: "large_import",
|
|
245
|
+
severity: "WARN",
|
|
246
|
+
category: "Performance",
|
|
247
|
+
file: filePath,
|
|
248
|
+
line,
|
|
249
|
+
column: node.loc.start.column,
|
|
250
|
+
title: "Large library import",
|
|
251
|
+
message: `Importing entire ${source} library - use tree-shaking or import specific functions`,
|
|
252
|
+
codeSnippet: lines[line - 1]?.trim(),
|
|
253
|
+
confidence: "med",
|
|
254
|
+
});
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
},
|
|
258
|
+
});
|
|
259
|
+
|
|
260
|
+
return findings;
|
|
261
|
+
}
|
|
262
|
+
|
|
263
|
+
module.exports = {
|
|
264
|
+
analyzePerformanceIssues,
|
|
265
|
+
};
|
|
@@ -0,0 +1,243 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Security Vulnerabilities Detection Engine
|
|
3
|
+
* Detects SQL injection, XSS, command injection, path traversal, and other security issues
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
const { getAST } = 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
|
+
* Analyze a file for security vulnerabilities
|
|
13
|
+
*/
|
|
14
|
+
function analyzeSecurityVulnerabilities(code, filePath) {
|
|
15
|
+
const findings = [];
|
|
16
|
+
|
|
17
|
+
// Skip excluded files
|
|
18
|
+
if (shouldExcludeFile(filePath)) return findings;
|
|
19
|
+
|
|
20
|
+
const ast = getAST(code, filePath);
|
|
21
|
+
if (!ast) return findings;
|
|
22
|
+
|
|
23
|
+
const lines = code.split("\n");
|
|
24
|
+
|
|
25
|
+
// SQL Injection patterns
|
|
26
|
+
traverse(ast, {
|
|
27
|
+
CallExpression(path) {
|
|
28
|
+
const node = path.node;
|
|
29
|
+
|
|
30
|
+
// Check for SQL query construction with user input
|
|
31
|
+
if (t.isMemberExpression(node.callee)) {
|
|
32
|
+
const obj = node.callee.object;
|
|
33
|
+
const prop = node.callee.property;
|
|
34
|
+
|
|
35
|
+
// Database query methods
|
|
36
|
+
if (t.isIdentifier(prop) &&
|
|
37
|
+
["query", "execute", "exec", "run"].includes(prop.name)) {
|
|
38
|
+
|
|
39
|
+
// Check if arguments contain template literals or string concatenation
|
|
40
|
+
for (const arg of node.arguments) {
|
|
41
|
+
if (t.isTemplateLiteral(arg) ||
|
|
42
|
+
(t.isBinaryExpression(arg) && arg.operator === "+")) {
|
|
43
|
+
const line = node.loc.start.line;
|
|
44
|
+
findings.push({
|
|
45
|
+
type: "sql_injection",
|
|
46
|
+
severity: "BLOCK",
|
|
47
|
+
category: "Security",
|
|
48
|
+
file: filePath,
|
|
49
|
+
line,
|
|
50
|
+
column: node.loc.start.column,
|
|
51
|
+
title: "Potential SQL injection vulnerability",
|
|
52
|
+
message: "SQL query constructed with user input without parameterization",
|
|
53
|
+
codeSnippet: lines[line - 1]?.trim(),
|
|
54
|
+
confidence: "high",
|
|
55
|
+
});
|
|
56
|
+
break;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
},
|
|
62
|
+
});
|
|
63
|
+
|
|
64
|
+
// XSS vulnerabilities
|
|
65
|
+
traverse(ast, {
|
|
66
|
+
CallExpression(path) {
|
|
67
|
+
const node = path.node;
|
|
68
|
+
|
|
69
|
+
// Dangerous DOM manipulation methods
|
|
70
|
+
if (t.isMemberExpression(node.callee)) {
|
|
71
|
+
const obj = node.callee.object;
|
|
72
|
+
const prop = node.callee.property;
|
|
73
|
+
|
|
74
|
+
if (t.isIdentifier(prop) &&
|
|
75
|
+
["innerHTML", "outerHTML", "insertAdjacentHTML"].includes(prop.name)) {
|
|
76
|
+
|
|
77
|
+
// Check if argument comes from user input or URL params
|
|
78
|
+
for (const arg of node.arguments) {
|
|
79
|
+
if (t.isIdentifier(arg) || t.isMemberExpression(arg)) {
|
|
80
|
+
const line = node.loc.start.line;
|
|
81
|
+
findings.push({
|
|
82
|
+
type: "xss",
|
|
83
|
+
severity: "BLOCK",
|
|
84
|
+
category: "Security",
|
|
85
|
+
file: filePath,
|
|
86
|
+
line,
|
|
87
|
+
column: node.loc.start.column,
|
|
88
|
+
title: "Potential XSS vulnerability",
|
|
89
|
+
message: `Using ${prop.name} with potentially unsafe content`,
|
|
90
|
+
codeSnippet: lines[line - 1]?.trim(),
|
|
91
|
+
confidence: "med",
|
|
92
|
+
});
|
|
93
|
+
break;
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
},
|
|
99
|
+
});
|
|
100
|
+
|
|
101
|
+
// Command injection
|
|
102
|
+
traverse(ast, {
|
|
103
|
+
CallExpression(path) {
|
|
104
|
+
const node = path.node;
|
|
105
|
+
|
|
106
|
+
// Dangerous command execution methods
|
|
107
|
+
if (t.isIdentifier(node.callee)) {
|
|
108
|
+
const dangerousMethods = ["exec", "spawn", "execSync", "spawnSync"];
|
|
109
|
+
|
|
110
|
+
if (dangerousMethods.includes(node.callee.name)) {
|
|
111
|
+
// Check if arguments contain user input
|
|
112
|
+
for (const arg of node.arguments) {
|
|
113
|
+
if (t.isTemplateLiteral(arg) ||
|
|
114
|
+
(t.isBinaryExpression(arg) && arg.operator === "+")) {
|
|
115
|
+
const line = node.loc.start.line;
|
|
116
|
+
findings.push({
|
|
117
|
+
type: "command_injection",
|
|
118
|
+
severity: "BLOCK",
|
|
119
|
+
category: "Security",
|
|
120
|
+
file: filePath,
|
|
121
|
+
line,
|
|
122
|
+
column: node.loc.start.column,
|
|
123
|
+
title: "Potential command injection vulnerability",
|
|
124
|
+
message: "Command execution with potentially unsafe user input",
|
|
125
|
+
codeSnippet: lines[line - 1]?.trim(),
|
|
126
|
+
confidence: "high",
|
|
127
|
+
});
|
|
128
|
+
break;
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
},
|
|
134
|
+
});
|
|
135
|
+
|
|
136
|
+
// Path traversal
|
|
137
|
+
traverse(ast, {
|
|
138
|
+
CallExpression(path) {
|
|
139
|
+
const node = path.node;
|
|
140
|
+
|
|
141
|
+
// File system operations
|
|
142
|
+
if (t.isMemberExpression(node.callee) &&
|
|
143
|
+
t.isIdentifier(node.callee.object, { name: "fs" })) {
|
|
144
|
+
const prop = node.callee.property;
|
|
145
|
+
|
|
146
|
+
if (t.isIdentifier(prop) &&
|
|
147
|
+
["readFile", "writeFile", "readFileSync", "writeFileSync", "unlink"].includes(prop.name)) {
|
|
148
|
+
|
|
149
|
+
// Check if path contains user input or "../"
|
|
150
|
+
for (const arg of node.arguments) {
|
|
151
|
+
if (t.isTemplateLiteral(arg)) {
|
|
152
|
+
const template = code.substring(arg.start, arg.end);
|
|
153
|
+
if (template.includes("../") || template.includes("..\\")) {
|
|
154
|
+
const line = node.loc.start.line;
|
|
155
|
+
findings.push({
|
|
156
|
+
type: "path_traversal",
|
|
157
|
+
severity: "BLOCK",
|
|
158
|
+
category: "Security",
|
|
159
|
+
file: filePath,
|
|
160
|
+
line,
|
|
161
|
+
column: node.loc.start.column,
|
|
162
|
+
title: "Potential path traversal vulnerability",
|
|
163
|
+
message: "File operation with path containing '..' - validate and sanitize paths",
|
|
164
|
+
codeSnippet: lines[line - 1]?.trim(),
|
|
165
|
+
confidence: "high",
|
|
166
|
+
});
|
|
167
|
+
break;
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
},
|
|
174
|
+
});
|
|
175
|
+
|
|
176
|
+
// Insecure random number generation
|
|
177
|
+
traverse(ast, {
|
|
178
|
+
CallExpression(path) {
|
|
179
|
+
const node = path.node;
|
|
180
|
+
|
|
181
|
+
if (t.isMemberExpression(node.callee) &&
|
|
182
|
+
t.isIdentifier(node.callee.object, { name: "Math" }) &&
|
|
183
|
+
t.isIdentifier(node.callee.property, { name: "random" })) {
|
|
184
|
+
|
|
185
|
+
// Check if used for security-sensitive purposes (crypto, tokens, etc.)
|
|
186
|
+
const parent = path.parentPath;
|
|
187
|
+
if (parent && parent.isCallExpression()) {
|
|
188
|
+
const parentCallee = parent.node.callee;
|
|
189
|
+
if (t.isMemberExpression(parentCallee) &&
|
|
190
|
+
t.isIdentifier(parentCallee.object, { name: "crypto" })) {
|
|
191
|
+
const line = node.loc.start.line;
|
|
192
|
+
findings.push({
|
|
193
|
+
type: "insecure_random",
|
|
194
|
+
severity: "WARN",
|
|
195
|
+
category: "Security",
|
|
196
|
+
file: filePath,
|
|
197
|
+
line,
|
|
198
|
+
column: node.loc.start.column,
|
|
199
|
+
title: "Insecure random number generation",
|
|
200
|
+
message: "Math.random() is not cryptographically secure - use crypto.randomBytes()",
|
|
201
|
+
codeSnippet: lines[line - 1]?.trim(),
|
|
202
|
+
confidence: "high",
|
|
203
|
+
});
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
},
|
|
208
|
+
});
|
|
209
|
+
|
|
210
|
+
// Weak encryption algorithms
|
|
211
|
+
const weakCryptoPatterns = [
|
|
212
|
+
/crypto\.createHash\s*\(\s*['"]md5['"]/i,
|
|
213
|
+
/crypto\.createHash\s*\(\s*['"]sha1['"]/i,
|
|
214
|
+
/crypto\.createCipher\s*\(/i, // Deprecated, insecure
|
|
215
|
+
];
|
|
216
|
+
|
|
217
|
+
for (let i = 0; i < lines.length; i++) {
|
|
218
|
+
const line = lines[i];
|
|
219
|
+
for (const pattern of weakCryptoPatterns) {
|
|
220
|
+
if (pattern.test(line)) {
|
|
221
|
+
findings.push({
|
|
222
|
+
type: "weak_crypto",
|
|
223
|
+
severity: "WARN",
|
|
224
|
+
category: "Security",
|
|
225
|
+
file: filePath,
|
|
226
|
+
line: i + 1,
|
|
227
|
+
column: 0,
|
|
228
|
+
title: "Weak or deprecated encryption algorithm",
|
|
229
|
+
message: "MD5, SHA1, or createCipher are insecure - use modern algorithms",
|
|
230
|
+
codeSnippet: line.trim(),
|
|
231
|
+
confidence: "high",
|
|
232
|
+
});
|
|
233
|
+
break;
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
return findings;
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
module.exports = {
|
|
242
|
+
analyzeSecurityVulnerabilities,
|
|
243
|
+
};
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* TODO/FIXME Detection Engine
|
|
3
|
+
* Uses AST analysis to detect TODO/FIXME comments with better context
|
|
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 comment contains TODO/FIXME markers
|
|
13
|
+
*/
|
|
14
|
+
function extractTodoMarkers(comment) {
|
|
15
|
+
const text = comment.value || "";
|
|
16
|
+
const markers = [];
|
|
17
|
+
|
|
18
|
+
// Block comments can have multiple markers
|
|
19
|
+
const patterns = [
|
|
20
|
+
{ rx: /\bTODO\b[\s:]/i, type: "TODO", severity: "WARN" },
|
|
21
|
+
{ rx: /\bFIXME\b[\s:]/i, type: "FIXME", severity: "WARN" },
|
|
22
|
+
{ rx: /\bHACK\b[\s:]/i, type: "HACK", severity: "WARN" },
|
|
23
|
+
{ rx: /\bXXX\b[\s:]/i, type: "XXX", severity: "WARN" },
|
|
24
|
+
{ rx: /\bBUG\b[\s:]/i, type: "BUG", severity: "BLOCK" },
|
|
25
|
+
{ rx: /\bBROKEN\b[\s:]/i, type: "BROKEN", severity: "BLOCK" },
|
|
26
|
+
{ rx: /\bURGENT\b[\s:]/i, type: "URGENT", severity: "BLOCK" },
|
|
27
|
+
{ rx: /\bSECURITY\b[\s:]/i, type: "SECURITY", severity: "BLOCK" },
|
|
28
|
+
{ rx: /\bDANGER\b[\s:]/i, type: "DANGER", severity: "BLOCK" },
|
|
29
|
+
];
|
|
30
|
+
|
|
31
|
+
for (const { rx, type, severity } of patterns) {
|
|
32
|
+
if (rx.test(text)) {
|
|
33
|
+
const match = text.match(rx);
|
|
34
|
+
const afterMarker = text.substring(text.indexOf(match[0]) + match[0].length).trim();
|
|
35
|
+
markers.push({
|
|
36
|
+
type,
|
|
37
|
+
severity,
|
|
38
|
+
text: afterMarker.substring(0, 100), // First 100 chars
|
|
39
|
+
fullText: text,
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
return markers;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
/**
|
|
48
|
+
* Analyze a file for TODO/FIXME comments
|
|
49
|
+
*/
|
|
50
|
+
function analyzeTodoFixme(code, filePath) {
|
|
51
|
+
const findings = [];
|
|
52
|
+
|
|
53
|
+
// Skip excluded files
|
|
54
|
+
if (shouldExcludeFile(filePath)) return findings;
|
|
55
|
+
|
|
56
|
+
const ast = getAST(code, filePath);
|
|
57
|
+
if (!ast) return findings;
|
|
58
|
+
|
|
59
|
+
const lines = code.split("\n");
|
|
60
|
+
const MAX_FINDINGS = 20;
|
|
61
|
+
|
|
62
|
+
// Process all comments
|
|
63
|
+
const comments = ast.comments || [];
|
|
64
|
+
let todoCount = 0;
|
|
65
|
+
let fixmeCount = 0;
|
|
66
|
+
|
|
67
|
+
for (const comment of comments) {
|
|
68
|
+
const markers = extractTodoMarkers(comment);
|
|
69
|
+
|
|
70
|
+
for (const marker of markers) {
|
|
71
|
+
if (marker.type === "TODO") todoCount++;
|
|
72
|
+
if (marker.type === "FIXME") fixmeCount++;
|
|
73
|
+
|
|
74
|
+
if (findings.length < MAX_FINDINGS) {
|
|
75
|
+
const line = comment.loc.start.line;
|
|
76
|
+
const snippet = lines[line - 1]?.trim() || "";
|
|
77
|
+
|
|
78
|
+
findings.push({
|
|
79
|
+
type: marker.type.toLowerCase(),
|
|
80
|
+
severity: marker.severity,
|
|
81
|
+
category: "TodoFixme",
|
|
82
|
+
file: filePath,
|
|
83
|
+
line,
|
|
84
|
+
column: comment.loc.start.column,
|
|
85
|
+
title: `${marker.type} comment`,
|
|
86
|
+
message: marker.text || marker.type,
|
|
87
|
+
codeSnippet: snippet.substring(0, 80),
|
|
88
|
+
confidence: "high",
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
// Add summary if there are many
|
|
95
|
+
const totalTodos = todoCount + fixmeCount;
|
|
96
|
+
if (totalTodos > MAX_FINDINGS) {
|
|
97
|
+
findings.push({
|
|
98
|
+
type: "summary",
|
|
99
|
+
severity: "WARN",
|
|
100
|
+
category: "TodoFixme",
|
|
101
|
+
file: filePath,
|
|
102
|
+
line: 0,
|
|
103
|
+
title: `${totalTodos} TODO/FIXME comments found (${totalTodos - MAX_FINDINGS} more not shown)`,
|
|
104
|
+
message: `Found ${totalTodos} TODO/FIXME comments in this file`,
|
|
105
|
+
confidence: "high",
|
|
106
|
+
});
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
return findings;
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
module.exports = {
|
|
113
|
+
analyzeTodoFixme,
|
|
114
|
+
parseCode,
|
|
115
|
+
};
|