id = "poutine"
name = "Poutine"
homepage = "https://github.com/boostsecurityio/poutine"
description = "Supply-chain vulnerability scanner for build pipelines."
executables = ["poutine"]
[dotfiles]
paths = ["~/.poutine/config.yaml"]
exclude = []
secret = []
side_effect = false
[commands]
format = 1
label = "Scan CI pipelines"
description = "Analyze a local repository, a remote repository or an organization for CI/CD supply-chain issues. Rule skipping beyond --skip and config-file options are left out."
quality = "ai-draft"
parser = { end_of_options = "--", interleave = "permute", long_equals = false, short_attached = false, short_bundles = false }
[[commands.subcommand]]
path = ["analyze_local"]
label = "Analyze a local repository"
[[commands.subcommand.source]]
id = "readme"
kind = "manual"
url = "https://github.com/boostsecurityio/poutine/blob/main/README.md"
revision = "2026-10-27"
evidence = """
poutine analyze_local .
poutine analyze_local . --config my-config.yml
--format Output format (default: pretty, json, sarif)
--config Path to the configuration file (default: .poutine.yml in the working directory, or .github/poutine.yml)
--skip Add rules to the skip list for the current run (can be specified multiple times)
--fail-on-violation Exit with a non-zero code (10) when violations are found
"""
[[commands.subcommand.field]]
id = "path"
label = "Repository path"
type = "path"
position = 0
min = 1
path = { kind = "directory", role = "input" }
sources = ["readme"]
[[commands.subcommand.field]]
id = "format"
label = "Output format"
type = "enum"
option = ["--format"]
choices = [{ value = "pretty", label = "Pretty" }, { value = "json", label = "JSON" }, { value = "sarif", label = "SARIF" }]
sources = ["readme"]
[[commands.subcommand.field]]
id = "config"
label = "Config file"
type = "path"
option = ["--config"]
path = { kind = "file", role = "input" }
sources = ["readme"]
[[commands.subcommand.field]]
id = "skip"
label = "Skip rules"
type = "string"
option = ["--skip"]
multiple = true
sources = ["readme"]
[[commands.subcommand.field]]
id = "fail_on_violation"
label = "Fail on violation"
type = "boolean"
option = ["--fail-on-violation"]
sources = ["readme"]
[[commands.subcommand.task]]
id = "scan"
label = "Scan current directory"
fields = ["path", "format", "fail_on_violation"]
required = ["path"]
[[commands.subcommand.group]]
id = "basic"
label = "Basic"
fields = ["path", "format", "fail_on_violation", "config", "skip"]
[[commands.subcommand]]
path = ["analyze_repo"]
label = "Analyze a remote repository"
[[commands.subcommand.source]]
id = "readme"
kind = "manual"
url = "https://github.com/boostsecurityio/poutine/blob/main/README.md"
revision = "2026-10-27"
evidence = """
poutine analyze_repo org/repo --token "$GH_TOKEN"
poutine analyze_org my-org/project --token "$GL_TOKEN" --scm gitlab --scm-base-url https://gitlab.example.com
--token SCM access token (required for the commands analyze_repo, analyze_org) (env: GH_TOKEN)
--format Output format (default: pretty, json, sarif)
--scm SCM platform (default: github, gitlab)
--scm-base-url Base URI of the self-hosted SCM instance
--skip Add rules to the skip list for the current run (can be specified multiple times)
"""
[[commands.subcommand.field]]
id = "repo"
label = "Repository"
description = "org/repo"
type = "string"
position = 0
min = 1
sources = ["readme"]
[[commands.subcommand.field]]
id = "token"
label = "Access token"
description = "Prefer the GH_TOKEN environment variable over typing a token here."
type = "string"
option = ["--token"]
sources = ["readme"]
[[commands.subcommand.field]]
id = "scm"
label = "SCM platform"
type = "enum"
option = ["--scm"]
choices = [{ value = "github", label = "GitHub" }, { value = "gitlab", label = "GitLab" }]
sources = ["readme"]
[[commands.subcommand.field]]
id = "scm_base_url"
label = "SCM base URL"
type = "url"
option = ["--scm-base-url"]
sources = ["readme"]
[[commands.subcommand.field]]
id = "format"
label = "Output format"
type = "enum"
option = ["--format"]
choices = [{ value = "pretty", label = "Pretty" }, { value = "json", label = "JSON" }, { value = "sarif", label = "SARIF" }]
sources = ["readme"]
[[commands.subcommand.task]]
id = "scan-repo"
label = "Scan a GitHub repository"
fields = ["repo", "token", "format"]
required = ["repo"]
[[commands.subcommand.group]]
id = "basic"
label = "Basic"
fields = ["repo", "token", "format", "scm", "scm_base_url"]