Helm chart builder

Helm chart development agent skill and plugin for Claude Code, Codex, Gemini CLI, Cursor, OpenClaw — chart scaffolding, values design, template patterns, dependency management, security hardening, and chart testing.

How to use it

Claude Code
  1. Run the line below. It pulls the whole folder into ~/.claude/skills/helm-chart-builder, including the files SKILL.md points to.
  2. Describe your job in plain words. Claude Code follows the skill from there.
Claude Code — installs the whole folder, not just SKILL.md
npx degit alirezarezvani/claude-skills/engineering/helm-chart-builder/skills/helm-chart-builder#main ~/.claude/skills/helm-chart-builder

For one project only, change the path to .claude/skills/helm-chart-builder. This skill also uses values.yaml, Chart.yaml, deployment.yaml, service.yaml, ingress.yaml, serviceaccount.yaml — copying SKILL.md alone won't be enough. See the folder on GitHub.

Claude (web or desktop app)
  1. On this page open ⋯ → Download .md.
  2. Save it as SKILL.md in a folder, zip the folder, then Customize → Skills → + → Create skill → Upload a skill.
  3. Pick the file and Save. Claude shows the name and description and runs a security scan.
  4. Check the skill is switched on.
  5. Start a new chat and describe your job in plain words. The AI follows the skill from there.
ChatGPT or another app
  1. ChatGPT: make a Project and paste it into Instructions.
  2. Neither? Paste it at the top of a new chat — it works for that chat.
Not working?
  • Check which app you pasted it into — the steps above name the right one.
  • Some skills need the paid tier of Claude or ChatGPT.
Step-by-step guide with screenshots · Ask in the forum

Paste into Claude, ChatGPT or Cursor.

Source of Helm chart builder

Show the full text450 lines
namedescriptionlicensemetadata
helm-chart-builderHelm chart development agent skill and plugin for Claude Code, Codex, Gemini CLI, Cursor, OpenClaw — chart scaffolding, values design, template patterns, dependency management, security hardening, and chart testing. Use when: user wants to create or improve Helm charts, design values.yaml files, implement template helpers, audit chart security (RBAC, network policies, pod security), manage subcharts, or run helm lint/test.MIT version: 1.0.0 author: Alireza Rezvani category: engineering updated: 2026-03-15

Helm Chart Builder

Production-grade Helm charts. Sensible defaults. Secure by design. No cargo-culting.

Opinionated Helm workflow that turns ad-hoc Kubernetes manifests into maintainable, testable, reusable charts. Covers chart structure, values design, template patterns, dependency management, and security hardening.

Not a Helm tutorial — a set of concrete decisions about how to build charts that operators trust and developers don't fight.


Slash Commands

Command What it does
/helm:create Scaffold a production-ready Helm chart with best-practice structure
/helm:review Analyze an existing chart for issues — missing labels, hardcoded values, template anti-patterns
/helm:security Audit chart for security issues — RBAC, network policies, pod security, secrets handling

When This Skill Activates

Recognize these patterns from the user:

  • "Create a Helm chart for this service"
  • "Review my Helm chart"
  • "Is this chart secure?"
  • "Design a values.yaml"
  • "Add a subchart dependency"
  • "Set up helm tests"
  • "Helm best practices for [workload type]"
  • Any request involving: Helm chart, values.yaml, Chart.yaml, templates, helpers, _helpers.tpl, subcharts, helm lint, helm test

If the user has a Helm chart or wants to package Kubernetes resources → this skill applies.


Workflow

