helm-chart-developer
Skill4 starsChanged 10 months agoMITView on GitHub
Helm chart authoring, values.yaml design, GitOps with Flux HelmRelease, External Secrets Operator integration. Use for creating and debugging Helm charts.
In this repository2 other files it gives its agents.
- flux-gitopsSkill
- go-developmentSkill
The file
We split this skill into the rules it gives an agent
10 rules. About 0 are common, 5 are distinctive, and 5 are very specific to this project.
≈0
Common · estimate
Many files like this have a rule of this kind.
≈5
Distinctive · estimate
This author's own choices. Worth a look.
5
Very specific
Tied to their project's names, files or tools. Probably skip.
- Common
- Distinctive
- Very specific
- Distinctive: line 12
Use this skill when:
- Distinctive: line 36
Rule: If adding manifests, ALWAYS use these API versions.
- Distinctive: line 37
If CRD/apiVersion mismatch detected in repo, STOP and propose migration plan.
- Distinctive: line 43
Before completing any Helm chart work:
- Very specific: line 54
Run /helm-validate to execute all checks.
- Very specific: line 131
Default rule: Use refreshPolicy: OnChange for predictable GitOps-driven updates.
- Very specific: line 160
Use spec.dependsOn in HelmRelease when app depends on:
- Very specific: line 212
OpenAPI validation: Use install.disableOpenAPIValidation: true in HelmRelease if needed.
- Very specific: line 213
NEVER put secrets in values.yaml: No passwords, tokens, API keys, credentials.
- Distinctive: line 214
Only references to Secret/ExternalSecret names.
≈ “Common” is an estimate: at least 1 in 5 of the 350,495 skill files we read have a rule of the same kind, not the same words. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.
Files
Helm Chart Developer
Purpose / When to Use
Use this skill when:
- Creating new Helm charts from scratch
- Converting raw Kubernetes manifests to Helm
- Designing values.yaml API and schema
- Setting up GitOps deployment with Flux HelmRelease
- Integrating External Secrets Operator (ESO)
- Debugging
helm template,helm lint,helm install --dry-run - Setting up multi-environment overlays (dev/prod)
Version & API Compatibility
Always use these API versions:
| Component | API Version | Notes |
| Helm Chart | apiVersion: v2 | Helm 3+ charts |
| Flux HelmRelease | helm.toolkit.fluxcd.io/v2 | Current stable |
| Flux HelmRepository | source.toolkit.fluxcd.io/v1 | Current stable |
| Flux Kustomization | kustomize.toolkit.fluxcd.io/v1 | Current stable |
| ExternalSecret | external-secrets.io/v1 | ESO v1 API |
| ClusterSecretStore | external-secrets.io/v1 | With spec.conditions[].namespaceSelector |
Target baseline: Kubernetes 1.29+, Helm 3.14+, Flux v2.3+, ESO 0.10+
Rule: If adding manifests, ALWAYS use these API versions. If CRD/apiVersion mismatch detected in repo, STOP and propose migration plan.
See VERSIONS.md for full compatibility matrix.
Definition of Done (DoD)
Before completing any Helm chart work:
- Linting:
helm lint .passes - Template rendering:
helm template <release> .succeeds - Schema validation (optional):
helm template . | kubeconform -strict - Dry-run:
helm install <release> . --dry-run --debugworks - Two secrets modes validated:
- GitOps mode:
--set secrets.existingSecretName=<name> - Chart-managed ESO:
--set secrets.externalSecret.enabled=true
- GitOps mode:
- API versions match the compatibility table above
Run /helm-validate to execute all checks.
Step-by-Step Workflow
1. Chart Structure
charts/app/
├── Chart.yaml
├── values.yaml
├── templates/
│ ├── _helpers.tpl
│ ├── deployment.yaml
│ ├── service.yaml
│ ├── ingress.yaml
│ ├── externalsecret.yaml # optional, gated
│ ├── hpa.yaml
│ ├── pdb.yaml
│ └── serviceaccount.yaml2. Values API Contract
See reference-gitops-eso.md for full details.
Key sections:
image: repository, tag, pullPolicysecrets: existingSecretName, externalSecret.*, inject.envFromservice: enabled, type, portingress: enabled, className, hosts, tlsresources: requests, limitsautoscaling: enabled, minReplicas, maxReplicas
3. Secrets Integration
Mode A: ExternalSecret in Overlay (Recommended)
Chart only references secret by name:
# values.yaml
secrets:
existingSecretName: "app-secrets"
inject:
envFrom: trueExternalSecret lives in GitOps overlay, not in chart.
Mode B: Chart-Managed ExternalSecret (Optional)
Chart renders ExternalSecret when enabled:
secrets:
externalSecret:
enabled: true
refreshInterval: 1h
refreshPolicy: OnChange
secretStoreRef:
kind: ClusterSecretStore
name: aws-secrets-manager
dataFrom:
extractKey: "fce/dev/app"
target:
name: "app-secrets"
creationPolicy: OwnerSecrets Determinism (ESO)
refreshPolicy options:
| Policy | Behavior | Use Case |
OnChange | Updates when ExternalSecret manifest changes | GitOps (default, recommended) |
CreatedOnce | Never updates after creation | Immutable credentials |
Periodic | Updates on interval (refreshInterval) | Legacy, auto-rotation |
Default rule: Use refreshPolicy: OnChange for predictable GitOps-driven updates.
Manual refresh (debug/runbook):
kubectl annotate es <name> force-sync=$(date +%s) --overwrite4. Flux + Kustomize Recipe
Values Composition Order (important!):
- Chart defaults (
charts/app/values.yaml) - Environment values (
apps/dev/app/values.yaml) - ConfigMap via Kustomize generator
- HelmRelease
valuesFromreferences ConfigMap - HelmRelease
spec.valuespatches (highest priority)
See snippets:
- flux-helmrelease.base.yaml
- flux-helmrelease.dev.patch.yaml
- kustomize.configmapgenerator.yaml
Critical Kustomize settings:
generatorOptions:
disableNameSuffixHash: true # MUST have, otherwise names change on every applyFlux Ordering
Use spec.dependsOn in HelmRelease when app depends on:
- CRDs (external-secrets, cert-manager)
- ExternalSecrets/SecretStores
- Ingress controllers, databases
Example:
spec:
dependsOn:
- name: external-secrets
namespace: external-secrets5. ESO Patterns
ClusterSecretStore (cluster-wide):
apiVersion: external-secrets.io/v1
kind: ClusterSecretStore
metadata:
name: aws-secrets-manager
spec:
conditions:
- namespaceSelector:
matchLabels:
eso.fce.global/enabled: "true"
provider:
aws:
service: SecretsManager
region: me-central-1ExternalSecret (per app/env):
apiVersion: external-secrets.io/v1
kind: ExternalSecret
spec:
refreshPolicy: OnChange # GitOps-deterministic
secretStoreRef:
kind: ClusterSecretStore
name: aws-secrets-manager
dataFrom:
- extract:
key: fce/dev/app
target:
name: app-secrets
creationPolicy: Owner6. Pitfalls
- CRD ordering: ESO CRDs must exist before ExternalSecret. Use Flux Kustomization
dependsOn. - OpenAPI validation: Use
install.disableOpenAPIValidation: truein HelmRelease if needed. - NEVER put secrets in values.yaml: No passwords, tokens, API keys, credentials. Only references to Secret/ExternalSecret names. This is non-negotiable.
Examples
Prompts that should activate this skill:
- "Create a Helm chart for my Node.js app"
- "Convert these Kubernetes manifests to Helm"
- "Add External Secrets integration to my chart"
- "Set up Flux HelmRelease for my app"
- "Debug why helm template is failing"
- "Design values.yaml schema for multi-environment deployment"
- "Add ingress with TLS to my Helm chart"
- "Integrate AWS Secrets Manager with my chart"
- "Set up Kustomize overlays for dev and prod"
- "Fix helm lint errors in my chart"
Anti-Patterns
| ❌ Avoid | ✅ Instead |
| Hardcode secrets in values.yaml | Use ExternalSecret with secretStoreRef |
| Single values.yaml for all envs | Kustomize overlays per environment |
HelmRelease v2beta1 / v2beta2 API | Use helm.toolkit.fluxcd.io/v2 |
| Manual Secret creation | ESO with ClusterSecretStore |
| Inline helm values in HelmRelease | External values.yaml + patches via valuesFrom |
Skip helm lint / helm template | Always validate with /helm-validate |
refreshPolicy: Periodic for GitOps | Use refreshPolicy: OnChange for determinism |
Kustomize namesSuffixHash: true | Always disableNameSuffixHash: true for ConfigMaps |
| Put ExternalSecret in Helm chart | Put ExternalSecret in GitOps overlay (Mode A) |
Skip dependsOn for CRDs | Use spec.dependsOn for external-secrets, cert-manager |
Related Files
- VERSIONS.md - Version compatibility matrix
- reference-gitops-eso.md - Full GitOps + ESO reference
- snippets/ - Ready-to-use YAML snippets
Version History
- 1.1.0 — Add version compatibility, secrets determinism, Flux ordering
- 1.0.0 — Initial release with Flux + ESO patterns
Does it work?
Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.
No reviews yet
People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.
- It worked
- Partly
- It didn't
Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.
Your trail
Files you open will collect here, so you can find them again.
Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.
Now do this for your own.
Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.

