Skip to content

expirement(tools): trustify-scanner CLI tool for vulnerability scanning#2527

Draft
rh-jfuller wants to merge 1 commit into
guacsec:mainfrom
rh-jfuller:trustify-scanner
Draft

expirement(tools): trustify-scanner CLI tool for vulnerability scanning#2527
rh-jfuller wants to merge 1 commit into
guacsec:mainfrom
rh-jfuller:trustify-scanner

Conversation

@rh-jfuller

@rh-jfuller rh-jfuller commented Jul 21, 2026

Copy link
Copy Markdown
Contributor

Illustrates a security scanner CLI that discovers packages in a target and checks them against a trustify instance for known vulnerabilities.

ed: Maybe this could be in a different repo but offering it here first.

Like grype but backed by trustify instead of a local DB (no consideration for 'air gapped' environments just yet).

This brings trustify to where engineers, developers and users are, in their local environments.

What it does

Scan standalone sbom:

trustify-scanner --trustify-url http://localhost:8080 sbom:my-sbom.json

Scan project in filesystem:

trustify-scanner --trustify-url http://localhost:8080 dir:./my-project

Scan container:

trustify-scanner --trustify-url http://localhost:8080 registry:registry.access.redhat.com/ubi9:latest

Scan an individual purl:

trustify-scanner --trustify-url http://localhost:8080 pkg:rpm/redhat/openssl@3.0.7

Discovers packages → extracts PURLs → calls POST /api/v3/vulnerability/analyze → renders results, for example:

cargo run -p trustify-scanner -- --trustify-url http://localhost:8080 sbom:cdx-sbom-example.json
    Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.18s
     Running `/home/jfuller/src/tpa/trustify/target/debug/trustify-scanner --trustify-url 'http://localhost:8080' 'sbom:cdx-sbom-example.json'`
2026-07-21T10:43:22.860219Z  INFO scanning target=Sbom("cdx-sbom-example.json")
2026-07-21T10:43:22.860265Z  WARN no authentication configured; requests will be unauthenticated
2026-07-21T10:43:22.916191Z  INFO packages discovered total_packages=1782
2026-07-21T10:43:22.916321Z  INFO submitting PURLs for analysis analyzed_packages=1549
 ✔ Scanned for vulnerabilities     [4 vulnerability matches]
   ├── by severity: 4 unknown
   └── 1782 packages scanned, 1549 analyzed (sbom)
NAME                           INSTALLED            TYPE           VULNERABILITY         SEVERITY   STATUS  
golang.org/x/crypto            v0.41.0              golang         CVE-2025-47914                            affect…
golang.org/x/crypto            v0.41.0              golang         CVE-2025-58181                            affect…
k8s.io/kubernetes              v1.33.3              golang         CVE-2025-13281                            affect…
k8s.io/kubernetes              v1.33.3              golang         CVE-2025-5187                             affect…

Container scanning

Uses SBOM-first strategy: checks for cosign SBOM attachments (sha256-DIGEST.sbom tag) before falling back to filesystem layer extraction. This leverages the SBOMs that SBOMer/Konflux already attach to Red Hat container images.

Supported ecosystems

Cargo.lock, go.sum, package-lock.json, requirements.txt, pyproject.toml, uv.lock, poetry.lock, Pipfile.lock, gradle.lockfile, APK (Alpine), dpkg (Debian/Ubuntu), RPM, SPDX 2.x/3.x, CycloneDX.

Summary by Sourcery

Introduce a new trustify-scanner CLI workspace tool that discovers packages from SBOMs, directories, containers, and OCI archives, sends their PURLs to the Trustify API for vulnerability analysis, and reports results with multiple output formats and CI-friendly behavior.

