Helm Values Navigator
VS Code extension for inspecting Helm values across environments. Hover, go-to-definition, and completion for .Values references; template definition hover and go-to-definition for include calls. Orphan diagnostics for unresolved refs and unused keys.

Features
- Values hover: Hover over
.Values.x.y.z or $.Values.x.y.z in templates/**/*.{yaml,yml,tpl} → inline table of resolved values across all environments. Works in {{ .Values.x }}, {{ $.Values.x }}, {{ index .Values "key" }} (static keys), {{ coalesce .Values.a .Values.b "default" }}, {{ or .Values.a .Values.b }}, {{ default "x" .Values.foo }}, {{ .Values.foo | default .Values.bar }}, {{ ternary .Values.a .Values.b .Values.flag }}, etc. Values that differ from the base are bold; missing keys show ⚠ not set.
- Go to definition: Ctrl+click (or F12) on
.Values.x.y.z → jumps to the key in values files. Ctrl+click on {{ include "template.name" . }} → jumps to the define block.
- Completion: Type
. after .Values or inside include " → suggests value paths and template names.
- Template definition hover: Hover over
{{ include "template.name" . }} → shows the define block source (file + full definition).
- Orphan diagnostics: Errors for
.Values paths not defined in any values file. Hint (blue dotted underline) instead of error when: (1) the reference uses a non-literal default ({{ .Values.foo | default (randAlphaNum 8) }}, etc.), or (2) it appears only in an {{ if … }} / {{ else if … }} condition (unset keys are falsy, so the branch is skipped). Quoted defaults and | default .Values.other still suppress the diagnostic entirely. References in the if body (other lines or later {{ }} blocks) stay errors. Information-level squiggles for value keys not referenced in templates. Right-click any orphan diagnostic → Add 'prefix' to orphan exclude list to add to helmValues.excludeOrphanPrefixes (e.g. secrets for .Values.secrets.*). Values passed to dependency charts are considered used if the subchart's templates reference them. When Chart.yaml lists dependencies not found in charts/, an informational diagnostic appears with a Quick Fix to run helm dependency update. Command palette: Helm: Refresh Diagnostics, Helm: Update Dependencies.
Supported layouts
- Helmfile:
helmfile.yaml at workspace root with explicit environments. Value layers: chart base → env values → secrets → system.
- Override-folder:
helm/*/values.yaml + helm/*/overrides/*.yaml. Environments inferred from override filenames.
- Standalone: Plain chart with
values.yaml only. Single "default" environment.
- Custom: Set
helmValues.environments and helmValues.valuesFilePattern to use explicit env list and a pattern like values/values-{env}.yml. Base path via helmValues.valuesBasePath. Takes precedence over helmfile/override-folder when both are set.
Implementation
Hover “effective value” and orphan rules for default / coalesce / or / ternary use src/templateAction.ts: it parses one template action (text inside {{ … }}) as pipelines (|), function calls, parenthesized sub-expressions, string literals, .Values… and $.Values…, bare ., and static index .Values "key" … chains. This is not a full Go text/Sprig evaluator; unknown or very dynamic expressions are treated conservatively.
See also my other work!
Settings
| Setting |
Description |
helmValues.helmfilePath |
Path to helmfile.yaml (default: helmfile.yaml) |
helmValues.chartPath |
Override chart path when multiple charts exist (e.g. nolo or helm/sample-gitops-2) |
helmValues.baseValuesFile |
Base values filename relative to chart root (default: values.yaml) |
helmValues.overridesDir |
Overrides directory relative to chart root (override-folder layout, default: overrides) |
helmValues.secretsFilePath |
Override for git-ignored secrets file |
helmValues.environments |
Explicit env list. With valuesFilePattern, enables custom layout |
helmValues.valuesBasePath |
Base path for value files (default: .). Used with custom layout |
helmValues.valuesFilePattern |
Pattern with {env} placeholder (e.g. values/values-{env}.yml) |
helmValues.excludeOrphanPrefixes |
Path prefixes to exclude. Use * for one segment (e.g. secrets.*). Examples: ["global.images","secrets"] |
helmValues.orphanDiagnosticsEnabled |
Enable/disable orphan diagnostics (default: true) |
Version history
Current release: 0.6.0 — template parser supports $.Values, bare ., and static index .Values …; missing .Values keys used only in an {{ if }} / {{ else if }} condition are still Hints (falsy when unset), not errors. Full notes: CHANGELOG.md.
Roadmap: associate .Values refs with multi-line blocks (if / range / with across lines); expand whitelisted functions beyond what templateAction + valuesFallback cover today.
| |