Skip to content
Merged
Show file tree
Hide file tree
Changes from 109 commits
Commits
Show all changes
123 commits
Select commit Hold shift + click to select a range
c7899b5
Added using Dependency Review on branches
aegilops Nov 26, 2025
d2a6b9f
Added Dependency Submission with Component Detection
aegilops Nov 26, 2025
ec32784
Added language choice to submission
aegilops Nov 26, 2025
5043ccb
Debug of submission, partial progress, but not working yet
aegilops Nov 26, 2025
a729fb3
Single repo scanning added. More scaffolding added to enable Dep Revi…
aegilops Nov 27, 2025
506b9a2
Runs component-detection now, but is killed on MacOS
aegilops Nov 27, 2025
68f5d22
Allow using component-detection at a provided path
aegilops Nov 28, 2025
51a111e
Refactor, make branch submission independent of freshly fetching SBOM
aegilops Nov 28, 2025
6f43ed0
Removed unused function
aegilops Nov 28, 2025
c002406
Works for branch changes
aegilops Nov 28, 2025
4787c2e
Formatting
aegilops Dec 1, 2025
290c070
Updated malware matching to do diffs
aegilops Dec 1, 2025
e55933e
Updated README
aegilops Dec 1, 2025
3e94895
Removed default branch limit
aegilops Dec 1, 2025
5364da0
Update to better handling rate limiting when querying malware database
aegilops Dec 1, 2025
00116c5
Allows just malware sync/caching
aegilops Dec 2, 2025
5c92626
Fix single repo behaviour on first pass
aegilops Dec 2, 2025
9f284c2
Fixed missing diff from skipped branches
aegilops Dec 2, 2025
f6d37c2
Allow forcing submission with Component Detection
aegilops Dec 2, 2025
33415a9
Fixed not waiting for process
aegilops Dec 2, 2025
3e65ebc
Now runs Component Detection correctly, on correct path
aegilops Dec 2, 2025
6314b14
Fixed mistake reading wrong path in Component Detection
aegilops Dec 2, 2025
99b20d9
Fixed missing graphs by normalising appropriately
aegilops Dec 4, 2025
3a89bfb
CHANGELOG
aegilops Dec 4, 2025
1887425
Fixed submission by fixing calling of git to capture STDOUT properly
aegilops Dec 4, 2025
9ea2fa0
Update docs
aegilops Dec 4, 2025
7f13c04
Update GHES URL for listing orgs
aegilops Dec 4, 2025
dab9c61
CHANGELOG
aegilops Dec 4, 2025
42bc4ac
Merge branch 'main' into dependency-review
aegilops Dec 4, 2025
12b5390
Potential fix for pull request finding 'Unused variable, import, func…
aegilops Dec 4, 2025
3b35d1c
Potential fix for pull request finding 'Semicolon insertion'
aegilops Dec 4, 2025
f3135f5
Improved property assignment from untrusted value
aegilops Dec 4, 2025
5cea67b
Update src/componentDetection.ts
aegilops Dec 4, 2025
9364ebc
Update src/cli.ts
aegilops Dec 4, 2025
afca11d
Update src/test-branch-search.ts
aegilops Dec 4, 2025
5d18ee5
Update src/componentDetection.ts
aegilops Dec 4, 2025
b4fa046
Update src/types.ts
aegilops Dec 4, 2025
fc20a4c
Update src/componentSubmission.ts
aegilops Dec 4, 2025
50cc8fb
Initial plan
Copilot Dec 4, 2025
8554a0a
Fix some issues
aegilops Dec 4, 2025
9c54209
Merge branch 'dependency-review' of https://github.com/advanced-secur…
aegilops Dec 4, 2025
83fb834
Update src/componentDetection.ts
aegilops Dec 4, 2025
ac8ea00
Fix submitSnapshot to return boolean indicating success/failure
Copilot Dec 4, 2025
15bd0e9
Initial plan
Copilot Dec 4, 2025
988b8ef
Add missing JSDoc parameter documentation for octokit
Copilot Dec 4, 2025
1d0d38c
Fix numbering in MD
aegilops Dec 4, 2025
c16aa51
Merge branch 'dependency-review' of https://github.com/advanced-secur…
aegilops Dec 4, 2025
e262cf5
Update src/cli.ts
aegilops Dec 4, 2025
ebf5b45
Fixed const/let
aegilops Dec 4, 2025
410f95e
Fix latestCommitDate to use actual commit date from API
Copilot Dec 4, 2025
a7a725b
Removed newVersion
aegilops Dec 4, 2025
5544df5
Update src/sbomCollector.ts
aegilops Dec 4, 2025
6c6c8b9
Update src/componentDetection.ts
aegilops Dec 5, 2025
a001a19
Update src/componentSubmission.ts
aegilops Dec 5, 2025
aafcd0f
Update package.json
aegilops Dec 5, 2025
3c40bc2
Allow undefined commit date
aegilops Dec 5, 2025
09cafe8
Fixed up Component Detection/Submission
aegilops Dec 5, 2025
da53c0b
Fixed missing await
aegilops Dec 5, 2025
a67db56
Updated packages
aegilops Dec 5, 2025
98dee3d
Fixed test
aegilops Dec 5, 2025
bc125d7
Updated test running
aegilops Dec 5, 2025
8b51d9a
Remove test file and put in ignore file
aegilops Dec 5, 2025
95896ab
Update src/componentSubmission.ts
aegilops Dec 5, 2025
95a7fd0
Update src/componentSubmission.ts
aegilops Dec 5, 2025
93d441c
Update src/componentDetection.ts
aegilops Dec 5, 2025
bd656c6
Update README.md
aegilops Dec 5, 2025
51bde41
Update src/sbomCollector.ts
aegilops Dec 5, 2025
f909bdc
Update src/componentSubmission.ts
aegilops Dec 5, 2025
f3673af
Update src/componentDetection.ts
aegilops Dec 5, 2025
938d965
Fix repo URL
aegilops Dec 5, 2025
8e6e341
Update src/componentSubmission.ts
aegilops Dec 5, 2025
580711e
Made job id nearly impossible to clash
aegilops Dec 5, 2025
5c8606b
Removed pointless cast to any
aegilops Dec 5, 2025
8e33d30
Merge branch 'dependency-review' of https://github.com/advanced-secur…
aegilops Dec 5, 2025
bdfe2f6
Move error count outside scope
aegilops Dec 5, 2025
ca7d8b6
Limit retries of diff
aegilops Dec 5, 2025
f2296bd
Initial plan
Copilot Dec 5, 2025
22fde03
Convert async forEach loops to for...of loops to fix race conditions
Copilot Dec 5, 2025
f119054
Add proper type definitions for ComponentDetectionPackage constructor
Copilot Dec 5, 2025
72477cf
Merge branch 'dependency-review' into copilot/sub-pr-21-another-one
aegilops Dec 5, 2025
dccef0c
Merge pull request #24 from advanced-security/copilot/sub-pr-21-anoth…
aegilops Dec 5, 2025
3991ca0
Merge branch 'dependency-review' of https://github.com/advanced-secur…
aegilops Dec 5, 2025
ee77207
Merge branch 'dependency-review' into copilot/sub-pr-21-one-more-time
aegilops Dec 5, 2025
6babca9
Merge pull request #26 from advanced-security/copilot/sub-pr-21-one-m…
aegilops Dec 5, 2025
8d93e53
Better repo handling for --repo
aegilops Dec 8, 2025
d6cad1f
Merge branch 'dependency-review' of https://github.com/advanced-secur…
aegilops Dec 8, 2025
e103f8a
Merge pull request #27 from advanced-security/copilot/sub-pr-21-pleas…
aegilops Dec 8, 2025
5b00aaf
Sort out retries parameter and handling skipping submission
aegilops Dec 8, 2025
546e33d
Fixed missing backticks
aegilops Dec 8, 2025
82b58da
Added checking retries and made it pre-decrement
aegilops Dec 8, 2025
e6b11d9
Update src/componentDetection.ts
aegilops Dec 8, 2025
f963d36
Use exact comparison
aegilops Dec 8, 2025
1d04ee8
Update src/sbomCollector.ts
aegilops Dec 8, 2025
46f8f8c
Clarified comment
aegilops Dec 8, 2025
fb52fb9
Removed type ignore
aegilops Dec 8, 2025
4997078
Update src/componentDetection.ts
aegilops Dec 8, 2025
e3aaf6f
Formatted
aegilops Dec 8, 2025
4dcf2b3
Update src/sbomCollector.ts
aegilops Dec 8, 2025
5ac59f7
Merge branch 'dependency-review' of https://github.com/advanced-secur…
aegilops Dec 8, 2025
ba8ff05
Update src/componentDetection.ts
aegilops Dec 8, 2025
5431556
Update src/sbomCollector.ts
aegilops Dec 8, 2025
4ad422a
Initial plan
Copilot Dec 8, 2025
a1e931f
Merge branch 'main' into dependency-review
aegilops Dec 8, 2025
395c925
Make snapshot ingestion delays configurable
Copilot Dec 8, 2025
4b2e75c
Update src/malwareMatcher.ts
aegilops Dec 8, 2025
3d5f9ad
Remove redundant 'ms' from log message
Copilot Dec 8, 2025
e7f34a6
Add CLI arguments for snapshot ingestion delays
Copilot Dec 8, 2025
de9be57
Merge pull request #28 from advanced-security/copilot/sub-pr-21-a1e28…
aegilops Dec 9, 2025
bd2e92e
Update src/componentDetection.ts
aegilops Dec 9, 2025
a798460
Fix mismerged code
aegilops Dec 9, 2025
bfa1e6a
Remove redundant assignment
aegilops Dec 9, 2025
5607399
Fix SBOM counts and caching
aegilops Dec 9, 2025
9a78c60
Update src/malwareMatcher.ts
aegilops Dec 9, 2025
6be40f1
Remove default for malware-cache
aegilops Dec 9, 2025
d5bad5a
Added namespace to type
aegilops Dec 9, 2025
3bd2d15
Merge branch 'dependency-review' of https://github.com/advanced-secur…
aegilops Dec 9, 2025
b2d1d03
Minor changes to logging
aegilops Dec 9, 2025
a502377
Remove unused type
aegilops Dec 9, 2025
4efe35e
Add more delays to processing
aegilops Dec 9, 2025
abe838a
Update CHANGELOG
aegilops Dec 9, 2025
2339190
Minor README updates
aegilops Dec 9, 2025
810fda3
Encoding URI parts in PURL, removed unneeded code
aegilops Dec 9, 2025
2d3fe41
Update src/cli.ts
aegilops Dec 9, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 3 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -3,4 +3,6 @@ dist/
.env
data/
.vscode/
.DS_Store
.DS_Store
component-detection
tmp-branch-search-cache/
3 changes: 3 additions & 0 deletions .gitmodules
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
[submodule "component-detection-dependency-submission-action"]
path = component-detection-dependency-submission-action
url = https://github.com/advanced-security/component-detection-dependency-submission-action.git
32 changes: 32 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
# Changelog