New Features:

  • Add the trustify-scanner Rust CLI as a new workspace binary for vulnerability scanning against a Trustify backend.
  • Support scanning SBOM files, filesystem directories, individual PURLs, container registry images, and OCI archives as scan targets.
  • Implement catalogers for multiple ecosystems (Rust, Go, npm, Python, Java/Gradle, RPM, dpkg, APK) to extract versioned PURLs from dependency and package metadata.
  • Provide list, table, and JSON output formats with severity-aware summaries and optional SBOM upload to Trustify.
  • Add OIDC and token-based authentication support, severity threshold exit codes, and a Makefile for common scanner workflows.

Enhancements:

  • Document the trustify-scanner architecture, supported targets and ecosystems, security considerations, and implementation plan in a dedicated architecture document.
  • Add safety guards around file size, CycloneDX nesting, and container layer extraction to harden scanning against untrusted inputs.

Documentation:

  • Add a README for trustify-scanner describing usage, targets, authentication, CI integration, and examples.

Tests:

  • Add unit tests for target parsing, SBOM cataloging, container and package catalogers, PURL parsing, and list output formatting to validate scanner behavior.

@sourcery-ai

sourcery-ai Bot commented Jul 21, 2026

Copy link
Copy Markdown
Contributor

Reviewer's Guide

Introduces a new Rust CLI tool trustify-scanner that discovers packages from various targets (dirs, SBOMs, containers, OCI archives, dpkg/apk/rpm, lockfiles), converts them to PURLs, calls the Trustify v3 vulnerability analysis API, optionally uploads a CycloneDX SBOM, and renders results in multiple formats with CI-friendly severity gating.

Sequence diagram for trustify-scanner end-to-end scan flow

sequenceDiagram
    actor User
    participant trustify_scanner as trustify_scanner_main
    participant TargetParser as target_Target
    participant Analyzer as analyze_scan
    participant Catalogers as cataloger_run_catalogers
    participant ContainerScanner as container_scan_registry_image
    participant Client as TrustifyClient
    participant TrustifyAPI as Trustify_v3_API
    participant Output as output_render

    User->>trustify_scanner: invoke CLI (trustify-scanner)
    trustify_scanner->>TargetParser: parse(target)
    TargetParser-->>trustify_scanner: Target
    trustify_scanner->>Client: build_client(with_token/with_oidc/unauthenticated)
    trustify_scanner->>Analyzer: scan(Target, Client, upload, follow_links)
    Analyzer->>Analyzer: discover_packages(Target, follow_links)
    alt Target_Sbom
        Analyzer->>Catalogers: cataloger_sbom_catalog_sbom
    else Target_Dir
        Analyzer->>Catalogers: run_catalogers(root, follow_links)
    else Target_Registry
        Analyzer->>ContainerScanner: scan_registry_image(image_ref, follow_links)
    else Target_OciArchive
        Analyzer->>ContainerScanner: scan_oci_archive(path, follow_links)
    else Target_Purl
        Analyzer->>Analyzer: parse_purl_name_version
    end
    Analyzer->>Client: analyze(purls)
    Client->>TrustifyAPI: POST /api/v3/vulnerability/analyze
    TrustifyAPI-->>Client: AnalysisResponse
    Client-->>Analyzer: AnalysisResponse
    opt upload_SBOM
        Analyzer->>Analyzer: build_minimal_sbom(packages)
        Analyzer->>Client: upload_sbom(sbom_json)
        Client->>TrustifyAPI: POST /api/v3/sbom
        TrustifyAPI-->>Client: IngestResult
    end
    Analyzer-->>trustify_scanner: ScanResult
    trustify_scanner->>Output: render(ScanResult, OutputFormat)
    Output-->>User: formatted results (list/table/json)
Loading

File-Level Changes

Change Details Files
Add a new trustify-scanner workspace binary crate and CLI entrypoint wired into Trustify’s vulnerability analysis API.
  • Register tools/scanner as a workspace member in Cargo.toml and add crate-specific dependencies in tools/scanner/Cargo.toml (clap, reqwest, tracing, oci-client, comfy-table, etc.).
  • Implement src/main.rs to parse CLI options and targets with clap, set up tracing, build an authenticated/unauthenticated TrustifyClient, invoke the async scan orchestration, render results via selectable output format, and apply --fail-on severity threshold to exit codes.
  • Define a Severity enum with numeric thresholds and matching logic that considers both CVSS scores and textual severities for gating CI failures.
  • Provide a top-level README and Makefile documenting usage patterns, supported targets, ecosystems, security constraints, and convenience make targets for scanning different inputs.