/helm:create — Chart Scaffolding
  1. Identify workload type

    • Web service (Deployment + Service + Ingress)
    • Worker (Deployment, no Service)
    • CronJob (CronJob + ServiceAccount)
    • Stateful service (StatefulSet + PVC + Headless Service)
    • Library chart (no templates, only helpers)
  2. Scaffold chart structure

    mychart/
    ├── Chart.yaml              # Chart metadata and dependencies
    ├── values.yaml             # Default configuration
    ├── values.schema.json      # Optional: JSON Schema for values validation
    ├── .helmignore             # Files to exclude from packaging
    ├── templates/
    │   ├── _helpers.tpl        # Named templates and helper functions
    │   ├── deployment.yaml     # Workload resource
    │   ├── service.yaml        # Service exposure
    │   ├── ingress.yaml        # Ingress (if applicable)
    │   ├── serviceaccount.yaml # ServiceAccount
    │   ├── hpa.yaml            # HorizontalPodAutoscaler
    │   ├── pdb.yaml            # PodDisruptionBudget
    │   ├── networkpolicy.yaml  # NetworkPolicy
    │   ├── configmap.yaml      # ConfigMap (if needed)
    │   ├── secret.yaml         # Secret (if needed)
    │   ├── NOTES.txt           # Post-install usage instructions
    │   └── tests/
    │       └── test-connection.yaml
    └── charts/                 # Subcharts (dependencies)
    
  3. Apply Chart.yaml best practices

    METADATA
    ├── apiVersion: v2 (Helm 3 only — never v1)
    ├── name: matches directory name exactly
    ├── version: semver (chart version, not app version)
    ├── appVersion: application version string
    ├── description: one-line summary of what the chart deploys
    └── type: application (or library for shared helpers)
    
    DEPENDENCIES
    ├── Pin dependency versions with ~X.Y.Z (patch-level float)
    ├── Use condition field to make subcharts optional
    ├── Use alias for multiple instances of same subchart
    └── Run helm dependency update after changes
    
  4. Generate values.yaml with documentation

    • Every value has an inline comment explaining purpose and type
    • Sensible defaults that work for development
    • Override-friendly structure (flat where possible, nested only when logical)
    • No hardcoded cluster-specific values (image registry, domain, storage class)
  5. Validate

    python3 scripts/chart_analyzer.py mychart/
    helm lint mychart/
    helm template mychart/ --debug
    
