# `foxglove`

[![#foxglove](https://img.shields.io/badge/slack-foxglove-brightgreen.svg?logo=slack)](https://orcd.slack.com/archives/C07M4P7GKLN)


`foxglove` is named after [@benburton](https://github.com/benburton)'s cat, Foxglove. It scans for security vulnerabilities like she scans his apartment for mice.

> Scan **any** repository you like[*](#repository-notes), with any source you like[*](#sources), with any output format you like [*](#formats).

That's the goal, anyway.

If you would like to see the intro video from Tech Week, FY2025 Q3 you can click the image below.

[<img src="/docs/images/intro-video.png" width="600">](https://drive.google.com/file/d/1zZUMqa6Vo4hddUU5ZRfxJrCQWD6Nnjhn/view?usp=drive_link),

## Quickstart

### 1. Install (this process needs improvement):

```sh
curl -fsSL https://bun.sh/install | bash
git clone git@github.com:theorchard/foxglove.git
cd foxglove
bun install
bun foxglove install
```

### 2. Update Your Shell Configuration
Add `foxglove` to your terminal's configuration whether that be your `~/.zshrc` or `~/.bashrc` file.

```shell
#foxglove
export PATH="$HOME/.foxglove:$PATH"
```


### Use

```sh
$ cd ows-something
ows-something$ foxglove local
                _____              _                
  ／l、        |  ___|____  ____ _| | _____   _____ 
（ﾟ､ ｡ ７      | |_ / _ \ \/ / _` | |/ _ \ \ / / _ \
  l  ~ヽ       |  _| (_) >  < (_| | | (_) \ V /  __/
  じしf_,)ノ   |_|  \___/_/\_\__, |_|\___/ \_/ \___|
                             |___/                  
  
[local] Fetch reference:	git@github.com:theorchard/ows-something.git
	Organization:		theorchard
	Repository:		ows-something

Contacting Github...

🐞 GitHub output contains 2 vulnerabilities
┌─────────────┬──────────┬──────────┬──────────────────┬────────────────┐
│ File        │ Package  │ Severity │ Required Version │ CVE ID         │
├─────────────┼──────────┼──────────┼──────────────────┼────────────────┤
│ poetry.lock │ pymysql  │ CRITICAL │ 1.1.1            │ CVE-2024-36039 │
├─────────────┼──────────┼──────────┼──────────────────┼────────────────┤
│ poetry.lock │ sqlparse │ HIGH     │ 0.5.0            │ CVE-2024-4340  │
└─────────────┴──────────┴──────────┴──────────────────┴────────────────┘
```

## Examples


### 🛠️ Default

```sh
foxglove local
```

![Use default source, default output, default format](/docs/images/examples/default.png)



### 🛠️ Use `osv` source, output to the file `output.html` in `html` format. Open the file after write.

```sh
foxglove local \
    --source osv \
    --format html \
    --output output.html \
    --open
```

![Use `osv` source, output to the file `output.html` in `html` format.](/docs/images/examples/osv-html.png)


- `$ foxglove local` executes the `/src/tasks/local` task
- `--source ovs` selects `src/connectors/ovs`
  - `src/connectors/osv` uses the `osv-scanner` cli to retrieve `Vulnerability[]`
- `--format html` combines `Vulnerability[]` output with `src/output/html`
  - `src/output/html` uses `src/output/markdown` to format to markdown and then HTML
- `--output output.html` sets the file path to be written
- `--open` tells the OS to open the file, and it delegates to the default browser (seen here as Chrome)

### 🛠️ Use `github` source, output to the file `output.xlsx` in `xlsx` format. Open the file after write.

```sh
foxglove local \
  --source github \
  --format xlsx \
  --output output.xlsx \
  --open
```

![Use `github` source, output to the file `output.xlsx` in `xlsx` format.](/docs/images/examples/github-xlsx.png)

- `$ foxglove local` executes the `/src/tasks/local` task
- `--source github` selects `src/connectors/github`
  - `src/connectors/github` uses the `@octokit/core` library to retrieve `Vulnerability[]`
- `--format xlsx` combines `Vulnerability[]` output with `src/output/xlsx`
  - `src/output/xlsx` uses `exceljs` to format to `xlsx`
- `--open` tells the OS to open the file, and it delegates to the default browser (seen here as Excel)

## Getting Started

At present, installation is a little clunky. It would be nice for this to be compiled on a cdn in some capacity.

First, install the [Bun](https://bun.sh/) runtime. Then you can run the install script that just drops into `~/.foxglove`. Read the [install script](./install.sh) if you want to see what it's up to.

```sh
curl -fsSL https://bun.sh/install | bash
git clone git@github.com:theorchard/foxglove.git
cd foxglove
bun install
bun foxglove install
```

## Basic Usage

Use the `--help` argument to get help on basic usage.

```sh
$ foxglove --help
                _____              _                
  ／l、        |  ___|____  ____ _| | _____   _____ 
（ﾟ､ ｡ ７      | |_ / _ \ \/ / _` | |/ _ \ \ / / _ \
  l  ~ヽ       |  _| (_) >  < (_| | | (_) \ V /  __/
  じしf_,)ノ   |_|  \___/_/\_\__, |_|\___/ \_/ \___|
                             |___/                  
  
Usage: foxglove [options] [command]

Options:
  -h, --help        display help for command

Commands:
  ecr [options]     ❌ NOT IMPLEMENTED: Build and scan an SBOM from a Docker image
  install           ✅ Installs the foxglove CLI locally, globally.
  local [options]   ✅ Inspects your git environment, finds the organization and repository, and scans for vulnerabilities.
  pr [options]      🚧 WIP: Creates pull requests from vulnerabilities.
  sbom [options]    ✅ Outputs a raw SBOM (needs testing)
  ticket [options]  ✅ Creates JIRA tickets from vulnerabilities.
  help [command]    display help for command
```

There's more information on the commands when you run this locally.

## Troubleshooting

![github-error image](docs/images/github-error.png)
1. If you have received this error, it means either your Github token has expired or you need 
   to add `GITHUB_TOKEN` as an environment variable to the .env file of the project that is being tested. See [here](https://www.notion.so/JavaScript-Package-Setup-9553d5d491c94835aa787fdf0fc4838d?pvs=4#5b40b9f911fc49e2a4139d342cd55cbc) for more details on how we set 
   this up.

## Development

If you are interested in contributing to `foxglove`, please read the [CONTRIBUTING](./CONTRIBUTING.md) guidelines. If you've found a bug or something, please consider reporting it.

`foxglove` targets the [bun](http://bun.sh/) runtime. In order to work on Foxglove, you need to have `bun` installed so that you have somewhere it can run.

```
curl -fsSL https://bun.sh/install | bash
```
🔼 Installation from [https://bun.sh/install](https://bun.sh/install)


You can run `foxglove`'s tasks within a local `bun` runtime by using the same syntax, prefixed with `bun`.

```sh
bun install
bun foxglove local
```
🔼 This needs to be explained better

When you `bun foxglove install`, you'll be prompted to confirm you want to run the install script. This will compile the `foxglove` binary, with `bun` included, to `~/.foxglove/foxglove`. We may also want global preferences in this directory at some point.


## Sources

```shell
$ foxglove --source github # default
```

`foxglove` supports the following "sources" of information security information:

| Param | Parent | Source | Lockfile | SBOM |
| --- | --- | --- | --- | --- |
| `--source github` | Microsoft | [GitHub GraphQL](https://docs.github.com/en/graphql/reference/objects#securityvulnerability) (dependabot) | ✅ | ❌ | 
| `--source osv` | Google | [Open Source Vulnerabilities](https://osv.dev/) | ✅ | ✅ |
| `--source aws` | Amazon | [Amazon Inspector](https://aws.amazon.com/inspector/) | ❌ | ⬜ |
| `--source npm` | Microsoft | [`npm audit`](https://docs.npmjs.com/cli/v10/commands/npm-audit) | ⬜ JS | ❌ |
| `--source debian-security` | [Sponsors](https://www.freexian.com/lts/debian/#sponsors) | [Debian Security Tracker](https://security-tracker.debian.org/tracker) | ❓ | ❓ | 

<sub>✅ implemented</sub>&nbsp;&nbsp;&nbsp;<sub>⬜ unimplemented</sub>&nbsp;&nbsp;&nbsp;<sub>❌ unsupported</sub>&nbsp;&nbsp;&nbsp;<sub>❓ unchecked</sub>



These are all 3rd party integrations living in [`src/connectors`](src/connectors/). The most detailed one is [`src/connectors/osv`](/src/connectors/osv/).

`foxglove` also treats the [NIST API](https://nvd.nist.gov/developers/vulnerabilities) as the canonical source of CVE data.

## Formats

`foxglove` can output to multiple formats.

```shell
$ foxglove --format cli # default
```

| Supported | Param | Format | Example |
| --- | --- | --- | --- |
| ✅ | `--format cli` (default) | stdout | [snapshot](/src/output/__tests__/__snapshots__/cli.test.ts.snap) |
| ✅ | `--format markdown` | Markdown | [snapshot](/src/output/__tests__/__snapshots__/markdown.test.ts.snap) |
| ✅ | `--format html` | HTML | [snapshot](/src/output/__tests__/__snapshots__/html.test.ts.snap) |
| ✅ | `--format adf` | [ADF](https://developer.atlassian.com/cloud/jira/platform/apis/document/structure/) (Atlassian Document Format) | [snapshot](/src/output/__tests__/__snapshots__/adf.test.ts.snap) |
| ✅ | `--format xlsx` | XLSX | Link to test |

## Repository Structure

The repository structure is intended to mirror closely to other server-side TypeScript projects.

Here's how you dump this:

```shell
brew install tree
tree -L 3 -I node_modules -I docs . -I __tests__
```

Here's what it looks like (ish):

```shell
.
├── CONTRIBUTING.md                   # Guidelines for contributing to foxglove
├── README.md
├── bench                             # Scripts that benchmark how fast foxglove is (or isn't)
│   ├── README.md
│   ├── index.js
│   ├── index.py
│   └── run.sh
├── build
│   └── foxglove                      # The distributable foxglove binary (.gitignore'd)
├── bun.lockb
├── index.ts                          # Entrypoint for the application
├── install.sh                        # Installation script (consider /scripts)
├── package.json
├── src
│   ├── connectors                    # • /connectors: External resources
│   │   ├── github                    # ├─ Connections to GitHub for things like Dependabot
│   │   ├── jira                      # ├─ JIRA connection for creating and evaluating tickets
│   │   ├── nist                      # ├─ NIST API connection for CVE data. It's the source of truth!
│   │   └── osv                       # └─ Connection to Google's `osv-scanner` library
│   ├── constants.ts
│   ├── logic                         # • /logic: Application logic for non-connector bits
│   │   ├── aws                       # ├─ AWS-specific logic
│   │   ├── cvss.ts                   # ├─ Support for parsing CVSS vectors/metrics
│   │   ├── docker                    # ├─ Docker interactions
│   │   ├── filters.ts                # ├─ General FP filtering functions
│   │   ├── git                       # ├─ Local hooks that examine .git
│   │   └── languages                 # └─ Parsing of language-specific dependency files
│   ├── output                        # • /output: Logic for formatting output
│   │   ├── adf.ts                    # ├─ Atlassian Document Format
│   │   ├── cli.ts                    # ├─ Command-line output (cli-table)
│   │   ├── constants.ts              # |
│   │   ├── html.ts                   # ├─ HTML output (converted from markdown w/ markdown-it)
│   │   ├── index.ts                  # |
│   │   ├── markdown.ts               # ├─ Markdown output (raw string joins)
│   │   ├── types.ts                  # |
│   │   └── xlsx.ts                   # └─ XLSX spreadsheet output (exceljs)
│   ├── tasks                         # • CommanderJS Application Tasks
│   │   ├── defaults.ts               # ├─ Defaults for task inputs
│   │   ├── ecr.ts                    # ├─ `foxglove ecr`
│   │   ├── index.ts                  # |
│   │   ├── install.ts                # ├─ `foxglove install` (delegates to install.sh)
│   │   ├── local.ts                  # ├─ `foxglove local`
│   │   ├── pr.ts                     # ├─ `foxglove pr`
│   │   ├── sbom.ts                   # ├─ `foxglove sbom`
│   │   └── ticket.ts                 # └─ `foxglove ticket`
│   └── types.ts
└── tsconfig.json
```

## Compile

```sh
bun compile
```
🔼 Compiles `foxglove` into `build/foxglove`, which is `.gitignore`d for the time being.

## Supported Git URL Formats

The following Git URL formats are supported by `foxglove`:

- `git@github.com:organization/repository.git`
- `https://github.com/organization/repository.git`
- `http://github.com/organization/repository.git`
- `ssh://git@github.com/organization/repository.git`
- `git://github.com/organization/repository.git`
- `git+ssh://git@github.com/organization/repository.git`

These formats are validated using the `gitUrlRegex` in the source code.

## Repository Notes

I would love for this to be in a place where we can dynamically generate the table below. 

This is a log of which repositories have been manually tested with `foxglove` default parameters. If you test a repository consider leaving a note here please. If you encounter a bug please file it in [issues](https://github.com/theorchard/foxglove/issues). This list *does not (yet) reflect which repositories are free of issue* -- just that `foxglove` can run scans on all `sources` with results. Apollo lambdas are not exhaustive. Many repositories are missing.

| Repository | OSV? | GitHub? | Errors/Last Passed |
| --- | --- | --- | -- |
| `apollo-api-healthcheck-lambda` | ⬜ | ⬜ | |
| `apollo-auth0-unblock-bruteforce-users-lambda` | ⬜ | ⬜ | |
| `apollo-charts-feed-messages-lambda` | ⬜ | ⬜ | |
| `apollo-charts-messages-lambda` | ⬜ | ⬜ | |
| `apollo-charts-push-messages-lambda` | ⬜ | ⬜ | |
| `apollo-clear-notifications-lambda` | ⬜ | ⬜ | |
| `apollo-delphi-events-lambda` | ⬜ | ⬜ | |
| `apollo-download-spotify-charts-lambda` | ⬜ | ⬜ | |
| `apollo-juno-email-messages-lambda` | ⬜ | ⬜ | |
| `apollo-juno-filters-messages-lambda` | ⬜ | ⬜ | |
| `apollo-juno-monitoring-lambda` | ⬜ | ⬜ | |
| `apollo-lambdas-metarepo` | ⬜ | ⬜ | |
| `apollo-messages-views-lambda` | ⬜ | ⬜ | |
| `apollo-playlists-messages-lambda` | ⬜ | ⬜ | |
| `apollo-playlists-push-messages-lambda` | ⬜ | ⬜ | |
| `apollo-save-push-receipts-lambda` | ⬜ | ⬜ | |
| `apollo-update-tracks-top-playlists-aggregated-history-lambda` | ⬜ | ⬜ | |
| `graphql-abacus` | ✅ | ✅ | [@benburton](https://github.com/benburton) 2024-10-06 |
| `graphql-account` | ✅ | ✅ | [@benburton](https://github.com/benburton) 2024-10-06 |
| `graphql-analytics` | ✅ | ✅ | [@benburton](https://github.com/benburton) 2024-10-06 |
| `graphql-audience` | ✅ | ✅ | [@benburton](https://github.com/benburton) 2024-10-06 |
| `graphql-collaborator` | ✅ | ✅ | [@benburton](https://github.com/benburton) 2024-10-06 |
| `graphql-content-review` | ✅ | ✅ | [@benburton](https://github.com/benburton) 2024-10-06 |
| `graphql-distribution` | ✅ | ✅ | [@benburton](https://github.com/benburton) 2024-10-06 |
| `graphql-gateway` | ✅ | ✅ | [@benburton](https://github.com/benburton) 2024-10-06 |
| `graphql-knowledge` | ✅ | ✅ | [@benburton](https://github.com/benburton) 2024-10-06 |
| `graphql-knowledge-search` | ✅ | ✅ | [@benburton](https://github.com/benburton) 2024-10-06 |
| `graphql-moneyhub` | ✅ | ✅ | [@benburton](https://github.com/benburton) 2024-10-06 |
| `graphql-neighbouring-rights` | ✅ | ✅ | [@benburton](https://github.com/benburton) 2024-10-06 |
| `graphql-notion` | ⬜ | ⬜ | |
| `graphql-participant` | ✅ | ✅ | [@benburton](https://github.com/benburton) 2024-10-06 |
| `graphql-podcast`| ✅ | ✅ | [@benburton](https://github.com/benburton) 2024-10-06 |
| `graphql-product` | ✅ | ✅ | [@benburton](https://github.com/benburton) 2024-10-06 |
| `graphql-publishing` | ✅ | ✅ | [@benburton](https://github.com/benburton) 2024-10-06 |
| `graphql-router` | ✅ | ✅ | [@benburton](https://github.com/benburton) 2024-10-06 |
| `graphql-rover-utility` | ⬜ | ⬜ | |
| `graphql-sr-delivery` | ✅ | ✅ | [@benburton](https://github.com/benburton) 2024-10-06 |
| `graphql-switchboard` | ❌ | ✅ | Uses unsupported `package-lock.json` |
| `graphql-tax-payment` | ✅ | ✅ | [@benburton](https://github.com/benburton) 2024-10-06 |
| `graphql-user` | ✅ | ✅ | [@benburton](https://github.com/benburton) 2024-10-06 |
| `ows-abacus-account` | ❌ | ✅ | Needs to send `requirements-to-freeze.txt` |
| `ows-abacus-contract` | ✅ | ✅ | [@benburton](https://github.com/benburton) 2024-10-06 |
| `ows-abacus-event` | ❌ | ❌ | Error parsing output |
| `ows-abacus-legacy-sync` | ❌ | ❌ | Error parsing output |
| `ows-abacus-schedule` | ❌ | ❌ | Error parsing output |
| `ows-abacus-state` | ✅ | ✅ | [@benburton](https://github.com/benburton) 2024-10-06 |
| `ows-abacus-worksheet` | ❌ | ❌ | Error parsing output |
| `ows-account` | ✅ | ✅ | [@benburton](https://github.com/benburton) 2024-10-06 |
| `ows-accounting` | ✅ | ✅ | [@benburton](https://github.com/benburton) 2024-10-06 |
| `ows-analytics` | ✅ | ✅ | [@benburton](https://github.com/benburton) 2024-10-06 |
| `ows-analytics-common` | ❌ | ✅ | OSV fails. |
| `ows-analytics-sr` | ✅ | ✅ | [@benburton](https://github.com/benburton) 2024-10-06 |
| `ows-analytics-v2` | ✅ | ✅ | [@benburton](https://github.com/benburton) 2024-10-06 |
| `ows-artist` | ✅ | ✅ | [@benburton](https://github.com/benburton) 2024-10-06 |
| `ows-artwork` | ❌ | ✅ | OSV fails. |
| `ows-asset-file-details` | ✅ | ✅ | [@benburton](https://github.com/benburton) 2024-10-06 |
| `ows-asset-transcoder` | ✅ | ✅ | [@benburton](https://github.com/benburton) 2024-10-06 |
| `ows-assets` | ✅ | ✅ | [@benburton](https://github.com/benburton) 2024-10-06 |
| `ows-assets-migration` | ✅ | ✅ | [@benburton](https://github.com/benburton) 2024-10-06 |
| `ows-atlantis-proxy` | ✅ | ✅ | [@benburton](https://github.com/benburton) 2024-10-06 |
| `ows-auth` | ✅ | ✅ | [@benburton](https://github.com/benburton) 2024-10-06 |
| `ows-blacklist-manager` | ✅ | ✅ | [@benburton](https://github.com/benburton) 2024-10-06 |
| `ows-bulkperformancerights` | ✅ | ✅ | [@benburton](https://github.com/benburton) 2024-10-06 |
| `ows-campaigns` | ✅ | ✅ | [@benburton](https://github.com/benburton) 2024-10-06 |
| `ows-carveouts` | ❌ | ✅ | missing `composer.lock` |
| `ows-carveouts-python` | ✅ | ✅ | [@benburton](https://github.com/benburton) 2024-10-06 |
| `ows-charts` | ✅ | ✅ | [@benburton](https://github.com/benburton) 2024-10-06 |
| `ows-cloudwatch-logs` | ✅ | ✅ | [@benburton](https://github.com/benburton) 2024-10-06 |
| `ows-collaborator` | ✅ | ✅ | [@benburton](https://github.com/benburton) 2024-10-06 |
| `ows-conflict-manager` | ✅ | ✅ | [@benburton](https://github.com/benburton) 2024-10-06 |
| `ows-content-review` | ✅ | ✅ | [@benburton](https://github.com/benburton) 2024-10-06 |
| `ows-contracts` | ✅ | ✅ | [@benburton](https://github.com/benburton) 2024-10-06 |
| `ows-cookiecutter-flask` | ✅ | ✅ | This one is empty. It's just a README. |
| `ows-data-export` | ✅ | ✅ | [@benburton](https://github.com/benburton) 2024-10-06 |
| `ows-ddex-lambda-proxy` | ✅ | ✅ | [@benburton](https://github.com/benburton) 2024-10-06 |
| `ows-delivery-history` | ✅ | ✅ | [@benburton](https://github.com/benburton) 2024-10-06 |
| `ows-delivery-metadata` | ✅ | ✅ | [@benburton](https://github.com/benburton) 2024-10-06 |
| `ows-dmp` | ✅ | ✅ | [@benburton](https://github.com/benburton) 2024-10-06 |
| `ows-dmp-workflows` | ✅ | ✅ | [@benburton](https://github.com/benburton) 2024-10-06 |
| `ows-download-streams` | ❌ | ✅ | missing `composer.lock` |
| `ows-email-campaigns` | ✅ | ✅ | [@benburton](https://github.com/benburton) 2024-10-06 |
| `ows-features` | ✅ | ✅ | [@benburton](https://github.com/benburton) 2024-10-06 |
| `ows-film-transparency` | ⬜ | ⬜ | Doesn't look like the repo is being searched recursively. There are vulnerable dependencies in subdirectories. |
| `ows-garcon` | ⬜ | ⬜ | This one's missing the scan on files that do not match the `/^requirements.txt$/` regular expression. |
| `ows-github-sqs-build-proxy` | ✅ | ✅ | [@benburton](https://github.com/benburton) 2024-09-21 |
| `ows-grass` | ✅ | ✅ | [@benburton](https://github.com/benburton) 2024-09-21 |
| `ows-grid-generator` | ✅ | ✅ | [@benburton](https://github.com/benburton) 2024-09-21 |
| `ows-images` | ✅ | ✅ | [@benburton](https://github.com/benburton) 2024-09-21 |
| `ows-label-audit` | ✅ | ✅ | [@benburton](https://github.com/benburton) 2024-09-21 |
| `ows-ledger` | ✅ | ✅ | [@benburton](https://github.com/benburton) 2024-09-21 |
| `ows-legacy-analytics` | ✅ | ✅ | [@benburton](https://github.com/benburton) 2024-09-21 |
| `ows-legacy-images` | ❌ | ✅ | missing `composer.lock` |
| `ows-location` | ❌ | ✅ | Suspicious output. Log OSV and examine payload. |
| `ows-lyrics` | ✅ | ✅ | [@benburton](https://github.com/benburton) 2024-09-21 |
| `ows-manual-adjustment` | ✅ | ✅ | [@benburton](https://github.com/benburton) 2024-09-21 |
| `ows-marketing` | ✅ | ❌ | GitHub fails -- payload parsing error |
| `ows-masters-registry` | ✅ | ✅ | [@benburton](https://github.com/benburton) 2024-09-21 |
| `ows-metadata` | ❌ | ✅ | missing `composer.lock` |
| `ows-moneyhub` | ✅ | ✅ | [@benburton](https://github.com/benburton) 2024-09-21 |
| `ows-notifications` | ❌ | ❌ | Error parsing `poetry.lock` |
| `ows-nr-ownership-ingest` | ✅ | ✅ | [@benburton](https://github.com/benburton) 2024-09-21 |
| `ows-participant` | ✅ | ✅ | [@benburton](https://github.com/benburton) 2024-09-21 |
| `ows-payee` | ✅ | ❌ | GitHub fails -- payload parsing error |
| `ows-payment` | ✅ | ❌ | GitHub fails -- payload parsing error |
| `ows-pdp` | ✅ | ❌ | GitHub fails -- payload parsing error |
| `ows-permissions` | ✅ | ✅ | [@benburton](https://github.com/benburton) 2024-09-21 |
| `ows-playlist` | ✅ | ❌ | GitHub fails -- payload parsing error |
| `ows-podcast` | ✅ | ✅ | [@benburton](https://github.com/benburton) 2024-09-21 |
| `ows-preference-center` | ❌ | ✅ | Suspicious output. Log OSV and examine payload. |
| `ows-pricing` | ✅ | ❌ | GitHub fails -- payload parsing error |
| `ows-product` | ✅ | ✅ | [@benburton](https://github.com/benburton) 2024-09-21 |
| `ows-product-configuration` | ❌ | ✅ | Suspicious output. Log OSV and examine payload. |
| `ows-product-digital` | ✅ | ✅ | [@benburton](https://github.com/benburton) 2024-09-21 |
| `ows-product-digital-marketing` | ✅ | ✅ | [@benburton](https://github.com/benburton) 2024-09-21 |
| `ows-product-film` | ✅ | ✅ | [@benburton](https://github.com/benburton) 2024-09-21 |
| `ows-product-physical` | ✅ | ✅ | [@benburton](https://github.com/benburton) 2024-09-21 |
| `ows-product-review` | ❌ | ✅ | Suspicious output. Log OSV and examine payload. |
| `ows-product-staging` | ✅ | ✅ | [@benburton](https://github.com/benburton) 2024-09-21 |
| `ows-product-store-mapping` | ⬜ | ⬜ | |
| `ows-product-workflow` | ⬜ | ⬜ | |
| `ows-project-manager` | ⬜ | ⬜ | |
| `ows-promoplayer` | ⬜ | ⬜ | |
| `ows-prs` | ⬜ | ⬜ | |
| `ows-prs-toolset` | ⬜ | ⬜ | |
| `ows-pypi-server` | ⬜ | ⬜ | |
| `ows-reporting` | ⬜ | ⬜ | |
| `ows-royalties` | ⬜ | ⬜ | |
| `ows-royalties-workflows` | ⬜ | ⬜ | |
| `ows-sales-goals` | ⬜ | ⬜ | |
| `ows-salessheets` | ⬜ | ⬜ | |
| `ows-search` | ⬜ | ⬜ | |
| `ows-social-analytics` | ⬜ | ⬜ | |
| `ows-socials` | ⬜ | ⬜ | |
| `ows-sony-metadata` | ⬜ | ⬜ | |
| `ows-sound-recording-analytics` | ⬜ | ⬜ | |
| `ows-sound-recordings` | ⬜ | ⬜ | |
| `ows-store` | ⬜ | ⬜ | |
| `ows-store-availability` | ⬜ | ⬜ | |
| `ows-territories` | ⬜ | ⬜ | |
| `ows-timed-release` | ⬜ | ⬜ | |
| `ows-track` | ⬜ | ⬜ | |
| `ows-transcoding` | ⬜ | ⬜ | |
| `ows-users` | ⬜ | ⬜ | |
| `ows-vector-job-rules` | ⬜ | ⬜ | |
| `ows-vectororder` | ⬜ | ⬜ | |
| `ows-video` | ⬜ | ⬜ | |
| `ows-xlsx` | ⬜ | ⬜ | |

<sub>✅ checked</sub>&nbsp;&nbsp;&nbsp;<sub>⬜ unchecked</sub>&nbsp;&nbsp;&nbsp;<sub>❌ failed</sub>