Cargo.toml
tools/scanner/Cargo.toml
tools/scanner/src/main.rs
tools/scanner/README.md
tools/scanner/Makefile
Implement target detection and package discovery catalogers for multiple ecosystems, including Python, SBOMs, JVM, Go, RPM, dpkg, and Alpine apk, with safety limits on file scanning.
  • Introduce a Target enum with FromStr parsing that supports explicit schemes (dir:, sbom:, pkg:, registry:, oci-archive:) and auto-detection for paths and image-like strings, with validation for existence of files/dirs.
  • Create a cataloger framework: Cataloger trait, DiscoveredPackage struct, CatalogResult, and run_catalogers that wires together individual catalogers, deduplicates by PURL, tracks ecosystems searched, and logs when no recognized dependency files are found.
  • Add defensive read_file_limited with a 256 MiB size cap and glob-like matching logic in find_matching_files to locate dependency files (e.g., Cargo.lock, go.sum, package-lock.json, Python lockfiles, gradle.lockfile, rpm files, dpkg/apk db).
  • Implement sbom cataloger that detects SPDX 2.x, SPDX 3.x, and CycloneDX JSON by top-level keys, extracts PURLs and name/version into DiscoveredPackages, supports nested CycloneDX components with depth limiting, and ships unit tests for correctness and error conditions.
  • Implement Python cataloger supporting requirements.txt, Pipfile.lock, poetry.lock, pyproject.toml (PEP 508 and tool.poetry deps), and uv.lock, with name normalization and PURL building for pkg:pypi.
  • Implement npm cataloger handling package-lock.json v1 (dependencies tree) and v2/v3 (packages object), including scoped package name encoding in PURLs.
  • Implement Cargo cataloger parsing [[package]] sections in Cargo.lock via a lightweight line parser, extracting name/version into pkg:cargo PURLs.
  • Implement Go cataloger parsing go.sum lines, ignoring /go.mod entries, and producing pkg:golang PURLs with v-prefixed version normalization.
  • Implement Maven/Gradle cataloger for gradle.lockfile, parsing group:artifact:version entries into pkg:maven PURLs.
  • Implement rpm cataloger that heuristically parses *.rpm filenames as name-version-release.arch.rpm to derive pkg:rpm PURLs.
  • Implement dpkg cataloger that parses var/lib/dpkg/status (RFC822-style) records for installed packages and produces pkg:deb/debian PURLs based on Package/Version/Source.
  • Implement apk cataloger that parses lib/apk/db/installed records, using origin field when present to create pkg:apk/alpine PURLs.
  • Expose a supported_file_patterns helper listing all recognized dependency patterns for user-facing warnings.
  • Add unit tests for several catalogers (Cargo, dpkg, apk, sbom) to validate parsing behavior and error handling.
