Is your feature request related to a problem? Please describe.
When Plumber flags an issue (e.g., ISSUE-412: Docker-in-Docker service detected), a developer needs to understand what it means, why it matters, and how to fix it. Currently they must either visit the getplumber.io documentation website or read through the JSON output to find the docUrl field.
For developers working in a terminal or in CI job logs, there's no quick way to get remediation guidance without leaving the current context.
Describe the solution you'd like
A new plumber explain command that prints detailed information about an issue code directly in the terminal:
$ plumber explain ISSUE-412
ISSUE-412: Docker-in-Docker service detected
Category: Pipeline Composition
Severity: high
Control: pipelineMustNotUseDockerInDocker
Description:
A CI/CD job uses a Docker-in-Docker (dind) service. On shared runners
running in privileged mode, this enables container escape, lateral
movement, and access to secrets from other jobs on the same runner.
Remediation:
Replace Docker-in-Docker with Kaniko or Buildah for building container
images. These tools do not require privileged mode.
Documentation: https://getplumber.io/docs/use-plumber/issues/ISSUE-412
Related: ISSUE-413, ISSUE-101
Additional options:
plumber explain --list to list all issue codes with short descriptions
plumber explain --json ISSUE-412 for machine-readable output
plumber explain --all for a full reference dump
Configuration in .plumber.yaml
# No configuration needed: this is a CLI informational command.
Implementation Hints
- Data source: The
errorCodeRegistry in control/codes.go already contains title, description, remediation, doc URL, and control name for every implemented issue code. Extend it with severity and related codes (or pull from a shared registry).
- New files:
cmd/explain.go (new command)
- Logic: Look up the issue code in the registry, format and print. For
--list, iterate AllCodes(). For --json, marshal the ErrorCodeInfo struct. Consider enhancing ErrorCodeInfo with Severity, Category, and RelatedCodes fields if they don't already exist.
- Edge cases: Unknown issue code should print a helpful message ("Unknown issue code. Run 'plumber explain --list' to see all codes.").
Files Touched
cmd/explain.go (new command)
cmd/root.go (register new subcommand)
control/codes.go (optionally add Severity, Category, RelatedCodes fields to ErrorCodeInfo)
Why It's Valuable
Developer experience is a key adoption driver. When a pipeline fails due to a Plumber finding, the developer should be able to understand and fix the issue as fast as possible. A built-in explain command keeps them in the terminal flow, avoids context-switching to a browser, and works in air-gapped environments. This pattern is well-established: rustc --explain E0382, kubectl explain pod.spec, golangci-lint help linters.
Note: If you submit a PR for this feature, please keep "Allow edits from maintainers" enabled so we can collaborate more easily.
Is your feature request related to a problem? Please describe.
When Plumber flags an issue (e.g.,
ISSUE-412: Docker-in-Docker service detected), a developer needs to understand what it means, why it matters, and how to fix it. Currently they must either visit the getplumber.io documentation website or read through the JSON output to find thedocUrlfield.For developers working in a terminal or in CI job logs, there's no quick way to get remediation guidance without leaving the current context.
Describe the solution you'd like
A new
plumber explaincommand that prints detailed information about an issue code directly in the terminal:Additional options:
plumber explain --listto list all issue codes with short descriptionsplumber explain --json ISSUE-412for machine-readable outputplumber explain --allfor a full reference dumpConfiguration in
.plumber.yaml# No configuration needed: this is a CLI informational command.Implementation Hints
errorCodeRegistryincontrol/codes.goalready contains title, description, remediation, doc URL, and control name for every implemented issue code. Extend it with severity and related codes (or pull from a shared registry).cmd/explain.go(new command)--list, iterateAllCodes(). For--json, marshal theErrorCodeInfostruct. Consider enhancingErrorCodeInfowithSeverity,Category, andRelatedCodesfields if they don't already exist.Files Touched
cmd/explain.go(new command)cmd/root.go(register new subcommand)control/codes.go(optionally addSeverity,Category,RelatedCodesfields toErrorCodeInfo)Why It's Valuable
Developer experience is a key adoption driver. When a pipeline fails due to a Plumber finding, the developer should be able to understand and fix the issue as fast as possible. A built-in
explaincommand keeps them in the terminal flow, avoids context-switching to a browser, and works in air-gapped environments. This pattern is well-established:rustc --explain E0382,kubectl explain pod.spec,golangci-lint help linters.