/helm:review — Chart Analysis
  1. Check chart structure

    Check Severity Fix
    Missing _helpers.tpl High Create helpers for common labels and selectors
    No NOTES.txt Medium Add post-install instructions
    No .helmignore Low Create one to exclude .git, CI files, tests
    Missing Chart.yaml fields Medium Add description, appVersion, maintainers
    Hardcoded values in templates High Extract to values.yaml with defaults
  2. Check template quality

    Check Severity Fix
    Missing standard labels High Use app.kubernetes.io/* labels via _helpers.tpl
    No resource requests/limits Critical Add resources section with defaults in values.yaml
    Hardcoded image tag High Use {{ .Values.image.repository }}:{{ .Values.image.tag }}
    No imagePullPolicy Medium Default to IfNotPresent, overridable
    Missing liveness/readiness probes High Add probes with configurable paths and ports
    No pod anti-affinity Medium Add preferred anti-affinity for HA
    Duplicate template code Medium Extract into named templates in _helpers.tpl
  3. Check values.yaml quality

    python3 scripts/values_validator.py mychart/values.yaml
    
  4. Generate review report

    HELM CHART REVIEW — [chart name]
    Date: [timestamp]
    
    CRITICAL: [count]
    HIGH:     [count]
    MEDIUM:   [count]
    LOW:      [count]
    
    [Detailed findings with fix recommendations]
    
/helm:security — Security Audit
  1. Pod security audit

    Check Severity Fix
    No securityContext Critical Add runAsNonRoot, readOnlyRootFilesystem
    Running as root Critical Set runAsNonRoot: true, runAsUser: 1000
    Writable root filesystem High Set readOnlyRootFilesystem: true + emptyDir for tmp
    All capabilities retained High Drop ALL, add only specific needed caps
    Privileged container Critical Set privileged: false, use specific capabilities
    No seccomp profile Medium Set seccompProfile.type: RuntimeDefault
    allowPrivilegeEscalation true High Set allowPrivilegeEscalation: false
  2. RBAC audit

    Check Severity Fix
    No ServiceAccount Medium Create dedicated SA, don't use default
    automountServiceAccountToken true Medium Set to false unless pod needs K8s API access
    ClusterRole instead of Role Medium Use namespace-scoped Role unless cluster-wide needed
    Wildcard permissions Critical Use specific resource names and verbs
    No RBAC at all Low Acceptable if pod doesn't need K8s API access
  3. Network and secrets audit

    Check Severity Fix
    No NetworkPolicy Medium Add default-deny ingress + explicit allow rules
    Secrets in values.yaml Critical Use external secrets operator or sealed-secrets
    No PodDisruptionBudget Medium Add PDB with minAvailable for HA workloads
    hostNetwork: true High Remove unless absolutely required (e.g., CNI plugin)
    hostPID or hostIPC Critical Never use in application charts
  4. Generate security report

    SECURITY AUDIT — [chart name]
    Date: [timestamp]
    
    CRITICAL: [count]
    HIGH:     [count]
    MEDIUM:   [count]
    LOW:      [count]
    
    [Detailed findings with remediation steps]
    

Tooling

scripts/chart_analyzer.py

CLI utility for static analysis of Helm chart directories.

Features:

  • Chart structure validation (required files, directory layout)
  • Template anti-pattern detection (hardcoded values, missing labels, no resource limits)
  • Chart.yaml metadata checks
  • Standard labels verification (app.kubernetes.io/*)
  • Security baseline checks
  • JSON and text output

Usage:

# Analyze a chart directory
python3 scripts/chart_analyzer.py mychart/

# JSON output
python3 scripts/chart_analyzer.py mychart/ --output json

# Security-focused analysis
python3 scripts/chart_analyzer.py mychart/ --security
scripts/values_validator.py

CLI utility for validating values.yaml against best practices.

Features:

  • Documentation coverage (inline comments)
  • Type consistency checks
  • Hardcoded secrets detection
  • Default value quality analysis
  • Structure depth analysis
  • Naming convention validation
  • JSON and text output

Usage:

# Validate values.yaml
python3 scripts/values_validator.py values.yaml

# JSON output
python3 scripts/values_validator.py values.yaml --output json

# Strict mode (fail on warnings)
python3 scripts/values_validator.py values.yaml --strict

Template Patterns

Pattern 1: Standard Labels (_helpers.tpl)
{{/*
Common labels for all resources.
*/}}
{{- define "mychart.labels" -}}
helm.sh/chart: {{ include "mychart.chart" . }}
app.kubernetes.io/name: {{ include "mychart.name" . }}
app.kubernetes.io/instance: {{ .Release.Name }}
app.kubernetes.io/version: {{ .Chart.AppVersion | quote }}
app.kubernetes.io/managed-by: {{ .Release.Service }}
{{- end }}

{{/*
Selector labels (subset of common labels — must be immutable).
*/}}
{{- define "mychart.selectorLabels" -}}
app.kubernetes.io/name: {{ include "mychart.name" . }}
app.kubernetes.io/instance: {{ .Release.Name }}
{{- end }}
Pattern 2: Conditional Resources
{{- if .Values.ingress.enabled -}}
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: {{ include "mychart.fullname" . }}
  labels:
    {{- include "mychart.labels" . | nindent 4 }}
  {{- with .Values.ingress.annotations }}
  annotations:
    {{- toYaml . | nindent 4 }}
  {{- end }}
spec:
  {{- if .Values.ingress.tls }}
  tls:
    {{- range .Values.ingress.tls }}
    - hosts:
        {{- range .hosts }}
        - {{ . | quote }}
        {{- end }}
      secretName: {{ .secretName }}
    {{- end }}
  {{- end }}
  rules:
    {{- range .Values.ingress.hosts }}
    - host: {{ .host | quote }}
      http:
        paths:
          {{- range .paths }}
          - path: {{ .path }}
            pathType: {{ .pathType }}
            backend:
              service:
                name: {{ include "mychart.fullname" $ }}
                port:
                  number: {{ $.Values.service.port }}
          {{- end }}
    {{- end }}
{{- end }}
Pattern 3: Security-Hardened Pod Spec
spec:
  serviceAccountName: {{ include "mychart.serviceAccountName" . }}
  automountServiceAccountToken: false
  securityContext:
    runAsNonRoot: true
    runAsUser: 1000
    fsGroup: 1000
    seccompProfile:
      type: RuntimeDefault
  containers:
    - name: {{ .Chart.Name }}
      securityContext:
        allowPrivilegeEscalation: false
        readOnlyRootFilesystem: true
        capabilities:
          drop:
            - ALL
      image: "{{ .Values.image.repository }}:{{ .Values.image.tag | default .Chart.AppVersion }}"
      imagePullPolicy: {{ .Values.image.pullPolicy }}
      resources:
        {{- toYaml .Values.resources | nindent 8 }}
      volumeMounts:
        - name: tmp
          mountPath: /tmp
  volumes:
    - name: tmp
      emptyDir: {}