tools/scanner/src/target.rs
tools/scanner/src/cataloger/mod.rs
tools/scanner/src/cataloger/sbom.rs
tools/scanner/src/cataloger/python.rs
tools/scanner/src/cataloger/npm.rs
tools/scanner/src/cataloger/cargo.rs
tools/scanner/src/cataloger/go.rs
tools/scanner/src/cataloger/maven.rs
tools/scanner/src/cataloger/rpm.rs
tools/scanner/src/cataloger/dpkg.rs
tools/scanner/src/cataloger/apk.rs
Implement the Trustify API client, OIDC-based authentication, scanning orchestration, and JSON/list/table output rendering, including SBOM upload support.
  • Create TrustifyClient with static token, OIDC, and unauthenticated modes, and methods for batched POST /api/v3/vulnerability/analyze requests (AnalysisRequest/AnalysisResponse types) and POST /api/v3/sbom uploads, plus response models for vulnerabilities and SBOM ingest.
  • Implement OidcTokenProvider that discovers the issuer’s .well-known/openid-configuration, caches tokens from client_credentials grant, refreshes ahead of expiry, and exposes get_token() for use by the client.
  • Define central Error enum (TargetParse, SbomParse, Api, Auth, Container) and wrappers for reqwest/io/json/url errors, used across modules for consistent error propagation and logging.
  • Implement analyze::scan which orchestrates package discovery per Target (Sbom, Dir, Purl, Registry, OciArchive), filters to versioned PURLs, calls Trustify analyze, builds ScanResult and VulnerabilityMatch structs with enriched package data, deduplicates matches per (purl, vuln, advisory) keeping highest score, sorts by score, optionally builds and uploads a minimal CycloneDX SBOM, and aggregates warnings/ecosystems searched.
  • Implement helper build_minimal_sbom that constructs a CycloneDX 1.5 JSON BOM from discovered packages to send to Trustify, and parse_purl_name_version to decompose PURLs into name/version for direct PURL targets, with unit tests for multiple PURL shapes.
  • Implement output module with OutputFormat enum and dispatch to list/table/json renderers; list renderer produces a grype-style summary banner, colorizes severity, truncates text safely on UTF-8, and summarizes packages scanned and severity breakdown; table renderer uses comfy-table to display expanded columns, including advisory id and score; JSON renderer dumps ScanResult via serde_json.
  • Wire tracing initialization with different verbosity levels, using tracing-subscriber env filter and module-specific default filters, and log key steps such as target scanning, package counts, analysis submission, and SBOM upload outcome.
tools/scanner/src/client.rs
tools/scanner/src/auth.rs
tools/scanner/src/error.rs
tools/scanner/src/analyze.rs
tools/scanner/src/output/mod.rs
tools/scanner/src/output/list.rs
tools/scanner/src/output/table.rs
tools/scanner/src/output/json.rs
Add container and OCI archive support with SBOM-first extraction, including safe tar layer processing and PURL extraction from embedded SBOMs.
  • Implement container::scan_registry_image which uses oci-client to resolve an image reference, pull the manifest, attempt to fetch a cosign-style SBOM attachment (sha256-.sbom tag), parse it via shared SBOM extraction logic, or fall back to pulling filesystem layers into a temp directory and running catalogers, tracking ecosystems searched precedence.
  • Implement container::scan_oci_archive which extracts a local OCI tarball, parses index.json and the referenced manifest/layers, detects SBOM layers by media type (spdx/cyclonedx/sbom) and parses them, or else extracts tar/gzip filesystem layers into a temp dir and runs catalogers; it also annotates ecosystems with oci-archive and handles missing blobs gracefully.
  • Provide helpers: fetch_sbom_attachment to pull SBOM blobs from OCI, parse_sbom_bytes to route raw bytes into SPDX2/SPDX3/CycloneDX extractors by content, is_sbom_media_type to recognize SBOM media types, and pull_and_extract_layers to fetch only filesystem layers (tar+gzip/night docker formats) and extract them under a root directory.
  • Implement tar extraction helpers (extract_tar_gz, extract_tar, extract_archive) with a global MAX_EXTRACT_SIZE guard (2 GiB), path traversal prevention by skipping entries with parent components, OCI whiteout file handling to delete files/dirs, and best-effort unpacking that logs unreadable entries instead of failing the whole extraction.
  • Add digest_to_blob_path to map OCI digests to blobs// paths inside an unpacked OCI archive, and use these paths for both manifest and layer blob resolution.
  • Expose ContainerScanResult struct for container scans, containing discovered packages and ecosystems_searched, and integrate this type into analyze::discover_packages for registry and OCI archive targets.
tools/scanner/src/container.rs

Tips and commands

