πŸ— Architecture

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                           main.rs                                  β”‚
β”‚                     (CLI routing via clap)                         β”‚
β”‚                                                                    β”‚
β”‚  keylens scan --path ./src --format cyclonedx                      β”‚
β”‚  keylens diff --base a --head b --strict                           β”‚
β”‚       β”‚                           β”‚                                β”‚
β”‚       β–Ό                           β–Ό                                β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”                     β”‚
β”‚  β”‚scanner.rsβ”‚  β”‚dependencies.rsβ”‚  β”‚  diff.rs β”‚                     β”‚
β”‚  β”‚          β”‚  β”‚               β”‚  β”‚          β”‚                     β”‚
β”‚  β”‚ ignore   β”‚  β”‚ Cargo.lock    β”‚  β”‚ HashSet  β”‚                     β”‚
β”‚  β”‚ (walk)   β”‚  β”‚ package-lock  β”‚  β”‚ (delta)  β”‚                     β”‚
β”‚  β”‚          β”‚  β”‚ requirements  β”‚  β”‚          β”‚                     β”‚
β”‚  β”‚tree-sitterβ”‚ β”‚ yarn.lock     β”‚  β”‚ policy   β”‚                     β”‚
β”‚  β”‚ (AST)    β”‚  β”‚ Pipfile.lock  β”‚  β”‚ (strict) β”‚                     β”‚
β”‚  β””β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”˜  β””β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”˜  β””β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”˜                     β”‚
β”‚       β”‚               β”‚                 β”‚                          β”‚
β”‚       β–Ό               β–Ό                 β–Ό                          β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”                      β”‚
β”‚  β”‚              policy.rs                   β”‚                      β”‚
β”‚  β”‚  severity Β· quantum safety Β· findings    β”‚                      β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜                      β”‚
β”‚                       β”‚                                            β”‚
β”‚                       β–Ό                                            β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”                      β”‚
β”‚  β”‚              models.rs                   β”‚                      β”‚
β”‚  β”‚  CryptoAsset Β· CycloneDX structs Β· OIDs  β”‚                      β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜                      β”‚
β”‚                       β”‚                                            β”‚
β”‚              β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”                                   β”‚
β”‚              β–Ό                 β–Ό                                   β”‚
β”‚     JSON stdout      CycloneDX stdout                              β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Module Responsibilities

Module Purpose
main.rs CLI entry point, argument parsing, output routing
scanner.rs Tree-sitter AST scanning for Python & JS; hardcoded secret detection; insecure PRNG detection
dependencies.rs Lockfile parsing and cross-referencing against known crypto library database
policy.rs Severity classification, quantum-safety assessment, deprecation detection
diff.rs CBOM comparison engine with --strict mode
models.rs Core CryptoAsset type + CycloneDX v1.5 output structures + OID mapping