Values Design Principles

STRUCTURE
├── Flat over nested (image.tag > container.spec.image.tag)
├── Group by resource (service.*, ingress.*, resources.*)
├── Use enabled: true/false for optional resources
├── Document every key with inline YAML comments
└── Provide sensible development defaults

NAMING
├── camelCase for keys (replicaCount, not replica_count)
├── Boolean keys: use adjectives (enabled, required) not verbs
├── Nested keys: max 3 levels deep
└── Match upstream conventions (image.repository, image.tag, image.pullPolicy)

ANTI-PATTERNS
├── Hardcoded cluster URLs or domains
├── Secrets as default values
├── Empty strings where null is correct
├── Deeply nested structures (>3 levels)
├── Undocumented values
└── values.yaml that doesn't work without overrides

Dependency Management

SUBCHARTS
├── Use Chart.yaml dependencies (not requirements.yaml — Helm 3)
├── Pin versions: version: ~15.x.x (patch float)
├── Use condition: to make optional: condition: postgresql.enabled
├── Use alias: for multiple instances of same chart
├── Override subchart values under subchart name key in values.yaml
└── Run helm dependency update before packaging

LIBRARY CHARTS
├── type: library in Chart.yaml — no templates directory
├── Export named templates only — no rendered resources
├── Use for shared labels, annotations, security contexts
└── Version independently from application charts

Proactive Triggers

Flag these without being asked:

  • No _helpers.tpl → Create one. Every chart needs standard labels and fullname helpers.
  • Hardcoded image tag in template → Extract to values.yaml. Tags must be overridable.
  • No resource requests/limits → Add them. Pods without limits can starve the node.
  • Running as root → Add securityContext. No exceptions for production charts.
  • No NOTES.txt → Create one. Users need post-install instructions.
  • Secrets in values.yaml defaults → Remove them. Use placeholders with comments explaining how to provide secrets.
  • No liveness/readiness probes → Add them. Kubernetes needs to know if the pod is healthy.
  • Missing app.kubernetes.io labels → Add via _helpers.tpl. Required for proper resource tracking.

Installation

One-liner (any tool)
git clone https://github.com/alirezarezvani/claude-skills.git
cp -r claude-skills/engineering/helm-chart-builder ~/.claude/skills/
Multi-tool install
./scripts/convert.sh --skill helm-chart-builder --tool codex|gemini|cursor|windsurf|openclaw
OpenClaw
clawhub install cs-helm-chart-builder

  • senior-devops — Broader DevOps scope (CI/CD, IaC, monitoring). Complementary — use helm-chart-builder for chart-specific work, senior-devops for pipeline and infrastructure.
  • docker-development — Container building. Complementary — docker-development builds the images, helm-chart-builder deploys them to Kubernetes.
  • ci-cd-pipeline-builder — Pipeline construction. Complementary — helm-chart-builder defines the deployment artifact, ci-cd-pipeline-builder automates its delivery.
  • senior-security — Application security. Complementary — helm-chart-builder covers Kubernetes-level security (RBAC, pod security), senior-security covers application-level threats.
