From 951fbd454abd8e474444b2fc506143a94f4800de Mon Sep 17 00:00:00 2001 From: Alex Goodman Date: Tue, 16 Jun 2026 12:13:34 -0400 Subject: [PATCH] add purl types to cataloger info cmd (#4984) Signed-off-by: Alex Goodman --- cmd/syft/internal/commands/cataloger_info.go | 24 +++++++--- .../internal/commands/cataloger_info_test.go | 8 ++++ internal/capabilities/generate/io.go | 7 ++- internal/capabilities/generate/merge.go | 38 ++++++++++++++++ internal/capabilities/generate/merge_test.go | 45 +++++++++++++++++++ internal/capabilities/model.go | 2 + syft/pkg/cataloger/alpine/capabilities.yaml | 2 + syft/pkg/cataloger/arch/capabilities.yaml | 2 + syft/pkg/cataloger/binary/capabilities.yaml | 3 ++ syft/pkg/cataloger/bitnami/capabilities.yaml | 4 ++ syft/pkg/cataloger/conda/capabilities.yaml | 2 + syft/pkg/cataloger/cpp/capabilities.yaml | 6 +++ syft/pkg/cataloger/dart/capabilities.yaml | 4 ++ syft/pkg/cataloger/debian/capabilities.yaml | 4 ++ syft/pkg/cataloger/dotnet/capabilities.yaml | 9 ++++ syft/pkg/cataloger/elixir/capabilities.yaml | 2 + syft/pkg/cataloger/erlang/capabilities.yaml | 4 ++ syft/pkg/cataloger/gentoo/capabilities.yaml | 2 + .../cataloger/githubactions/capabilities.yaml | 6 +++ syft/pkg/cataloger/golang/capabilities.yaml | 4 ++ syft/pkg/cataloger/haskell/capabilities.yaml | 6 +++ syft/pkg/cataloger/homebrew/capabilities.yaml | 2 + syft/pkg/cataloger/java/capabilities.yaml | 6 +++ .../cataloger/javascript/capabilities.yaml | 10 +++++ syft/pkg/cataloger/kernel/capabilities.yaml | 3 ++ syft/pkg/cataloger/lua/capabilities.yaml | 2 + syft/pkg/cataloger/nix/capabilities.yaml | 4 ++ syft/pkg/cataloger/ocaml/capabilities.yaml | 2 + syft/pkg/cataloger/php/capabilities.yaml | 8 ++++ syft/pkg/cataloger/python/capabilities.yaml | 14 ++++++ syft/pkg/cataloger/r/capabilities.yaml | 2 + syft/pkg/cataloger/redhat/capabilities.yaml | 6 +++ syft/pkg/cataloger/ruby/capabilities.yaml | 6 +++ syft/pkg/cataloger/rust/capabilities.yaml | 4 ++ syft/pkg/cataloger/sbom/capabilities.yaml | 2 + syft/pkg/cataloger/snap/capabilities.yaml | 8 ++++ syft/pkg/cataloger/swift/capabilities.yaml | 4 ++ syft/pkg/cataloger/swipl/capabilities.yaml | 2 + .../pkg/cataloger/terraform/capabilities.yaml | 2 + .../pkg/cataloger/wordpress/capabilities.yaml | 2 + 40 files changed, 266 insertions(+), 7 deletions(-) diff --git a/cmd/syft/internal/commands/cataloger_info.go b/cmd/syft/internal/commands/cataloger_info.go index 818d91d5d..57e0f2744 100644 --- a/cmd/syft/internal/commands/cataloger_info.go +++ b/cmd/syft/internal/commands/cataloger_info.go @@ -60,6 +60,7 @@ type ( Packages []detectorPackageInfo `json:"packages,omitempty"` Comment string `json:"comment,omitempty"` PackageTypes []string `json:"package_types,omitempty"` + PURLTypes []string `json:"purl_types,omitempty"` JSONSchemaTypes []string `json:"json_schema_types,omitempty"` Capabilities capabilities.CapabilitySet `json:"capabilities,omitempty"` } @@ -235,7 +236,7 @@ func renderCatalogerInfoJSON(doc *capabilities.Document, catalogers []capabiliti // if no parsers, use detectors instead if len(info.Patterns) == 0 { info.Capabilities = cat.Capabilities - info.Patterns = convertDetectorsToPatterns(cat.Detectors, cat.PackageTypes, cat.JSONSchemaTypes) + info.Patterns = convertDetectorsToPatterns(cat.Detectors, cat.PackageTypes, cat.PURLTypes, cat.JSONSchemaTypes) } info.Config = getConfigInfoFromDocument(doc, cat.Config) @@ -278,6 +279,7 @@ func convertParsersToPatterns(parsers []capabilities.Parser) []patternInfo { Packages: convertDetectorPackages(parser.Detector.Packages), Comment: parser.Detector.Comment, PackageTypes: parser.PackageTypes, + PURLTypes: parser.PURLTypes, JSONSchemaTypes: parser.JSONSchemaTypes, Capabilities: parser.Capabilities, }) @@ -286,7 +288,7 @@ func convertParsersToPatterns(parsers []capabilities.Parser) []patternInfo { } // convertDetectorsToPatterns converts detector entries to pattern info for JSON output (for non-parser catalogers) -func convertDetectorsToPatterns(detectors []capabilities.Detector, packageTypes, jsonSchemaTypes []string) []patternInfo { +func convertDetectorsToPatterns(detectors []capabilities.Detector, packageTypes, purlTypes, jsonSchemaTypes []string) []patternInfo { var patterns []patternInfo for _, det := range detectors { patterns = append(patterns, patternInfo{ @@ -296,6 +298,7 @@ func convertDetectorsToPatterns(detectors []capabilities.Detector, packageTypes, Packages: convertDetectorPackages(det.Packages), Comment: det.Comment, PackageTypes: packageTypes, + PURLTypes: purlTypes, JSONSchemaTypes: jsonSchemaTypes, }) } @@ -353,7 +356,7 @@ func renderCatalogerInfoTable(_ *capabilities.Document, catalogers []capabilitie ) // set headers - table.Header("ECOSYSTEM", "CATALOGER", "CRITERIA", "LICENSE", "NODES", "EDGES", "KINDS", "LISTING", "DIGESTS", "HASH") + table.Header("ECOSYSTEM", "CATALOGER", "CRITERIA", "PURL", "LICENSE", "NODES", "EDGES", "KINDS", "LISTING", "DIGESTS", "HASH") // build rows for each cataloger var data [][]string @@ -367,13 +370,13 @@ func renderCatalogerInfoTable(_ *capabilities.Document, catalogers []capabilitie // generic catalogers: one row per parser for _, parser := range cat.Parsers { criteria := formatCriteria([]capabilities.Detector{parser.Detector}) - row := buildTableRowFromCapabilities(ecosystem, cat.Name, criteria, parser.Capabilities) + row := buildTableRowFromCapabilities(ecosystem, cat.Name, criteria, parser.PURLTypes, parser.Capabilities) data = append(data, row) } } else { // custom catalogers: one row with all detectors criteria := formatCriteria(cat.Detectors) - row := buildTableRowFromCapabilities(ecosystem, cat.Name, criteria, cat.Capabilities) + row := buildTableRowFromCapabilities(ecosystem, cat.Name, criteria, cat.PURLTypes, cat.Capabilities) data = append(data, row) } } @@ -385,7 +388,7 @@ func renderCatalogerInfoTable(_ *capabilities.Document, catalogers []capabilitie } // buildTableRowFromCapabilities builds a table row from capability values -func buildTableRowFromCapabilities(ecosystem, name, criteria string, caps capabilities.CapabilitySet) []string { +func buildTableRowFromCapabilities(ecosystem, name, criteria string, purlTypes []string, caps capabilities.CapabilitySet) []string { // extract capability default values license := extractBoolCapability(caps, "license") nodes := extractNodesCapability(caps) @@ -399,6 +402,7 @@ func buildTableRowFromCapabilities(ecosystem, name, criteria string, caps capabi ecosystem, name, criteria, + formatPURLTypes(purlTypes), license, nodes, edges, @@ -409,6 +413,14 @@ func buildTableRowFromCapabilities(ecosystem, name, criteria string, caps capabi } } +// formatPURLTypes renders the PURL types as a comma-separated list, or a placeholder when empty +func formatPURLTypes(purlTypes []string) string { + if len(purlTypes) == 0 { + return noStyle.Render("·") + } + return strings.Join(purlTypes, ", ") +} + // extractBoolCapability extracts a boolean capability value and formats it func extractBoolCapability(caps capabilities.CapabilitySet, name string) string { for _, cap := range caps { diff --git a/cmd/syft/internal/commands/cataloger_info_test.go b/cmd/syft/internal/commands/cataloger_info_test.go index 6794c3b81..9593329f4 100644 --- a/cmd/syft/internal/commands/cataloger_info_test.go +++ b/cmd/syft/internal/commands/cataloger_info_test.go @@ -280,12 +280,15 @@ func Test_catalogerInfoReport(t *testing.T) { Detectors: []capabilities.Detector{ {Method: capabilities.GlobDetection, Criteria: []string{"**/*.test"}}, }, + PURLTypes: []string{"npm"}, }, }, assertions: func(t *testing.T, got string) { assert.Contains(t, got, "test-cataloger") assert.Contains(t, got, "ECOSYSTEM") assert.Contains(t, got, "CATALOGER") + assert.Contains(t, got, "PURL") + assert.Contains(t, got, "npm") }, }, { @@ -298,12 +301,17 @@ func Test_catalogerInfoReport(t *testing.T) { Ecosystem: "test", Type: "custom", Selectors: []string{"test", "custom"}, + Detectors: []capabilities.Detector{ + {Method: capabilities.GlobDetection, Criteria: []string{"**/*.test"}}, + }, + PURLTypes: []string{"npm"}, }, }, assertions: func(t *testing.T, got string) { assert.Contains(t, got, `"name":"test-cataloger"`) assert.Contains(t, got, `"ecosystem":"test"`) assert.Contains(t, got, `"type":"custom"`) + assert.Contains(t, got, `"purl_types":["npm"]`) }, }, { diff --git a/internal/capabilities/generate/io.go b/internal/capabilities/generate/io.go index 762948618..3d660cf32 100644 --- a/internal/capabilities/generate/io.go +++ b/internal/capabilities/generate/io.go @@ -297,6 +297,11 @@ func addCatalogerFieldComment(keyNode, valueNode *yaml.Node, catalogerName strin if keyNode.LineComment == "" { keyNode.LineComment = autoGeneratedComment } + case "purl_types": + // cataloger-level purl_types (for custom catalogers) are AUTO-GENERATED + if keyNode.LineComment == "" { + keyNode.LineComment = autoGeneratedComment + } case "json_schema_types": // json_schema_types are AUTO-GENERATED if keyNode.LineComment == "" { @@ -367,7 +372,7 @@ func addParserComments(parsersNode *yaml.Node) { valueNode := parserNode.Content[i+1] switch keyNode.Value { - case "parser_function", "metadata_types", "package_types", "json_schema_types": + case "parser_function", "metadata_types", "package_types", "purl_types", "json_schema_types": // add AUTO-GENERATED comment to these fields if keyNode.LineComment == "" { keyNode.LineComment = autoGeneratedComment diff --git a/internal/capabilities/generate/merge.go b/internal/capabilities/generate/merge.go index 5f045fb82..b5d3b9b02 100644 --- a/internal/capabilities/generate/merge.go +++ b/internal/capabilities/generate/merge.go @@ -3,6 +3,7 @@ package main import ( "fmt" + "sort" "strings" "github.com/scylladb/go-set/strset" @@ -10,6 +11,7 @@ import ( "github.com/anchore/syft/internal/capabilities" "github.com/anchore/syft/internal/capabilities/internal" "github.com/anchore/syft/internal/packagemetadata" + "github.com/anchore/syft/syft/pkg" "github.com/anchore/syft/syft/pkg/cataloger/binary" ) @@ -192,6 +194,9 @@ func RegenerateCapabilities(catalogerDir string, repoRoot string) (*Statistics, formatOrphans(orphans)) } + // 5a. Derive PURL types from the discovered package types (purely a function of pkg.Type) + derivePURLTypes(updated) + // 6. Write back to YAML files with comments, preserving existing node trees fmt.Print(" → Writing updated capabilities files...") if err := saveCapabilities(catalogerDir, repoRoot, updated, existingNodes); err != nil { @@ -427,6 +432,39 @@ func (e *EnrichmentData) GetMetadataTypes(catalogerName string) ([]string, bool) return types, ok } +// derivePURLTypes populates the PURLTypes field on every cataloger and parser by mapping each +// observed package type to its canonical PURL type via pkg.Type.PackageURLType. this is a pure +// function of the already-discovered package_types, so it needs no additional test observations. +func derivePURLTypes(doc *capabilities.Document) { + for i := range doc.Catalogers { + cat := &doc.Catalogers[i] + cat.PURLTypes = purlTypesFromPackageTypes(cat.PackageTypes) + for j := range cat.Parsers { + cat.Parsers[j].PURLTypes = purlTypesFromPackageTypes(cat.Parsers[j].PackageTypes) + } + } +} + +// purlTypesFromPackageTypes maps syft package type strings (e.g. "go-module") to their PURL types +// (e.g. "golang"), returning a deduplicated, sorted slice. package types with no PURL mapping are skipped. +func purlTypesFromPackageTypes(packageTypes []string) []string { + if len(packageTypes) == 0 { + return nil + } + set := strset.New() + for _, pt := range packageTypes { + if purlType := pkg.Type(pt).PackageURLType(); purlType != "" { + set.Add(purlType) + } + } + if set.IsEmpty() { + return nil + } + result := set.List() + sort.Strings(result) + return result +} + // GetPackageTypes returns the package types for the given cataloger name func (e *EnrichmentData) GetPackageTypes(catalogerName string) ([]string, bool) { types, ok := e.packageTypes[catalogerName] diff --git a/internal/capabilities/generate/merge_test.go b/internal/capabilities/generate/merge_test.go index 229218e5d..8e604af61 100644 --- a/internal/capabilities/generate/merge_test.go +++ b/internal/capabilities/generate/merge_test.go @@ -552,3 +552,48 @@ func TestConvertToJSONSchemaTypesFromMetadata(t *testing.T) { }) } } + +func TestPURLTypesFromPackageTypes(t *testing.T) { + tests := []struct { + name string + packageTypes []string + want []string + }{ + { + name: "nil slice returns nil", + packageTypes: nil, + want: nil, + }, + { + name: "single package type maps to purl type", + packageTypes: []string{"go-module"}, + want: []string{"golang"}, + }, + { + name: "multiple package types are sorted", + packageTypes: []string{"npm", "go-module"}, + want: []string{"golang", "npm"}, + }, + { + // java and jenkins-plugin both map to maven, so the result is deduplicated + name: "distinct package types collapsing to one purl type are deduplicated", + packageTypes: []string{"java-archive", "jenkins-plugin"}, + want: []string{"maven"}, + }, + { + // unknown package types have no purl mapping and are skipped + name: "package type without a purl mapping is skipped", + packageTypes: []string{"UnknownPackage"}, + want: nil, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + got := purlTypesFromPackageTypes(tt.packageTypes) + if diff := cmp.Diff(tt.want, got); diff != "" { + t.Errorf("purlTypesFromPackageTypes() mismatch (-want +got):\n%s", diff) + } + }) + } +} diff --git a/internal/capabilities/model.go b/internal/capabilities/model.go index c969897b8..b43790c84 100644 --- a/internal/capabilities/model.go +++ b/internal/capabilities/model.go @@ -82,6 +82,7 @@ type CatalogerEntry struct { Detectors []Detector `yaml:"detectors,omitempty" json:"detectors,omitempty"` // AUTO-GENERATED - detection methods (only for type=custom) MetadataTypes []string `yaml:"metadata_types,omitempty" json:"metadata_types,omitempty"` // AUTO-GENERATED - pkg metadata types emitted (only for type=custom) PackageTypes []string `yaml:"package_types,omitempty" json:"package_types,omitempty"` // AUTO-GENERATED - package types emitted (only for type=custom) + PURLTypes []string `yaml:"purl_types,omitempty" json:"purl_types,omitempty"` // AUTO-GENERATED - PURL types derived from package_types (only for type=custom) JSONSchemaTypes []string `yaml:"json_schema_types,omitempty" json:"json_schema_types,omitempty"` // AUTO-GENERATED - JSON schema type names (UpperCamelCase) Capabilities CapabilitySet `yaml:"capabilities,omitempty" json:"capabilities,omitempty"` // MANUAL - config-driven capability definitions (only for type=custom) } @@ -92,6 +93,7 @@ type Parser struct { Detector Detector `yaml:"detector" json:"detector"` // AUTO-GENERATED - how artifacts are detected MetadataTypes []string `yaml:"metadata_types,omitempty" json:"metadata_types,omitempty"` // AUTO-GENERATED - pkg metadata types emitted by this parser PackageTypes []string `yaml:"package_types,omitempty" json:"package_types,omitempty"` // AUTO-GENERATED - package types emitted by this parser + PURLTypes []string `yaml:"purl_types,omitempty" json:"purl_types,omitempty"` // AUTO-GENERATED - PURL types derived from package_types JSONSchemaTypes []string `yaml:"json_schema_types,omitempty" json:"json_schema_types,omitempty"` // AUTO-GENERATED - JSON schema type names (UpperCamelCase) Capabilities CapabilitySet `yaml:"capabilities,omitempty" json:"capabilities,omitempty"` // MANUAL - config-driven capability definitions } diff --git a/syft/pkg/cataloger/alpine/capabilities.yaml b/syft/pkg/cataloger/alpine/capabilities.yaml index 8f0efe66f..e42f7dd69 100644 --- a/syft/pkg/cataloger/alpine/capabilities.yaml +++ b/syft/pkg/cataloger/alpine/capabilities.yaml @@ -26,6 +26,8 @@ catalogers: - pkg.ApkDBEntry package_types: # AUTO-GENERATED - apk + purl_types: # AUTO-GENERATED + - apk json_schema_types: # AUTO-GENERATED - ApkDbEntry capabilities: # MANUAL - preserved across regeneration diff --git a/syft/pkg/cataloger/arch/capabilities.yaml b/syft/pkg/cataloger/arch/capabilities.yaml index 1c8c7057b..dfa9c97b1 100644 --- a/syft/pkg/cataloger/arch/capabilities.yaml +++ b/syft/pkg/cataloger/arch/capabilities.yaml @@ -27,6 +27,8 @@ catalogers: - pkg.AlpmDBEntry package_types: # AUTO-GENERATED - alpm + purl_types: # AUTO-GENERATED + - alpm json_schema_types: # AUTO-GENERATED - AlpmDbEntry capabilities: # MANUAL - preserved across regeneration diff --git a/syft/pkg/cataloger/binary/capabilities.yaml b/syft/pkg/cataloger/binary/capabilities.yaml index edee01ef6..d3b959da4 100644 --- a/syft/pkg/cataloger/binary/capabilities.yaml +++ b/syft/pkg/cataloger/binary/capabilities.yaml @@ -932,6 +932,9 @@ catalogers: - apk - binary - rpm + purl_types: # AUTO-GENERATED + - apk + - rpm json_schema_types: # AUTO-GENERATED - ElfBinaryPackageNoteJsonPayload capabilities: # MANUAL - edit capabilities here diff --git a/syft/pkg/cataloger/bitnami/capabilities.yaml b/syft/pkg/cataloger/bitnami/capabilities.yaml index 4edca292e..94ebf49b9 100644 --- a/syft/pkg/cataloger/bitnami/capabilities.yaml +++ b/syft/pkg/cataloger/bitnami/capabilities.yaml @@ -22,6 +22,8 @@ catalogers: - pkg.BitnamiSBOMEntry package_types: # AUTO-GENERATED - bitnami + purl_types: # AUTO-GENERATED + - bitnami json_schema_types: # AUTO-GENERATED - BitnamiSbomEntry capabilities: # MANUAL - preserved across regeneration @@ -51,6 +53,8 @@ catalogers: - pkg.BitnamiSBOMEntry package_types: # AUTO-GENERATED - bitnami + purl_types: # AUTO-GENERATED + - bitnami json_schema_types: # AUTO-GENERATED - BitnamiSbomEntry capabilities: # MANUAL - preserved across regeneration diff --git a/syft/pkg/cataloger/conda/capabilities.yaml b/syft/pkg/cataloger/conda/capabilities.yaml index 7c306c660..ebb0b0ea3 100644 --- a/syft/pkg/cataloger/conda/capabilities.yaml +++ b/syft/pkg/cataloger/conda/capabilities.yaml @@ -22,6 +22,8 @@ catalogers: - pkg.CondaMetaPackage package_types: # AUTO-GENERATED - conda + purl_types: # AUTO-GENERATED + - generic json_schema_types: # AUTO-GENERATED - CondaMetadataEntry capabilities: # MANUAL - preserved across regeneration diff --git a/syft/pkg/cataloger/cpp/capabilities.yaml b/syft/pkg/cataloger/cpp/capabilities.yaml index e96431121..2f27f4d7f 100644 --- a/syft/pkg/cataloger/cpp/capabilities.yaml +++ b/syft/pkg/cataloger/cpp/capabilities.yaml @@ -25,6 +25,8 @@ catalogers: - pkg.ConanV2LockEntry package_types: # AUTO-GENERATED - conan + purl_types: # AUTO-GENERATED + - conan json_schema_types: # AUTO-GENERATED - CConanLockEntry - CConanLockV2Entry @@ -59,6 +61,8 @@ catalogers: - pkg.ConanfileEntry package_types: # AUTO-GENERATED - conan + purl_types: # AUTO-GENERATED + - conan json_schema_types: # AUTO-GENERATED - CConanFileEntry capabilities: # MANUAL - preserved across regeneration @@ -101,6 +105,8 @@ catalogers: - pkg.ConaninfoEntry package_types: # AUTO-GENERATED - conan + purl_types: # AUTO-GENERATED + - conan json_schema_types: # AUTO-GENERATED - CConanInfoEntry capabilities: # MANUAL - preserved across regeneration diff --git a/syft/pkg/cataloger/dart/capabilities.yaml b/syft/pkg/cataloger/dart/capabilities.yaml index cfcf8a0e8..696b1edf1 100644 --- a/syft/pkg/cataloger/dart/capabilities.yaml +++ b/syft/pkg/cataloger/dart/capabilities.yaml @@ -24,6 +24,8 @@ catalogers: - pkg.DartPubspec package_types: # AUTO-GENERATED - dart-pub + purl_types: # AUTO-GENERATED + - pub json_schema_types: # AUTO-GENERATED - DartPubspec capabilities: # MANUAL - preserved across regeneration @@ -65,6 +67,8 @@ catalogers: - pkg.DartPubspecLockEntry package_types: # AUTO-GENERATED - dart-pub + purl_types: # AUTO-GENERATED + - pub json_schema_types: # AUTO-GENERATED - DartPubspecLockEntry capabilities: # MANUAL - preserved across regeneration diff --git a/syft/pkg/cataloger/debian/capabilities.yaml b/syft/pkg/cataloger/debian/capabilities.yaml index 248812217..6d1f21e99 100644 --- a/syft/pkg/cataloger/debian/capabilities.yaml +++ b/syft/pkg/cataloger/debian/capabilities.yaml @@ -29,6 +29,8 @@ catalogers: - pkg.DpkgDBEntry package_types: # AUTO-GENERATED - deb + purl_types: # AUTO-GENERATED + - deb json_schema_types: # AUTO-GENERATED - DpkgDbEntry capabilities: # MANUAL - preserved across regeneration @@ -77,6 +79,8 @@ catalogers: - pkg.DpkgArchiveEntry package_types: # AUTO-GENERATED - deb + purl_types: # AUTO-GENERATED + - deb json_schema_types: # AUTO-GENERATED - DpkgArchiveEntry capabilities: # MANUAL - preserved across regeneration diff --git a/syft/pkg/cataloger/dotnet/capabilities.yaml b/syft/pkg/cataloger/dotnet/capabilities.yaml index 11e537c7c..aa6b9c499 100644 --- a/syft/pkg/cataloger/dotnet/capabilities.yaml +++ b/syft/pkg/cataloger/dotnet/capabilities.yaml @@ -45,6 +45,9 @@ catalogers: package_types: # AUTO-GENERATED - dotnet - npm + purl_types: # AUTO-GENERATED + - dotnet + - npm json_schema_types: # AUTO-GENERATED - DotnetDepsEntry - DotnetPortableExecutableEntry @@ -83,6 +86,8 @@ catalogers: - pkg.DotnetDepsEntry package_types: # AUTO-GENERATED - dotnet + purl_types: # AUTO-GENERATED + - dotnet json_schema_types: # AUTO-GENERATED - DotnetDepsEntry capabilities: # MANUAL - edit capabilities here @@ -127,6 +132,8 @@ catalogers: - pkg.DotnetPackagesLockEntry package_types: # AUTO-GENERATED - dotnet + purl_types: # AUTO-GENERATED + - dotnet json_schema_types: # AUTO-GENERATED - DotnetPackagesLockEntry capabilities: # MANUAL - preserved across regeneration @@ -170,6 +177,8 @@ catalogers: - pkg.DotnetPortableExecutableEntry package_types: # AUTO-GENERATED - dotnet + purl_types: # AUTO-GENERATED + - dotnet json_schema_types: # AUTO-GENERATED - DotnetPortableExecutableEntry capabilities: # MANUAL - edit capabilities here diff --git a/syft/pkg/cataloger/elixir/capabilities.yaml b/syft/pkg/cataloger/elixir/capabilities.yaml index 4ce07a862..bc0dffa09 100644 --- a/syft/pkg/cataloger/elixir/capabilities.yaml +++ b/syft/pkg/cataloger/elixir/capabilities.yaml @@ -23,6 +23,8 @@ catalogers: - pkg.ElixirMixLockEntry package_types: # AUTO-GENERATED - hex + purl_types: # AUTO-GENERATED + - hex json_schema_types: # AUTO-GENERATED - ElixirMixLockEntry capabilities: # MANUAL - preserved across regeneration diff --git a/syft/pkg/cataloger/erlang/capabilities.yaml b/syft/pkg/cataloger/erlang/capabilities.yaml index b7d490909..342f401f1 100644 --- a/syft/pkg/cataloger/erlang/capabilities.yaml +++ b/syft/pkg/cataloger/erlang/capabilities.yaml @@ -22,6 +22,8 @@ catalogers: - '**/*.app' package_types: # AUTO-GENERATED - erlang-otp + purl_types: # AUTO-GENERATED + - otp capabilities: # MANUAL - preserved across regeneration - name: license default: false @@ -62,6 +64,8 @@ catalogers: - pkg.ErlangRebarLockEntry package_types: # AUTO-GENERATED - hex + purl_types: # AUTO-GENERATED + - hex json_schema_types: # AUTO-GENERATED - ErlangRebarLockEntry capabilities: # MANUAL - preserved across regeneration diff --git a/syft/pkg/cataloger/gentoo/capabilities.yaml b/syft/pkg/cataloger/gentoo/capabilities.yaml index 5b8745c36..aaed8063b 100644 --- a/syft/pkg/cataloger/gentoo/capabilities.yaml +++ b/syft/pkg/cataloger/gentoo/capabilities.yaml @@ -26,6 +26,8 @@ catalogers: - pkg.PortageEntry package_types: # AUTO-GENERATED - portage + purl_types: # AUTO-GENERATED + - portage json_schema_types: # AUTO-GENERATED - PortageDbEntry capabilities: # MANUAL - preserved across regeneration diff --git a/syft/pkg/cataloger/githubactions/capabilities.yaml b/syft/pkg/cataloger/githubactions/capabilities.yaml index 4ff9d032d..67719dd63 100644 --- a/syft/pkg/cataloger/githubactions/capabilities.yaml +++ b/syft/pkg/cataloger/githubactions/capabilities.yaml @@ -24,6 +24,8 @@ catalogers: - pkg.GitHubActionsUseStatement package_types: # AUTO-GENERATED - github-action-workflow + purl_types: # AUTO-GENERATED + - github json_schema_types: # AUTO-GENERATED - GithubActionsUseStatement capabilities: # MANUAL - preserved across regeneration @@ -64,6 +66,8 @@ catalogers: - pkg.GitHubActionsUseStatement package_types: # AUTO-GENERATED - github-action + purl_types: # AUTO-GENERATED + - github json_schema_types: # AUTO-GENERATED - GithubActionsUseStatement capabilities: # MANUAL - preserved across regeneration @@ -91,6 +95,8 @@ catalogers: - pkg.GitHubActionsUseStatement package_types: # AUTO-GENERATED - github-action + purl_types: # AUTO-GENERATED + - github json_schema_types: # AUTO-GENERATED - GithubActionsUseStatement capabilities: # MANUAL - preserved across regeneration diff --git a/syft/pkg/cataloger/golang/capabilities.yaml b/syft/pkg/cataloger/golang/capabilities.yaml index 49e87f1a3..b0e55805c 100644 --- a/syft/pkg/cataloger/golang/capabilities.yaml +++ b/syft/pkg/cataloger/golang/capabilities.yaml @@ -57,6 +57,8 @@ catalogers: - pkg.GolangBinaryBuildinfoEntry package_types: # AUTO-GENERATED - go-module + purl_types: # AUTO-GENERATED + - golang json_schema_types: # AUTO-GENERATED - GoModuleBuildinfoEntry capabilities: # MANUAL - preserved across regeneration @@ -113,6 +115,8 @@ catalogers: - pkg.GolangSourceEntry package_types: # AUTO-GENERATED - go-module + purl_types: # AUTO-GENERATED + - golang json_schema_types: # AUTO-GENERATED - GoModuleEntry - GoSourceEntry diff --git a/syft/pkg/cataloger/haskell/capabilities.yaml b/syft/pkg/cataloger/haskell/capabilities.yaml index 0c1de7b1b..25ea697ac 100644 --- a/syft/pkg/cataloger/haskell/capabilities.yaml +++ b/syft/pkg/cataloger/haskell/capabilities.yaml @@ -23,6 +23,8 @@ catalogers: - '**/cabal.project.freeze' package_types: # AUTO-GENERATED - hackage + purl_types: # AUTO-GENERATED + - hackage capabilities: # MANUAL - preserved across regeneration - name: license default: false @@ -51,6 +53,8 @@ catalogers: - pkg.HackageStackYamlLockEntry package_types: # AUTO-GENERATED - hackage + purl_types: # AUTO-GENERATED + - hackage json_schema_types: # AUTO-GENERATED - HaskellHackageStackLockEntry capabilities: # MANUAL - preserved across regeneration @@ -83,6 +87,8 @@ catalogers: - pkg.HackageStackYamlEntry package_types: # AUTO-GENERATED - hackage + purl_types: # AUTO-GENERATED + - hackage json_schema_types: # AUTO-GENERATED - HaskellHackageStackEntry capabilities: # MANUAL - preserved across regeneration diff --git a/syft/pkg/cataloger/homebrew/capabilities.yaml b/syft/pkg/cataloger/homebrew/capabilities.yaml index fb7ac85f8..ea9b2b08a 100644 --- a/syft/pkg/cataloger/homebrew/capabilities.yaml +++ b/syft/pkg/cataloger/homebrew/capabilities.yaml @@ -24,6 +24,8 @@ catalogers: - pkg.HomebrewFormula package_types: # AUTO-GENERATED - homebrew + purl_types: # AUTO-GENERATED + - homebrew json_schema_types: # AUTO-GENERATED - HomebrewFormula capabilities: # MANUAL - preserved across regeneration diff --git a/syft/pkg/cataloger/java/capabilities.yaml b/syft/pkg/cataloger/java/capabilities.yaml index 06c5526b9..84469f497 100644 --- a/syft/pkg/cataloger/java/capabilities.yaml +++ b/syft/pkg/cataloger/java/capabilities.yaml @@ -91,6 +91,8 @@ catalogers: - pkg.JavaArchive package_types: # AUTO-GENERATED - java-archive + purl_types: # AUTO-GENERATED + - maven json_schema_types: # AUTO-GENERATED - JavaArchive capabilities: # MANUAL - edit capabilities here @@ -137,6 +139,8 @@ catalogers: - pkg.JavaArchive package_types: # AUTO-GENERATED - java-archive + purl_types: # AUTO-GENERATED + - maven json_schema_types: # AUTO-GENERATED - JavaArchive capabilities: # MANUAL - preserved across regeneration @@ -179,6 +183,8 @@ catalogers: - pkg.JavaArchive package_types: # AUTO-GENERATED - java-archive + purl_types: # AUTO-GENERATED + - maven json_schema_types: # AUTO-GENERATED - JavaArchive capabilities: # MANUAL - edit capabilities here diff --git a/syft/pkg/cataloger/javascript/capabilities.yaml b/syft/pkg/cataloger/javascript/capabilities.yaml index 3a11c74a1..0cec8d141 100644 --- a/syft/pkg/cataloger/javascript/capabilities.yaml +++ b/syft/pkg/cataloger/javascript/capabilities.yaml @@ -38,6 +38,8 @@ catalogers: - pkg.BunLockEntry package_types: # AUTO-GENERATED - npm + purl_types: # AUTO-GENERATED + - npm json_schema_types: # AUTO-GENERATED - JavascriptBunLockEntry capabilities: # MANUAL - preserved across regeneration @@ -70,6 +72,8 @@ catalogers: - pkg.PnpmLockEntry package_types: # AUTO-GENERATED - npm + purl_types: # AUTO-GENERATED + - npm json_schema_types: # AUTO-GENERATED - JavascriptPnpmLockEntry capabilities: # MANUAL - preserved across regeneration @@ -99,6 +103,8 @@ catalogers: - pkg.YarnLockEntry package_types: # AUTO-GENERATED - npm + purl_types: # AUTO-GENERATED + - npm json_schema_types: # AUTO-GENERATED - JavascriptYarnLockEntry capabilities: # MANUAL - preserved across regeneration @@ -131,6 +137,8 @@ catalogers: - pkg.NpmPackageLockEntry package_types: # AUTO-GENERATED - npm + purl_types: # AUTO-GENERATED + - npm json_schema_types: # AUTO-GENERATED - JavascriptNpmPackageLockEntry capabilities: # MANUAL - preserved across regeneration @@ -177,6 +185,8 @@ catalogers: - pkg.NpmPackage package_types: # AUTO-GENERATED - npm + purl_types: # AUTO-GENERATED + - npm json_schema_types: # AUTO-GENERATED - JavascriptNpmPackage capabilities: # MANUAL - preserved across regeneration diff --git a/syft/pkg/cataloger/kernel/capabilities.yaml b/syft/pkg/cataloger/kernel/capabilities.yaml index c6e8afe1e..f24b3e8e1 100644 --- a/syft/pkg/cataloger/kernel/capabilities.yaml +++ b/syft/pkg/cataloger/kernel/capabilities.yaml @@ -45,6 +45,9 @@ catalogers: package_types: # AUTO-GENERATED - linux-kernel - linux-kernel-module + purl_types: # AUTO-GENERATED + - generic + - generic/linux-kernel json_schema_types: # AUTO-GENERATED - LinuxKernelArchive - LinuxKernelModule diff --git a/syft/pkg/cataloger/lua/capabilities.yaml b/syft/pkg/cataloger/lua/capabilities.yaml index edbdcf894..a8f5edc08 100644 --- a/syft/pkg/cataloger/lua/capabilities.yaml +++ b/syft/pkg/cataloger/lua/capabilities.yaml @@ -24,6 +24,8 @@ catalogers: - pkg.LuaRocksPackage package_types: # AUTO-GENERATED - lua-rocks + purl_types: # AUTO-GENERATED + - luarocks json_schema_types: # AUTO-GENERATED - LuarocksPackage capabilities: # MANUAL - preserved across regeneration diff --git a/syft/pkg/cataloger/nix/capabilities.yaml b/syft/pkg/cataloger/nix/capabilities.yaml index 6df5d58f4..c919b1679 100644 --- a/syft/pkg/cataloger/nix/capabilities.yaml +++ b/syft/pkg/cataloger/nix/capabilities.yaml @@ -30,6 +30,8 @@ catalogers: - pkg.NixStoreEntry package_types: # AUTO-GENERATED - nix + purl_types: # AUTO-GENERATED + - nix json_schema_types: # AUTO-GENERATED - NixStoreEntry capabilities: # MANUAL - edit capabilities here @@ -71,6 +73,8 @@ catalogers: - pkg.NixStoreEntry package_types: # AUTO-GENERATED - nix + purl_types: # AUTO-GENERATED + - nix json_schema_types: # AUTO-GENERATED - NixStoreEntry capabilities: # MANUAL - edit capabilities here diff --git a/syft/pkg/cataloger/ocaml/capabilities.yaml b/syft/pkg/cataloger/ocaml/capabilities.yaml index b49a98a14..541944fc3 100644 --- a/syft/pkg/cataloger/ocaml/capabilities.yaml +++ b/syft/pkg/cataloger/ocaml/capabilities.yaml @@ -24,6 +24,8 @@ catalogers: - pkg.OpamPackage package_types: # AUTO-GENERATED - opam + purl_types: # AUTO-GENERATED + - opam json_schema_types: # AUTO-GENERATED - OpamPackage capabilities: # MANUAL - preserved across regeneration diff --git a/syft/pkg/cataloger/php/capabilities.yaml b/syft/pkg/cataloger/php/capabilities.yaml index 7fe336c05..d448221a2 100644 --- a/syft/pkg/cataloger/php/capabilities.yaml +++ b/syft/pkg/cataloger/php/capabilities.yaml @@ -24,6 +24,8 @@ catalogers: - pkg.PhpComposerInstalledEntry package_types: # AUTO-GENERATED - php-composer + purl_types: # AUTO-GENERATED + - composer json_schema_types: # AUTO-GENERATED - PhpComposerInstalledEntry capabilities: # MANUAL - preserved across regeneration @@ -68,6 +70,8 @@ catalogers: - pkg.PhpComposerLockEntry package_types: # AUTO-GENERATED - php-composer + purl_types: # AUTO-GENERATED + - composer json_schema_types: # AUTO-GENERATED - PhpComposerLockEntry capabilities: # MANUAL - preserved across regeneration @@ -156,6 +160,8 @@ catalogers: - pkg.PhpPearEntry package_types: # AUTO-GENERATED - php-pear + purl_types: # AUTO-GENERATED + - pear json_schema_types: # AUTO-GENERATED - PhpPearEntry capabilities: # MANUAL - preserved across regeneration @@ -194,6 +200,8 @@ catalogers: - pkg.PhpPeclEntry package_types: # AUTO-GENERATED - php-pecl + purl_types: # AUTO-GENERATED + - pear json_schema_types: # AUTO-GENERATED - PhpPeclEntry capabilities: # MANUAL - preserved across regeneration diff --git a/syft/pkg/cataloger/python/capabilities.yaml b/syft/pkg/cataloger/python/capabilities.yaml index dfbadc272..c2b403b26 100644 --- a/syft/pkg/cataloger/python/capabilities.yaml +++ b/syft/pkg/cataloger/python/capabilities.yaml @@ -40,6 +40,8 @@ catalogers: - pkg.PythonPackage package_types: # AUTO-GENERATED - python + purl_types: # AUTO-GENERATED + - pypi json_schema_types: # AUTO-GENERATED - PythonPackage capabilities: # MANUAL - preserved across regeneration @@ -86,6 +88,8 @@ catalogers: - pkg.PythonPdmLockEntry package_types: # AUTO-GENERATED - python + purl_types: # AUTO-GENERATED + - pypi json_schema_types: # AUTO-GENERATED - PythonPdmLockEntry capabilities: # MANUAL - preserved across regeneration @@ -118,6 +122,8 @@ catalogers: - pkg.PythonUvLockEntry package_types: # AUTO-GENERATED - python + purl_types: # AUTO-GENERATED + - pypi json_schema_types: # AUTO-GENERATED - PythonUvLockEntry capabilities: # MANUAL - preserved across regeneration @@ -147,6 +153,8 @@ catalogers: - '**/setup.py' package_types: # AUTO-GENERATED - python + purl_types: # AUTO-GENERATED + - pypi capabilities: # MANUAL - preserved across regeneration - name: license default: false @@ -173,6 +181,8 @@ catalogers: - pkg.PythonPipfileLockEntry package_types: # AUTO-GENERATED - python + purl_types: # AUTO-GENERATED + - pypi json_schema_types: # AUTO-GENERATED - PythonPipfileLockEntry capabilities: # MANUAL - preserved across regeneration @@ -204,6 +214,8 @@ catalogers: - pkg.PythonPoetryLockEntry package_types: # AUTO-GENERATED - python + purl_types: # AUTO-GENERATED + - pypi json_schema_types: # AUTO-GENERATED - PythonPoetryLockEntry capabilities: # MANUAL - preserved across regeneration @@ -235,6 +247,8 @@ catalogers: - pkg.PythonRequirementsEntry package_types: # AUTO-GENERATED - python + purl_types: # AUTO-GENERATED + - pypi json_schema_types: # AUTO-GENERATED - PythonPipRequirementsEntry capabilities: # MANUAL - preserved across regeneration diff --git a/syft/pkg/cataloger/r/capabilities.yaml b/syft/pkg/cataloger/r/capabilities.yaml index b890f082c..737047ba0 100644 --- a/syft/pkg/cataloger/r/capabilities.yaml +++ b/syft/pkg/cataloger/r/capabilities.yaml @@ -24,6 +24,8 @@ catalogers: - pkg.RDescription package_types: # AUTO-GENERATED - R-package + purl_types: # AUTO-GENERATED + - cran json_schema_types: # AUTO-GENERATED - RDescription capabilities: # MANUAL - preserved across regeneration diff --git a/syft/pkg/cataloger/redhat/capabilities.yaml b/syft/pkg/cataloger/redhat/capabilities.yaml index 2480296a0..b6ee9e4fa 100644 --- a/syft/pkg/cataloger/redhat/capabilities.yaml +++ b/syft/pkg/cataloger/redhat/capabilities.yaml @@ -25,6 +25,8 @@ catalogers: - pkg.RpmArchive package_types: # AUTO-GENERATED - rpm + purl_types: # AUTO-GENERATED + - rpm json_schema_types: # AUTO-GENERATED - RpmArchive capabilities: # MANUAL - preserved across regeneration @@ -71,6 +73,8 @@ catalogers: - pkg.RpmDBEntry package_types: # AUTO-GENERATED - rpm + purl_types: # AUTO-GENERATED + - rpm json_schema_types: # AUTO-GENERATED - RpmDbEntry capabilities: # MANUAL - preserved across regeneration @@ -100,6 +104,8 @@ catalogers: - pkg.RpmDBEntry package_types: # AUTO-GENERATED - rpm + purl_types: # AUTO-GENERATED + - rpm json_schema_types: # AUTO-GENERATED - RpmDbEntry capabilities: # MANUAL - preserved across regeneration diff --git a/syft/pkg/cataloger/ruby/capabilities.yaml b/syft/pkg/cataloger/ruby/capabilities.yaml index 991596552..28edc114b 100644 --- a/syft/pkg/cataloger/ruby/capabilities.yaml +++ b/syft/pkg/cataloger/ruby/capabilities.yaml @@ -23,6 +23,8 @@ catalogers: - '**/Gemfile.next.lock' package_types: # AUTO-GENERATED - gem + purl_types: # AUTO-GENERATED + - gem capabilities: # MANUAL - preserved across regeneration - name: license default: false @@ -66,6 +68,8 @@ catalogers: - pkg.RubyGemspec package_types: # AUTO-GENERATED - gem + purl_types: # AUTO-GENERATED + - gem json_schema_types: # AUTO-GENERATED - RubyGemspec capabilities: # MANUAL - preserved across regeneration @@ -109,6 +113,8 @@ catalogers: - pkg.RubyGemspec package_types: # AUTO-GENERATED - gem + purl_types: # AUTO-GENERATED + - gem json_schema_types: # AUTO-GENERATED - RubyGemspec capabilities: # MANUAL - preserved across regeneration diff --git a/syft/pkg/cataloger/rust/capabilities.yaml b/syft/pkg/cataloger/rust/capabilities.yaml index 82d211be6..04fc597e8 100644 --- a/syft/pkg/cataloger/rust/capabilities.yaml +++ b/syft/pkg/cataloger/rust/capabilities.yaml @@ -30,6 +30,8 @@ catalogers: - pkg.RustBinaryAuditEntry package_types: # AUTO-GENERATED - rust-crate + purl_types: # AUTO-GENERATED + - cargo json_schema_types: # AUTO-GENERATED - RustCargoAuditEntry capabilities: # MANUAL - preserved across regeneration @@ -73,6 +75,8 @@ catalogers: - pkg.RustCargoLockEntry package_types: # AUTO-GENERATED - rust-crate + purl_types: # AUTO-GENERATED + - cargo json_schema_types: # AUTO-GENERATED - RustCargoLockEntry capabilities: # MANUAL - preserved across regeneration diff --git a/syft/pkg/cataloger/sbom/capabilities.yaml b/syft/pkg/cataloger/sbom/capabilities.yaml index 5fe58eb18..177cd8f9c 100644 --- a/syft/pkg/cataloger/sbom/capabilities.yaml +++ b/syft/pkg/cataloger/sbom/capabilities.yaml @@ -30,6 +30,8 @@ catalogers: - pkg.ApkDBEntry package_types: # AUTO-GENERATED - apk + purl_types: # AUTO-GENERATED + - apk json_schema_types: # AUTO-GENERATED - ApkDbEntry capabilities: # MANUAL - preserved across regeneration diff --git a/syft/pkg/cataloger/snap/capabilities.yaml b/syft/pkg/cataloger/snap/capabilities.yaml index b414044e0..2d0789e05 100644 --- a/syft/pkg/cataloger/snap/capabilities.yaml +++ b/syft/pkg/cataloger/snap/capabilities.yaml @@ -23,6 +23,8 @@ catalogers: - pkg.SnapEntry package_types: # AUTO-GENERATED - deb + purl_types: # AUTO-GENERATED + - deb json_schema_types: # AUTO-GENERATED - SnapEntry capabilities: # MANUAL - preserved across regeneration @@ -49,6 +51,8 @@ catalogers: - pkg.SnapEntry package_types: # AUTO-GENERATED - deb + purl_types: # AUTO-GENERATED + - deb json_schema_types: # AUTO-GENERATED - SnapEntry capabilities: # MANUAL - preserved across regeneration @@ -75,6 +79,8 @@ catalogers: - pkg.SnapEntry package_types: # AUTO-GENERATED - deb + purl_types: # AUTO-GENERATED + - deb json_schema_types: # AUTO-GENERATED - SnapEntry capabilities: # MANUAL - preserved across regeneration @@ -101,6 +107,8 @@ catalogers: - pkg.SnapEntry package_types: # AUTO-GENERATED - deb + purl_types: # AUTO-GENERATED + - deb json_schema_types: # AUTO-GENERATED - SnapEntry capabilities: # MANUAL - preserved across regeneration diff --git a/syft/pkg/cataloger/swift/capabilities.yaml b/syft/pkg/cataloger/swift/capabilities.yaml index b03352c59..182803d6d 100644 --- a/syft/pkg/cataloger/swift/capabilities.yaml +++ b/syft/pkg/cataloger/swift/capabilities.yaml @@ -24,6 +24,8 @@ catalogers: - pkg.CocoaPodfileLockEntry package_types: # AUTO-GENERATED - pod + purl_types: # AUTO-GENERATED + - cocoapods json_schema_types: # AUTO-GENERATED - CocoaPodfileLockEntry capabilities: # MANUAL - preserved across regeneration @@ -70,6 +72,8 @@ catalogers: - pkg.SwiftPackageManagerResolvedEntry package_types: # AUTO-GENERATED - swift + purl_types: # AUTO-GENERATED + - swift json_schema_types: # AUTO-GENERATED - SwiftPackageManagerLockEntry capabilities: # MANUAL - preserved across regeneration diff --git a/syft/pkg/cataloger/swipl/capabilities.yaml b/syft/pkg/cataloger/swipl/capabilities.yaml index f88328567..82ac70b73 100644 --- a/syft/pkg/cataloger/swipl/capabilities.yaml +++ b/syft/pkg/cataloger/swipl/capabilities.yaml @@ -24,6 +24,8 @@ catalogers: - pkg.SwiplPackEntry package_types: # AUTO-GENERATED - swiplpack + purl_types: # AUTO-GENERATED + - swiplpack json_schema_types: # AUTO-GENERATED - SwiplpackPackage capabilities: # MANUAL - preserved across regeneration diff --git a/syft/pkg/cataloger/terraform/capabilities.yaml b/syft/pkg/cataloger/terraform/capabilities.yaml index 427cb5f5d..586a153bd 100644 --- a/syft/pkg/cataloger/terraform/capabilities.yaml +++ b/syft/pkg/cataloger/terraform/capabilities.yaml @@ -22,6 +22,8 @@ catalogers: - pkg.TerraformLockProviderEntry package_types: # AUTO-GENERATED - terraform + purl_types: # AUTO-GENERATED + - terraform json_schema_types: # AUTO-GENERATED - TerraformLockProviderEntry capabilities: # MANUAL - preserved across regeneration diff --git a/syft/pkg/cataloger/wordpress/capabilities.yaml b/syft/pkg/cataloger/wordpress/capabilities.yaml index 9da6257a3..81e5e12f7 100644 --- a/syft/pkg/cataloger/wordpress/capabilities.yaml +++ b/syft/pkg/cataloger/wordpress/capabilities.yaml @@ -22,6 +22,8 @@ catalogers: - pkg.WordpressPluginEntry package_types: # AUTO-GENERATED - wordpress-plugin + purl_types: # AUTO-GENERATED + - wordpress-plugin json_schema_types: # AUTO-GENERATED - WordpressPluginEntry capabilities: # MANUAL - preserved across regeneration