## [2025-12-04] – 0.2.0 - Branch scanning and dependency submission

Added:

- Branch scanning:
- Fetch SBOM diffs for non‑default branches via Dependency Review API.
- Added `--branch-scan`, `--branch-limit`, and `--diff-base` CLI flags.
- Dependency Submission integration:
- Automatically submits dependency snapshots for branches being scanned, if not already present, using Component Detection.
- Language-aware sparse checkout.
- Use a pre-downloaded binary (`--component-detection-bin`) or an auto-downloaded release.
- Search and matching:
- Refactored search to de-duplicate logic and include branch diffs (added/updated packages only).
- Malware matching enhanced to enumerate packages from diffs; matches annotated with branch.
- CLI and CSV outputs include branch context; CSV adds a `branch` column.
- CLI and UX improvements:
- Argument validation updated: `--sync-sboms` requires `--sbom-cache`.
- Malware-only mode: allow `--sync-malware` without `--sbom-cache` (requires `--malware-cache`).
- JSON/CLI/CSV interaction clarified and documented.
- Added examples for malware-only sync and branch scanning.
- Advisory sync robustness:
- GraphQL advisory sync now implements adaptive retries with exponential backoff and `Retry-After` support; respects `--quiet`.

Fixed:

- Added `--ghes` flag to ensure proper API URL construction for GitHub Enterprise Server instances.

