- Nix (with flakes enabled)
- direnv (optional, recommended)
- Git
# Using Nix directly
nix develop
# Or with direnv (recommended)
direnv allownpm install -g jscpd# See all available commands
just --list
# Run all quality checks
just quality
# Run specific checks
just rust-quality
just elixir-quality
just securityAll tools are pre-installed via Nix (flake.nix):
cargo-audit- Security vulnerability scanningcargo-deny- License and advisory checkingcargo-geiger- Unsafe code detectioncargo-udeps- Unused dependency detection (requires nightly)cargo-machete- Unused dependency detectioncargo-outdated- Outdated dependency checkercargo-nextest- Fast test runnercargo-tarpaulin- Code coveragecargo-bloat- Binary size analysiscargo-llvm-lines- LLVM IR line countingcargo-expand- Macro expansioncargo-fuzz- Fuzz testing
Installed via mix.exs dependencies:
credo- Code linting and consistencydialyxir- Static type analysisdoctor- Documentation coveragesobelow- Security scannermix_audit- Dependency vulnerability scannerexcoveralls- Code coverage
gitleaks- Secret scanningshellcheck- Shell script lintingtokei- Code statisticsjust- Command runnernodejs- For jscpd
| File | Purpose |
|---|---|
flake.nix |
Nix development environment |
devenv.nix |
Pre-commit hooks configuration |
justfile |
Command runner recipes |
clippy.toml |
Rust Clippy linter settings |
deny.toml |
Cargo-deny policies |
.credo.exs |
Elixir Credo settings |
.jscpd.json |
Duplicate code detection config |
mix.exs |
Elixir project & dependencies |
- Clippy: Pedantic + Nursery + Cargo lints
- Cognitive Complexity: ≤ 15
- Function Lines: ≤ 100
- Function Parameters (bools): ≤ 3
- Max Trait Bounds: 3
- Max Struct Bools: 3
- Enum Variant Size Diff: ≤ 200 bytes
- Cyclomatic Complexity: ≤ 12
- Function Arity: ≤ 6
- Nesting Depth: ≤ 3
- Line Length: ≤ 120 characters
- Module Documentation: Required
- Vulnerabilities: Zero tolerance
- Secrets: No hardcoded secrets/keys
- Licenses: Only approved licenses (see deny.toml)
just fmt # Format all code
just rust-fmt-fix # Rust only
just elixir-fmt-fix # Elixir onlyjust test # All tests
just coverage # Generate coverage reportsjust security # All security checks
just gitleaks # Scan for secrets
just rust-audit # Rust vulnerabilities
just elixir-sobelow # Elixir securityjust stats # Code statistics
just duplication # Find duplicate code
just rust-geiger # Unsafe code detection
just bloat # Binary size analysisjust build-cli # Build singularity-rca CLI
just install-cli # Install CLI globally
just cli-languages # List supported languages
just cli-analyze src/ # Analyze with CLI
just cli-metrics FILE # Show metrics
just cli-complexity src/ # Check complexityjust pre-commit # Quick essential checksjust ci # Full CI simulation (all checks + tests + coverage)
just quality # All quality checks (includes CLI analysis)Configured in devenv.nix, automatically run on git commit:
Rust:
rustfmt --checkclippy --workspace --all-targets --all-featurescargo auditcargo deny check
Elixir:
mix format --check-formattedmix credo
# Rebuild environment
nix flake update
nix develop --rebuild
# Clear cache
rm -rf .direnv .sccache
direnv allow# Clean and rebuild PLT
mix dialyzer --clean
mix dialyzer --plt# Clean coverage data
rm -rf coverage/ cover/
mix clean
cargo clean# Skip hooks temporarily (use sparingly)
git commit --no-verifyRecommended extensions:
rust-analyzer(Rust)ElixirLS(Elixir)shellcheck(Shell)EditorConfig(formatting)
- Use built-in LSP with
rust-analyzerandelixir-ls - Both are available in the Nix environment
The justfile provides a ci target that runs:
- All quality checks (Rust + Elixir + Security)
- All tests
- Coverage report generation
Use in CI pipeline:
script:
- nix develop -c just ciThe project includes a command-line interface singularity-rca:
Build & Install:
# Build CLI
just build-cli
# Install globally
just install-cli
# Or with cargo
cargo install --path . --features cliUsage:
singularity-rca --help
singularity-rca languages
singularity-rca analyze src/ --recursiveSee CLI.md for complete documentation.
This project uses the Singularity Language Registry from GitHub:
singularity-language-registry = {
git = "https://github.com/Singularity-ng/singularity-language-registry",
tag = "v0.1.0"
}See Cargo.toml:50 for configuration.
- Quality Documentation:
QUALITY.md - Contributing Guide:
CONTRIBUTING.md - Main README:
README.md - Just Documentation: https://just.systems
- Nix Flakes: https://nixos.wiki/wiki/Flakes