Interacting with Sourcery

  • Trigger a new review: Comment @sourcery-ai review on the pull request.
  • Continue discussions: Reply directly to Sourcery's review comments.
  • Generate a GitHub issue from a review comment: Ask Sourcery to create an
    issue from a review comment by replying to it. You can also reply to a
    review comment with @sourcery-ai issue to create an issue from it.
  • Generate a pull request title: Write @sourcery-ai anywhere in the pull
    request title to generate a title at any time. You can also comment
    @sourcery-ai title on the pull request to (re-)generate the title at any time.
  • Generate a pull request summary: Write @sourcery-ai summary anywhere in
    the pull request body to generate a PR summary at any time exactly where you
    want it. You can also comment @sourcery-ai summary on the pull request to
    (re-)generate the summary at any time.
  • Generate reviewer's guide: Comment @sourcery-ai guide on the pull
    request to (re-)generate the reviewer's guide at any time.
  • Resolve all Sourcery comments: Comment @sourcery-ai resolve on the
    pull request to resolve all Sourcery comments. Useful if you've already
    addressed all the comments and don't want to see them anymore.
  • Dismiss all Sourcery reviews: Comment @sourcery-ai dismiss on the pull
    request to dismiss all existing Sourcery reviews. Especially useful if you
    want to start fresh with a new review - don't forget to comment
    @sourcery-ai review to trigger a new review!

Customizing Your Experience

Access your dashboard to:

  • Enable or disable review features such as the Sourcery-generated pull request
    summary, the reviewer's guide, and others.
  • Change the review language.
  • Add, remove or edit custom review instructions.
  • Adjust other review settings.

Getting Help

@rh-jfuller
rh-jfuller requested a review from a team July 21, 2026 10:46

@sourcery-ai sourcery-ai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hey - I've found 2 issues, and left some high level feedback:

  • PURL construction and parsing are currently done with manual string manipulation across catalogers and parse_purl_name_version; consider using the packageurl crate consistently to avoid subtle format/encoding bugs (e.g., scoped npm packages, namespaces) and keep behavior aligned with the spec.
  • Several catalogers (Cargo, Python, Maven/Gradle) implement ad‑hoc line-based parsing for TOML / lockfiles instead of using format-aware parsers; this will be brittle against variations in file structure, so it would be safer to switch to existing crates (e.g., cargo-lock, TOML parsers) or reuse workspace utilities where available.
  • In the container tar extraction (extract_archive), the result of entry.unpack_in(dest) is ignored and any per-entry I/O errors are silently suppressed; consider handling or logging these errors explicitly so partial extraction failures don't go unnoticed and lead to confusing scan results.
Prompt for AI Agents
Please address the comments from this code review:

## Overall Comments
- PURL construction and parsing are currently done with manual string manipulation across catalogers and `parse_purl_name_version`; consider using the `packageurl` crate consistently to avoid subtle format/encoding bugs (e.g., scoped npm packages, namespaces) and keep behavior aligned with the spec.
- Several catalogers (Cargo, Python, Maven/Gradle) implement ad‑hoc line-based parsing for TOML / lockfiles instead of using format-aware parsers; this will be brittle against variations in file structure, so it would be safer to switch to existing crates (e.g., `cargo-lock`, TOML parsers) or reuse workspace utilities where available.
- In the container tar extraction (`extract_archive`), the result of `entry.unpack_in(dest)` is ignored and any per-entry I/O errors are silently suppressed; consider handling or logging these errors explicitly so partial extraction failures don't go unnoticed and lead to confusing scan results.

## Individual Comments

