<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Flux – Flux Schema</title><link>https://deploy-preview-2604--fluxcd.netlify.app/flux/cli-plugins/flux-schema/</link><description>Recent content in Flux Schema on Flux</description><generator>Hugo -- gohugo.io</generator><language>en</language><atom:link href="https://deploy-preview-2604--fluxcd.netlify.app/flux/cli-plugins/flux-schema/index.xml" rel="self" type="application/rss+xml"/><item><title>Flux: Flux Schema Config</title><link>https://deploy-preview-2604--fluxcd.netlify.app/flux/cli-plugins/flux-schema/config/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://deploy-preview-2604--fluxcd.netlify.app/flux/cli-plugins/flux-schema/config/</guid><description>
&lt;p>The &lt;code>flux schema validate&lt;/code> and &lt;code>flux schema explain&lt;/code> commands can load default
flag values from a YAML configuration file. The file shape is versioned and
documented by the JSON Schema in
&lt;a href="https://github.com/fluxcd/flux-schema/blob/v0.10.2/docs/config-v1beta1.json" target="_blank">&lt;code>config-v1beta1.json&lt;/code>&lt;/a>.&lt;/p>
&lt;h2 id="example">Example&lt;/h2>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f0f0f0;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-yaml" data-lang="yaml">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#062873;font-weight:bold">apiVersion&lt;/span>:&lt;span style="color:#bbb"> &lt;/span>schema.plugin.fluxcd.io/v1beta1&lt;span style="color:#bbb">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#bbb">&lt;/span>&lt;span style="color:#062873;font-weight:bold">kind&lt;/span>:&lt;span style="color:#bbb"> &lt;/span>Config&lt;span style="color:#bbb">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#bbb">&lt;/span>&lt;span style="color:#062873;font-weight:bold">validate&lt;/span>:&lt;span style="color:#bbb">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#bbb"> &lt;/span>&lt;span style="color:#062873;font-weight:bold">schemaLocation&lt;/span>:&lt;span style="color:#bbb">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#bbb"> &lt;/span>- ecosystem&lt;span style="color:#bbb">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#bbb"> &lt;/span>&lt;span style="color:#062873;font-weight:bold">skipKind&lt;/span>:&lt;span style="color:#bbb">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#bbb"> &lt;/span>- source.toolkit.fluxcd.io/v1/ExternalArtifact&lt;span style="color:#bbb">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#bbb"> &lt;/span>&lt;span style="color:#062873;font-weight:bold">skipJSONPath&lt;/span>:&lt;span style="color:#bbb">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#bbb"> &lt;/span>- Secret:/sops&lt;span style="color:#bbb">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#bbb"> &lt;/span>&lt;span style="color:#062873;font-weight:bold">skipFile&lt;/span>:&lt;span style="color:#bbb">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#bbb"> &lt;/span>- &lt;span style="color:#4070a0">&amp;#39;.*&amp;#39;&lt;/span>&lt;span style="color:#bbb">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#bbb"> &lt;/span>- kustomization.yaml&lt;span style="color:#bbb">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#bbb"> &lt;/span>&lt;span style="color:#062873;font-weight:bold">skipCELRules&lt;/span>:&lt;span style="color:#bbb"> &lt;/span>&lt;span style="color:#007020;font-weight:bold">false&lt;/span>&lt;span style="color:#bbb">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#bbb"> &lt;/span>&lt;span style="color:#062873;font-weight:bold">skipMissingSchemas&lt;/span>:&lt;span style="color:#bbb"> &lt;/span>&lt;span style="color:#007020;font-weight:bold">false&lt;/span>&lt;span style="color:#bbb">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#bbb"> &lt;/span>&lt;span style="color:#062873;font-weight:bold">verbose&lt;/span>:&lt;span style="color:#bbb"> &lt;/span>&lt;span style="color:#007020;font-weight:bold">true&lt;/span>&lt;span style="color:#bbb">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#bbb"> &lt;/span>&lt;span style="color:#062873;font-weight:bold">failFast&lt;/span>:&lt;span style="color:#bbb"> &lt;/span>&lt;span style="color:#007020;font-weight:bold">false&lt;/span>&lt;span style="color:#bbb">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#bbb"> &lt;/span>&lt;span style="color:#062873;font-weight:bold">concurrent&lt;/span>:&lt;span style="color:#bbb"> &lt;/span>&lt;span style="color:#40a070">8&lt;/span>&lt;span style="color:#bbb">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#bbb"> &lt;/span>&lt;span style="color:#062873;font-weight:bold">insecureSkipTLSVerify&lt;/span>:&lt;span style="color:#bbb"> &lt;/span>&lt;span style="color:#007020;font-weight:bold">false&lt;/span>&lt;span style="color:#bbb">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#bbb"> &lt;/span>&lt;span style="color:#062873;font-weight:bold">output&lt;/span>:&lt;span style="color:#bbb"> &lt;/span>text&lt;span style="color:#bbb">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#bbb">&lt;/span>&lt;span style="color:#062873;font-weight:bold">explain&lt;/span>:&lt;span style="color:#bbb">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#bbb"> &lt;/span>&lt;span style="color:#062873;font-weight:bold">schemaLocation&lt;/span>:&lt;span style="color:#bbb">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#bbb"> &lt;/span>- ecosystem&lt;span style="color:#bbb">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#bbb"> &lt;/span>&lt;span style="color:#062873;font-weight:bold">apiVersion&lt;/span>:&lt;span style="color:#bbb"> &lt;/span>v1&lt;span style="color:#bbb">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#bbb"> &lt;/span>&lt;span style="color:#062873;font-weight:bold">recursive&lt;/span>:&lt;span style="color:#bbb"> &lt;/span>&lt;span style="color:#007020;font-weight:bold">false&lt;/span>&lt;span style="color:#bbb">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#bbb"> &lt;/span>&lt;span style="color:#062873;font-weight:bold">insecureSkipTLSVerify&lt;/span>:&lt;span style="color:#bbb"> &lt;/span>&lt;span style="color:#007020;font-weight:bold">false&lt;/span>&lt;span style="color:#bbb">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#bbb"> &lt;/span>&lt;span style="color:#062873;font-weight:bold">output&lt;/span>:&lt;span style="color:#bbb"> &lt;/span>plaintext&lt;span style="color:#bbb">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Usage:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f0f0f0;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-shell" data-lang="shell">&lt;span style="display:flex;">&lt;span>flux schema validate ./manifests --config .fluxschema.yml
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>flux schema explain pods.spec --config .fluxschema.yml
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>When &lt;code>--config&lt;/code> is not set, the &lt;code>FLUX_SCHEMA_CONFIG&lt;/code> environment variable is
used. When neither is set, &lt;code>validate&lt;/code> uses the executable-adjacent config file
when it exists. &lt;code>explain&lt;/code> reads that same path when no &lt;code>--schema-location&lt;/code> is
passed, for example &lt;code>~/.fluxcd/plugins/flux-schema.config&lt;/code>.&lt;/p>
&lt;h2 id="specification">Specification&lt;/h2>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Field&lt;/th>
&lt;th>Description&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;code>apiVersion&lt;/code>&lt;/td>
&lt;td>Config API version. Currently &lt;code>schema.plugin.fluxcd.io/v1beta1&lt;/code>.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>kind&lt;/code>&lt;/td>
&lt;td>Config API kind. Currently &lt;code>Config&lt;/code>.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>validate&lt;/code>&lt;/td>
&lt;td>Defaults for validation options.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>explain&lt;/code>&lt;/td>
&lt;td>Defaults for explain options.&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;h3 id="validation">Validation&lt;/h3>
&lt;p>The &lt;code>validate&lt;/code> section configures defaults for the &lt;code>flux schema validate&lt;/code> flags.&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Field&lt;/th>
&lt;th>Description&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;code>schemaLocation[]&lt;/code>&lt;/td>
&lt;td>Schema URLs, file paths, or templates tried in order. Aliases: &lt;code>default&lt;/code> (built-in catalog), &lt;code>ecosystem&lt;/code> (
&lt;a href="https://schemas.fluxoperator.dev/" target="_blank">schemas.fluxoperator.dev&lt;/a>).&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>skipMissingSchemas&lt;/code>&lt;/td>
&lt;td>Skip documents for which no schema can be found.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>skipKind[]&lt;/code>&lt;/td>
&lt;td>Kind or apiVersion/kind patterns excluded from validation.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>skipJSONPath[]&lt;/code>&lt;/td>
&lt;td>JSON Pointers stripped before validation.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>skipFile[]&lt;/code>&lt;/td>
&lt;td>Basename glob patterns excluded from validation.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>skipCELRules&lt;/code>&lt;/td>
&lt;td>Disable evaluation of &lt;code>x-kubernetes-validations&lt;/code> CEL rules.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>verbose&lt;/code>&lt;/td>
&lt;td>Print a line for every document, including valid and skipped.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>failFast&lt;/code>&lt;/td>
&lt;td>Exit after the first invalid document.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>concurrent&lt;/code>&lt;/td>
&lt;td>Number of concurrent validation workers.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>insecureSkipTLSVerify&lt;/code>&lt;/td>
&lt;td>Disable TLS certificate verification when downloading schemas.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>output&lt;/code>&lt;/td>
&lt;td>Output format: &lt;code>text&lt;/code>, &lt;code>json&lt;/code>, or &lt;code>yaml&lt;/code>.&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>When the &lt;code>output&lt;/code> field is set to &lt;code>json&lt;/code> or &lt;code>yaml&lt;/code>, the result has the
&lt;a href="https://deploy-preview-2604--fluxcd.netlify.app/flux/cli-plugins/flux-schema/report/">Report API&lt;/a> shape.&lt;/p>
&lt;h3 id="explain">Explain&lt;/h3>
&lt;p>The &lt;code>explain&lt;/code> section configures defaults for the &lt;code>flux schema explain&lt;/code> flags.&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Field&lt;/th>
&lt;th>Description&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;code>schemaLocation[]&lt;/code>&lt;/td>
&lt;td>Schema URLs, file paths, or templates tried in order. Aliases: &lt;code>default&lt;/code> (built-in catalog), &lt;code>ecosystem&lt;/code> (
&lt;a href="https://schemas.fluxoperator.dev/" target="_blank">schemas.fluxoperator.dev&lt;/a>).&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>apiVersion&lt;/code>&lt;/td>
&lt;td>API group/version to explain by default.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>recursive&lt;/code>&lt;/td>
&lt;td>Print fields of fields.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>insecureSkipTLSVerify&lt;/code>&lt;/td>
&lt;td>Disable TLS certificate verification when downloading schemas.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>output&lt;/code>&lt;/td>
&lt;td>Output format: &lt;code>plaintext&lt;/code> or &lt;code>plaintext-openapiv2&lt;/code>.&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table></description></item><item><title>Flux: Kubernetes Manifests Validation with Flux Schema CLI</title><link>https://deploy-preview-2604--fluxcd.netlify.app/flux/cli-plugins/flux-schema/manifests-validation/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://deploy-preview-2604--fluxcd.netlify.app/flux/cli-plugins/flux-schema/manifests-validation/</guid><description>
&lt;p>The &lt;code>flux schema validate&lt;/code> command validates Kubernetes YAML manifests from one
or more files or directories against a JSON Schema resolved from each
document&amp;rsquo;s &lt;code>apiVersion&lt;/code> and &lt;code>kind&lt;/code>.&lt;/p>
&lt;p>Examples:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f0f0f0;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-shell" data-lang="shell">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#60a0b0;font-style:italic"># Validate all YAML files in a directory tree&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>flux schema validate ./manifests --skip-missing-schemas
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#60a0b0;font-style:italic"># Validate a Helm chart by piping the rendered output&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>helm template ./charts/app | flux schema validate --verbose
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>A non-zero exit code is returned when any document is invalid or errored.&lt;/p>
&lt;h2 id="flags">Flags&lt;/h2>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Flag&lt;/th>
&lt;th>Description&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;code>-s, --schema-location&lt;/code>&lt;/td>
&lt;td>URL or file path for schemas (repeatable, tried in order); &lt;code>default&lt;/code> points at the built-in catalog, &lt;code>ecosystem&lt;/code> at the CNCF ecosystem catalog.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>--skip-missing-schemas&lt;/code>&lt;/td>
&lt;td>Skip documents for which no schema can be found.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>--skip-kind&lt;/code>&lt;/td>
&lt;td>Skip documents matching &lt;code>kind&lt;/code> or &lt;code>apiVersion/kind&lt;/code> (repeatable).&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>--skip-json-path&lt;/code>&lt;/td>
&lt;td>Strip a JSON Pointer field before validation, optionally scoped: &lt;code>[apiVersion/kind:]/path&lt;/code> (repeatable).&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>--skip-file&lt;/code>&lt;/td>
&lt;td>Glob pattern matched against files and dirs; defaults to skipping dotfiles and dot-dirs (repeatable).&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>--skip-cel-rules&lt;/code>&lt;/td>
&lt;td>Skip evaluation of &lt;code>x-kubernetes-validations&lt;/code> CEL rules.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>--fail-fast&lt;/code>&lt;/td>
&lt;td>Exit after the first invalid document.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>--concurrent&lt;/code>&lt;/td>
&lt;td>Number of concurrent workers (default 8).&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>--insecure-skip-tls-verify&lt;/code>&lt;/td>
&lt;td>Disable TLS certificate verification when fetching schemas over HTTPS.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>-v, --verbose&lt;/code>&lt;/td>
&lt;td>Print a line for every document, including valid and skipped ones.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>-o, --output&lt;/code>&lt;/td>
&lt;td>Output format, one of &lt;code>text&lt;/code>, &lt;code>json&lt;/code> or &lt;code>yaml&lt;/code> (default: &lt;code>text&lt;/code>).&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>--config&lt;/code>&lt;/td>
&lt;td>Path to a YAML file supplying default values for validate flags (env: &lt;code>FLUX_SCHEMA_CONFIG&lt;/code>).&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;h2 id="schema-location">Schema location&lt;/h2>
&lt;p>When no &lt;code>--schema-location&lt;/code> is given, &lt;code>validate&lt;/code> uses the
&lt;a href="https://github.com/fluxcd/flux-schema/blob/v0.10.2/catalog/README.md" target="_blank">Flux Schema catalog&lt;/a>, which covers the latest Kubernetes and OpenShift APIs,
the stable channel of Gateway API, and the Flux ecosystem CRDs:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f0f0f0;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-shell" data-lang="shell">&lt;span style="display:flex;">&lt;span>flux schema validate ./manifests
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>To validate against your own schemas generated by &lt;code>flux schema extract&lt;/code>, pass
the directory as &lt;code>--schema-location&lt;/code>. Bare paths and URLs are auto-expanded to
the catalog layout &lt;code>{{.Group}}/{{.Kind}}_{{.Version}}.json&lt;/code>:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f0f0f0;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-shell" data-lang="shell">&lt;span style="display:flex;">&lt;span>flux schema validate ./manifests --schema-location ./my-schemas
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>For a different layout, pass a full Go template ending in &lt;code>.json&lt;/code>:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f0f0f0;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-shell" data-lang="shell">&lt;span style="display:flex;">&lt;span>flux schema validate ./manifests &lt;span style="color:#4070a0;font-weight:bold">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#4070a0;font-weight:bold">&lt;/span> --schema-location &lt;span style="color:#4070a0">&amp;#39;./schemas/{{.Kind}}-{{.GroupPrefix}}-{{.Version}}.json&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Template variables are &lt;code>.Group&lt;/code>, &lt;code>.GroupPrefix&lt;/code>, &lt;code>.Kind&lt;/code>, and &lt;code>.Version&lt;/code>.&lt;/p>
&lt;p>The &lt;code>--schema-location&lt;/code> flag is repeatable and locations are tried in order
(the first match wins). Pass the literal value &lt;code>default&lt;/code> to include the
Flux Schema catalog alongside your own schemas:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f0f0f0;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-shell" data-lang="shell">&lt;span style="display:flex;">&lt;span>flux schema validate ./manifests &lt;span style="color:#4070a0;font-weight:bold">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#4070a0;font-weight:bold">&lt;/span> --schema-location default &lt;span style="color:#4070a0;font-weight:bold">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#4070a0;font-weight:bold">&lt;/span> --schema-location ecosystem &lt;span style="color:#4070a0;font-weight:bold">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#4070a0;font-weight:bold">&lt;/span> --schema-location &lt;span style="color:#4070a0">&amp;#39;./schemas/{{.Kind}}-{{.GroupPrefix}}-{{.Version}}.json&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>The literal value &lt;code>ecosystem&lt;/code> resolves to the
&lt;a href="https://schemas.fluxoperator.dev" target="_blank">CNCF ecosystem catalog&lt;/a> served from
&lt;code>https://schemas.fluxoperator.dev/catalog/&lt;/code>, covering CRDs of hundreds of CNCF
projects and rebuilt daily from upstream releases.&lt;/p>
&lt;p>See
&lt;a href="https://deploy-preview-2604--fluxcd.netlify.app/flux/cli-plugins/flux-schema/custom-schema-catalog/">custom catalogs&lt;/a> for guidance on building and hosting
your own schema catalog.&lt;/p>
&lt;h2 id="skipping-documents-and-fields">Skipping documents and fields&lt;/h2>
&lt;p>Manifests can be piped in and certain documents skipped with &lt;code>--skip-kind&lt;/code>:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f0f0f0;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-shell" data-lang="shell">&lt;span style="display:flex;">&lt;span>kustomize build . | flux schema validate &lt;span style="color:#4070a0;font-weight:bold">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#4070a0;font-weight:bold">&lt;/span> --skip-kind &lt;span style="color:#4070a0">&amp;#39;Service&amp;#39;&lt;/span> &lt;span style="color:#4070a0;font-weight:bold">\ &lt;/span>&lt;span style="color:#60a0b0;font-style:italic"># matches any Service kind regardless of apiVersion&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> --skip-kind &lt;span style="color:#4070a0">&amp;#39;source.toolkit.fluxcd.io/v1/ExternalArtifact&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Some manifests carry tooling-injected fields that are stripped at apply time
by Flux (e.g. SOPS-encrypted Secrets). Use &lt;code>--skip-json-path&lt;/code> to remove those
fields from validation so the rest of the document is still checked:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f0f0f0;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-shell" data-lang="shell">&lt;span style="display:flex;">&lt;span>flux schema validate ./manifests &lt;span style="color:#4070a0;font-weight:bold">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#4070a0;font-weight:bold">&lt;/span> --skip-json-path &lt;span style="color:#4070a0">&amp;#39;v1/Secret:/sops&amp;#39;&lt;/span> &lt;span style="color:#4070a0;font-weight:bold">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#4070a0;font-weight:bold">&lt;/span> --skip-json-path &lt;span style="color:#4070a0">&amp;#39;Deployment:/sops&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="output">Output&lt;/h2>
&lt;p>Default output (&lt;code>-o text&lt;/code>) prints one line per document with its validation result,
and a summary at the end. To print valid documents and skipped ones alongside
invalid ones, pass &lt;code>--verbose&lt;/code>:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f0f0f0;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-console" data-lang="console">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#c65d09;font-weight:bold">$&lt;/span> flux schema validate ./manifests --verbose
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="">&lt;/span>&lt;span style="color:#888">manifests/releases.yaml - HelmRelease/apps/frontend is invalid: cel violation
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#888"> - /spec: Invalid value: either &amp;#39;chart&amp;#39; or &amp;#39;chartRef&amp;#39; must be set
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#888">manifests/sources.yaml - Bucket/apps/frontend-config is invalid: schema violation
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#888"> - /spec: missing property &amp;#39;bucketName&amp;#39;
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#888"> - /spec/interval: got number, want string
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#888"> - /spec/secretRef/name: got object, want string
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#888"> - /spec: additional properties &amp;#39;force&amp;#39; not allowed
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#888">manifests/sources.yaml - OCIRepository/apps/frontend is invalid: yaml parse error
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#888"> - line 10: key &amp;#34;app.kubernetes.io/name&amp;#34; already set in map
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#888">manifests/sources.yaml - HelmChart/apps/frontend is valid
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#888">manifests/sources.yaml - Secret/apps/auth-sops is skipped: kind skipped
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#888">Summary: 5 resources found in 2 files - Valid: 1, Invalid: 3, Skipped: 1
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>For CI pipelines and tooling, pass &lt;code>-o json&lt;/code> (or &lt;code>-o yaml&lt;/code>) to emit a
machine-readable report instead of plain text:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f0f0f0;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-shell" data-lang="shell">&lt;span style="display:flex;">&lt;span>flux schema validate ./manifests -o json
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Example JSON output:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f0f0f0;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-json" data-lang="json">&lt;span style="display:flex;">&lt;span>{
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#062873;font-weight:bold">&amp;#34;apiVersion&amp;#34;&lt;/span>: &lt;span style="color:#4070a0">&amp;#34;schema.plugin.fluxcd.io/v1beta1&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#062873;font-weight:bold">&amp;#34;kind&amp;#34;&lt;/span>: &lt;span style="color:#4070a0">&amp;#34;Report&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#062873;font-weight:bold">&amp;#34;$schema&amp;#34;&lt;/span>: &lt;span style="color:#4070a0">&amp;#34;https://raw.githubusercontent.com/fluxcd/flux-schema/main/docs/report-v1beta1.json&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#062873;font-weight:bold">&amp;#34;report&amp;#34;&lt;/span>: {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#062873;font-weight:bold">&amp;#34;reporter&amp;#34;&lt;/span>: &lt;span style="color:#4070a0">&amp;#34;flux-schema/v0.1.0&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#062873;font-weight:bold">&amp;#34;timestamp&amp;#34;&lt;/span>: &lt;span style="color:#4070a0">&amp;#34;2026-05-20T12:00:00Z&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#062873;font-weight:bold">&amp;#34;summary&amp;#34;&lt;/span>: {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#062873;font-weight:bold">&amp;#34;total&amp;#34;&lt;/span>: &lt;span style="color:#40a070">3&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#062873;font-weight:bold">&amp;#34;valid&amp;#34;&lt;/span>: &lt;span style="color:#40a070">1&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#062873;font-weight:bold">&amp;#34;invalid&amp;#34;&lt;/span>: &lt;span style="color:#40a070">2&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#062873;font-weight:bold">&amp;#34;skipped&amp;#34;&lt;/span>: &lt;span style="color:#40a070">0&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> },
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#062873;font-weight:bold">&amp;#34;results&amp;#34;&lt;/span>: [
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#062873;font-weight:bold">&amp;#34;resource&amp;#34;&lt;/span>: {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#062873;font-weight:bold">&amp;#34;apiVersion&amp;#34;&lt;/span>: &lt;span style="color:#4070a0">&amp;#34;v1&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#062873;font-weight:bold">&amp;#34;kind&amp;#34;&lt;/span>: &lt;span style="color:#4070a0">&amp;#34;Namespace&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#062873;font-weight:bold">&amp;#34;name&amp;#34;&lt;/span>: &lt;span style="color:#4070a0">&amp;#34;apps&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> },
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#062873;font-weight:bold">&amp;#34;source&amp;#34;&lt;/span>: &lt;span style="color:#4070a0">&amp;#34;manifests/apps.yaml&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#062873;font-weight:bold">&amp;#34;idx&amp;#34;&lt;/span>: &lt;span style="color:#40a070">1&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#062873;font-weight:bold">&amp;#34;status&amp;#34;&lt;/span>: &lt;span style="color:#4070a0">&amp;#34;valid&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> },
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#062873;font-weight:bold">&amp;#34;resource&amp;#34;&lt;/span>: {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#062873;font-weight:bold">&amp;#34;apiVersion&amp;#34;&lt;/span>: &lt;span style="color:#4070a0">&amp;#34;helm.toolkit.fluxcd.io/v2&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#062873;font-weight:bold">&amp;#34;kind&amp;#34;&lt;/span>: &lt;span style="color:#4070a0">&amp;#34;HelmRelease&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#062873;font-weight:bold">&amp;#34;name&amp;#34;&lt;/span>: &lt;span style="color:#4070a0">&amp;#34;frontend&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#062873;font-weight:bold">&amp;#34;namespace&amp;#34;&lt;/span>: &lt;span style="color:#4070a0">&amp;#34;apps&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> },
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#062873;font-weight:bold">&amp;#34;source&amp;#34;&lt;/span>: &lt;span style="color:#4070a0">&amp;#34;manifests/apps.yaml&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#062873;font-weight:bold">&amp;#34;idx&amp;#34;&lt;/span>: &lt;span style="color:#40a070">2&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#062873;font-weight:bold">&amp;#34;status&amp;#34;&lt;/span>: &lt;span style="color:#4070a0">&amp;#34;invalid&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#062873;font-weight:bold">&amp;#34;reason&amp;#34;&lt;/span>: &lt;span style="color:#4070a0">&amp;#34;cel-violation&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#062873;font-weight:bold">&amp;#34;violations&amp;#34;&lt;/span>: [
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#062873;font-weight:bold">&amp;#34;path&amp;#34;&lt;/span>: &lt;span style="color:#4070a0">&amp;#34;/spec&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#062873;font-weight:bold">&amp;#34;message&amp;#34;&lt;/span>: &lt;span style="color:#4070a0">&amp;#34;Invalid value: either &amp;#39;chart&amp;#39; or &amp;#39;chartRef&amp;#39; must be set&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> ]
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> },
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#062873;font-weight:bold">&amp;#34;resource&amp;#34;&lt;/span>: {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#062873;font-weight:bold">&amp;#34;apiVersion&amp;#34;&lt;/span>: &lt;span style="color:#4070a0">&amp;#34;source.toolkit.fluxcd.io/v1&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#062873;font-weight:bold">&amp;#34;kind&amp;#34;&lt;/span>: &lt;span style="color:#4070a0">&amp;#34;OCIRepository&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#062873;font-weight:bold">&amp;#34;name&amp;#34;&lt;/span>: &lt;span style="color:#4070a0">&amp;#34;frontend&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#062873;font-weight:bold">&amp;#34;namespace&amp;#34;&lt;/span>: &lt;span style="color:#4070a0">&amp;#34;apps&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> },
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#062873;font-weight:bold">&amp;#34;source&amp;#34;&lt;/span>: &lt;span style="color:#4070a0">&amp;#34;manifests/apps.yaml&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#062873;font-weight:bold">&amp;#34;idx&amp;#34;&lt;/span>: &lt;span style="color:#40a070">3&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#062873;font-weight:bold">&amp;#34;status&amp;#34;&lt;/span>: &lt;span style="color:#4070a0">&amp;#34;invalid&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#062873;font-weight:bold">&amp;#34;reason&amp;#34;&lt;/span>: &lt;span style="color:#4070a0">&amp;#34;schema-violation&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#062873;font-weight:bold">&amp;#34;violations&amp;#34;&lt;/span>: [
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#062873;font-weight:bold">&amp;#34;path&amp;#34;&lt;/span>: &lt;span style="color:#4070a0">&amp;#34;/spec&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#062873;font-weight:bold">&amp;#34;message&amp;#34;&lt;/span>: &lt;span style="color:#4070a0">&amp;#34;additional properties &amp;#39;force&amp;#39; not allowed&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> },
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#062873;font-weight:bold">&amp;#34;path&amp;#34;&lt;/span>: &lt;span style="color:#4070a0">&amp;#34;/spec/interval&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#062873;font-weight:bold">&amp;#34;message&amp;#34;&lt;/span>: &lt;span style="color:#4070a0">&amp;#34;got number, want string&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> ]
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> ]
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>See the
&lt;a href="https://deploy-preview-2604--fluxcd.netlify.app/flux/cli-plugins/flux-schema/report/">validation report reference&lt;/a> for the full envelope
shape, the &lt;code>reason&lt;/code> enum, and an example covering every result type. The
report is versioned by a published
&lt;a href="https://github.com/fluxcd/flux-schema/blob/v0.10.2/docs/report-v1beta1.json" target="_blank">JSON Schema&lt;/a>.&lt;/p>
&lt;h2 id="validation-rules">Validation rules&lt;/h2>
&lt;ul>
&lt;li>YAML documents with duplicate keys are rejected matching Flux behavior.&lt;/li>
&lt;li>Documents missing both &lt;code>metadata.name&lt;/code> and &lt;code>metadata.generateName&lt;/code> are
flagged as invalid matching Kubernetes API behavior.&lt;/li>
&lt;li>&lt;code>metadata.name&lt;/code>, &lt;code>generateName&lt;/code>, &lt;code>namespace&lt;/code>, and &lt;code>labels&lt;/code>/&lt;code>annotations&lt;/code>
keys and values are checked against the Kubernetes API server&amp;rsquo;s ObjectMeta
rules (DNS-1123, qualified names).&lt;/li>
&lt;li>Schemas produced by &lt;code>flux schema extract crd&lt;/code> close objects with
&lt;code>additionalProperties: false&lt;/code>, so undocumented fields under &lt;code>spec&lt;/code> fail
validation.&lt;/li>
&lt;li>Kubernetes admission extensions are enforced for embedded resources and list
topology: &lt;code>x-kubernetes-embedded-resource&lt;/code> validates nested &lt;code>apiVersion&lt;/code>,
&lt;code>kind&lt;/code>, and &lt;code>metadata&lt;/code>, while &lt;code>x-kubernetes-list-type: map|set&lt;/code> rejects
duplicate list entries using &lt;code>x-kubernetes-list-map-keys&lt;/code> for map lists.&lt;/li>
&lt;li>String formats &lt;code>duration&lt;/code>, &lt;code>date&lt;/code>, &lt;code>datetime&lt;/code>/&lt;code>date-time&lt;/code>, and &lt;code>time&lt;/code> are
validated matching Kubernetes OpenAPI conventions.&lt;/li>
&lt;/ul>
&lt;h2 id="cel-validation-rules">CEL validation rules&lt;/h2>
&lt;p>By default, the validate command extracts the &lt;code>x-kubernetes-validations&lt;/code>
rules from the schemas and evaluates them as CEL expressions using the same
engine as the Kubernetes API.&lt;/p>
&lt;p>CEL evaluation runs only after JSON Schema validation passes, and any rule
violations are reported with the &lt;code>cel-violation&lt;/code> reason. Before evaluating
rules, flux-schema applies the schema&amp;rsquo;s structural defaults in memory, matching
kube-apiserver ordering. Transition rules referencing &lt;code>oldSelf&lt;/code> evaluate with
no prior state, matching the Kubernetes API behavior on &lt;code>CREATE&lt;/code>.&lt;/p>
&lt;p>The CEL validation can be disabled with the &lt;code>--skip-cel-rules&lt;/code> flag.&lt;/p>
&lt;h2 id="config-file">Config file&lt;/h2>
&lt;p>Flag values can be pre-set in a YAML config file and referenced with&lt;code>--config&lt;/code>
or with the &lt;code>FLUX_SCHEMA_CONFIG&lt;/code> environment variable. This keeps long invocations
out of CI scripts and makes validation reproducible across environments.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f0f0f0;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-shell" data-lang="shell">&lt;span style="display:flex;">&lt;span>flux schema validate ./manifests --config .fluxschema.yml
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>The file is wrapped in a &lt;code>Config&lt;/code> API envelope and has a &lt;code>validate&lt;/code> section
for validation defaults. The shape is documented by the
&lt;a href="https://github.com/fluxcd/flux-schema/blob/v0.10.2/docs/config-v1beta1.json" target="_blank">Config JSON Schema&lt;/a>.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f0f0f0;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-yaml" data-lang="yaml">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#062873;font-weight:bold">apiVersion&lt;/span>:&lt;span style="color:#bbb"> &lt;/span>schema.plugin.fluxcd.io/v1beta1&lt;span style="color:#bbb">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#bbb">&lt;/span>&lt;span style="color:#062873;font-weight:bold">kind&lt;/span>:&lt;span style="color:#bbb"> &lt;/span>Config&lt;span style="color:#bbb">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#bbb">&lt;/span>&lt;span style="color:#062873;font-weight:bold">validate&lt;/span>:&lt;span style="color:#bbb">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#bbb"> &lt;/span>&lt;span style="color:#062873;font-weight:bold">schemaLocation&lt;/span>:&lt;span style="color:#bbb">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#bbb"> &lt;/span>- default&lt;span style="color:#bbb">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#bbb"> &lt;/span>- ecosystem&lt;span style="color:#bbb">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#bbb"> &lt;/span>&lt;span style="color:#062873;font-weight:bold">skipKind&lt;/span>:&lt;span style="color:#bbb">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#bbb"> &lt;/span>- source.toolkit.fluxcd.io/v1/ExternalArtifact&lt;span style="color:#bbb">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#bbb"> &lt;/span>&lt;span style="color:#062873;font-weight:bold">skipJSONPath&lt;/span>:&lt;span style="color:#bbb">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#bbb"> &lt;/span>- Secret:/sops&lt;span style="color:#bbb">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#bbb"> &lt;/span>&lt;span style="color:#062873;font-weight:bold">skipFile&lt;/span>:&lt;span style="color:#bbb">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#bbb"> &lt;/span>- &lt;span style="color:#4070a0">&amp;#39;.*&amp;#39;&lt;/span>&lt;span style="color:#bbb">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#bbb"> &lt;/span>- kustomization.yaml&lt;span style="color:#bbb">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#bbb"> &lt;/span>&lt;span style="color:#062873;font-weight:bold">skipCELRules&lt;/span>:&lt;span style="color:#bbb"> &lt;/span>&lt;span style="color:#007020;font-weight:bold">false&lt;/span>&lt;span style="color:#bbb">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#bbb"> &lt;/span>&lt;span style="color:#062873;font-weight:bold">skipMissingSchemas&lt;/span>:&lt;span style="color:#bbb"> &lt;/span>&lt;span style="color:#007020;font-weight:bold">false&lt;/span>&lt;span style="color:#bbb">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#bbb"> &lt;/span>&lt;span style="color:#062873;font-weight:bold">verbose&lt;/span>:&lt;span style="color:#bbb"> &lt;/span>&lt;span style="color:#007020;font-weight:bold">true&lt;/span>&lt;span style="color:#bbb">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#bbb"> &lt;/span>&lt;span style="color:#062873;font-weight:bold">failFast&lt;/span>:&lt;span style="color:#bbb"> &lt;/span>&lt;span style="color:#007020;font-weight:bold">false&lt;/span>&lt;span style="color:#bbb">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#bbb"> &lt;/span>&lt;span style="color:#062873;font-weight:bold">concurrent&lt;/span>:&lt;span style="color:#bbb"> &lt;/span>&lt;span style="color:#40a070">8&lt;/span>&lt;span style="color:#bbb">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#bbb"> &lt;/span>&lt;span style="color:#062873;font-weight:bold">insecureSkipTLSVerify&lt;/span>:&lt;span style="color:#bbb"> &lt;/span>&lt;span style="color:#007020;font-weight:bold">false&lt;/span>&lt;span style="color:#bbb">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#bbb"> &lt;/span>&lt;span style="color:#062873;font-weight:bold">output&lt;/span>:&lt;span style="color:#bbb"> &lt;/span>text&lt;span style="color:#bbb">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Rules:&lt;/p>
&lt;ul>
&lt;li>CLI flags override config values. Setting &lt;code>--verbose=false&lt;/code> wins over
&lt;code>verbose: true&lt;/code> in the file.&lt;/li>
&lt;li>Setting &lt;code>--config&lt;/code> overrides &lt;code>FLUX_SCHEMA_CONFIG&lt;/code>. When both are set, the
flag wins and the env var is ignored.&lt;/li>
&lt;li>Manifest paths stay positional. The config file configures how to validate;
paths are given on the command line.&lt;/li>
&lt;/ul>
&lt;h2 id="running-in-ci">Running in CI&lt;/h2>
&lt;h3 id="github-actions">GitHub Actions&lt;/h3>
&lt;p>See the
&lt;a href="https://github.com/fluxcd/flux-schema/blob/v0.10.2/actions/validate/README.md" target="_blank">validate action&lt;/a> reference.&lt;/p>
&lt;h3 id="docker">Docker&lt;/h3>
&lt;p>The &lt;code>ghcr.io/fluxcd/flux-schema&lt;/code> image bakes the
&lt;a href="https://github.com/fluxcd/flux-schema/blob/v0.10.2/catalog/README.md" target="_blank">default catalog&lt;/a>
into &lt;code>/catalog/latest/&lt;/code>, so manifests can be validated offline without fetching schemas from GitHub.&lt;/p>
&lt;p>Mount the manifests directory and point &lt;code>--schema-location&lt;/code> at the builtin catalog:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f0f0f0;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-sh" data-lang="sh">&lt;span style="display:flex;">&lt;span>docker run --rm &lt;span style="color:#4070a0;font-weight:bold">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#4070a0;font-weight:bold">&lt;/span> -v &lt;span style="color:#4070a0">&amp;#34;&lt;/span>&lt;span style="color:#bb60d5">$PWD&lt;/span>&lt;span style="color:#4070a0">/manifests:/manifests:ro&amp;#34;&lt;/span> &lt;span style="color:#4070a0;font-weight:bold">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#4070a0;font-weight:bold">&lt;/span> ghcr.io/fluxcd/flux-schema:latest validate /manifests &lt;span style="color:#4070a0;font-weight:bold">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#4070a0;font-weight:bold">&lt;/span> --schema-location /catalog/latest
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Or pipe rendered manifests into the container over stdin
(note the &lt;code>-i&lt;/code> flag to keep stdin open):&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f0f0f0;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-sh" data-lang="sh">&lt;span style="display:flex;">&lt;span>kustomize build ./manifests | docker run --rm -i &lt;span style="color:#4070a0;font-weight:bold">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#4070a0;font-weight:bold">&lt;/span> ghcr.io/fluxcd/flux-schema:latest validate &lt;span style="color:#4070a0;font-weight:bold">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#4070a0;font-weight:bold">&lt;/span> --schema-location /catalog/latest &lt;span style="color:#4070a0;font-weight:bold">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#4070a0;font-weight:bold">&lt;/span> --skip-missing-schemas
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Notes:&lt;/p>
&lt;ul>
&lt;li>Use &lt;code>--schema-location /catalog/latest&lt;/code> rather than &lt;code>default&lt;/code> for air-gapped environments.&lt;/li>
&lt;li>Pin the image to a release tag e.g. &lt;code>ghcr.io/fluxcd/flux-schema:v0.3.0&lt;/code>.&lt;/li>
&lt;li>Tu use your own schema catalog, repeat &lt;code>--schema-location&lt;/code> with another mounted directory.&lt;/li>
&lt;/ul></description></item><item><title>Flux: Kubernetes Schema Explain with Flux Schema CLI</title><link>https://deploy-preview-2604--fluxcd.netlify.app/flux/cli-plugins/flux-schema/explain/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://deploy-preview-2604--fluxcd.netlify.app/flux/cli-plugins/flux-schema/explain/</guid><description>
&lt;p>The &lt;code>flux schema explain&lt;/code> command prints kubectl-style field documentation from
JSON Schema catalogs, without contacting a Kubernetes API server.&lt;/p>
&lt;p>Examples:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f0f0f0;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-shell" data-lang="shell">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#60a0b0;font-style:italic"># Explain a native Kubernetes resource from a local catalog&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>flux schema explain pods --api-version&lt;span style="color:#666">=&lt;/span>v1 --schema-location ./catalog
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#60a0b0;font-style:italic"># Explain a Flux resource from a description-preserving remote catalog&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>flux schema explain hr.spec -s ecosystem
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#60a0b0;font-style:italic"># Explain a nested field&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>flux schema explain pods.spec.containers --api-version&lt;span style="color:#666">=&lt;/span>v1 --schema-location ./catalog
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#60a0b0;font-style:italic"># Print nested fields recursively&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>flux schema explain pods --api-version&lt;span style="color:#666">=&lt;/span>v1 --recursive --schema-location ./catalog
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="flags">Flags&lt;/h2>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Flag&lt;/th>
&lt;th>Description&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;code>-s, --schema-location&lt;/code>&lt;/td>
&lt;td>URL or file path for schemas (repeatable); &lt;code>default&lt;/code> points at the built-in validation catalog, &lt;code>ecosystem&lt;/code> at the CNCF ecosystem catalog.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>-f, --config&lt;/code>&lt;/td>
&lt;td>YAML config file with &lt;code>explain&lt;/code> defaults; defaults to &lt;code>$FLUX_SCHEMA_CONFIG&lt;/code>, else &lt;code>&amp;lt;executable&amp;gt;.config&lt;/code>.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>--api-version&lt;/code>&lt;/td>
&lt;td>Get different explanations for a particular API version (&lt;code>group/version&lt;/code>).&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>--recursive&lt;/code>&lt;/td>
&lt;td>Print fields of fields.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>-o, --output&lt;/code>&lt;/td>
&lt;td>Output format, one of &lt;code>plaintext&lt;/code> or &lt;code>plaintext-openapiv2&lt;/code> (default: &lt;code>plaintext&lt;/code>).&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>--insecure-skip-tls-verify&lt;/code>&lt;/td>
&lt;td>Disable TLS certificate verification when fetching schemas over HTTPS.&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>When &lt;code>--schema-location&lt;/code> is not passed, &lt;code>explain&lt;/code> reads config from
&lt;code>--config&lt;/code>, then &lt;code>$FLUX_SCHEMA_CONFIG&lt;/code>, then a file next to the running binary
named &lt;code>&amp;lt;binary&amp;gt;.config&lt;/code>. That config must set &lt;code>explain.schemaLocation&lt;/code>.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f0f0f0;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-yaml" data-lang="yaml">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#062873;font-weight:bold">apiVersion&lt;/span>:&lt;span style="color:#bbb"> &lt;/span>schema.plugin.fluxcd.io/v1beta1&lt;span style="color:#bbb">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#bbb">&lt;/span>&lt;span style="color:#062873;font-weight:bold">kind&lt;/span>:&lt;span style="color:#bbb"> &lt;/span>Config&lt;span style="color:#bbb">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#bbb">&lt;/span>&lt;span style="color:#062873;font-weight:bold">explain&lt;/span>:&lt;span style="color:#bbb">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#bbb"> &lt;/span>&lt;span style="color:#062873;font-weight:bold">schemaLocation&lt;/span>:&lt;span style="color:#bbb">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#bbb"> &lt;/span>- https://schemas.fluxoperator.dev/catalog&lt;span style="color:#bbb">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="resource-references">Resource References&lt;/h2>
&lt;p>&lt;code>explain&lt;/code> resolves resource references in the same style as &lt;code>kubectl explain&lt;/code>:
kind names (&lt;code>OCIRepository.spec.verify&lt;/code>), plural resource names
(&lt;code>ocirepositories.spec.verify&lt;/code>), full resource names
(&lt;code>ocirepositories.source.toolkit.fluxcd.io.spec.verify&lt;/code>), and short names
(&lt;code>po.spec&lt;/code>, &lt;code>hr.spec&lt;/code>, &lt;code>ag.spec&lt;/code>). Built-in Kubernetes short names are
recognized by the command. CRD kinds, plural names, singular names, full
resource names, and short names are resolved from sharded metadata under
&lt;code>.explain/refs/&lt;/code> when custom catalogs provide it. For the &lt;code>ecosystem&lt;/code> catalog,
&lt;code>explain&lt;/code> uses the hosted &lt;code>https://schemas.fluxoperator.dev/index.json&lt;/code> to
resolve resource references and provide shell completion without fetching
thousands of per-resource metadata files. Resource completion suggests the
canonical resource name (&lt;code>plural.group&lt;/code>, or &lt;code>plural&lt;/code> for core resources) for all
indexed resources matching the typed prefix. Field completion resolves the typed
resource reference, fetches that schema, and suggests matching child field paths
while preserving the resource reference the user typed. Loaded schemas and
not-found lookups are cached in memory for the life of the process; no disk
cache is written.&lt;/p>
&lt;p>When &lt;code>--api-version&lt;/code> is set, dotted group suffixes are treated like kubectl:
the first path segment is the resource name and the remaining segments are
field names. Without &lt;code>--api-version&lt;/code>, &lt;code>explain&lt;/code> first tries to interpret dotted
segments after the resource as an API group, then falls back to field lookup.&lt;/p>
&lt;h2 id="catalogs">Catalogs&lt;/h2>
&lt;p>&lt;code>explain&lt;/code> has two catalog modes.&lt;/p>
&lt;h3 id="ecosystem-index-mode">Ecosystem index mode&lt;/h3>
&lt;p>The hosted &lt;code>ecosystem&lt;/code> catalog is special. &lt;code>flux schema explain -s ecosystem&lt;/code>
uses &lt;code>https://schemas.fluxoperator.dev/index.json&lt;/code> for resource lookup and
resource-name completion. Field completion and command output fetch only the
schema JSON needed for the resolved resource. Because the index already provides
plural names, short names, full resource names, and resource completion
candidates, the catalog does not need alias redirect files or a &lt;code>.explain/&lt;/code>
tree.&lt;/p>
&lt;p>Schemas used with this mode should be generated with JSON-only explain type
metadata:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f0f0f0;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-shell" data-lang="shell">&lt;span style="display:flex;">&lt;span>flux schema extract k8s --with-explain-type-metadata -d ./catalog
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;code>--with-explain-type-metadata&lt;/code> keeps only schema-local JSON hints used after a
schema has been loaded, such as named field types (&lt;code>Container&lt;/code>, &lt;code>Quantity&lt;/code>,
&lt;code>IntOrString&lt;/code>) and referenced type descriptions. It does not write alias JSON
files, &lt;code>.explain/refs/&lt;/code>, or &lt;code>.explain/completion/&lt;/code>.&lt;/p>
&lt;h3 id="standalone-catalog-mode">Standalone catalog mode&lt;/h3>
&lt;p>Use standalone mode for custom catalogs that must contain everything
&lt;code>flux schema explain&lt;/code> needs without the ecosystem index.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f0f0f0;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-shell" data-lang="shell">&lt;span style="display:flex;">&lt;span>flux schema extract k8s --with-explain-metadata -d ./catalog
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>flux schema extract crd --with-explain-metadata -d ./catalog
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;code>--with-explain-metadata&lt;/code> is the full explain mode. It is a superset of
&lt;code>--with-explain-type-metadata&lt;/code>: it keeps the schema-local JSON type hints and
also writes alias redirects, &lt;code>.explain/refs/&lt;/code> lookup files, and
&lt;code>.explain/completion/&lt;/code> shards used for kubectl-style resource references and
type-reference shell completion.&lt;/p>
&lt;p>&lt;code>--with-field-index&lt;/code> is independent from both modes. It writes &lt;code>.fields.txt&lt;/code>
sidecars for search and agent workflows. &lt;code>explain&lt;/code> does not use field indexes
for resource lookup, completion, field rendering, type names, or descriptions.
It can read them only as a fallback for root &lt;code>apiVersion&lt;/code> and &lt;code>kind&lt;/code> when JSON
explain metadata is missing.&lt;/p>
&lt;p>Catalogs generated with &lt;code>--strip-description&lt;/code> still resolve fields, but they
cannot reproduce kubectl&amp;rsquo;s descriptive output byte-for-byte because regular
descriptions and explain type descriptions are removed.&lt;/p></description></item><item><title>Flux: GitOps Repository Discovery with Flux Schema CLI</title><link>https://deploy-preview-2604--fluxcd.netlify.app/flux/cli-plugins/flux-schema/repo-discovery/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://deploy-preview-2604--fluxcd.netlify.app/flux/cli-plugins/flux-schema/repo-discovery/</guid><description>
&lt;p>The &lt;code>flux schema discover&lt;/code> command catalogs the Kubernetes manifests in a
GitOps repository and emits a structured inventory. The inventory is
designed for AI agents and automation auditing a repository: it maps the
directory structure, lists every Flux resource with its defining file,
and counts plain Kubernetes resources.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f0f0f0;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-shell" data-lang="shell">&lt;span style="display:flex;">&lt;span>flux schema discover ./my-gitops-repo -o json
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>The scan is purely static: no kustomize builds, no Helm rendering, no
cluster access. Resources are counted once, where they are defined on
disk. To validate the rendered output of kustomize overlays, see the
&lt;a href="https://deploy-preview-2604--fluxcd.netlify.app/flux/cli-plugins/flux-schema/manifests-validation/">manifest validation guide&lt;/a>.&lt;/p>
&lt;h2 id="why-ai-agents-should-use-this-command">Why AI agents should use this command&lt;/h2>
&lt;p>An agent exploring a GitOps repository with &lt;code>tree&lt;/code>, &lt;code>ls&lt;/code> and &lt;code>grep&lt;/code> sees
file names and string matches, not resources. Flux Schema discovery replaces
the read-and-grep loop that follows with one deterministic pass:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>File names reveal nothing.&lt;/strong> GitOps repos are full of &lt;code>sync.yaml&lt;/code>,
&lt;code>release.yaml&lt;/code> and multi-document files; a file listing cannot reveal
what resources a file holds, which API versions they use, or their
names and namespaces. The inventory extracts all of it in one call
instead of N file reads.&lt;/li>
&lt;li>&lt;strong>String matching miscounts.&lt;/strong> &lt;code>grep -rl &amp;quot;kind: HelmRelease&amp;quot;&lt;/code> matches
kustomize patch files and patch-target references alongside real
resources. The inventory excludes patch files by resolving the
kustomization &lt;code>patches&lt;/code> references, so every resource is counted
exactly once across base and overlays.&lt;/li>
&lt;li>&lt;strong>Every kind carries its API version.&lt;/strong> The &lt;code>resources&lt;/code> census counts
every resource per &lt;code>apiVersion/Kind&lt;/code>, Flux and plain Kubernetes alike,
so outdated API versions of any CRD are visible from the inventory
alone.&lt;/li>
&lt;li>&lt;strong>The output is budgeted for context windows.&lt;/strong> Flux resources — the
usual audit subjects — are enumerated per file; plain Kubernetes
resources appear only as counts (2,000 Deployments cost a few lines,
not thousands); Helm chart and Terraform subtrees are pruned. A typical
repository inventories in a few KB.&lt;/li>
&lt;li>&lt;strong>The shape is a versioned contract.&lt;/strong> The JSON envelope is validated
by a published
&lt;a href="https://deploy-preview-2604--fluxcd.netlify.app/flux/cli-plugins/flux-schema/inventory/">JSON Schema&lt;/a>, so agents can
parse it programmatically instead of interpreting ad-hoc shell output.&lt;/li>
&lt;/ul>
&lt;p>For very large repositories (hundreds of Flux resources), the inventory
grows with the Flux resource count in every output format. Scope the
scan to the subtree under audit
(&lt;code>flux schema discover ./clusters/production -o json&lt;/code>) or exclude
directories with &lt;code>--skip-file&lt;/code> to keep the output small.&lt;/p>
&lt;p>&lt;code>tree&lt;/code> remains useful for what &lt;code>discover&lt;/code> deliberately ignores: READMEs,
scripts, CI configs, and other non-Kubernetes content.&lt;/p>
&lt;h2 id="flags">Flags&lt;/h2>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Flag&lt;/th>
&lt;th>Default&lt;/th>
&lt;th>Description&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;code>[path]&lt;/code>&lt;/td>
&lt;td>&lt;code>.&lt;/code>&lt;/td>
&lt;td>Directory (or single file) to scan.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>--skip-file&lt;/code>&lt;/td>
&lt;td>&lt;code>.*&lt;/code>&lt;/td>
&lt;td>Glob pattern matched against file and directory basenames, repeatable. The default skips dotfiles and dot-directories such as &lt;code>.git&lt;/code>.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>-o, --output&lt;/code>&lt;/td>
&lt;td>&lt;code>text&lt;/code>&lt;/td>
&lt;td>Output format: &lt;code>text&lt;/code>, &lt;code>json&lt;/code> or &lt;code>yaml&lt;/code>.&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>The command always exits zero on a successful scan, even when nothing is
found — discovery is informational. Reading from stdin is not supported:
directory classification is path-based and meaningless for a stream.&lt;/p>
&lt;h2 id="classification-rules">Classification rules&lt;/h2>
&lt;p>Both &lt;code>.yaml&lt;/code> and &lt;code>.yml&lt;/code> files are scanned. Per YAML document:&lt;/p>
&lt;ul>
&lt;li>Documents without both &lt;code>apiVersion&lt;/code> and &lt;code>kind&lt;/code> are ignored.&lt;/li>
&lt;li>Documents in the &lt;code>kustomize.config.k8s.io&lt;/code> group mark their directory as
a kustomize overlay and are not counted as resources.&lt;/li>
&lt;li>Every resource is counted per &lt;code>apiVersion/Kind&lt;/code> in the &lt;code>resources&lt;/code>
census.&lt;/li>
&lt;li>Documents whose API group contains &lt;code>fluxcd&lt;/code> are Flux resources,
additionally listed under &lt;code>flux&lt;/code> with their defining file.&lt;/li>
&lt;/ul>
&lt;p>Every directory in the inventory carries one of four types:&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Type&lt;/th>
&lt;th>Meaning&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;code>kubernetes-manifests&lt;/code>&lt;/td>
&lt;td>Plain Kubernetes YAML manifests.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>kustomize-overlay&lt;/code>&lt;/td>
&lt;td>Contains a kustomize configuration file.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>helm-chart&lt;/code>&lt;/td>
&lt;td>Contains a &lt;code>Chart.yaml&lt;/code>; the directory subtree is not scanned.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>terraform-module&lt;/code>&lt;/td>
&lt;td>Contains &lt;code>.tf&lt;/code> files; the directory subtree is not scanned.&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>When a directory holds both a &lt;code>Chart.yaml&lt;/code> and &lt;code>.tf&lt;/code> files, the Helm chart classification wins.&lt;/p>
&lt;h3 id="kustomize-patch-files">Kustomize patch files&lt;/h3>
&lt;p>Files referenced as kustomize patches (&lt;code>patches&lt;/code>, &lt;code>patchesStrategicMerge&lt;/code>,
&lt;code>patchesJson6902&lt;/code>) are excluded from the inventory entirely. Patch files
look like full manifests but only describe modifications to resources
defined elsewhere, so counting them would duplicate resources across base
and overlays. Inline patches need no special handling. An overlay
directory whose only content is the kustomize configuration and patch
files still appears in &lt;code>directories&lt;/code> as &lt;code>kustomize-overlay&lt;/code>.&lt;/p>
&lt;h3 id="path-handling">Path handling&lt;/h3>
&lt;p>All &lt;code>source&lt;/code> and &lt;code>path&lt;/code> values in the inventory are &lt;code>/&lt;/code>-separated and
relative to the scanned root; resources at the root itself land in the
&lt;code>.&lt;/code> directory. Unlike Git-based tooling, &lt;code>discover&lt;/code> does not honor
&lt;code>.gitignore&lt;/code> — use &lt;code>--skip-file&lt;/code> to exclude generated or vendored
directories by basename.&lt;/p>
&lt;p>The scan is confined to the scanned root at the operating-system level,
so a link pointing outside the repository can never leak content into the
inventory or make the scan read arbitrary files. Symbolic links are not
followed even when they stay inside the root: the walk already visits the
real target, so following the link too would list the same resource
twice.&lt;/p>
&lt;h2 id="output">Output&lt;/h2>
&lt;p>The default &lt;code>text&lt;/code> output mirrors the envelope order — directory
classifications, the per-GVK resource census, the Flux resources by
defining file, and summary line:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f0f0f0;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-text" data-lang="text">&lt;span style="display:flex;">&lt;span>Directories:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> apps/base: kustomize-overlay
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> apps/overlays/prod: kustomize-overlay
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> charts/podinfo: helm-chart
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> clusters/prod: kubernetes-manifests
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> infra/tf: terraform-module
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> legacy: kubernetes-manifests
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Resources:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> apps/v1/Deployment: 1
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> fluxcd.controlplane.io/v1/FluxInstance: 1
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> helm.toolkit.fluxcd.io/v2/HelmRelease: 1
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> kustomize.toolkit.fluxcd.io/v1/Kustomization: 1
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> source.toolkit.fluxcd.io/v1/GitRepository: 1
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> v1/ConfigMap: 1
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> v1/Service: 1
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Flux:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> FluxInstance:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> clusters/prod/instance.yaml: flux-system/flux
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> GitRepository:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> clusters/prod/flux-system.yaml: flux-system/flux-system
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> HelmRelease:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> apps/base/podinfo.yaml: podinfo/podinfo
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> Kustomization:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> clusters/prod/flux-system.yaml: flux-system/apps
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Summary: 7 resources found in 8 files with 92 lines of YAML
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>With &lt;code>-o json&lt;/code> or &lt;code>-o yaml&lt;/code> the command emits the versioned Inventory
envelope documented in the
&lt;a href="https://deploy-preview-2604--fluxcd.netlify.app/flux/cli-plugins/flux-schema/inventory/">inventory reference&lt;/a>:
&lt;code>resources&lt;/code> counts everything per &lt;code>apiVersion/Kind&lt;/code>, and &lt;code>flux&lt;/code> maps
each Flux kind to its defining files and the &lt;code>namespace/name&lt;/code> identities
they declare (the API version is already in the census):&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f0f0f0;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-json" data-lang="json">&lt;span style="display:flex;">&lt;span>{
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#062873;font-weight:bold">&amp;#34;apiVersion&amp;#34;&lt;/span>: &lt;span style="color:#4070a0">&amp;#34;schema.plugin.fluxcd.io/v1beta1&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#062873;font-weight:bold">&amp;#34;kind&amp;#34;&lt;/span>: &lt;span style="color:#4070a0">&amp;#34;Inventory&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#062873;font-weight:bold">&amp;#34;$schema&amp;#34;&lt;/span>: &lt;span style="color:#4070a0">&amp;#34;https://raw.githubusercontent.com/fluxcd/flux-schema/main/docs/inventory-v1beta1.json&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#062873;font-weight:bold">&amp;#34;inventory&amp;#34;&lt;/span>: {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#062873;font-weight:bold">&amp;#34;reporter&amp;#34;&lt;/span>: &lt;span style="color:#4070a0">&amp;#34;flux-schema/0.3.0&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#062873;font-weight:bold">&amp;#34;timestamp&amp;#34;&lt;/span>: &lt;span style="color:#4070a0">&amp;#34;2026-06-11T10:30:00Z&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#062873;font-weight:bold">&amp;#34;summary&amp;#34;&lt;/span>: {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#062873;font-weight:bold">&amp;#34;files&amp;#34;&lt;/span>: &lt;span style="color:#40a070">8&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#062873;font-weight:bold">&amp;#34;resources&amp;#34;&lt;/span>: &lt;span style="color:#40a070">7&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#062873;font-weight:bold">&amp;#34;lines-of-yaml&amp;#34;&lt;/span>: &lt;span style="color:#40a070">92&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> },
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#062873;font-weight:bold">&amp;#34;directories&amp;#34;&lt;/span>: {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#062873;font-weight:bold">&amp;#34;apps/base&amp;#34;&lt;/span>: &lt;span style="color:#4070a0">&amp;#34;kustomize-overlay&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#062873;font-weight:bold">&amp;#34;apps/overlays/prod&amp;#34;&lt;/span>: &lt;span style="color:#4070a0">&amp;#34;kustomize-overlay&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#062873;font-weight:bold">&amp;#34;charts/podinfo&amp;#34;&lt;/span>: &lt;span style="color:#4070a0">&amp;#34;helm-chart&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#062873;font-weight:bold">&amp;#34;clusters/prod&amp;#34;&lt;/span>: &lt;span style="color:#4070a0">&amp;#34;kubernetes-manifests&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#062873;font-weight:bold">&amp;#34;infra/tf&amp;#34;&lt;/span>: &lt;span style="color:#4070a0">&amp;#34;terraform-module&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#062873;font-weight:bold">&amp;#34;legacy&amp;#34;&lt;/span>: &lt;span style="color:#4070a0">&amp;#34;kubernetes-manifests&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> },
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#062873;font-weight:bold">&amp;#34;resources&amp;#34;&lt;/span>: {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#062873;font-weight:bold">&amp;#34;apps/v1/Deployment&amp;#34;&lt;/span>: &lt;span style="color:#40a070">1&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#062873;font-weight:bold">&amp;#34;fluxcd.controlplane.io/v1/FluxInstance&amp;#34;&lt;/span>: &lt;span style="color:#40a070">1&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#062873;font-weight:bold">&amp;#34;helm.toolkit.fluxcd.io/v2/HelmRelease&amp;#34;&lt;/span>: &lt;span style="color:#40a070">1&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#062873;font-weight:bold">&amp;#34;kustomize.toolkit.fluxcd.io/v1/Kustomization&amp;#34;&lt;/span>: &lt;span style="color:#40a070">1&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#062873;font-weight:bold">&amp;#34;source.toolkit.fluxcd.io/v1/GitRepository&amp;#34;&lt;/span>: &lt;span style="color:#40a070">1&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#062873;font-weight:bold">&amp;#34;v1/ConfigMap&amp;#34;&lt;/span>: &lt;span style="color:#40a070">1&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#062873;font-weight:bold">&amp;#34;v1/Service&amp;#34;&lt;/span>: &lt;span style="color:#40a070">1&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> },
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#062873;font-weight:bold">&amp;#34;flux&amp;#34;&lt;/span>: {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#062873;font-weight:bold">&amp;#34;FluxInstance&amp;#34;&lt;/span>: {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#062873;font-weight:bold">&amp;#34;clusters/prod/instance.yaml&amp;#34;&lt;/span>: [&lt;span style="color:#4070a0">&amp;#34;flux-system/flux&amp;#34;&lt;/span>]
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> },
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#062873;font-weight:bold">&amp;#34;GitRepository&amp;#34;&lt;/span>: {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#062873;font-weight:bold">&amp;#34;clusters/prod/flux-system.yaml&amp;#34;&lt;/span>: [&lt;span style="color:#4070a0">&amp;#34;flux-system/flux-system&amp;#34;&lt;/span>]
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> },
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#062873;font-weight:bold">&amp;#34;HelmRelease&amp;#34;&lt;/span>: {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#062873;font-weight:bold">&amp;#34;apps/base/podinfo.yaml&amp;#34;&lt;/span>: [&lt;span style="color:#4070a0">&amp;#34;podinfo/podinfo&amp;#34;&lt;/span>]
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> },
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#062873;font-weight:bold">&amp;#34;Kustomization&amp;#34;&lt;/span>: {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#062873;font-weight:bold">&amp;#34;clusters/prod/flux-system.yaml&amp;#34;&lt;/span>: [&lt;span style="color:#4070a0">&amp;#34;flux-system/apps&amp;#34;&lt;/span>]
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="reading-the-inventory">Reading the inventory&lt;/h2>
&lt;p>The inventory answers an auditing agent&amp;rsquo;s first questions without any grepping:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Repository pattern&lt;/strong> — the sorted &lt;code>directories&lt;/code> map reads as a tree.
&lt;code>GitRepository&lt;/code> or &lt;code>OCIRepository&lt;/code> resources defined in the same
directories as Flux &lt;code>Kustomization&lt;/code> resources (typically under
&lt;code>clusters/&lt;/code>) mark cluster sync entrypoints; &lt;code>FluxInstance&lt;/code> resources
indicate a Flux Operator managed cluster.&lt;/li>
&lt;li>&lt;strong>Navigation&lt;/strong> — every Flux kind in &lt;code>flux&lt;/code> is keyed by its defining
files, so an agent can open exactly the files relevant to an audit.&lt;/li>
&lt;li>&lt;strong>API currency&lt;/strong> — the &lt;code>resources&lt;/code> census is keyed by
&lt;code>apiVersion/Kind&lt;/code>, so deprecated API versions of Flux and third-party
CRDs stand out without reading a single manifest.&lt;/li>
&lt;li>&lt;strong>Scope boundaries&lt;/strong> — &lt;code>helm-chart&lt;/code> and &lt;code>terraform-module&lt;/code> directories exist in
the map but contribute no resources, signaling that their contents are
not Kubernetes manifests to lint.&lt;/li>
&lt;/ul></description></item><item><title>Flux: Maintaining Custom Catalogs with Flux Schema CLI</title><link>https://deploy-preview-2604--fluxcd.netlify.app/flux/cli-plugins/flux-schema/custom-schema-catalog/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://deploy-preview-2604--fluxcd.netlify.app/flux/cli-plugins/flux-schema/custom-schema-catalog/</guid><description>
&lt;p>A catalog is a directory tree of JSON Schemas laid out so that
&lt;code>flux schema validate&lt;/code> can resolve a schema from a manifest&amp;rsquo;s &lt;code>apiVersion&lt;/code>
and &lt;code>kind&lt;/code>. The built-in
&lt;a href="https://github.com/fluxcd/flux-schema/blob/v0.10.2/catalog/README.md" target="_blank">Flux Schema catalog&lt;/a> ships
schemas for Kubernetes, OpenShift, Gateway API, and the Flux ecosystem;
custom catalogs let you cover internal CRDs, pin specific upstream versions,
or assemble a layout that fits your tooling.
For third-party CRDs you don&amp;rsquo;t want to extract yourself, the hosted
&lt;a href="https://schemas.fluxoperator.dev" target="_blank">ecosystem catalog&lt;/a> is available via
&lt;code>--schema-location ecosystem&lt;/code>.&lt;/p>
&lt;h2 id="layout">Layout&lt;/h2>
&lt;p>The default resolution template is:&lt;/p>
&lt;pre tabindex="0">&lt;code>{{ .Group }}/{{ .Kind }}_{{ .Version }}.json
&lt;/code>&lt;/pre>&lt;p>For example, &lt;code>apiVersion: source.toolkit.fluxcd.io/v1&lt;/code>, &lt;code>kind: GitRepository&lt;/code>
resolves to &lt;code>source.toolkit.fluxcd.io/GitRepository_v1.json&lt;/code>.&lt;/p>
&lt;p>All template variables are lowercased at render time, so the file names on
disk are lowercase even though &lt;code>apiVersion&lt;/code>/&lt;code>kind&lt;/code> are mixed case.&lt;/p>
&lt;p>If you need a different layout (for example the kubeconform/kubeval flat
form), pass a full template to &lt;code>--schema-location&lt;/code>:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f0f0f0;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-shell" data-lang="shell">&lt;span style="display:flex;">&lt;span>flux schema validate ./manifests &lt;span style="color:#4070a0;font-weight:bold">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#4070a0;font-weight:bold">&lt;/span> --schema-location &lt;span style="color:#4070a0">&amp;#39;./my-catalog/{{.Kind}}-{{.GroupPrefix}}-{{.Version}}.json&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Supported template variables:&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Variable&lt;/th>
&lt;th>Example&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;code>.Group&lt;/code>&lt;/td>
&lt;td>&lt;code>source.toolkit.fluxcd.io&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>.GroupPrefix&lt;/code>&lt;/td>
&lt;td>&lt;code>source&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>.Kind&lt;/code>&lt;/td>
&lt;td>&lt;code>gitrepository&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>.Version&lt;/code>&lt;/td>
&lt;td>&lt;code>v1&lt;/code>&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>An empty &lt;code>.Group&lt;/code> (Kubernetes core API, e.g. &lt;code>apiVersion: v1&lt;/code>) is normalized
to &lt;code>core&lt;/code>, and &lt;code>.GroupPrefix&lt;/code> is derived from &lt;code>.Group&lt;/code> when unset. So a core
&lt;code>Pod&lt;/code> renders as &lt;code>core/pod_v1.json&lt;/code> with the default template and resolves to
the same path when &lt;code>validate&lt;/code> looks up its schema.&lt;/p>
&lt;p>The &lt;code>extract&lt;/code> commands described below all share the same default template
and &lt;code>-f, --output-format&lt;/code> flag, so a single &lt;code>--schema-location&lt;/code> resolves
everything you generate.&lt;/p>
&lt;h2 id="populating-a-catalog">Populating a catalog&lt;/h2>
&lt;p>The &lt;code>flux schema extract&lt;/code> commands write one JSON Schema file per kind, using
the layout above by default. Mix and match these commands to cover the
Kubernetes core APIs, OpenShift resources, and any CRDs your manifests rely
on.&lt;/p>
&lt;h3 id="kubernetes-crds">Kubernetes CRDs&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f0f0f0;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-shell" data-lang="shell">&lt;span style="display:flex;">&lt;span>flux schema extract crd &lt;span style="color:#666">[&lt;/span>files...&lt;span style="color:#666">]&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Reads bare CRDs, a &lt;code>List&lt;/code> of CRDs, or a multi-document YAML stream, and
emits one schema file per CRD version.&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Flag&lt;/th>
&lt;th>Description&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;code>-d, --output-dir&lt;/code>&lt;/td>
&lt;td>Directory to write JSON Schema files to (mutually exclusive with &lt;code>--output-archive&lt;/code>).&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>-a, --output-archive&lt;/code>&lt;/td>
&lt;td>Path to write a gzipped tar archive of JSON Schema files to.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>-f, --output-format&lt;/code>&lt;/td>
&lt;td>Go template for output file paths (default: &lt;code>{{ .Group }}/{{ .Kind }}_{{ .Version }}.json&lt;/code>).&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>--index-source&lt;/code>&lt;/td>
&lt;td>Source name and version recorded in field index headers, overriding auto-detection.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>--strip-description&lt;/code>&lt;/td>
&lt;td>Drop &lt;code>description&lt;/code> fields from the generated schemas to reduce their size.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>--with-field-index&lt;/code>&lt;/td>
&lt;td>Also write a &lt;code>.fields.txt&lt;/code> field index next to each schema.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>--with-explain-type-metadata&lt;/code>&lt;/td>
&lt;td>Keep JSON-only explain type hints, without writing explain lookup files.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>--with-explain-metadata&lt;/code>&lt;/td>
&lt;td>Include JSON type hints, alias redirects, and &lt;code>.explain/&lt;/code> lookup shards used by standalone &lt;code>flux schema explain&lt;/code> catalogs.&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>Generate schemas for every CRD installed in a cluster:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f0f0f0;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-shell" data-lang="shell">&lt;span style="display:flex;">&lt;span>kubectl get crds -o yaml | flux schema extract crd -d ./my-catalog
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Or from a kustomize build of an operator&amp;rsquo;s CRD bundle:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f0f0f0;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-shell" data-lang="shell">&lt;span style="display:flex;">&lt;span>kustomize build ./config/crd | flux schema extract crd -d ./my-catalog
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;blockquote>
&lt;p>The output is also compatible with &lt;code>kubeconform&lt;/code> and &lt;code>kubeval&lt;/code>, making
&lt;code>extract crd&lt;/code> a drop-in replacement for kubeconform&amp;rsquo;s
&lt;a href="https://github.com/yannh/kubeconform/blob/master/scripts/openapi2jsonschema.py" target="_blank">openapi2jsonschema.py&lt;/a>
script.&lt;/p>
&lt;/blockquote>
&lt;h3 id="kubernetes-apis">Kubernetes APIs&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f0f0f0;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-shell" data-lang="shell">&lt;span style="display:flex;">&lt;span>flux schema extract k8s &lt;span style="color:#666">[&lt;/span>swagger-file&lt;span style="color:#666">]&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Reads a Kubernetes OpenAPI v2 swagger document and emits one file per kind
listed under &lt;code>x-kubernetes-group-version-kind&lt;/code>. Helper types (e.g. &lt;code>PodSpec&lt;/code>,
&lt;code>ObjectMeta&lt;/code>) are inlined into the kinds that reference them, not written as
standalone files.&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Flag&lt;/th>
&lt;th>Description&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;code>--version X.Y.Z&lt;/code>&lt;/td>
&lt;td>Fetch the swagger from &lt;code>github.com/kubernetes/kubernetes&lt;/code> for the given release tag (mutually exclusive with a swagger file).&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>-d, --output-dir&lt;/code>&lt;/td>
&lt;td>Directory to write JSON Schema files to.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>-f, --output-format&lt;/code>&lt;/td>
&lt;td>Go template for output file paths (default: &lt;code>{{ .Group }}/{{ .Kind }}_{{ .Version }}.json&lt;/code>).&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>--index-source&lt;/code>&lt;/td>
&lt;td>Source name and version recorded in field index headers, overriding auto-detection.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>--strip-description&lt;/code>&lt;/td>
&lt;td>Drop &lt;code>description&lt;/code> fields from the generated schemas to reduce their size.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>--with-field-index&lt;/code>&lt;/td>
&lt;td>Also write a &lt;code>.fields.txt&lt;/code> field index next to each schema.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>--with-explain-type-metadata&lt;/code>&lt;/td>
&lt;td>Keep JSON-only explain type hints, without writing explain lookup files.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>--with-explain-metadata&lt;/code>&lt;/td>
&lt;td>Include JSON type hints, alias redirects, and &lt;code>.explain/&lt;/code> lookup shards used by standalone &lt;code>flux schema explain&lt;/code> catalogs.&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>Pin the catalog to a specific Kubernetes release:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f0f0f0;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-shell" data-lang="shell">&lt;span style="display:flex;">&lt;span>flux schema extract k8s --version 1.35.0 -d ./my-catalog
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Or extract from a live cluster:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f0f0f0;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-shell" data-lang="shell">&lt;span style="display:flex;">&lt;span>kubectl get --raw /openapi/v2 | flux schema extract k8s -d ./my-catalog
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Core API kinds (&lt;code>apiVersion: v1&lt;/code>) render under the &lt;code>core/&lt;/code> group directory.&lt;/p>
&lt;h3 id="openshift-apis">OpenShift APIs&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f0f0f0;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-shell" data-lang="shell">&lt;span style="display:flex;">&lt;span>flux schema extract openshift &lt;span style="color:#666">[&lt;/span>swagger-file&lt;span style="color:#666">]&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Reads an &lt;code>openshift/api&lt;/code> OpenAPI v2 swagger document and emits one file per
OpenShift resource. Only definitions in the &lt;code>openshift&lt;/code> namespace are
emitted; embedded upstream Kubernetes types (e.g. &lt;code>Pod&lt;/code>) are inlined.&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Flag&lt;/th>
&lt;th>Description&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;code>--ref REF&lt;/code>&lt;/td>
&lt;td>Fetch the swagger from &lt;code>github.com/openshift/api&lt;/code> at the given git ref (e.g. &lt;code>release-4.20&lt;/code>); mutually exclusive with a swagger file.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>-d, --output-dir&lt;/code>&lt;/td>
&lt;td>Directory to write JSON Schema files to.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>-f, --output-format&lt;/code>&lt;/td>
&lt;td>Go template for output file paths (default: &lt;code>{{ .Group }}/{{ .Kind }}_{{ .Version }}.json&lt;/code>).&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>--index-source&lt;/code>&lt;/td>
&lt;td>Source name and version recorded in field index headers, overriding auto-detection.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>--strip-description&lt;/code>&lt;/td>
&lt;td>Drop &lt;code>description&lt;/code> fields from the generated schemas to reduce their size.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>--with-field-index&lt;/code>&lt;/td>
&lt;td>Also write a &lt;code>.fields.txt&lt;/code> field index next to each schema.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>--with-explain-type-metadata&lt;/code>&lt;/td>
&lt;td>Keep JSON-only explain type hints, without writing explain lookup files.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>--with-explain-metadata&lt;/code>&lt;/td>
&lt;td>Include JSON type hints, alias redirects, and &lt;code>.explain/&lt;/code> lookup shards used by standalone &lt;code>flux schema explain&lt;/code> catalogs.&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>Pin to an OpenShift release branch:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f0f0f0;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-shell" data-lang="shell">&lt;span style="display:flex;">&lt;span>flux schema extract openshift --ref release-4.20 -d ./my-catalog
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Or feed in a downloaded swagger:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f0f0f0;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-shell" data-lang="shell">&lt;span style="display:flex;">&lt;span>curl -sL https://raw.githubusercontent.com/openshift/api/release-4.20/openapi/openapi.json | &lt;span style="color:#4070a0;font-weight:bold">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#4070a0;font-weight:bold">&lt;/span> flux schema extract openshift -d ./my-catalog
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="a-typical-refresh-script">A typical refresh script&lt;/h3>
&lt;p>A single script can populate a catalog with everything you need — the
default &lt;code>-f&lt;/code> template means the outputs land side by side under the same
root and resolve to one &lt;code>--schema-location&lt;/code>:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f0f0f0;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-shell" data-lang="shell">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#007020">#!/usr/bin/env bash
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#007020">&lt;/span>&lt;span style="color:#007020">set&lt;/span> -euo pipefail
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#bb60d5">CATALOG&lt;/span>&lt;span style="color:#666">=&lt;/span>./my-catalog
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>mkdir -p &lt;span style="color:#4070a0">&amp;#34;&lt;/span>&lt;span style="color:#bb60d5">$CATALOG&lt;/span>&lt;span style="color:#4070a0">&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#60a0b0;font-style:italic"># Kubernetes core + built-ins&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>flux schema extract k8s --version 1.35.0 --strip-description -d &lt;span style="color:#4070a0">&amp;#34;&lt;/span>&lt;span style="color:#bb60d5">$CATALOG&lt;/span>&lt;span style="color:#4070a0">&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#60a0b0;font-style:italic"># Vendor CRDs at a pinned version&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>kubectl kustomize &lt;span style="color:#4070a0;font-weight:bold">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#4070a0;font-weight:bold">&lt;/span> https://github.com/external-secrets/external-secrets/config/crds/bases?ref&lt;span style="color:#666">=&lt;/span>v2.3.0 | &lt;span style="color:#4070a0;font-weight:bold">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#4070a0;font-weight:bold">&lt;/span> flux schema extract crd --strip-description -d &lt;span style="color:#4070a0">&amp;#34;&lt;/span>&lt;span style="color:#bb60d5">$CATALOG&lt;/span>&lt;span style="color:#4070a0">&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Pass &lt;code>--strip-description&lt;/code> to every generator to keep the catalog small —
the official catalog uses it everywhere and gets about a 54% size
reduction on native Kubernetes schemas.&lt;/p>
&lt;p>The official catalog&amp;rsquo;s generator scripts under
&lt;a href="https://github.com/fluxcd/flux-schema/tree/v0.10.2/scripts" target="_blank">&lt;code>scripts/&lt;/code>&lt;/a> are a working reference: &lt;code>gen-k8s-schemas.sh&lt;/code>,
&lt;code>gen-flux-schemas.sh&lt;/code>, &lt;code>gen-crd-schemas.sh&lt;/code>, and &lt;code>gen-openshift-schemas.sh&lt;/code>.&lt;/p>
&lt;h2 id="schema-output">Schema output&lt;/h2>
&lt;p>All &lt;code>extract&lt;/code> commands emit the standalone-strict JSON Schema variant, so
schemas in the catalog are usable on their own and reproduce the
constraints the Kubernetes API server enforces:&lt;/p>
&lt;ul>
&lt;li>Every &lt;code>$ref&lt;/code> is inlined, so each schema has no cross-file dependencies.&lt;/li>
&lt;li>Objects with &lt;code>properties&lt;/code> are closed with &lt;code>additionalProperties: false&lt;/code>,
except under nodes marked &lt;code>x-kubernetes-preserve-unknown-fields: true&lt;/code>,
which stay open so free-form maps validate correctly.&lt;/li>
&lt;li>Kubernetes admission validation extensions are preserved when they affect
manifest validation: &lt;code>x-kubernetes-embedded-resource&lt;/code>,
&lt;code>x-kubernetes-list-type&lt;/code>, &lt;code>x-kubernetes-list-map-keys&lt;/code>,
&lt;code>x-kubernetes-map-type&lt;/code>, &lt;code>x-kubernetes-preserve-unknown-fields&lt;/code>, and
&lt;code>x-kubernetes-validations&lt;/code>. Merge/patch-only extensions are stripped.&lt;/li>
&lt;li>Integer-or-string fields are rewritten to
&lt;code>oneOf: [{type: string}, {type: integer}]&lt;/code>. Both the legacy
&lt;code>format: int-or-string&lt;/code> and the structural
&lt;code>x-kubernetes-int-or-string: true&lt;/code> forms are recognized.&lt;/li>
&lt;li>Optional fields are marked nullable (&lt;code>type: [&amp;lt;t&amp;gt;, &amp;quot;null&amp;quot;]&lt;/code>), matching the
API server&amp;rsquo;s behavior of accepting &lt;code>null&lt;/code> for unset optional values.&lt;/li>
&lt;li>&lt;code>apiVersion&lt;/code> and &lt;code>kind&lt;/code> are injected into every kind&amp;rsquo;s properties and
required list.&lt;/li>
&lt;li>&lt;code>x-flux-schema-*&lt;/code> explain annotations are omitted by default. They are
documentation-only and do not affect JSON Schema validation.&lt;/li>
&lt;/ul>
&lt;h2 id="explain-metadata">Explain metadata&lt;/h2>
&lt;p>&lt;code>extract&lt;/code> can write two layers of metadata used by &lt;code>flux schema explain&lt;/code>.
They are opt-in so validation-only catalogs do not grow by default.&lt;/p>
&lt;p>Schema-local type metadata is stored inside each JSON Schema. It preserves
field render hints that are otherwise lost when OpenAPI &lt;code>$ref&lt;/code> definitions
are inlined, such as named nested types (&lt;code>Container&lt;/code>, &lt;code>Quantity&lt;/code>,
&lt;code>IntOrString&lt;/code>) and referenced type descriptions. Pass
&lt;code>--with-explain-type-metadata&lt;/code> when another index provides resource lookup and
resource-name completion. This is the ecosystem catalog mode used with
&lt;code>--schema-location ecosystem&lt;/code>, where &lt;code>explain&lt;/code> resolves resources from
&lt;code>https://schemas.fluxoperator.dev/index.json&lt;/code> and uses the loaded JSON schema for
kubectl-style field output and field-path completion.&lt;/p>
&lt;p>Standalone explain metadata includes the schema-local type metadata plus the
lookup files needed when there is no separate ecosystem index: alias redirect
JSON files, &lt;code>.explain/refs/&lt;/code>, and &lt;code>.explain/completion/&lt;/code>. Pass
&lt;code>--with-explain-metadata&lt;/code> for custom catalogs that should support
&lt;code>flux schema explain&lt;/code> resource references and resource-name shell completion on
their own. Field-path completion is derived from the resolved JSON Schema. This
flag is a superset of &lt;code>--with-explain-type-metadata&lt;/code>.&lt;/p>
&lt;p>&lt;code>--with-field-index&lt;/code> is separate. It writes &lt;code>.fields.txt&lt;/code> sidecars for
search, agents, and other catalog consumers. &lt;code>explain&lt;/code> does not use field
indexes for resource lookup, completion, field rendering, type names, or
descriptions. It can read &lt;code>.fields.txt&lt;/code> only as a compatibility fallback to
recover root &lt;code>apiVersion&lt;/code> and &lt;code>kind&lt;/code> when JSON explain metadata is absent.&lt;/p>
&lt;p>Catalogs generated with &lt;code>--strip-description&lt;/code> still validate resources and
resolve fields, but they cannot reproduce kubectl&amp;rsquo;s descriptive output
byte-for-byte because descriptions and explain type descriptions are removed.&lt;/p>
&lt;h2 id="field-indexes">Field indexes&lt;/h2>
&lt;p>Pass &lt;code>--with-field-index&lt;/code> to the &lt;code>extract&lt;/code> commands to write greppable,
LLM-friendly field indexes alongside the extracted schemas: one
&lt;code>.fields.txt&lt;/code> file per schema, with one self-contained line per field.
See the
&lt;a href="https://deploy-preview-2604--fluxcd.netlify.app/flux/cli-plugins/flux-schema/field-index/">field index reference&lt;/a> for the file naming, line
grammar, and annotations. Field indexes are independent from explain metadata.&lt;/p>
&lt;h2 id="hosting">Hosting&lt;/h2>
&lt;p>A catalog is just a tree of files. The validator&amp;rsquo;s loader fetches each
rendered location over &lt;code>http&lt;/code>/&lt;code>https&lt;/code> or from the local filesystem.
Common options:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Filesystem&lt;/strong>: vendor the catalog into the same repo as your manifests, or
publish it as a release artifact / OCI artifact and unpack it in CI.&lt;/li>
&lt;li>&lt;strong>HTTP(S)&lt;/strong>: serve the catalog from any static host (GitHub raw, S3,
GitHub Pages, etc.) and pass the base URL to &lt;code>--schema-location&lt;/code>. The
loader expands bare URLs with the default template.&lt;/li>
&lt;/ul>
&lt;p>A 404 or &lt;code>ENOENT&lt;/code> for a given &lt;code>apiVersion&lt;/code>/&lt;code>kind&lt;/code> falls through to the next
&lt;code>--schema-location&lt;/code>, so you can layer your catalog on top of the built-in
one:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f0f0f0;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-shell" data-lang="shell">&lt;span style="display:flex;">&lt;span>flux schema validate ./manifests &lt;span style="color:#4070a0;font-weight:bold">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#4070a0;font-weight:bold">&lt;/span> --schema-location ./my-catalog &lt;span style="color:#4070a0;font-weight:bold">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#4070a0;font-weight:bold">&lt;/span> --schema-location default
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Order matters — the first match wins, so put your overrides before &lt;code>default&lt;/code>.&lt;/p>
&lt;h2 id="refreshing">Refreshing&lt;/h2>
&lt;p>Custom catalogs go stale as upstream versions move. Schedule the refresh
script in CI (cron workflow, scheduled pipeline, etc.) and commit the result
back, the same way the official catalog is updated by
&lt;a href="https://github.com/fluxcd/flux-schema/blob/v0.10.2/.github/workflows/update-catalog.yaml" target="_blank">&lt;code>.github/workflows/update-catalog.yaml&lt;/code>&lt;/a>.&lt;/p></description></item><item><title>Flux: Field Indexes for AI Agents</title><link>https://deploy-preview-2604--fluxcd.netlify.app/flux/cli-plugins/flux-schema/field-index/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://deploy-preview-2604--fluxcd.netlify.app/flux/cli-plugins/flux-schema/field-index/</guid><description>
&lt;p>Pass &lt;code>--with-field-index&lt;/code> to &lt;code>extract crd&lt;/code>, &lt;code>extract k8s&lt;/code>, or
&lt;code>extract openshift&lt;/code> to write greppable, LLM-friendly field indexes alongside
the extracted schemas. Each index is a plain-text UTF-8 file with one
self-contained line per field: full dotted path, type, constraints, and
description when available. An agent greps a dotted path or keyword instead
of reading the full JSON Schema.&lt;/p>
&lt;p>The index serves agents in three roles:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Authoring manifests&lt;/strong> — the &lt;code>spec&lt;/code> subtree tells the agent which fields
exist, which are &lt;code>(required)&lt;/code>, and which values are legal (&lt;code>enum=&lt;/code>,
&lt;code>pattern=&lt;/code>, &lt;code>min=&lt;/code>/&lt;code>max=&lt;/code>, &lt;code>default=&lt;/code>), so generated YAML passes
&lt;code>flux schema validate&lt;/code> on the first attempt.&lt;/li>
&lt;li>&lt;strong>Assessing resources&lt;/strong> — the &lt;code>status&lt;/code> subtree tells the agent what the
controller reports, for interpreting the state of a resource and for
authoring expressions against it: health check CEL (&lt;code>healthCheckExprs&lt;/code>,
&lt;code>readyExpr&lt;/code>), monitoring queries, and troubleshooting. &lt;code>(immutable)&lt;/code>
markers tell the agent when a change requires recreating the resource
instead of patching it.&lt;/li>
&lt;li>&lt;strong>Understanding semantics&lt;/strong> — the descriptions carry what the schema
cannot express: field precedence, mutual exclusions, units, and expected
values documented only in prose. For fields outside the agent&amp;rsquo;s training
data — new API versions or private CRDs — the description line is its only
source of meaning, grounding answers in the upstream documentation instead
of guesswork.&lt;/li>
&lt;/ul>
&lt;p>Compared to &lt;code>kubectl explain&lt;/code>, the index answers offline without a cluster or
installed CRD, in one self-contained line instead of a per-path query, keeps
descriptions in full-tree listings (where &lt;code>explain --recursive&lt;/code> drops them),
surfaces constraints systematically, and supports keyword search across all
fields and kinds — the agent does not need to know a field&amp;rsquo;s path to find it.&lt;/p>
&lt;h2 id="file-naming">File naming&lt;/h2>
&lt;p>The index path is derived from the rendered schema path. If &lt;code>--output-format&lt;/code>
renders a path ending in &lt;code>.json&lt;/code>, that suffix is replaced with &lt;code>.fields.txt&lt;/code>;
otherwise &lt;code>.fields.txt&lt;/code> is appended. For example,
&lt;code>helm.toolkit.fluxcd.io/helmrelease_v2.json&lt;/code> gets
&lt;code>helm.toolkit.fluxcd.io/helmrelease_v2.fields.txt&lt;/code>.&lt;/p>
&lt;h2 id="comments">Comments&lt;/h2>
&lt;p>Lines beginning with &lt;code># &lt;/code> are comments: they carry metadata about the index
rather than field definitions, so tools that parse the line grammar must skip
them (and tolerate comment keys added in the future). When known, an index
begins with &lt;code># schema source: &amp;lt;value&amp;gt;&lt;/code>; when unknown, the comment is omitted
and the index starts directly with the &lt;code>apiVersion&lt;/code> line.&lt;/p>
&lt;p>The schema source value is composed by command: &lt;code>extract crd&lt;/code> joins the CRD
labels &lt;code>app.kubernetes.io/part-of&lt;/code> and &lt;code>app.kubernetes.io/version&lt;/code> when
present, &lt;code>extract k8s&lt;/code> records &lt;code>Kubernetes &amp;lt;info.version&amp;gt;&lt;/code> (or &lt;code>Kubernetes&lt;/code>,
with &lt;code>--version&lt;/code> appended when the swagger has no real version), and
&lt;code>extract openshift&lt;/code> records &lt;code>OpenShift &amp;lt;info.version&amp;gt;&lt;/code> (or &lt;code>OpenShift&lt;/code>, with
&lt;code>--ref&lt;/code> appended when the swagger has no version). Pass &lt;code>--index-source&lt;/code> to
override auto-detection for every index in an invocation.&lt;/p>
&lt;h2 id="line-grammar">Line grammar&lt;/h2>
&lt;p>Each field line has &lt;code>path &amp;lt;type&amp;gt;&lt;/code>, optional annotations, then an optional
description separated by one TAB and written as &lt;code># description&lt;/code>. Tokens before
the description are separated by one space:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f0f0f0;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-text" data-lang="text">&lt;span style="display:flex;">&lt;span>line = comment-line | field-line
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>comment-line = &amp;#34;# &amp;#34; text
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>field-line = path SPACE type [SPACE &amp;#34;(required)&amp;#34;] [SPACE enum]
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> [SPACE default] [SPACE format] [SPACE pattern]
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> [SPACE min] [SPACE max] [SPACE &amp;#34;(immutable)&amp;#34;]
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> [SPACE &amp;#34;(deprecated)&amp;#34;] [SPACE &amp;#34;(cluster-scoped)&amp;#34;]
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> [TAB &amp;#34;# &amp;#34; description]
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>path = segment *( &amp;#34;.&amp;#34; segment )
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>segment = name | name &amp;#34;[]&amp;#34; | &amp;#34;&amp;lt;key&amp;gt;&amp;#34;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>type = &amp;#34;&amp;lt;&amp;#34; typename &amp;#34;&amp;gt;&amp;#34;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>enum = &amp;#34;enum=&amp;#34; value *( &amp;#34;|&amp;#34; value )
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>default = &amp;#34;default=&amp;#34; json-value
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>format = &amp;#34;format=&amp;#34; value
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>pattern = &amp;#34;pattern=&amp;#34; json-string
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>min = &amp;#34;min=&amp;#34; json-number
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>max = &amp;#34;max=&amp;#34; json-number
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;code># schema source:&lt;/code> is the only comment key currently emitted; parsers must
tolerate other keys. &lt;code>(deprecated)&lt;/code> appears only on the &lt;code>apiVersion&lt;/code> header
line and &lt;code>(cluster-scoped)&lt;/code> only on the &lt;code>kind&lt;/code> header line.&lt;/p>
&lt;p>Two guarantees matter for parsing. Descriptions (including deprecation
warnings) are whitespace-normalized — newlines and tabs collapse to single
spaces — so a line contains at most one TAB, and splitting on the first TAB
always separates the tokens from the description. Naive space-splitting of
the tokens is unsafe: the type token may contain a space
(&lt;code>&amp;lt;object (free-form)&amp;gt;&lt;/code>), and JSON-encoded annotation values may too
(&lt;code>pattern=&amp;quot;^foo bar$&amp;quot;&lt;/code>); parse the type as a &lt;code>&amp;lt;...&amp;gt;&lt;/code>-delimited token and
treat quoted annotation values as JSON strings.&lt;/p>
&lt;p>Example lines from a HelmRelease index:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f0f0f0;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-text" data-lang="text">&lt;span style="display:flex;">&lt;span># schema source: flux v2.8.5
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>apiVersion &amp;lt;string&amp;gt; enum=helm.toolkit.fluxcd.io/v2
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>kind &amp;lt;string&amp;gt; enum=HelmRelease
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>metadata.name &amp;lt;string&amp;gt; (required)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>metadata.namespace &amp;lt;string&amp;gt; (required)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>spec &amp;lt;object&amp;gt; # HelmReleaseSpec defines the desired state of a Helm release.
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>spec.valuesFrom &amp;lt;[]object&amp;gt; # ValuesFrom holds references to resources containing Helm values for this HelmRelease, and information about how they should be merged.
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>spec.valuesFrom[].kind &amp;lt;string&amp;gt; (required) enum=Secret|ConfigMap # Kind of the values referent, valid values are (&amp;#39;Secret&amp;#39;, &amp;#39;ConfigMap&amp;#39;).
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>spec.valuesFrom[].name &amp;lt;string&amp;gt; (required) min=1 max=253 # Name of the values referent. Should reside in the same namespace as the referring resource.
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="path-notation">Path notation&lt;/h2>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Notation&lt;/th>
&lt;th>Meaning&lt;/th>
&lt;th>Example&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;code>a.b.c&lt;/code>&lt;/td>
&lt;td>Nested object field.&lt;/td>
&lt;td>&lt;code>spec.chart.spec&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>a[]&lt;/code>&lt;/td>
&lt;td>Array of objects; child fields continue below the array.&lt;/td>
&lt;td>&lt;code>spec.dependsOn[]&lt;/code> -&amp;gt; &lt;code>spec.dependsOn[].name&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>a.&amp;lt;key&amp;gt;.&lt;/code>&lt;/td>
&lt;td>Object map value fields.&lt;/td>
&lt;td>&lt;code>spec.devices[].attributes.&amp;lt;key&amp;gt;.version &amp;lt;string&amp;gt;&lt;/code>&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>The &lt;code>.&amp;lt;key&amp;gt;.&lt;/code> segment means &amp;ldquo;for each key in this map&amp;rdquo;; it is used when a map
has object values with known fields.&lt;/p>
&lt;h2 id="type-notation">Type notation&lt;/h2>
&lt;p>Type notation uses Kubernetes schema types in angle brackets:&lt;/p>
&lt;ul>
&lt;li>&lt;code>&amp;lt;string&amp;gt;&lt;/code>, &lt;code>&amp;lt;integer&amp;gt;&lt;/code>, &lt;code>&amp;lt;number&amp;gt;&lt;/code>, &lt;code>&amp;lt;boolean&amp;gt;&lt;/code> — scalar fields.&lt;/li>
&lt;li>&lt;code>&amp;lt;object&amp;gt;&lt;/code> — object with known fields, listed below it.&lt;/li>
&lt;li>&lt;code>&amp;lt;object (free-form)&amp;gt;&lt;/code> — object without a defined structure.&lt;/li>
&lt;li>&lt;code>&amp;lt;[]string&amp;gt;&lt;/code> (or the matching scalar type) — array of scalars.&lt;/li>
&lt;li>&lt;code>&amp;lt;[]object&amp;gt;&lt;/code> — array of objects; child fields continue under &lt;code>a[].&lt;/code>.&lt;/li>
&lt;li>&lt;code>&amp;lt;map[string]string&amp;gt;&lt;/code> (or the matching value type) — map with scalar values.&lt;/li>
&lt;li>&lt;code>&amp;lt;map[string]object&amp;gt;&lt;/code> — map with object values; child fields, when known,
continue under &lt;code>.&amp;lt;key&amp;gt;.&lt;/code>.&lt;/li>
&lt;li>&lt;code>&amp;lt;int-or-string&amp;gt;&lt;/code> — accepts an integer or a string.&lt;/li>
&lt;li>&lt;code>&amp;lt;any&amp;gt;&lt;/code> — untyped (e.g. preserves unknown fields).&lt;/li>
&lt;/ul>
&lt;h2 id="annotations">Annotations&lt;/h2>
&lt;p>Annotations are suffix tokens after the type. Facts that carry a value use the
&lt;code>key=value&lt;/code> form; boolean facts are parenthesized markers whose presence means
true and whose absence means false.&lt;/p>
&lt;p>Key-value annotations:&lt;/p>
&lt;ul>
&lt;li>&lt;code>enum=a|b|c&lt;/code> — allowed values; values containing whitespace or &lt;code>|&lt;/code> are
JSON-encoded, all other values stay verbatim.&lt;/li>
&lt;li>&lt;code>default=&amp;lt;json&amp;gt;&lt;/code> — the schema default, JSON-encoded.&lt;/li>
&lt;li>&lt;code>format=&amp;lt;value&amp;gt;&lt;/code> — the schema format (e.g. &lt;code>date-time&lt;/code>).&lt;/li>
&lt;li>&lt;code>pattern=&amp;lt;json-string&amp;gt;&lt;/code> — the regex pattern, always JSON-encoded.&lt;/li>
&lt;li>&lt;code>min=&amp;lt;n&amp;gt;&lt;/code> / &lt;code>max=&amp;lt;n&amp;gt;&lt;/code> — minimum/maximum for number and integer fields,
minLength/maxLength for strings, minItems/maxItems for arrays.&lt;/li>
&lt;/ul>
&lt;p>Boolean markers:&lt;/p>
&lt;ul>
&lt;li>&lt;code>(required)&lt;/code> — the field appears in the parent schema&amp;rsquo;s required list.&lt;/li>
&lt;li>&lt;code>(immutable)&lt;/code> — the field carries a CEL validation rule equal to
&lt;code>self == oldSelf&lt;/code> (either operand order), or its description contains
&lt;code>Cannot be updated.&lt;/code>.&lt;/li>
&lt;li>&lt;code>(deprecated)&lt;/code> — on the apiVersion header line only, when the CRD version is
deprecated; the deprecation warning is appended as its description when
present.&lt;/li>
&lt;li>&lt;code>(cluster-scoped)&lt;/code> — on the kind header line only, when the resource is
cluster-scoped; such indexes have no &lt;code>metadata.namespace&lt;/code> line.&lt;/li>
&lt;/ul>
&lt;h2 id="header-lines">Header lines&lt;/h2>
&lt;p>After the optional schema source comment, every index starts with header lines
for &lt;code>apiVersion&lt;/code>, &lt;code>kind&lt;/code>, &lt;code>metadata.name&lt;/code>, and, when applicable,
&lt;code>metadata.namespace&lt;/code>. &lt;code>apiVersion&lt;/code> and &lt;code>kind&lt;/code> use &lt;code>enum=&lt;/code> values from the
extracted GVK, and &lt;code>metadata.name&lt;/code> is always emitted with &lt;code>(required)&lt;/code>. The
resource scope determines the rest:&lt;/p>
&lt;ul>
&lt;li>namespaced kinds: &lt;code>metadata.namespace &amp;lt;string&amp;gt; (required)&lt;/code> is emitted.&lt;/li>
&lt;li>cluster-scoped kinds: the &lt;code>metadata.namespace&lt;/code> line is omitted and the kind
line ends with &lt;code>(cluster-scoped)&lt;/code>.&lt;/li>
&lt;li>unknown scope: &lt;code>metadata.namespace &amp;lt;string&amp;gt;&lt;/code> is emitted without &lt;code>(required)&lt;/code>.&lt;/li>
&lt;/ul>
&lt;p>&lt;code>extract crd&lt;/code> reads exact scope from &lt;code>spec.scope&lt;/code>; &lt;code>extract k8s&lt;/code> and
&lt;code>extract openshift&lt;/code> derive it from swagger paths (the openshift/api document
carries none, so its scope comes out unknown).&lt;/p>
&lt;p>The header lines replace the schema&amp;rsquo;s own &lt;code>apiVersion&lt;/code>, &lt;code>kind&lt;/code>, and
&lt;code>metadata&lt;/code> properties, which are suppressed from the body: fields like
&lt;code>metadata.labels&lt;/code> and &lt;code>metadata.annotations&lt;/code> are standard across all kinds
and deliberately not listed — their absence from an index does not mean they
are unsupported.&lt;/p>
&lt;h2 id="generation-notes">Generation notes&lt;/h2>
&lt;p>Indexes are generated before &lt;code>--strip-description&lt;/code> is applied, so field index
descriptions are preserved even when the JSON Schemas are stripped.
For &lt;code>extract k8s&lt;/code> and &lt;code>extract openshift&lt;/code>, schemas whose kind ends in &lt;code>List&lt;/code>
still write JSON Schema files but do not write &lt;code>.fields.txt&lt;/code> indexes.&lt;/p>
&lt;h2 id="grep-recipes">Grep recipes&lt;/h2>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f0f0f0;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-shell" data-lang="shell">&lt;span style="display:flex;">&lt;span>grep &lt;span style="color:#4070a0">&amp;#39;^spec\.chart\.&amp;#39;&lt;/span> helmrelease_v2.fields.txt &lt;span style="color:#60a0b0;font-style:italic"># subtree listing&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>grep &lt;span style="color:#4070a0">&amp;#39;valuesFrom&amp;#39;&lt;/span> helmrelease_v2.fields.txt &lt;span style="color:#60a0b0;font-style:italic"># locate a field&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>grep &lt;span style="color:#4070a0">&amp;#39;(required)&amp;#39;&lt;/span> helmrelease_v2.fields.txt &lt;span style="color:#60a0b0;font-style:italic"># all required fields&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>grep &lt;span style="color:#4070a0">&amp;#39;^status\.&amp;#39;&lt;/span> helmrelease_v2.fields.txt &lt;span style="color:#60a0b0;font-style:italic"># fields reported by the controller&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>grep -r &lt;span style="color:#4070a0">&amp;#39;certSecretRef&amp;#39;&lt;/span> ./my-catalog &lt;span style="color:#60a0b0;font-style:italic"># which kinds support custom TLS certs&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div></description></item><item><title>Flux: Flux Schema Inventory</title><link>https://deploy-preview-2604--fluxcd.netlify.app/flux/cli-plugins/flux-schema/inventory/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://deploy-preview-2604--fluxcd.netlify.app/flux/cli-plugins/flux-schema/inventory/</guid><description>
&lt;p>The &lt;code>flux schema discover&lt;/code> command can emit a structured inventory of a
GitOps repository by setting &lt;code>--output&lt;/code> to &lt;code>json&lt;/code> or &lt;code>yaml&lt;/code>. The envelope
shape is versioned and documented by the JSON Schema in
&lt;a href="https://github.com/fluxcd/flux-schema/blob/v0.10.2/docs/inventory-v1beta1.json" target="_blank">&lt;code>inventory-v1beta1.json&lt;/code>&lt;/a>.&lt;/p>
&lt;h2 id="usage">Usage&lt;/h2>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f0f0f0;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-shell" data-lang="shell">&lt;span style="display:flex;">&lt;span>flux schema discover ./my-gitops-repo -o json
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>See the
&lt;a href="https://deploy-preview-2604--fluxcd.netlify.app/flux/cli-plugins/flux-schema/repo-discovery/">repository discovery guide&lt;/a> for the
classification rules behind the inventory data.&lt;/p>
&lt;h2 id="envelope">Envelope&lt;/h2>
&lt;p>Every inventory is wrapped in a top-level envelope:&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Key&lt;/th>
&lt;th>Description&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;code>apiVersion&lt;/code>&lt;/td>
&lt;td>Inventory API version. Currently &lt;code>schema.plugin.fluxcd.io/v1beta1&lt;/code>.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>kind&lt;/code>&lt;/td>
&lt;td>Inventory API kind. Currently &lt;code>Inventory&lt;/code>.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>$schema&lt;/code>&lt;/td>
&lt;td>URL of the JSON Schema describing the envelope.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>inventory.reporter&lt;/code>&lt;/td>
&lt;td>Identity of the producer, e.g. &lt;code>flux-schema/0.3.0&lt;/code>.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>inventory.timestamp&lt;/code>&lt;/td>
&lt;td>RFC 3339 UTC timestamp of the scan.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>inventory.summary&lt;/code>&lt;/td>
&lt;td>Aggregate counts: &lt;code>files&lt;/code>, &lt;code>resources&lt;/code>, &lt;code>lines-of-yaml&lt;/code>.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>inventory.directories&lt;/code>&lt;/td>
&lt;td>Map of directory path to classification.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>inventory.resources&lt;/code>&lt;/td>
&lt;td>Map of &lt;code>apiVersion/Kind&lt;/code> to resource count, for all resources.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>inventory.flux&lt;/code>&lt;/td>
&lt;td>Map of Flux resource kind to defining files and identities.&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>All maps serialize with sorted keys, so the output is deterministic and
diff-friendly.&lt;/p>
&lt;h2 id="directories">Directories&lt;/h2>
&lt;p>&lt;code>directories&lt;/code> maps every directory containing scanned manifests, plus
Helm chart and Terraform directories, to one of four classifications:
&lt;code>kubernetes-manifests&lt;/code>, &lt;code>kustomize-overlay&lt;/code>, &lt;code>helm-chart&lt;/code>, or &lt;code>terraform-module&lt;/code>. Paths are
relative to the scanned root and &lt;code>/&lt;/code>-separated; the root itself is &lt;code>.&lt;/code>.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f0f0f0;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-json" data-lang="json">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#4070a0">&amp;#34;directories&amp;#34;&lt;/span>&lt;span style="">:&lt;/span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#062873;font-weight:bold">&amp;#34;apps/base&amp;#34;&lt;/span>: &lt;span style="color:#4070a0">&amp;#34;kustomize-overlay&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#062873;font-weight:bold">&amp;#34;charts/podinfo&amp;#34;&lt;/span>: &lt;span style="color:#4070a0">&amp;#34;helm-chart&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="resources">Resources&lt;/h2>
&lt;p>&lt;code>resources&lt;/code> is the complete census: every resource in the repository,
counted per &lt;code>apiVersion/Kind&lt;/code>. The exact
API version of every kind is visible without opening any file.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f0f0f0;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-json" data-lang="json">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#4070a0">&amp;#34;resources&amp;#34;&lt;/span>&lt;span style="">:&lt;/span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#062873;font-weight:bold">&amp;#34;apps/v1/Deployment&amp;#34;&lt;/span>: &lt;span style="color:#40a070">12&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#062873;font-weight:bold">&amp;#34;cert-manager.io/v1/ClusterIssuer&amp;#34;&lt;/span>: &lt;span style="color:#40a070">1&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#062873;font-weight:bold">&amp;#34;helm.toolkit.fluxcd.io/v2/HelmRelease&amp;#34;&lt;/span>: &lt;span style="color:#40a070">3&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="flux">Flux&lt;/h2>
&lt;p>&lt;code>flux&lt;/code> locates every Flux custom resource. Keys are bare kinds — their
API versions are already stated in &lt;code>resources&lt;/code>. Each kind maps the
defining file path (relative to the scanned root) to the resource
identities declared in that file:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f0f0f0;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-json" data-lang="json">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#4070a0">&amp;#34;flux&amp;#34;&lt;/span>&lt;span style="">:&lt;/span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#062873;font-weight:bold">&amp;#34;HelmRelease&amp;#34;&lt;/span>: {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#062873;font-weight:bold">&amp;#34;apps/base/podinfo.yaml&amp;#34;&lt;/span>: [&lt;span style="color:#4070a0">&amp;#34;podinfo/podinfo&amp;#34;&lt;/span>]
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> },
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#062873;font-weight:bold">&amp;#34;Kustomization&amp;#34;&lt;/span>: {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#062873;font-weight:bold">&amp;#34;clusters/production/apps.yaml&amp;#34;&lt;/span>: [&lt;span style="color:#4070a0">&amp;#34;flux-system/apps&amp;#34;&lt;/span>],
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#062873;font-weight:bold">&amp;#34;clusters/staging/apps.yaml&amp;#34;&lt;/span>: [&lt;span style="color:#4070a0">&amp;#34;flux-system/apps&amp;#34;&lt;/span>]
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Identities are &lt;code>namespace/name&lt;/code>; the &lt;code>namespace/&lt;/code> segment is omitted for
resources without a namespace, and the name is &lt;code>-&lt;/code> when the document has
no &lt;code>metadata.name&lt;/code>. Multi-document files list their identities in
document order.&lt;/p>
&lt;p>Plain Kubernetes resources are intentionally not enumerated per item: a
large repository can hold thousands of them, and the census combined
with the directory map locates them precisely enough.&lt;/p>
&lt;p>When the same kind exists in more than one API version — typically
mid-migration — its files merge under the kind key, while
&lt;code>resources&lt;/code> still reports each version separately.&lt;/p>
&lt;h2 id="example">Example&lt;/h2>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f0f0f0;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-json" data-lang="json">&lt;span style="display:flex;">&lt;span>{
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#062873;font-weight:bold">&amp;#34;apiVersion&amp;#34;&lt;/span>: &lt;span style="color:#4070a0">&amp;#34;schema.plugin.fluxcd.io/v1beta1&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#062873;font-weight:bold">&amp;#34;kind&amp;#34;&lt;/span>: &lt;span style="color:#4070a0">&amp;#34;Inventory&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#062873;font-weight:bold">&amp;#34;$schema&amp;#34;&lt;/span>: &lt;span style="color:#4070a0">&amp;#34;https://raw.githubusercontent.com/fluxcd/flux-schema/main/docs/inventory-v1beta1.json&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#062873;font-weight:bold">&amp;#34;inventory&amp;#34;&lt;/span>: {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#062873;font-weight:bold">&amp;#34;reporter&amp;#34;&lt;/span>: &lt;span style="color:#4070a0">&amp;#34;flux-schema/0.3.0&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#062873;font-weight:bold">&amp;#34;timestamp&amp;#34;&lt;/span>: &lt;span style="color:#4070a0">&amp;#34;2026-06-11T10:30:00Z&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#062873;font-weight:bold">&amp;#34;summary&amp;#34;&lt;/span>: {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#062873;font-weight:bold">&amp;#34;files&amp;#34;&lt;/span>: &lt;span style="color:#40a070">8&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#062873;font-weight:bold">&amp;#34;resources&amp;#34;&lt;/span>: &lt;span style="color:#40a070">8&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#062873;font-weight:bold">&amp;#34;lines-of-yaml&amp;#34;&lt;/span>: &lt;span style="color:#40a070">99&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> },
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#062873;font-weight:bold">&amp;#34;directories&amp;#34;&lt;/span>: {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#062873;font-weight:bold">&amp;#34;apps/base&amp;#34;&lt;/span>: &lt;span style="color:#4070a0">&amp;#34;kustomize-overlay&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#062873;font-weight:bold">&amp;#34;apps/overlays/prod&amp;#34;&lt;/span>: &lt;span style="color:#4070a0">&amp;#34;kustomize-overlay&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#062873;font-weight:bold">&amp;#34;charts/podinfo&amp;#34;&lt;/span>: &lt;span style="color:#4070a0">&amp;#34;helm-chart&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#062873;font-weight:bold">&amp;#34;clusters/prod&amp;#34;&lt;/span>: &lt;span style="color:#4070a0">&amp;#34;kubernetes-manifests&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#062873;font-weight:bold">&amp;#34;infra/tf&amp;#34;&lt;/span>: &lt;span style="color:#4070a0">&amp;#34;terraform-module&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> },
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#062873;font-weight:bold">&amp;#34;resources&amp;#34;&lt;/span>: {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#062873;font-weight:bold">&amp;#34;apps/v1/Deployment&amp;#34;&lt;/span>: &lt;span style="color:#40a070">1&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#062873;font-weight:bold">&amp;#34;fluxcd.controlplane.io/v1/FluxInstance&amp;#34;&lt;/span>: &lt;span style="color:#40a070">1&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#062873;font-weight:bold">&amp;#34;helm.toolkit.fluxcd.io/v2/HelmRelease&amp;#34;&lt;/span>: &lt;span style="color:#40a070">1&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#062873;font-weight:bold">&amp;#34;kustomize.toolkit.fluxcd.io/v1/Kustomization&amp;#34;&lt;/span>: &lt;span style="color:#40a070">1&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#062873;font-weight:bold">&amp;#34;source.toolkit.fluxcd.io/v1/GitRepository&amp;#34;&lt;/span>: &lt;span style="color:#40a070">1&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#062873;font-weight:bold">&amp;#34;source.toolkit.fluxcd.io/v1/OCIRepository&amp;#34;&lt;/span>: &lt;span style="color:#40a070">1&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#062873;font-weight:bold">&amp;#34;v1/ConfigMap&amp;#34;&lt;/span>: &lt;span style="color:#40a070">1&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#062873;font-weight:bold">&amp;#34;v1/Service&amp;#34;&lt;/span>: &lt;span style="color:#40a070">1&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> },
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#062873;font-weight:bold">&amp;#34;flux&amp;#34;&lt;/span>: {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#062873;font-weight:bold">&amp;#34;FluxInstance&amp;#34;&lt;/span>: {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#062873;font-weight:bold">&amp;#34;clusters/prod/instance.yaml&amp;#34;&lt;/span>: [&lt;span style="color:#4070a0">&amp;#34;flux-system/flux&amp;#34;&lt;/span>]
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> },
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#062873;font-weight:bold">&amp;#34;GitRepository&amp;#34;&lt;/span>: {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#062873;font-weight:bold">&amp;#34;clusters/prod/flux-system.yaml&amp;#34;&lt;/span>: [&lt;span style="color:#4070a0">&amp;#34;flux-system/flux-system&amp;#34;&lt;/span>]
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> },
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#062873;font-weight:bold">&amp;#34;HelmRelease&amp;#34;&lt;/span>: {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#062873;font-weight:bold">&amp;#34;apps/base/podinfo.yaml&amp;#34;&lt;/span>: [&lt;span style="color:#4070a0">&amp;#34;podinfo/podinfo&amp;#34;&lt;/span>]
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> },
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#062873;font-weight:bold">&amp;#34;Kustomization&amp;#34;&lt;/span>: {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#062873;font-weight:bold">&amp;#34;clusters/prod/flux-system.yaml&amp;#34;&lt;/span>: [&lt;span style="color:#4070a0">&amp;#34;flux-system/apps&amp;#34;&lt;/span>]
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> },
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#062873;font-weight:bold">&amp;#34;OCIRepository&amp;#34;&lt;/span>: {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#062873;font-weight:bold">&amp;#34;apps/base/podinfo.yaml&amp;#34;&lt;/span>: [&lt;span style="color:#4070a0">&amp;#34;podinfo/podinfo&amp;#34;&lt;/span>]
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div></description></item><item><title>Flux: Flux Schema Report</title><link>https://deploy-preview-2604--fluxcd.netlify.app/flux/cli-plugins/flux-schema/report/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://deploy-preview-2604--fluxcd.netlify.app/flux/cli-plugins/flux-schema/report/</guid><description>
&lt;p>The &lt;code>flux schema validate&lt;/code> command can emit a structured report of the
validation results by setting &lt;code>--output&lt;/code> to &lt;code>json&lt;/code> or &lt;code>yaml&lt;/code>. The envelope
shape is versioned and documented by the JSON Schema in
&lt;a href="https://github.com/fluxcd/flux-schema/blob/v0.10.2/docs/report-v1beta1.json" target="_blank">&lt;code>report-v1beta1.json&lt;/code>&lt;/a>.&lt;/p>
&lt;h2 id="usage">Usage&lt;/h2>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f0f0f0;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-shell" data-lang="shell">&lt;span style="display:flex;">&lt;span>flux schema validate ./manifests -o json
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Structured output always emits every result regardless of &lt;code>--verbose&lt;/code>.
Filtering belongs downstream (&lt;code>jq&lt;/code>, &lt;code>yq&lt;/code>). The process exit code still
reflects whether any document was invalid.&lt;/p>
&lt;h2 id="envelope">Envelope&lt;/h2>
&lt;p>Every report is wrapped in a top-level envelope:&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Key&lt;/th>
&lt;th>Description&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;code>apiVersion&lt;/code>&lt;/td>
&lt;td>Report API version. Currently &lt;code>schema.plugin.fluxcd.io/v1beta1&lt;/code>.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>kind&lt;/code>&lt;/td>
&lt;td>Report API kind. Currently &lt;code>Report&lt;/code>.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>$schema&lt;/code>&lt;/td>
&lt;td>URL of the JSON Schema describing the envelope.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>report.reporter&lt;/code>&lt;/td>
&lt;td>Identity of the producer, e.g. &lt;code>flux-schema/0.1.0&lt;/code>.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>report.timestamp&lt;/code>&lt;/td>
&lt;td>RFC 3339 UTC timestamp of the run.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>report.summary&lt;/code>&lt;/td>
&lt;td>Aggregate counts: &lt;code>total&lt;/code>, &lt;code>valid&lt;/code>, &lt;code>invalid&lt;/code>, &lt;code>skipped&lt;/code>.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>report.results[]&lt;/code>&lt;/td>
&lt;td>One entry per validated document, in source order.&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;h2 id="result-fields">Result fields&lt;/h2>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Key&lt;/th>
&lt;th>Description&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;code>resource&lt;/code>&lt;/td>
&lt;td>&lt;code>{apiVersion, kind, namespace?, name?}&lt;/code> or &lt;code>null&lt;/code> when no Kubernetes identity could be recovered (e.g. a file that fails to open, or stdin that is not YAML).&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>source&lt;/code>&lt;/td>
&lt;td>File path or &lt;code>stdin&lt;/code>.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>idx&lt;/code>&lt;/td>
&lt;td>1-based position of the document within its source. &lt;code>0&lt;/code> for source-level failures that have no document.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>status&lt;/code>&lt;/td>
&lt;td>&lt;code>&amp;quot;valid&amp;quot;&lt;/code>, &lt;code>&amp;quot;invalid&amp;quot;&lt;/code>, or &lt;code>&amp;quot;skipped&amp;quot;&lt;/code>.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>reason&lt;/code>&lt;/td>
&lt;td>Stable kebab-case code (see below). Omitted when &lt;code>status&lt;/code> is &lt;code>&amp;quot;valid&amp;quot;&lt;/code>.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>violations[]&lt;/code>&lt;/td>
&lt;td>Zero or more &lt;code>{path?, message}&lt;/code> entries. &lt;code>path&lt;/code> is a JSON Pointer set by schema violations; for every other reason it is absent and &lt;code>message&lt;/code> carries the raw error text.&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;h2 id="reasons">Reasons&lt;/h2>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Reason&lt;/th>
&lt;th>Triggered by&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;code>source-load-error&lt;/code>&lt;/td>
&lt;td>Source-level open/read failure.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>yaml-parse-error&lt;/code>&lt;/td>
&lt;td>Strict YAML decode fails (duplicate keys, malformed doc).&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>schema-load-error&lt;/code>&lt;/td>
&lt;td>Schema loader failure (HTTP fetch, file read, or JSON Schema compile).&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>schema-not-found&lt;/code>&lt;/td>
&lt;td>No schema applicable — either no schema file matches the GVK, or the document has no GVK to look up.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>schema-violation&lt;/code>&lt;/td>
&lt;td>Document fails one or more schema constraints. &lt;code>violations[]&lt;/code> carries a JSON Pointer &lt;code>path&lt;/code> per entry.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>cel-violation&lt;/code>&lt;/td>
&lt;td>Document fails one or more &lt;code>x-kubernetes-validations&lt;/code> CEL rules, or the schema&amp;rsquo;s CEL evaluator could not be built. JSON Schema constraints all passed.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>kind-skipped&lt;/code>&lt;/td>
&lt;td>Matched a &lt;code>--skip-kind&lt;/code> pattern.&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;h2 id="example">Example&lt;/h2>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f0f0f0;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-json" data-lang="json">&lt;span style="display:flex;">&lt;span>{
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#062873;font-weight:bold">&amp;#34;apiVersion&amp;#34;&lt;/span>: &lt;span style="color:#4070a0">&amp;#34;schema.plugin.fluxcd.io/v1beta1&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#062873;font-weight:bold">&amp;#34;kind&amp;#34;&lt;/span>: &lt;span style="color:#4070a0">&amp;#34;Report&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#062873;font-weight:bold">&amp;#34;$schema&amp;#34;&lt;/span>: &lt;span style="color:#4070a0">&amp;#34;https://raw.githubusercontent.com/fluxcd/flux-schema/main/docs/report-v1beta1.json&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#062873;font-weight:bold">&amp;#34;report&amp;#34;&lt;/span>: {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#062873;font-weight:bold">&amp;#34;reporter&amp;#34;&lt;/span>: &lt;span style="color:#4070a0">&amp;#34;flux-schema/v0.1.0&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#062873;font-weight:bold">&amp;#34;timestamp&amp;#34;&lt;/span>: &lt;span style="color:#4070a0">&amp;#34;2026-06-01T12:00:00Z&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#062873;font-weight:bold">&amp;#34;summary&amp;#34;&lt;/span>: {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#062873;font-weight:bold">&amp;#34;total&amp;#34;&lt;/span>: &lt;span style="color:#40a070">7&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#062873;font-weight:bold">&amp;#34;valid&amp;#34;&lt;/span>: &lt;span style="color:#40a070">1&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#062873;font-weight:bold">&amp;#34;invalid&amp;#34;&lt;/span>: &lt;span style="color:#40a070">5&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#062873;font-weight:bold">&amp;#34;skipped&amp;#34;&lt;/span>: &lt;span style="color:#40a070">1&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> },
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#062873;font-weight:bold">&amp;#34;results&amp;#34;&lt;/span>: [
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#062873;font-weight:bold">&amp;#34;resource&amp;#34;&lt;/span>: {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#062873;font-weight:bold">&amp;#34;apiVersion&amp;#34;&lt;/span>: &lt;span style="color:#4070a0">&amp;#34;apps/v1&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#062873;font-weight:bold">&amp;#34;kind&amp;#34;&lt;/span>: &lt;span style="color:#4070a0">&amp;#34;Deployment&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#062873;font-weight:bold">&amp;#34;namespace&amp;#34;&lt;/span>: &lt;span style="color:#4070a0">&amp;#34;default&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#062873;font-weight:bold">&amp;#34;name&amp;#34;&lt;/span>: &lt;span style="color:#4070a0">&amp;#34;web&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> },
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#062873;font-weight:bold">&amp;#34;source&amp;#34;&lt;/span>: &lt;span style="color:#4070a0">&amp;#34;manifests/app.yaml&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#062873;font-weight:bold">&amp;#34;idx&amp;#34;&lt;/span>: &lt;span style="color:#40a070">1&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#062873;font-weight:bold">&amp;#34;status&amp;#34;&lt;/span>: &lt;span style="color:#4070a0">&amp;#34;valid&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> },
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#062873;font-weight:bold">&amp;#34;resource&amp;#34;&lt;/span>: {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#062873;font-weight:bold">&amp;#34;apiVersion&amp;#34;&lt;/span>: &lt;span style="color:#4070a0">&amp;#34;source.toolkit.fluxcd.io/v1&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#062873;font-weight:bold">&amp;#34;kind&amp;#34;&lt;/span>: &lt;span style="color:#4070a0">&amp;#34;Bucket&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#062873;font-weight:bold">&amp;#34;namespace&amp;#34;&lt;/span>: &lt;span style="color:#4070a0">&amp;#34;apps&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#062873;font-weight:bold">&amp;#34;name&amp;#34;&lt;/span>: &lt;span style="color:#4070a0">&amp;#34;minio&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> },
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#062873;font-weight:bold">&amp;#34;source&amp;#34;&lt;/span>: &lt;span style="color:#4070a0">&amp;#34;manifests/sources.yaml&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#062873;font-weight:bold">&amp;#34;idx&amp;#34;&lt;/span>: &lt;span style="color:#40a070">1&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#062873;font-weight:bold">&amp;#34;status&amp;#34;&lt;/span>: &lt;span style="color:#4070a0">&amp;#34;invalid&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#062873;font-weight:bold">&amp;#34;reason&amp;#34;&lt;/span>: &lt;span style="color:#4070a0">&amp;#34;schema-violation&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#062873;font-weight:bold">&amp;#34;violations&amp;#34;&lt;/span>: [
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#062873;font-weight:bold">&amp;#34;path&amp;#34;&lt;/span>: &lt;span style="color:#4070a0">&amp;#34;/spec&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#062873;font-weight:bold">&amp;#34;message&amp;#34;&lt;/span>: &lt;span style="color:#4070a0">&amp;#34;missing property &amp;#39;bucketName&amp;#39;&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> },
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#062873;font-weight:bold">&amp;#34;path&amp;#34;&lt;/span>: &lt;span style="color:#4070a0">&amp;#34;/spec/interval&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#062873;font-weight:bold">&amp;#34;message&amp;#34;&lt;/span>: &lt;span style="color:#4070a0">&amp;#34;got number, want string&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> },
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#062873;font-weight:bold">&amp;#34;path&amp;#34;&lt;/span>: &lt;span style="color:#4070a0">&amp;#34;/spec&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#062873;font-weight:bold">&amp;#34;message&amp;#34;&lt;/span>: &lt;span style="color:#4070a0">&amp;#34;additional properties &amp;#39;force&amp;#39; not allowed&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> ]
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> },
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#062873;font-weight:bold">&amp;#34;resource&amp;#34;&lt;/span>: {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#062873;font-weight:bold">&amp;#34;apiVersion&amp;#34;&lt;/span>: &lt;span style="color:#4070a0">&amp;#34;source.toolkit.fluxcd.io/v1&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#062873;font-weight:bold">&amp;#34;kind&amp;#34;&lt;/span>: &lt;span style="color:#4070a0">&amp;#34;OCIRepository&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#062873;font-weight:bold">&amp;#34;namespace&amp;#34;&lt;/span>: &lt;span style="color:#4070a0">&amp;#34;default&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#062873;font-weight:bold">&amp;#34;name&amp;#34;&lt;/span>: &lt;span style="color:#4070a0">&amp;#34;podinfo&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> },
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#062873;font-weight:bold">&amp;#34;source&amp;#34;&lt;/span>: &lt;span style="color:#4070a0">&amp;#34;manifests/sources.yaml&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#062873;font-weight:bold">&amp;#34;idx&amp;#34;&lt;/span>: &lt;span style="color:#40a070">2&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#062873;font-weight:bold">&amp;#34;status&amp;#34;&lt;/span>: &lt;span style="color:#4070a0">&amp;#34;invalid&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#062873;font-weight:bold">&amp;#34;reason&amp;#34;&lt;/span>: &lt;span style="color:#4070a0">&amp;#34;yaml-parse-error&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#062873;font-weight:bold">&amp;#34;violations&amp;#34;&lt;/span>: [
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#062873;font-weight:bold">&amp;#34;message&amp;#34;&lt;/span>: &lt;span style="color:#4070a0">&amp;#34;line 18: key \&amp;#34;app.kubernetes.io/name\&amp;#34; already set in map&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> ]
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> },
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#062873;font-weight:bold">&amp;#34;resource&amp;#34;&lt;/span>: &lt;span style="color:#007020;font-weight:bold">null&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#062873;font-weight:bold">&amp;#34;source&amp;#34;&lt;/span>: &lt;span style="color:#4070a0">&amp;#34;manifests/missing.yaml&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#062873;font-weight:bold">&amp;#34;idx&amp;#34;&lt;/span>: &lt;span style="color:#40a070">0&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#062873;font-weight:bold">&amp;#34;status&amp;#34;&lt;/span>: &lt;span style="color:#4070a0">&amp;#34;invalid&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#062873;font-weight:bold">&amp;#34;reason&amp;#34;&lt;/span>: &lt;span style="color:#4070a0">&amp;#34;source-load-error&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#062873;font-weight:bold">&amp;#34;violations&amp;#34;&lt;/span>: [
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#062873;font-weight:bold">&amp;#34;message&amp;#34;&lt;/span>: &lt;span style="color:#4070a0">&amp;#34;open manifests/missing.yaml: no such file or directory&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> ]
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> },
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#062873;font-weight:bold">&amp;#34;resource&amp;#34;&lt;/span>: {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#062873;font-weight:bold">&amp;#34;apiVersion&amp;#34;&lt;/span>: &lt;span style="color:#4070a0">&amp;#34;example.com/v1&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#062873;font-weight:bold">&amp;#34;kind&amp;#34;&lt;/span>: &lt;span style="color:#4070a0">&amp;#34;Widget&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#062873;font-weight:bold">&amp;#34;namespace&amp;#34;&lt;/span>: &lt;span style="color:#4070a0">&amp;#34;default&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#062873;font-weight:bold">&amp;#34;name&amp;#34;&lt;/span>: &lt;span style="color:#4070a0">&amp;#34;w1&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> },
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#062873;font-weight:bold">&amp;#34;source&amp;#34;&lt;/span>: &lt;span style="color:#4070a0">&amp;#34;manifests/widgets.yaml&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#062873;font-weight:bold">&amp;#34;idx&amp;#34;&lt;/span>: &lt;span style="color:#40a070">1&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#062873;font-weight:bold">&amp;#34;status&amp;#34;&lt;/span>: &lt;span style="color:#4070a0">&amp;#34;invalid&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#062873;font-weight:bold">&amp;#34;reason&amp;#34;&lt;/span>: &lt;span style="color:#4070a0">&amp;#34;schema-load-error&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#062873;font-weight:bold">&amp;#34;violations&amp;#34;&lt;/span>: [
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#062873;font-weight:bold">&amp;#34;message&amp;#34;&lt;/span>: &lt;span style="color:#4070a0">&amp;#34;Get \&amp;#34;https://schemas.example.com/Widget_v1.json\&amp;#34;: dial tcp: lookup schemas.example.com: no such host&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> ]
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> },
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#062873;font-weight:bold">&amp;#34;resource&amp;#34;&lt;/span>: {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#062873;font-weight:bold">&amp;#34;apiVersion&amp;#34;&lt;/span>: &lt;span style="color:#4070a0">&amp;#34;artifact.toolkit.fluxcd.io/v1&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#062873;font-weight:bold">&amp;#34;kind&amp;#34;&lt;/span>: &lt;span style="color:#4070a0">&amp;#34;ArtifactGenerator&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#062873;font-weight:bold">&amp;#34;namespace&amp;#34;&lt;/span>: &lt;span style="color:#4070a0">&amp;#34;apps&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#062873;font-weight:bold">&amp;#34;name&amp;#34;&lt;/span>: &lt;span style="color:#4070a0">&amp;#34;podinfo&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> },
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#062873;font-weight:bold">&amp;#34;source&amp;#34;&lt;/span>: &lt;span style="color:#4070a0">&amp;#34;manifests/artifacts.yaml&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#062873;font-weight:bold">&amp;#34;idx&amp;#34;&lt;/span>: &lt;span style="color:#40a070">1&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#062873;font-weight:bold">&amp;#34;status&amp;#34;&lt;/span>: &lt;span style="color:#4070a0">&amp;#34;invalid&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#062873;font-weight:bold">&amp;#34;reason&amp;#34;&lt;/span>: &lt;span style="color:#4070a0">&amp;#34;schema-not-found&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#062873;font-weight:bold">&amp;#34;violations&amp;#34;&lt;/span>: [
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#062873;font-weight:bold">&amp;#34;message&amp;#34;&lt;/span>: &lt;span style="color:#4070a0">&amp;#34;no schema for kind \&amp;#34;ArtifactGenerator\&amp;#34; in version \&amp;#34;artifact.toolkit.fluxcd.io/v1\&amp;#34;&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> ]
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> },
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#062873;font-weight:bold">&amp;#34;resource&amp;#34;&lt;/span>: {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#062873;font-weight:bold">&amp;#34;apiVersion&amp;#34;&lt;/span>: &lt;span style="color:#4070a0">&amp;#34;v1&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#062873;font-weight:bold">&amp;#34;kind&amp;#34;&lt;/span>: &lt;span style="color:#4070a0">&amp;#34;Secret&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#062873;font-weight:bold">&amp;#34;namespace&amp;#34;&lt;/span>: &lt;span style="color:#4070a0">&amp;#34;apps&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#062873;font-weight:bold">&amp;#34;name&amp;#34;&lt;/span>: &lt;span style="color:#4070a0">&amp;#34;auth-sops&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> },
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#062873;font-weight:bold">&amp;#34;source&amp;#34;&lt;/span>: &lt;span style="color:#4070a0">&amp;#34;manifests/secrets.yaml&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#062873;font-weight:bold">&amp;#34;idx&amp;#34;&lt;/span>: &lt;span style="color:#40a070">1&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#062873;font-weight:bold">&amp;#34;status&amp;#34;&lt;/span>: &lt;span style="color:#4070a0">&amp;#34;skipped&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#062873;font-weight:bold">&amp;#34;reason&amp;#34;&lt;/span>: &lt;span style="color:#4070a0">&amp;#34;kind-skipped&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> ]
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div></description></item></channel></rss>