#![forbid(unsafe_code)]
#![warn(clippy::pedantic)]
#![cfg_attr(test, allow(clippy::unwrap_used, clippy::expect_used, clippy::panic))]
#![expect(
clippy::module_name_repetitions,
reason = "module prefixes on types are intentional"
)]
#![expect(
clippy::must_use_candidate,
reason = "not all public fns need #[must_use]"
)]
#![expect(
clippy::missing_errors_doc,
reason = "deferred until v1.0 public API stabilization"
)]
#![expect(
clippy::doc_markdown,
reason = "markdown linting too strict for rule names"
)]
#![expect(
clippy::struct_excessive_bools,
reason = "visitor state requires bool fields"
)]
#![expect(
clippy::cast_possible_truncation,
reason = "line/column casts are safe within u32 range"
)]
#![expect(
clippy::cast_precision_loss,
reason = "score penalty math is fine with f64"
)]
#![expect(
clippy::items_after_statements,
reason = "inline test helpers after setup"
)]
#![expect(clippy::cast_sign_loss, reason = "score clamped to 0-100 before cast")]
#![expect(
clippy::used_underscore_binding,
reason = "underscore prefixes used in destructuring"
)]
pub mod cli;
pub mod config;
pub mod deps;
pub mod diagnostics;
pub mod discovery;
pub mod error;
pub mod fixer;
#[cfg(feature = "mcp")]
pub mod mcp;
pub mod output;
pub mod plan;
pub mod sarif;
pub mod scan;
pub mod setup;
#[doc(hidden)]
pub mod run;
pub(crate) mod cache;
pub(crate) mod diff;
pub(crate) mod passes;
pub(crate) mod process;
pub(crate) mod scanner;
pub(crate) mod suppression;
pub(crate) mod workspace;
pub(crate) use passes::quality::coverage;
pub(crate) use passes::quality::machete;
pub(crate) use passes::quality::msrv;
pub(crate) use passes::quality::semver_checks;
pub(crate) use passes::security::audit;
pub(crate) use passes::security::deny;
pub(crate) use passes::security::geiger;
pub(crate) use passes::static_analysis::clippy;
pub(crate) use passes::static_analysis::rules;