### Comment 1
<location path="tools/scanner/src/cataloger/python.rs" line_range="170-179" />
<code_context>
+///
+/// Looks for `[project] dependencies = [...]` entries with pinned (`==`)
+/// or minimum (`>=`) versions. Also checks `[tool.poetry.dependencies]`.
+fn parse_pyproject_toml(content: &str, path: &Path, packages: &mut Vec<DiscoveredPackage>) {
+    // Track which section we're in.
+    let mut in_dependencies = false;
+    let mut in_poetry_deps = false;
+
+    for line in content.lines() {
+        let trimmed = line.trim();
+
+        // Section headers.
+        if trimmed.starts_with('[') {
+            in_dependencies = trimmed == "[project]"
+                || trimmed == "dependencies = ["
+                || in_dependencies && trimmed.starts_with('"');
</code_context>
<issue_to_address>
**issue (bug_risk):** Section tracking in `parse_pyproject_toml` is brittle and likely misclassifies lines in non-[project] sections.

The current logic mixes section header detection with dependency array parsing and toggles `in_dependencies` on any `[`-prefixed line, which can misinterpret non-`[project]` sections (e.g. `[tool.poetry]` with a `dependencies = [` array). Consider instead:

- Track the current section name whenever `trimmed.starts_with('[')`.
- Set `in_dependencies = true` only when `current_section == "project"` and you see `dependencies = [`.
- Keep `in_dependencies` scoped to the `[project]` section and use a separate flag for other sections.

This will prevent accidentally parsing dependency strings from unrelated tables and make the control flow clearer.
</issue_to_address>

### Comment 2
<location path="tools/scanner/src/cataloger/mod.rs" line_range="174-176" />
<code_context>
+            let matches = if let Some(suffix) = pattern.strip_prefix('*') {
+                // Suffix match: *.lock, *.toml, etc.
+                name.ends_with(suffix)
+            } else if pattern.contains('/') {
+                // Path-based match.
+                path_str.ends_with(pattern)
+            } else {
+                // Exact filename match.
</code_context>
<issue_to_address>
**issue:** Path-based pattern matching assumes `/` as a separator, which will not work on Windows paths.

Using `path_str.ends_with(pattern)` with `/` in the pattern depends on the `Path` display representation matching that separator. On Windows, paths use `\`, so patterns like `"var/lib/dpkg/status"` or `"lib/apk/db/installed"` will never match. To make this portable, either compare `Path` components instead of string suffixes, or normalize both the path and the pattern to a common separator before matching.
</issue_to_address>

Sourcery is free for open source - if you like our reviews please consider sharing them ✨
Help me be more useful! Please click 👍 or 👎 on each comment and I'll use the feedback to improve your reviews.

Comment on lines +170 to +179
fn parse_pyproject_toml(content: &str, path: &Path, packages: &mut Vec<DiscoveredPackage>) {
// Track which section we're in.
let mut in_dependencies = false;
let mut in_poetry_deps = false;

for line in content.lines() {
let trimmed = line.trim();

// Section headers.
if trimmed.starts_with('[') {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

issue (bug_risk): Section tracking in parse_pyproject_toml is brittle and likely misclassifies lines in non-[project] sections.

The current logic mixes section header detection with dependency array parsing and toggles in_dependencies on any [-prefixed line, which can misinterpret non-[project] sections (e.g. [tool.poetry] with a dependencies = [ array). Consider instead:

  • Track the current section name whenever trimmed.starts_with('[').
  • Set in_dependencies = true only when current_section == "project" and you see dependencies = [.
  • Keep in_dependencies scoped to the [project] section and use a separate flag for other sections.

This will prevent accidentally parsing dependency strings from unrelated tables and make the control flow clearer.

Comment on lines +174 to +176
} else if pattern.contains('/') {
// Path-based match.
path_str.ends_with(pattern)

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

issue: Path-based pattern matching assumes / as a separator, which will not work on Windows paths.

Using path_str.ends_with(pattern) with / in the pattern depends on the Path display representation matching that separator. On Windows, paths use \, so patterns like "var/lib/dpkg/status" or "lib/apk/db/installed" will never match. To make this portable, either compare Path components instead of string suffixes, or normalize both the path and the pattern to a common separator before matching.

@rh-jfuller rh-jfuller self-assigned this Jul 21, 2026
@rh-jfuller rh-jfuller added the enhancement New feature or request label Jul 21, 2026
A Rust CLI tool that scans directories, SBOM files, container images,
and bare PURLs for known vulnerabilities using a trustify backend.

Scan targets:
- dir:PATH — walk filesystem, discover packages via catalogers
- sbom:PATH — parse SPDX (2.x/3.x) or CycloneDX JSON
- registry:IMAGE:TAG — pull from OCI registry (SBOM-first, layer fallback)
- oci-archive:PATH — unpack local OCI archive tarball
- pkg:TYPE/NAME@VERSION — analyze a single PURL directly

Package catalogers:
- APK (Alpine), dpkg (Debian/Ubuntu), RPM (filename heuristic)
- Cargo.lock, go.sum, package-lock.json (v1/v2/v3)
- requirements.txt, pyproject.toml, uv.lock, poetry.lock, Pipfile.lock
- gradle.lockfile

Container scanning uses SBOM-first strategy: checks for cosign SBOM
attachments (sha256-DIGEST.sbom tag convention) before falling back to
layer extraction. This matches how Red Hat SBOMer/Konflux builds attach
SBOMs to container images.

Output formats: list (grype-style default), table, JSON.
CI integration via --fail-on severity threshold (exit code 1).
Auth: static token, OIDC client_credentials, or unauthenticated.

Security: symlinks off by default (--follow-links to enable), 256 MiB
file size limit, 2 GiB extraction limit, CycloneDX recursion depth cap,
tar path traversal rejection, UTF-8 safe truncation.

Includes 28 unit tests, Makefile, README, and architecture doc.
@codecov

codecov Bot commented Jul 21, 2026

Copy link
Copy Markdown

Codecov Report

❌ Patch coverage is 28.22458% with 1419 lines in your changes missing coverage. Please review.
✅ Project coverage is 68.82%. Comparing base (8c7484c) to head (48cb46d).
⚠️ Report is 2 commits behind head on main.

Files with missing lines Patch % Lines
tools/scanner/src/cataloger/python.rs 0.00% 258 Missing ⚠️
tools/scanner/src/container.rs 0.00% 254 Missing ⚠️
tools/scanner/src/analyze.rs 20.58% 162 Missing ⚠️
tools/scanner/src/output/list.rs 16.26% 103 Missing ⚠️
tools/scanner/src/cataloger/mod.rs 4.39% 85 Missing and 2 partials ⚠️
tools/scanner/src/main.rs 0.00% 84 Missing ⚠️
tools/scanner/src/client.rs 0.00% 78 Missing ⚠️
tools/scanner/src/auth.rs 0.00% 69 Missing ⚠️
tools/scanner/src/cataloger/npm.rs 0.00% 69 Missing ⚠️
tools/scanner/src/output/table.rs 0.00% 50 Missing ⚠️
... and 10 more
Additional details and impacted files
@@            Coverage Diff             @@
##             main    #2527      +/-   ##
==========================================
- Coverage   71.69%   68.82%   -2.88%     
==========================================
  Files         457      477      +20     
  Lines       27743    29729    +1986     
  Branches    27743    29729    +1986     
==========================================
+ Hits        19890    20460     +570     
- Misses       6710     8102    +1392     
- Partials     1143     1167      +24     

☔ View full report in Codecov by Harness.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.

@rh-jfuller
rh-jfuller marked this pull request as draft July 22, 2026 03:51
@rh-jfuller rh-jfuller changed the title feat: add trustify-scanner CLI tool for vulnerability scanning expirement(tools): add trustify-scanner CLI tool for vulnerability scanning Jul 23, 2026
@rh-jfuller rh-jfuller changed the title expirement(tools): add trustify-scanner CLI tool for vulnerability scanning expirement(tools): trustify-scanner CLI tool for vulnerability scanning Jul 23, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

enhancement New feature or request

Projects

Status: No status

Development

Successfully merging this pull request may close these issues.

1 participant