## [2025-10-06] - 0.1.0 - Initial public release

- Initial release, with: SBOM sync; malware sync; malware matching; CLI, file based and interactive PURL searching. SARIF, CSV and JSON outputs supported.
151 changes: 126 additions & 25 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ Supports human-readable, JSON, CSV and SARIF output. SARIF alerts can be uploade
- Optional progress bar while fetching SBOMs
- Option to suppress secondary rate limit warnings, and full quiet mode to suppress informative messages
- Adaptive backoff: each secondary rate limit hit increases the SBOM fetch delay by 10% to reduce future throttling
- Optional branch scanning†: fetch SBOM diffs with Dependency Review for non-default branches and submit missing dependency snapshots if needed with Component Detection + Dependency Submission
- Offline caching of SBOMs and security advisories with incremental updates
- Matching:
- Version-aware matching of SBOM packages against malware advisories
Expand All @@ -27,9 +28,12 @@ Supports human-readable, JSON, CSV and SARIF output. SARIF alerts can be uploade
- Output:
- Human-readable console output
- JSON or CSV output (to stdout or file) with both search and malware matches
- Optional SARIF 2.1.0 output per repository for malware matches with optional Code Scanning upload
- Optional SARIF 2.1.0 output per repository for malware matches
- includes Code Scanning upload†
- Works with GitHub.com, GitHub Enterprise Server, GitHub Enterprise Managed Users and GitHub Enterprise Cloud with Data Residency (custom base URL)