1---
2name: "helm-chart-builder"
3description: "Helm chart development agent skill and plugin for Claude Code, Codex, Gemini CLI, Cursor, OpenClaw — chart scaffolding, values design, template patterns, dependency management, security hardening, and chart testing. Use when: user wants to create or improve Helm charts, design values.yaml files, implement template helpers, audit chart security (RBAC, network policies, pod security), manage subcharts, or run helm lint/test."
4license: MIT
5metadata:
6 version: 1.0.0
7 author: Alireza Rezvani
8 category: engineering
9 updated: 2026-03-15
10---
11 
12# Helm Chart Builder
13 
14> Production-grade Helm charts. Sensible defaults. Secure by design. No cargo-culting.
15 
16Opinionated Helm workflow that turns ad-hoc Kubernetes manifests into maintainable, testable, reusable charts. Covers chart structure, values design, template patterns, dependency management, and security hardening.
17 
18Not a Helm tutorial — a set of concrete decisions about how to build charts that operators trust and developers don't fight.
19 
20---
21 
22## Slash Commands
23 
24| Command | What it does |
25|---------|-------------|
26| `/helm:create` | Scaffold a production-ready Helm chart with best-practice structure |
27| `/helm:review` | Analyze an existing chart for issues — missing labels, hardcoded values, template anti-patterns |
28| `/helm:security` | Audit chart for security issues — RBAC, network policies, pod security, secrets handling |
29 
30---
31 
32## When This Skill Activates
33 
34Recognize these patterns from the user:
35 
36- "Create a Helm chart for this service"
37- "Review my Helm chart"
38- "Is this chart secure?"
39- "Design a values.yaml"
40- "Add a subchart dependency"
41- "Set up helm tests"
42- "Helm best practices for [workload type]"
43- Any request involving: Helm chart, values.yaml, Chart.yaml, templates, helpers, _helpers.tpl, subcharts, helm lint, helm test
44 
45If the user has a Helm chart or wants to package Kubernetes resources → this skill applies.
46 
47---
48 
49## Workflow
50 
51### `/helm:create` — Chart Scaffolding
52 
531. **Identify workload type**
54 - Web service (Deployment + Service + Ingress)
55 - Worker (Deployment, no Service)
56 - CronJob (CronJob + ServiceAccount)
57 - Stateful service (StatefulSet + PVC + Headless Service)
58 - Library chart (no templates, only helpers)
59 
602. **Scaffold chart structure**
61 
62 ```
63 mychart/
64 ├── Chart.yaml # Chart metadata and dependencies
65 ├── values.yaml # Default configuration
66 ├── values.schema.json # Optional: JSON Schema for values validation
67 ├── .helmignore # Files to exclude from packaging
68 ├── templates/
69 │ ├── _helpers.tpl # Named templates and helper functions
70 │ ├── deployment.yaml # Workload resource
71 │ ├── service.yaml # Service exposure
72 │ ├── ingress.yaml # Ingress (if applicable)
73 │ ├── serviceaccount.yaml # ServiceAccount
74 │ ├── hpa.yaml # HorizontalPodAutoscaler
75 │ ├── pdb.yaml # PodDisruptionBudget
76 │ ├── networkpolicy.yaml # NetworkPolicy
77 │ ├── configmap.yaml # ConfigMap (if needed)
78 │ ├── secret.yaml # Secret (if needed)
79 │ ├── NOTES.txt # Post-install usage instructions
80 │ └── tests/
81 │ └── test-connection.yaml
82 └── charts/ # Subcharts (dependencies)
83 ```
84 
853. **Apply Chart.yaml best practices**
86 
87 ```
88 METADATA
89 ├── apiVersion: v2 (Helm 3 only — never v1)
90 ├── name: matches directory name exactly
91 ├── version: semver (chart version, not app version)
92 ├── appVersion: application version string
93 ├── description: one-line summary of what the chart deploys
94 └── type: application (or library for shared helpers)
95 
96 DEPENDENCIES
97 ├── Pin dependency versions with ~X.Y.Z (patch-level float)
98 ├── Use condition field to make subcharts optional
99 ├── Use alias for multiple instances of same subchart
100 └── Run helm dependency update after changes
101 ```
102 
1034. **Generate values.yaml with documentation**
104 - Every value has an inline comment explaining purpose and type
105 - Sensible defaults that work for development
106 - Override-friendly structure (flat where possible, nested only when logical)
107 - No hardcoded cluster-specific values (image registry, domain, storage class)
108 
1095. **Validate**
110 ```bash
111 python3 scripts/chart_analyzer.py mychart/
112 helm lint mychart/
113 helm template mychart/ --debug
114 ```
115 
116### `/helm:review` — Chart Analysis
117 
1181. **Check chart structure**
119 
120 | Check | Severity | Fix |
121 |-------|----------|-----|
122 | Missing _helpers.tpl | High | Create helpers for common labels and selectors |
123 | No NOTES.txt | Medium | Add post-install instructions |
124 | No .helmignore | Low | Create one to exclude .git, CI files, tests |
125 | Missing Chart.yaml fields | Medium | Add description, appVersion, maintainers |
126 | Hardcoded values in templates | High | Extract to values.yaml with defaults |
127 
1282. **Check template quality**
129 
130 | Check | Severity | Fix |
131 |-------|----------|-----|
132 | Missing standard labels | High | Use `app.kubernetes.io/*` labels via _helpers.tpl |
133 | No resource requests/limits | Critical | Add resources section with defaults in values.yaml |
134 | Hardcoded image tag | High | Use `{{ .Values.image.repository }}:{{ .Values.image.tag }}` |
135 | No imagePullPolicy | Medium | Default to `IfNotPresent`, overridable |
136 | Missing liveness/readiness probes | High | Add probes with configurable paths and ports |
137 | No pod anti-affinity | Medium | Add preferred anti-affinity for HA |
138 | Duplicate template code | Medium | Extract into named templates in _helpers.tpl |
139 
1403. **Check values.yaml quality**
141 ```bash
142 python3 scripts/values_validator.py mychart/values.yaml
143 ```
144 
1454. **Generate review report**
146 ```
147 HELM CHART REVIEW — [chart name]
148 Date: [timestamp]
149 
150 CRITICAL: [count]
151 HIGH: [count]
152 MEDIUM: [count]
153 LOW: [count]
154 
155 [Detailed findings with fix recommendations]
156 ```
157 
158### `/helm:security` — Security Audit
159 
1601. **Pod security audit**
161 
162 | Check | Severity | Fix |
163 |-------|----------|-----|
164 | No securityContext | Critical | Add runAsNonRoot, readOnlyRootFilesystem |
165 | Running as root | Critical | Set `runAsNonRoot: true`, `runAsUser: 1000` |
166 | Writable root filesystem | High | Set `readOnlyRootFilesystem: true` + emptyDir for tmp |
167 | All capabilities retained | High | Drop ALL, add only specific needed caps |
168 | Privileged container | Critical | Set `privileged: false`, use specific capabilities |
169 | No seccomp profile | Medium | Set `seccompProfile.type: RuntimeDefault` |
170 | allowPrivilegeEscalation true | High | Set `allowPrivilegeEscalation: false` |
171 
1722. **RBAC audit**
173 
174 | Check | Severity | Fix |
175 |-------|----------|-----|
176 | No ServiceAccount | Medium | Create dedicated SA, don't use default |
177 | automountServiceAccountToken true | Medium | Set to false unless pod needs K8s API access |
178 | ClusterRole instead of Role | Medium | Use namespace-scoped Role unless cluster-wide needed |
179 | Wildcard permissions | Critical | Use specific resource names and verbs |
180 | No RBAC at all | Low | Acceptable if pod doesn't need K8s API access |
181 
1823. **Network and secrets audit**
183 
184 | Check | Severity | Fix |
185 |-------|----------|-----|
186 | No NetworkPolicy | Medium | Add default-deny ingress + explicit allow rules |
187 | Secrets in values.yaml | Critical | Use external secrets operator or sealed-secrets |
188 | No PodDisruptionBudget | Medium | Add PDB with minAvailable for HA workloads |
189 | hostNetwork: true | High | Remove unless absolutely required (e.g., CNI plugin) |
190 | hostPID or hostIPC | Critical | Never use in application charts |
191 
1924. **Generate security report**
193 ```
194 SECURITY AUDIT — [chart name]
195 Date: [timestamp]
196 
197 CRITICAL: [count]
198 HIGH: [count]
199 MEDIUM: [count]
200 LOW: [count]
201 
202 [Detailed findings with remediation steps]
203 ```
204 
205---
206 
207## Tooling
208 
209### `scripts/chart_analyzer.py`
210 
211CLI utility for static analysis of Helm chart directories.
212 
213**Features:**
214- Chart structure validation (required files, directory layout)
215- Template anti-pattern detection (hardcoded values, missing labels, no resource limits)
216- Chart.yaml metadata checks
217- Standard labels verification (app.kubernetes.io/*)
218- Security baseline checks
219- JSON and text output
220 
221**Usage:**
222```bash
223# Analyze a chart directory
224python3 scripts/chart_analyzer.py mychart/
225 
226# JSON output
227python3 scripts/chart_analyzer.py mychart/ --output json
228 
229# Security-focused analysis
230python3 scripts/chart_analyzer.py mychart/ --security
231```
232 
233### `scripts/values_validator.py`
234 
235CLI utility for validating values.yaml against best practices.
236 
237**Features:**
238- Documentation coverage (inline comments)
239- Type consistency checks
240- Hardcoded secrets detection
241- Default value quality analysis
242- Structure depth analysis
243- Naming convention validation
244- JSON and text output
245 
246**Usage:**
247```bash
248# Validate values.yaml
249python3 scripts/values_validator.py values.yaml
250 
251# JSON output
252python3 scripts/values_validator.py values.yaml --output json
253 
254# Strict mode (fail on warnings)
255python3 scripts/values_validator.py values.yaml --strict
256```
257 
258---
259 
260## Template Patterns
261 
262### Pattern 1: Standard Labels (_helpers.tpl)
263 
264```yaml
265{{/*
266Common labels for all resources.
267*/}}
268{{- define "mychart.labels" -}}
269helm.sh/chart: {{ include "mychart.chart" . }}
270app.kubernetes.io/name: {{ include "mychart.name" . }}
271app.kubernetes.io/instance: {{ .Release.Name }}
272app.kubernetes.io/version: {{ .Chart.AppVersion | quote }}
273app.kubernetes.io/managed-by: {{ .Release.Service }}
274{{- end }}
275 
276{{/*
277Selector labels (subset of common labels — must be immutable).
278*/}}
279{{- define "mychart.selectorLabels" -}}
280app.kubernetes.io/name: {{ include "mychart.name" . }}
281app.kubernetes.io/instance: {{ .Release.Name }}
282{{- end }}
283```
284 
285### Pattern 2: Conditional Resources
286 
287```yaml
288{{- if .Values.ingress.enabled -}}
289apiVersion: networking.k8s.io/v1
290kind: Ingress
291metadata:
292 name: {{ include "mychart.fullname" . }}
293 labels:
294 {{- include "mychart.labels" . | nindent 4 }}
295 {{- with .Values.ingress.annotations }}
296 annotations:
297 {{- toYaml . | nindent 4 }}
298 {{- end }}
299spec:
300 {{- if .Values.ingress.tls }}
301 tls:
302 {{- range .Values.ingress.tls }}
303 - hosts:
304 {{- range .hosts }}
305 - {{ . | quote }}
306 {{- end }}
307 secretName: {{ .secretName }}
308 {{- end }}
309 {{- end }}
310 rules:
311 {{- range .Values.ingress.hosts }}
312 - host: {{ .host | quote }}
313 http:
314 paths:
315 {{- range .paths }}
316 - path: {{ .path }}
317 pathType: {{ .pathType }}
318 backend:
319 service:
320 name: {{ include "mychart.fullname" $ }}
321 port:
322 number: {{ $.Values.service.port }}
323 {{- end }}
324 {{- end }}
325{{- end }}
326```
327 
328### Pattern 3: Security-Hardened Pod Spec
329 
330```yaml
331spec:
332 serviceAccountName: {{ include "mychart.serviceAccountName" . }}
333 automountServiceAccountToken: false
334 securityContext:
335 runAsNonRoot: true
336 runAsUser: 1000
337 fsGroup: 1000
338 seccompProfile:
339 type: RuntimeDefault
340 containers:
341 - name: {{ .Chart.Name }}
342 securityContext:
343 allowPrivilegeEscalation: false
344 readOnlyRootFilesystem: true
345 capabilities:
346 drop:
347 - ALL
348 image: "{{ .Values.image.repository }}:{{ .Values.image.tag | default .Chart.AppVersion }}"
349 imagePullPolicy: {{ .Values.image.pullPolicy }}
350 resources:
351 {{- toYaml .Values.resources | nindent 8 }}
352 volumeMounts:
353 - name: tmp
354 mountPath: /tmp
355 volumes:
356 - name: tmp
357 emptyDir: {}
358```
359 
360---
361 
362## Values Design Principles
363 
364```
365STRUCTURE
366├── Flat over nested (image.tag > container.spec.image.tag)
367├── Group by resource (service.*, ingress.*, resources.*)
368├── Use enabled: true/false for optional resources
369├── Document every key with inline YAML comments
370└── Provide sensible development defaults
371 
372NAMING
373├── camelCase for keys (replicaCount, not replica_count)
374├── Boolean keys: use adjectives (enabled, required) not verbs
375├── Nested keys: max 3 levels deep
376└── Match upstream conventions (image.repository, image.tag, image.pullPolicy)
377 
378ANTI-PATTERNS
379├── Hardcoded cluster URLs or domains
380├── Secrets as default values
381├── Empty strings where null is correct
382├── Deeply nested structures (>3 levels)
383├── Undocumented values
384└── values.yaml that doesn't work without overrides
385```
386 
387---
388 
389## Dependency Management
390 
391```
392SUBCHARTS
393├── Use Chart.yaml dependencies (not requirements.yaml — Helm 3)
394├── Pin versions: version: ~15.x.x (patch float)
395├── Use condition: to make optional: condition: postgresql.enabled
396├── Use alias: for multiple instances of same chart
397├── Override subchart values under subchart name key in values.yaml
398└── Run helm dependency update before packaging
399 
400LIBRARY CHARTS
401├── type: library in Chart.yaml — no templates directory
402├── Export named templates only — no rendered resources
403├── Use for shared labels, annotations, security contexts
404└── Version independently from application charts
405```
406 
407---
408 
409## Proactive Triggers
410 
411Flag these without being asked:
412 
413- **No _helpers.tpl** → Create one. Every chart needs standard labels and fullname helpers.
414- **Hardcoded image tag in template** → Extract to values.yaml. Tags must be overridable.
415- **No resource requests/limits** → Add them. Pods without limits can starve the node.
416- **Running as root** → Add securityContext. No exceptions for production charts.
417- **No NOTES.txt** → Create one. Users need post-install instructions.
418- **Secrets in values.yaml defaults** → Remove them. Use placeholders with comments explaining how to provide secrets.
419- **No liveness/readiness probes** → Add them. Kubernetes needs to know if the pod is healthy.
420- **Missing app.kubernetes.io labels** → Add via _helpers.tpl. Required for proper resource tracking.
421 
422---
423 
424## Installation
425 
426### One-liner (any tool)
427```bash
428git clone https://github.com/alirezarezvani/claude-skills.git
429cp -r claude-skills/engineering/helm-chart-builder ~/.claude/skills/
430```
431 
432### Multi-tool install
433```bash
434./scripts/convert.sh --skill helm-chart-builder --tool codex|gemini|cursor|windsurf|openclaw
435```
436 
437### OpenClaw
438```bash
439clawhub install cs-helm-chart-builder
440```
441 
442---
443 
444## Related Skills
445 
446- **senior-devops** — Broader DevOps scope (CI/CD, IaC, monitoring). Complementary — use helm-chart-builder for chart-specific work, senior-devops for pipeline and infrastructure.
447- **docker-development** — Container building. Complementary — docker-development builds the images, helm-chart-builder deploys them to Kubernetes.
448- **ci-cd-pipeline-builder** — Pipeline construction. Complementary — helm-chart-builder defines the deployment artifact, ci-cd-pipeline-builder automates its delivery.
449- **senior-security** — Application security. Complementary — helm-chart-builder covers Kubernetes-level security (RBAC, pod security), senior-security covers application-level threats.
450 

Discussion

Alternatives

Also in SecuritySee all 533 in Development →