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,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Engine Registry
|
|
3
|
+
*
|
|
4
|
+
* Single source of truth for all polish engines.
|
|
5
|
+
* Adding a new engine = add one line here + create the file.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
const engines = {
|
|
9
|
+
frontend: require("./frontend"),
|
|
10
|
+
backend: require("./backend"),
|
|
11
|
+
security: require("./security"),
|
|
12
|
+
performance: require("./performance"),
|
|
13
|
+
accessibility: require("./accessibility"),
|
|
14
|
+
seo: require("./seo"),
|
|
15
|
+
configuration: require("./configuration"),
|
|
16
|
+
documentation: require("./documentation"),
|
|
17
|
+
infrastructure: require("./infrastructure"),
|
|
18
|
+
observability: require("./observability"),
|
|
19
|
+
resilience: require("./resilience"),
|
|
20
|
+
internationalization: require("./internationalization"),
|
|
21
|
+
privacy: require("./privacy"),
|
|
22
|
+
};
|
|
23
|
+
|
|
24
|
+
/** All registered category names */
|
|
25
|
+
const categories = Object.keys(engines);
|
|
26
|
+
|
|
27
|
+
module.exports = { engines, categories };
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Infrastructure Polish Engine
|
|
3
|
+
*
|
|
4
|
+
* Checks: Docker, CI/CD, deployment config, env validation.
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
const path = require("path");
|
|
8
|
+
const { pathExists, readFileSafe } = require("./utils");
|
|
9
|
+
|
|
10
|
+
module.exports = async function infrastructureEngine(projectPath) {
|
|
11
|
+
const issues = [];
|
|
12
|
+
const packageJson = await readFileSafe(path.join(projectPath, "package.json"));
|
|
13
|
+
|
|
14
|
+
// Docker
|
|
15
|
+
const hasDocker =
|
|
16
|
+
(await pathExists(path.join(projectPath, "Dockerfile"))) ||
|
|
17
|
+
(await pathExists(path.join(projectPath, "docker-compose.yml")));
|
|
18
|
+
if (!hasDocker) {
|
|
19
|
+
issues.push({
|
|
20
|
+
id: "missing-docker",
|
|
21
|
+
category: "Infrastructure",
|
|
22
|
+
severity: "low",
|
|
23
|
+
title: "Missing Docker Configuration",
|
|
24
|
+
description: "No Docker setup found. Deployment may be inconsistent.",
|
|
25
|
+
suggestion: "Add Dockerfile for consistent deployment environments.",
|
|
26
|
+
autoFixable: true,
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
// CI/CD
|
|
31
|
+
const hasCi =
|
|
32
|
+
(await pathExists(path.join(projectPath, ".github", "workflows"))) ||
|
|
33
|
+
(await pathExists(path.join(projectPath, ".gitlab-ci.yml"))) ||
|
|
34
|
+
(await pathExists(path.join(projectPath, ".circleci")));
|
|
35
|
+
if (!hasCi) {
|
|
36
|
+
issues.push({
|
|
37
|
+
id: "missing-ci",
|
|
38
|
+
category: "Infrastructure",
|
|
39
|
+
severity: "high",
|
|
40
|
+
title: "Missing CI/CD Configuration",
|
|
41
|
+
description: "No CI/CD pipeline found. Code changes are not automatically tested.",
|
|
42
|
+
suggestion: "Add GitHub Actions, GitLab CI, or CircleCI for automated testing.",
|
|
43
|
+
autoFixable: true,
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
// Deployment config
|
|
48
|
+
const hasDeployConfig =
|
|
49
|
+
(await pathExists(path.join(projectPath, "vercel.json"))) ||
|
|
50
|
+
(await pathExists(path.join(projectPath, "netlify.toml"))) ||
|
|
51
|
+
(await pathExists(path.join(projectPath, "railway.json")));
|
|
52
|
+
if (!hasDeployConfig && !hasDocker) {
|
|
53
|
+
issues.push({
|
|
54
|
+
id: "missing-deployment-config",
|
|
55
|
+
category: "Infrastructure",
|
|
56
|
+
severity: "medium",
|
|
57
|
+
title: "No Deployment Configuration",
|
|
58
|
+
description: "No deployment platform configuration found.",
|
|
59
|
+
suggestion: "Add vercel.json, netlify.toml, or similar for deployment settings.",
|
|
60
|
+
autoFixable: false,
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
// Env validation
|
|
65
|
+
const hasEnvValidation =
|
|
66
|
+
packageJson && /@t3-oss\/env|envalid|dotenv-safe/i.test(packageJson);
|
|
67
|
+
if (!hasEnvValidation) {
|
|
68
|
+
issues.push({
|
|
69
|
+
id: "missing-env-validation",
|
|
70
|
+
category: "Infrastructure",
|
|
71
|
+
severity: "medium",
|
|
72
|
+
title: "No Environment Validation",
|
|
73
|
+
description: "Environment variables are not validated at startup.",
|
|
74
|
+
suggestion: "Add @t3-oss/env-nextjs or envalid to validate env vars at startup.",
|
|
75
|
+
autoFixable: false,
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
return issues;
|
|
80
|
+
};
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Internationalization Polish Engine
|
|
3
|
+
*
|
|
4
|
+
* Checks: i18n library, locale detection, RTL support, translation files.
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
const path = require("path");
|
|
8
|
+
const { pathExists, findFile, readFileSafe } = require("./utils");
|
|
9
|
+
|
|
10
|
+
module.exports = async function internationalizationEngine(projectPath) {
|
|
11
|
+
const issues = [];
|
|
12
|
+
const packageJson = await readFileSafe(path.join(projectPath, "package.json"));
|
|
13
|
+
const srcPath = path.join(projectPath, "src");
|
|
14
|
+
const hasSrc = await pathExists(srcPath);
|
|
15
|
+
const searchPath = hasSrc ? srcPath : projectPath;
|
|
16
|
+
|
|
17
|
+
const hasI18n =
|
|
18
|
+
packageJson && /next-intl|react-i18next|i18next|lingui|formatjs|react-intl/i.test(packageJson);
|
|
19
|
+
|
|
20
|
+
if (!hasI18n) {
|
|
21
|
+
issues.push({
|
|
22
|
+
id: "missing-i18n",
|
|
23
|
+
category: "Internationalization",
|
|
24
|
+
severity: "low",
|
|
25
|
+
title: "Missing Internationalization (i18n)",
|
|
26
|
+
description: "No i18n library found. Adding translations later is costly.",
|
|
27
|
+
suggestion: "Add next-intl or react-i18next for internationalization support.",
|
|
28
|
+
autoFixable: false,
|
|
29
|
+
aiPrompt: "Set up internationalization using next-intl or react-i18next. Include locale detection, language switching, and translation extraction workflow.",
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
// Locale detection (only if i18n is installed)
|
|
34
|
+
if (hasI18n) {
|
|
35
|
+
const hasLocaleDetection = await findFile(searchPath, /locale|navigator\.language|accept-language|getLocale/i);
|
|
36
|
+
if (!hasLocaleDetection) {
|
|
37
|
+
issues.push({
|
|
38
|
+
id: "missing-locale-detection",
|
|
39
|
+
category: "Internationalization",
|
|
40
|
+
severity: "medium",
|
|
41
|
+
title: "Missing Locale Detection",
|
|
42
|
+
description: "i18n setup found but no automatic locale detection.",
|
|
43
|
+
suggestion: "Add automatic locale detection from browser settings or Accept-Language header.",
|
|
44
|
+
autoFixable: false,
|
|
45
|
+
aiPrompt: "Add automatic locale detection. Detect from Accept-Language header on server, navigator.language on client, allow user override with persistence.",
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
// RTL support
|
|
50
|
+
const hasRTL = await findFile(searchPath, /rtl|dir=.*rtl|direction.*rtl|ltr.*rtl/i);
|
|
51
|
+
if (!hasRTL) {
|
|
52
|
+
issues.push({
|
|
53
|
+
id: "missing-rtl-support",
|
|
54
|
+
category: "Internationalization",
|
|
55
|
+
severity: "low",
|
|
56
|
+
title: "Missing RTL Support",
|
|
57
|
+
description: "No RTL (right-to-left) support found. Arabic/Hebrew users affected.",
|
|
58
|
+
suggestion: "Add RTL layout support using CSS logical properties or rtlcss.",
|
|
59
|
+
autoFixable: false,
|
|
60
|
+
aiPrompt: "Add RTL support for Arabic/Hebrew locales. Use CSS logical properties, directional icons, and proper text alignment.",
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
// Translation files
|
|
65
|
+
const hasTranslationFiles =
|
|
66
|
+
(await pathExists(path.join(projectPath, "locales"))) ||
|
|
67
|
+
(await pathExists(path.join(projectPath, "translations"))) ||
|
|
68
|
+
(await pathExists(path.join(projectPath, "messages"))) ||
|
|
69
|
+
(await pathExists(path.join(srcPath, "locales")));
|
|
70
|
+
if (!hasTranslationFiles) {
|
|
71
|
+
issues.push({
|
|
72
|
+
id: "missing-translation-files",
|
|
73
|
+
category: "Internationalization",
|
|
74
|
+
severity: "medium",
|
|
75
|
+
title: "Missing Translation Files",
|
|
76
|
+
description: "i18n library found but no translation files directory.",
|
|
77
|
+
suggestion: "Create locales/ directory with JSON translation files for each language.",
|
|
78
|
+
autoFixable: true,
|
|
79
|
+
aiPrompt: "Create a translation file structure with English as base, organized namespaces, and a script to extract translation keys from code.",
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
return issues;
|
|
85
|
+
};
|
|
@@ -0,0 +1,180 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Library detection for context-aware polish checking.
|
|
3
|
+
*
|
|
4
|
+
* When a project already uses a library that provides a feature,
|
|
5
|
+
* we skip the corresponding check to reduce false positives.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
const path = require("path");
|
|
9
|
+
const { pathExists, readFileSafe } = require("./utils");
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* Common libraries grouped by the functionality they provide.
|
|
13
|
+
*/
|
|
14
|
+
const LIBRARY_ALTERNATIVES = {
|
|
15
|
+
errorBoundary: [
|
|
16
|
+
"react-error-boundary",
|
|
17
|
+
"@sentry/react",
|
|
18
|
+
"bugsnag-react",
|
|
19
|
+
],
|
|
20
|
+
|
|
21
|
+
toast: [
|
|
22
|
+
"react-hot-toast",
|
|
23
|
+
"react-toastify",
|
|
24
|
+
"sonner",
|
|
25
|
+
"@radix-ui/react-toast",
|
|
26
|
+
"notistack",
|
|
27
|
+
"react-notifications",
|
|
28
|
+
],
|
|
29
|
+
|
|
30
|
+
spinner: [
|
|
31
|
+
"react-spinners",
|
|
32
|
+
"react-loader-spinner",
|
|
33
|
+
"react-loading",
|
|
34
|
+
"@chakra-ui/react",
|
|
35
|
+
"@mantine/core",
|
|
36
|
+
],
|
|
37
|
+
|
|
38
|
+
skeleton: [
|
|
39
|
+
"react-loading-skeleton",
|
|
40
|
+
"react-content-loader",
|
|
41
|
+
"@chakra-ui/react",
|
|
42
|
+
"@mantine/core",
|
|
43
|
+
"@radix-ui/themes",
|
|
44
|
+
],
|
|
45
|
+
|
|
46
|
+
formValidation: [
|
|
47
|
+
"react-hook-form",
|
|
48
|
+
"formik",
|
|
49
|
+
"@tanstack/react-form",
|
|
50
|
+
"react-final-form",
|
|
51
|
+
"zod",
|
|
52
|
+
"yup",
|
|
53
|
+
],
|
|
54
|
+
|
|
55
|
+
uiLibrary: [
|
|
56
|
+
"@chakra-ui/react",
|
|
57
|
+
"@mantine/core",
|
|
58
|
+
"@radix-ui/themes",
|
|
59
|
+
"@mui/material",
|
|
60
|
+
"antd",
|
|
61
|
+
"@nextui-org/react",
|
|
62
|
+
"shadcn",
|
|
63
|
+
"@headlessui/react",
|
|
64
|
+
],
|
|
65
|
+
|
|
66
|
+
stateManagement: [
|
|
67
|
+
"zustand",
|
|
68
|
+
"@reduxjs/toolkit",
|
|
69
|
+
"jotai",
|
|
70
|
+
"recoil",
|
|
71
|
+
"mobx",
|
|
72
|
+
"@tanstack/react-query",
|
|
73
|
+
],
|
|
74
|
+
|
|
75
|
+
i18n: [
|
|
76
|
+
"next-intl",
|
|
77
|
+
"react-i18next",
|
|
78
|
+
"next-translate",
|
|
79
|
+
"@formatjs/intl",
|
|
80
|
+
"lingui",
|
|
81
|
+
],
|
|
82
|
+
|
|
83
|
+
analytics: [
|
|
84
|
+
"@sentry/nextjs",
|
|
85
|
+
"@sentry/react",
|
|
86
|
+
"@vercel/analytics",
|
|
87
|
+
"posthog-js",
|
|
88
|
+
"mixpanel-browser",
|
|
89
|
+
"@segment/analytics-next",
|
|
90
|
+
],
|
|
91
|
+
};
|
|
92
|
+
|
|
93
|
+
/**
|
|
94
|
+
* Check if package.json contains any of the specified libraries.
|
|
95
|
+
* @param {string} packageJsonContent - Raw package.json content
|
|
96
|
+
* @param {string[]} libraries - Library names to look for
|
|
97
|
+
* @returns {string|null} First matched library name, or null
|
|
98
|
+
*/
|
|
99
|
+
function hasLibrary(packageJsonContent, libraries) {
|
|
100
|
+
if (!packageJsonContent) return null;
|
|
101
|
+
|
|
102
|
+
for (const lib of libraries) {
|
|
103
|
+
const escaped = lib.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
|
|
104
|
+
const pattern = new RegExp(`"${escaped}"\\s*:`, "i");
|
|
105
|
+
if (pattern.test(packageJsonContent)) {
|
|
106
|
+
return lib;
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
return null;
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
/**
|
|
114
|
+
* Detect project type for context-aware severity adjustments.
|
|
115
|
+
*/
|
|
116
|
+
async function detectProjectType(projectPath, packageJsonContent) {
|
|
117
|
+
const hasApp = await pathExists(path.join(projectPath, "app"));
|
|
118
|
+
const hasPages = await pathExists(path.join(projectPath, "pages"));
|
|
119
|
+
const hasSrc = await pathExists(path.join(projectPath, "src"));
|
|
120
|
+
|
|
121
|
+
const isNextJs = packageJsonContent && /["']next["']/.test(packageJsonContent);
|
|
122
|
+
const isRemix = packageJsonContent && /["']@remix-run\//.test(packageJsonContent);
|
|
123
|
+
const isVite = packageJsonContent && /["']vite["']/.test(packageJsonContent);
|
|
124
|
+
const isAstro = packageJsonContent && /["']astro["']/.test(packageJsonContent);
|
|
125
|
+
|
|
126
|
+
const isLibrary = packageJsonContent && /"main"|"module"|"exports"/.test(packageJsonContent);
|
|
127
|
+
const isCli = packageJsonContent && /"bin"/.test(packageJsonContent);
|
|
128
|
+
const isApi =
|
|
129
|
+
!hasApp &&
|
|
130
|
+
!hasPages &&
|
|
131
|
+
packageJsonContent &&
|
|
132
|
+
/["']express["']|["']fastify["']|["']hono["']/.test(packageJsonContent);
|
|
133
|
+
|
|
134
|
+
const uiLib = hasLibrary(packageJsonContent, LIBRARY_ALTERNATIVES.uiLibrary);
|
|
135
|
+
|
|
136
|
+
return {
|
|
137
|
+
isNextJs,
|
|
138
|
+
isRemix,
|
|
139
|
+
isVite,
|
|
140
|
+
isAstro,
|
|
141
|
+
isLibrary,
|
|
142
|
+
isCli,
|
|
143
|
+
isApi,
|
|
144
|
+
hasAppRouter: hasApp && isNextJs,
|
|
145
|
+
hasPagesRouter: hasPages && isNextJs,
|
|
146
|
+
hasSrc,
|
|
147
|
+
uiLibrary: uiLib,
|
|
148
|
+
skipFrontend: isLibrary || isCli || isApi,
|
|
149
|
+
};
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
/**
|
|
153
|
+
* Adjust severity based on project context.
|
|
154
|
+
*/
|
|
155
|
+
function adjustSeverity(baseSeverity, projectType, issueId) {
|
|
156
|
+
if (projectType.skipFrontend && issueId.startsWith("missing-")) {
|
|
157
|
+
return "low";
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
if (projectType.uiLibrary) {
|
|
161
|
+
const componentIssues = [
|
|
162
|
+
"missing-spinner",
|
|
163
|
+
"missing-skeleton",
|
|
164
|
+
"missing-toast",
|
|
165
|
+
"missing-empty-states",
|
|
166
|
+
];
|
|
167
|
+
if (componentIssues.includes(issueId)) {
|
|
168
|
+
return "low";
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
return baseSeverity;
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
module.exports = {
|
|
176
|
+
LIBRARY_ALTERNATIVES,
|
|
177
|
+
hasLibrary,
|
|
178
|
+
detectProjectType,
|
|
179
|
+
adjustSeverity,
|
|
180
|
+
};
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Observability Polish Engine
|
|
3
|
+
*
|
|
4
|
+
* Checks: OpenTelemetry, structured logging, metrics, correlation IDs.
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
const path = require("path");
|
|
8
|
+
const { pathExists, findFile, readFileSafe } = require("./utils");
|
|
9
|
+
|
|
10
|
+
module.exports = async function observabilityEngine(projectPath) {
|
|
11
|
+
const issues = [];
|
|
12
|
+
const packageJson = await readFileSafe(path.join(projectPath, "package.json"));
|
|
13
|
+
const srcPath = path.join(projectPath, "src");
|
|
14
|
+
const hasSrc = await pathExists(srcPath);
|
|
15
|
+
const searchPath = hasSrc ? srcPath : projectPath;
|
|
16
|
+
|
|
17
|
+
// OpenTelemetry
|
|
18
|
+
if (!(packageJson && /@opentelemetry|otel/i.test(packageJson))) {
|
|
19
|
+
issues.push({
|
|
20
|
+
id: "missing-opentelemetry",
|
|
21
|
+
category: "Observability",
|
|
22
|
+
severity: "medium",
|
|
23
|
+
title: "Missing OpenTelemetry",
|
|
24
|
+
description: "No OpenTelemetry setup found. Distributed tracing helps debug production issues.",
|
|
25
|
+
suggestion: "Add @opentelemetry/sdk-node and configure tracing for your application.",
|
|
26
|
+
autoFixable: false,
|
|
27
|
+
aiPrompt: "Set up OpenTelemetry for distributed tracing in my Node.js/Next.js application. Include automatic instrumentation for HTTP requests, database queries, and external API calls.",
|
|
28
|
+
});
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
// Structured logging
|
|
32
|
+
if (!(packageJson && /pino|winston|bunyan|@elastic\/ecs-pino-format/i.test(packageJson))) {
|
|
33
|
+
issues.push({
|
|
34
|
+
id: "missing-structured-logging",
|
|
35
|
+
category: "Observability",
|
|
36
|
+
severity: "high",
|
|
37
|
+
title: "Missing Structured Logging",
|
|
38
|
+
description: "No structured logging library found. console.log is hard to parse in production.",
|
|
39
|
+
suggestion: "Add pino or winston for structured JSON logging.",
|
|
40
|
+
autoFixable: false,
|
|
41
|
+
aiPrompt: "Set up structured logging using pino. Configure JSON output in production with request ID correlation, log levels, and proper error serialization. Include dev mode pretty-printing.",
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
// Metrics
|
|
46
|
+
if (!(packageJson && /prom-client|@opentelemetry\/sdk-metrics|datadog-metrics/i.test(packageJson))) {
|
|
47
|
+
issues.push({
|
|
48
|
+
id: "missing-metrics",
|
|
49
|
+
category: "Observability",
|
|
50
|
+
severity: "medium",
|
|
51
|
+
title: "Missing Metrics Collection",
|
|
52
|
+
description: "No metrics library found. You won't have visibility into application performance.",
|
|
53
|
+
suggestion: "Add prom-client or OpenTelemetry metrics for application monitoring.",
|
|
54
|
+
autoFixable: false,
|
|
55
|
+
aiPrompt: "Set up Prometheus metrics collection using prom-client. Include default metrics (CPU, memory, event loop lag) and custom business metrics.",
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
// Correlation IDs
|
|
60
|
+
const hasCorrelationId = await findFile(searchPath, /correlation|request.*id|trace.*id|x-request-id/i);
|
|
61
|
+
if (!hasCorrelationId && hasSrc) {
|
|
62
|
+
issues.push({
|
|
63
|
+
id: "missing-correlation-ids",
|
|
64
|
+
category: "Observability",
|
|
65
|
+
severity: "medium",
|
|
66
|
+
title: "Missing Request Correlation IDs",
|
|
67
|
+
description: "No correlation ID handling found. Debugging distributed requests is difficult.",
|
|
68
|
+
suggestion: "Add correlation ID middleware to trace requests across services.",
|
|
69
|
+
autoFixable: true,
|
|
70
|
+
aiPrompt: "Add request correlation ID middleware. Generate unique IDs per request, propagate in headers, include in all log output.",
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
return issues;
|
|
75
|
+
};
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Performance Polish Engine
|
|
3
|
+
*
|
|
4
|
+
* Checks: Image optimization, caching, bundle analysis.
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
const path = require("path");
|
|
8
|
+
const { findFile, readFileSafe } = require("./utils");
|
|
9
|
+
|
|
10
|
+
module.exports = async function performanceEngine(projectPath) {
|
|
11
|
+
const issues = [];
|
|
12
|
+
const packageJson = await readFileSafe(path.join(projectPath, "package.json"));
|
|
13
|
+
|
|
14
|
+
// Image optimization
|
|
15
|
+
const nextConfig =
|
|
16
|
+
(await readFileSafe(path.join(projectPath, "next.config.js"))) ||
|
|
17
|
+
(await readFileSafe(path.join(projectPath, "next.config.mjs")));
|
|
18
|
+
const hasImageOptimization =
|
|
19
|
+
(packageJson && /sharp|next\/image|@next\/image/i.test(packageJson)) ||
|
|
20
|
+
(nextConfig && /images:/i.test(nextConfig));
|
|
21
|
+
|
|
22
|
+
if (!hasImageOptimization) {
|
|
23
|
+
issues.push({
|
|
24
|
+
id: "missing-image-optimization",
|
|
25
|
+
category: "Performance",
|
|
26
|
+
severity: "medium",
|
|
27
|
+
title: "Missing Image Optimization",
|
|
28
|
+
description: "No image optimization setup found. Images may be served unoptimized.",
|
|
29
|
+
suggestion: "Use Next.js Image component or sharp for image optimization.",
|
|
30
|
+
autoFixable: false,
|
|
31
|
+
});
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
// Caching
|
|
35
|
+
const hasCaching = await findFile(projectPath, /cache|stale-while-revalidate/i);
|
|
36
|
+
if (!hasCaching) {
|
|
37
|
+
issues.push({
|
|
38
|
+
id: "missing-caching",
|
|
39
|
+
category: "Performance",
|
|
40
|
+
severity: "medium",
|
|
41
|
+
title: "No Caching Strategy",
|
|
42
|
+
description: "No caching configuration found. API responses may not be cached.",
|
|
43
|
+
suggestion: "Add Cache-Control headers or use SWR/React Query for client-side caching.",
|
|
44
|
+
autoFixable: false,
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
// Bundle analyzer
|
|
49
|
+
const hasBundleAnalyzer =
|
|
50
|
+
packageJson && /@next\/bundle-analyzer|webpack-bundle-analyzer/i.test(packageJson);
|
|
51
|
+
if (!hasBundleAnalyzer) {
|
|
52
|
+
issues.push({
|
|
53
|
+
id: "missing-bundle-analyzer",
|
|
54
|
+
category: "Performance",
|
|
55
|
+
severity: "low",
|
|
56
|
+
title: "No Bundle Analyzer",
|
|
57
|
+
description: "No bundle analyzer installed. Can't visualize bundle size.",
|
|
58
|
+
suggestion: "Add @next/bundle-analyzer to track and optimize bundle size.",
|
|
59
|
+
autoFixable: false,
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
return issues;
|
|
64
|
+
};
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Privacy Polish Engine
|
|
3
|
+
*
|
|
4
|
+
* Checks: Cookie consent, privacy policy, data export, account deletion,
|
|
5
|
+
* data retention, PII encryption.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
const path = require("path");
|
|
9
|
+
const { pathExists, findFile, readFileSafe } = require("./utils");
|
|
10
|
+
|
|
11
|
+
module.exports = async function privacyEngine(projectPath) {
|
|
12
|
+
const issues = [];
|
|
13
|
+
const packageJson = await readFileSafe(path.join(projectPath, "package.json"));
|
|
14
|
+
const srcPath = path.join(projectPath, "src");
|
|
15
|
+
const hasSrc = await pathExists(srcPath);
|
|
16
|
+
const searchPath = hasSrc ? srcPath : projectPath;
|
|
17
|
+
|
|
18
|
+
// Cookie consent
|
|
19
|
+
const hasCookieConsentLib =
|
|
20
|
+
packageJson && /cookie-consent|cookieconsent|react-cookie-consent|gdpr|onetrust|cookiebot/i.test(packageJson);
|
|
21
|
+
const hasCookieConsentCode = await findFile(searchPath, /cookie.*consent|gdpr.*consent|consent.*banner/i);
|
|
22
|
+
if (!hasCookieConsentLib && !hasCookieConsentCode) {
|
|
23
|
+
issues.push({
|
|
24
|
+
id: "missing-cookie-consent",
|
|
25
|
+
category: "Privacy",
|
|
26
|
+
severity: "high",
|
|
27
|
+
title: "Missing Cookie Consent",
|
|
28
|
+
description: "No cookie consent mechanism found. GDPR/CCPA compliance required.",
|
|
29
|
+
suggestion: "Add a cookie consent banner for EU/California visitors.",
|
|
30
|
+
autoFixable: false,
|
|
31
|
+
aiPrompt: "Implement GDPR-compliant cookie consent banner with categories (necessary, analytics, marketing), persist choice, only load tracking scripts after consent.",
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
// Privacy policy
|
|
36
|
+
const hasPrivacyPolicy =
|
|
37
|
+
(await pathExists(path.join(projectPath, "public", "privacy.html"))) ||
|
|
38
|
+
(await pathExists(path.join(projectPath, "public", "privacy-policy.html"))) ||
|
|
39
|
+
(await findFile(searchPath, /privacy.*policy|PrivacyPolicy/i));
|
|
40
|
+
if (!hasPrivacyPolicy) {
|
|
41
|
+
issues.push({
|
|
42
|
+
id: "missing-privacy-policy",
|
|
43
|
+
category: "Privacy",
|
|
44
|
+
severity: "high",
|
|
45
|
+
title: "Missing Privacy Policy",
|
|
46
|
+
description: "No privacy policy page found. Required by law in many jurisdictions.",
|
|
47
|
+
suggestion: "Add a privacy policy page explaining data collection and usage.",
|
|
48
|
+
autoFixable: false,
|
|
49
|
+
aiPrompt: "Create a privacy policy page covering: data collected, usage, third-party services, cookies, user rights (GDPR), and contact information.",
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
// Data export
|
|
54
|
+
if (!(await findFile(searchPath, /export.*data|download.*data|gdpr.*export|data.*portability/i))) {
|
|
55
|
+
issues.push({
|
|
56
|
+
id: "missing-data-export",
|
|
57
|
+
category: "Privacy",
|
|
58
|
+
severity: "medium",
|
|
59
|
+
title: "Missing Data Export Feature",
|
|
60
|
+
description: "No data export capability found. GDPR requires data portability.",
|
|
61
|
+
suggestion: "Add ability for users to export their data in a standard format.",
|
|
62
|
+
autoFixable: false,
|
|
63
|
+
aiPrompt: "Implement data export for GDPR compliance. Allow users to download personal data in JSON/CSV including profile, activity history, and preferences.",
|
|
64
|
+
});
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
// Account deletion
|
|
68
|
+
if (!(await findFile(searchPath, /delete.*account|account.*deletion|remove.*account|gdpr.*delete/i))) {
|
|
69
|
+
issues.push({
|
|
70
|
+
id: "missing-account-deletion",
|
|
71
|
+
category: "Privacy",
|
|
72
|
+
severity: "high",
|
|
73
|
+
title: "Missing Account Deletion",
|
|
74
|
+
description: "No account deletion feature found. GDPR requires right to erasure.",
|
|
75
|
+
suggestion: "Add ability for users to delete their account and all associated data.",
|
|
76
|
+
autoFixable: false,
|
|
77
|
+
aiPrompt: "Implement account deletion with confirmation flow, grace period, cascade deletion, and anonymization of non-deletable records.",
|
|
78
|
+
});
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
// Data retention
|
|
82
|
+
if (!(await findFile(searchPath, /retention|data.*cleanup|purge.*old|ttl.*expire/i))) {
|
|
83
|
+
issues.push({
|
|
84
|
+
id: "missing-data-retention",
|
|
85
|
+
category: "Privacy",
|
|
86
|
+
severity: "medium",
|
|
87
|
+
title: "Missing Data Retention Policy",
|
|
88
|
+
description: "No data retention/cleanup logic found. Old data should be purged.",
|
|
89
|
+
suggestion: "Implement data retention policies to automatically purge old data.",
|
|
90
|
+
autoFixable: false,
|
|
91
|
+
aiPrompt: "Implement data retention policy. Add scheduled jobs to purge old sessions, logs, and inactive accounts. Document retention periods.",
|
|
92
|
+
});
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
// PII encryption
|
|
96
|
+
if (!(await findFile(searchPath, /encrypt|crypto.*cipher|aes|bcrypt|argon2/i))) {
|
|
97
|
+
issues.push({
|
|
98
|
+
id: "missing-pii-encryption",
|
|
99
|
+
category: "Privacy",
|
|
100
|
+
severity: "high",
|
|
101
|
+
title: "Missing Data Encryption",
|
|
102
|
+
description: "No encryption utilities found. Sensitive data should be encrypted.",
|
|
103
|
+
suggestion: "Add encryption for PII at rest and ensure passwords use bcrypt/argon2.",
|
|
104
|
+
autoFixable: false,
|
|
105
|
+
aiPrompt: "Set up encryption for sensitive data. Use bcrypt/argon2 for passwords, field-level encryption for PII, proper key management.",
|
|
106
|
+
});
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
return issues;
|
|
110
|
+
};
|