† GitHub Advanced Security or GitHub Code Security required for this feature

## Usage

### Quick Start
Expand All @@ -55,6 +59,76 @@ Using GitHub Enterprise Server:
npm run start -- --sync-sboms --enterprise ent --base-url https://github.internal/api/v3 --sbom-cache sboms --token $GHES_TOKEN
```

### 🔀 Branch Scanning & Dependency Review

Enable branch SBOM collection and dependency diffs with `--branch-scan`.

Flags:

```bash
--branch-scan # Fetch SBOMs for non-default branches
--branch-limit <n> # Max number of non-default branches per repo (default 10)
--diff-base <branch> # Override base branch for diffs (default: repository default)
```

Example: scan first 5 feature branches and diff them against `main`:

```bash
npm run start -- --sync-sboms --org my-org \
--sbom-cache sboms --branch-scan --branch-limit 5 \
--diff-base main --token $GITHUB_TOKEN
```

Search results will include branch matches: package PURLs annotated with `@branch` inside the match list (e.g. `pkg:npm/react@18.3.0@feature-x`). Dependency Review additions / updates are also searched; only added/updated head-side packages are considered.

If a branch SBOM or diff retrieval fails, the error is recorded but does not stop collection for other branches or repositories.

#### Handling Missing Dependency Review Snapshots

If the Dependency Review API returns a 404 for a branch diff (commonly due to a missing dependency snapshot on either the base or head commit), the toolkit can optionally attempt to generate and submit a snapshot using Component Detection and Dependency Submission. This is vendored-in and forked from the public [Component Detection Dependency Submission Action](https://github.com/advanced-security/component-detection-dependency-submission-action).

Enable automatic submission + retry with:

```bash
--submit-on-missing-snapshot
```

The tool will attempt to download the latest Component Detection release from GitHub Releases into the current directory, to run it, unless you provide a local binary with `--component-detection-bin`.

If submission fails, the original 404 reason is retained and collection proceeds.

##### Using a Local Component Detection Binary

Instead of downloading the latest release automatically, you can point the toolkit at a local `component-detection` executable. This is useful if you already manage the binary or need a custom build.

Pass the path via `--component-detection-bin` and optionally limit languages to reduce sparse checkout size:

```bash
npm run start -- \
--sync-sboms --org my-org --sbom-cache sboms \
--branch-scan --submit-on-missing-snapshot \
--submit-languages JavaScript,TypeScript \
--component-detection-bin /usr/local/bin/component-detection
```

On MacOS, you may find that system protection prevents running a downloaded binary. You can [check out the .NET code](https://github.com/microsoft/component-detection/) and run it via a wrapper script such as:

```bash
#!/bin/bash

SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"

cd "$SCRIPT_DIR" || exit 1

dotnet run --project "./src/Microsoft.ComponentDetection/Microsoft.ComponentDetection.csproj" "$@"
```

Notes:

- Providing `--component-detection-bin` skips any download logic and uses your binary directly.
- Snapshot submission performs a language-aware sparse checkout of common manifest/lock files (e.g., `package.json`, `requirements.txt`, `pom.xml`).
- After submission, the toolkit waits briefly and retries the dependency review diff once.

### 🔑 Authentication

A GitHub token with appropriate scope is required when performing network operations such as `--sync-sboms`, `--sync-malware` and `--upload-sarif`.
Expand Down Expand Up @@ -123,6 +197,12 @@ Offline match with already-cached malware advisories (no network calls):
npm run start -- --sbom-cache sboms --malware-cache malware-cache --match-malware
```

Malware-only advisory sync (no SBOM cache required):

```bash
npm run start -- --sync-malware --malware-cache malware-cache --token $GITHUB_TOKEN
```

Write malware matches (and optionally search results later) to a JSON file using `--output-file`:

```bash
Expand All @@ -131,6 +211,16 @@ npm run start -- --sbom-cache sboms --malware-cache malware-cache --match-malwar

If you also perform a search in the same invocation (add `--purl` or `--purl-file`), the JSON file will contain both `malwareMatches` and `search` top-level keys.

#### Advisory Rate Limit Handling

Advisory sync uses GitHub GraphQL with adaptive retry/backoff to handle secondary rate limits and transient errors:

- Retries on `403` secondary rate limit, `429`, and `5xx` responses.
- Honors `Retry-After` when provided; otherwise uses exponential backoff with jitter.
- Respects `--quiet` to suppress retry log messages.

If retries are exhausted, the sync aborts gracefully and leaves previously cached advisories intact.

#### Ignoring Matches

Provide a YAML ignore file via `--ignore-file` to suppress specific matches (before SARIF generation / JSON output). Structure:
Expand Down Expand Up @@ -295,31 +385,42 @@ Then type one PURL query per line. Entering a blank line or using Ctrl+C on a bl

| Arg | Purpose |
|------|---------|
| `--sbom-cache <dir>` | Directory holding per-repo SBOM JSON files (required for offline mode; used as write target when syncing) |
| `--sync-sboms` | Perform API calls to (re)collect SBOMs; without it the CLI runs offline loading cached SBOMs. Requires a GitHub token |
| `--enterprise <slug>` / `--org <login>` | Scope selection (mutually exclusive when syncing) |
| `--purl <purl>` | Add a PURL/range/wildcard query (repeatable) |
| `--purl-file <file>` | File with one query per line |
| `--json` | Emit search JSON to stdout (unless overridden by `--output-file`) |
| `--cli` | Also emit human-readable output when producing JSON (requires `--output-file`) |
| `--output-file <file>` | Write search JSON payload to file; required when using both `--json` and `--cli` |
| `--interactive` | Enter interactive search prompt after initial processing |
| `--sync-malware` | Fetch & cache malware advisories (MALWARE classification). Requires a GitHub token |
| `--match-malware` | Match current SBOM set against cached advisories |
| `--malware-cache <dir>` | Advisory cache directory (required with malware operations) |
| `--malware-cutoff <ISO-date>` | Ignore advisories whose publishedAt AND updatedAt are both before this date/time (e.g. `2025-09-29` or full timestamp) |
| `--ignore-file <path>` | YAML ignore file (advisories / purls / scoped blocks) to filter malware matches before output |
| `--ignore-unbounded-malware` | Ignore matches whose advisory vulnerable version range covers all versions (e.g. `*`, `>=0`, `0.0.0`) |
| `--sarif-dir <dir>` | Write SARIF 2.1.0 files per repository (with malware matches) |
| `--upload-sarif` | Upload generated SARIF to Code Scanning (requires --match-malware & --sarif-dir and a GitHub token) |
| `--token <token>` | GitHub token; required for `--sync-sboms`, `--sync-malware`, and `--upload-sarif` (or use `GITHUB_TOKEN`) |
| `--enterprise <slug>` | Collect across all orgs in an Enterprise (mutually exclusive with `--org`/`--repo` when syncing) |
| `--org <login>` | Single organization scope (mutually exclusive with `--enterprise`/`--repo` when syncing) |
| `--repo <name>` | Single repository scope (mutually exclusive with `--enterprise`/`--org` when syncing) |
| `--base-url <url>` | GitHub Enterprise Server REST base URL (e.g. `https://ghe.example.com/api/v3`) |
| `--concurrency <n>` | Parallel SBOM fetches (default 5) |
| `--sbom-delay <ms>` | Delay between SBOM fetch (dependency-graph/sbom) requests (default 5000) |
| `--light-delay <ms>` | Delay between lightweight metadata calls (listing repos, commit head checks) (default 500) |
| `--base-url <url>` | GitHub Enterprise Server REST base URL (ends with /api/v3) |
| `--progress` | Show a dynamic progress bar during SBOM collection |
| `--suppress-secondary-rate-limit-logs` | Hide secondary rate limit warning lines (automatically applied with `--progress`) |
| `--quiet` | Suppress all non-error and non-result output (progress bar, JSON and human readable output still show) |
| `--ca-bundle <path>` | Path to a PEM file containing one or more additional CA certificates (self‑signed / internal PKI) |
| `--sbom-delay <ms>` | Delay between SBOM fetch requests (default 3000) |
| `--light-delay <ms>` | Delay between lightweight metadata requests (default 100) |
| `--sbom-cache <dir>` | Directory to read/write per‑repo SBOM JSON; required for offline mode |
| `--sync-sboms` | Perform API calls to collect SBOMs; without it the CLI runs offline using `--sbom-cache` |
| `--progress` | Show a progress bar during SBOM collection |
| `--suppress-secondary-rate-limit-logs` | Suppress secondary rate limit warning logs (useful with `--progress`) |
| `--quiet` | Suppress non‑error output (progress bar and machine output still emitted) |
| `--ca-bundle <path>` | PEM bundle with additional CA certs for REST/GraphQL/SARIF upload |
| `--purl <purl>` | Add a PURL / semver range / wildcard query (repeatable) |
| `--purl-file <file>` | File with one query per line (supports comments) |
| `--json` | Emit search results as JSON (to stdout unless `--output-file` specified) |
| `--cli` | Also emit human‑readable output when producing JSON/CSV; requires `--output-file` to avoid mixed stdout |
| `--csv` | Emit results (search + malware matches) as CSV (to stdout or `--output-file`) |
| `--output-file <file>` | Write JSON/CSV output to file; required when using `--cli` with `--json` or `--csv` |
| `--interactive` | Enter interactive PURL search prompt after initial processing |
| `--sync-malware` | Fetch & cache malware advisories (MALWARE); requires a token |
| `--match-malware` | Match SBOM packages against cached malware advisories |
| `--malware-cache <dir>` | Directory to store malware advisory cache (required with malware operations) |
| `--malware-cutoff <ISO-date>` | Exclude advisories whose `publishedAt` and `updatedAt` are both before cutoff |
| `--ignore-file <path>` | YAML ignore file (advisories / purls / scoped blocks) to filter matches before output |
| `--ignore-unbounded-malware` | Suppress advisories with effectively unbounded vulnerable ranges (e.g. `*`, `>=0`) |
| `--sarif-dir <dir>` | Write SARIF 2.1.0 files per repository (for malware matches) |
| `--upload-sarif` | Upload generated SARIF to Code Scanning (requires `--match-malware` and `--sarif-dir`) |
| `--branch-scan` | Fetch SBOM diffs for non‑default branches (limited by `--branch-limit`) |
| `--branch-limit <n>` | Limit number of non‑default branches scanned per repository (default 10) |
| `--diff-base <branch>` | Override base branch for dependency review diffs (defaults to repository default branch) |
| `--submit-on-missing-snapshot` | On diff 404, run Component Detection to submit a snapshot, then retry |
| `--submit-languages <list>` | Limit snapshot submission to specific languages (comma‑separated) |
| `--component-detection-bin <path>` | Path to local `component-detection` executable (skip download) |
| `--debug` | Enable debug logging |

## Build & test

Expand Down
20 changes: 20 additions & 0 deletions fixtures/sboms/advanced-security/test-sbom-repo/sbom.json
Original file line number Diff line number Diff line change
Expand Up @@ -69,5 +69,25 @@
}
]
}
],
"branchDiffs": [
{
"latestCommitDate": "2025-12-01T12:39:01.734Z",
"base": "main",
"head": "test",
"retrievedAt": "2025-12-01T12:39:01.734Z",
"changes": [
{
"changeType": "added",
"name": "chalk",
"ecosystem": "npm",
"packageURL": "pkg:npm/chalk@5.6.1",
"license": "MIT",
"manifest": "package-lock.json",
"scope": "runtime",
"version": "5.6.1"
}
]
}
]
}
Loading