specweave 0.3.13 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (112) hide show
  1. package/CLAUDE.md +17 -1
  2. package/README.md +1 -1
  3. package/bin/install-all.sh +9 -2
  4. package/bin/install-hooks.sh +57 -0
  5. package/dist/cli/commands/init.d.ts.map +1 -1
  6. package/dist/cli/commands/init.js +55 -0
  7. package/dist/cli/commands/init.js.map +1 -1
  8. package/dist/core/agent-model-manager.d.ts +52 -0
  9. package/dist/core/agent-model-manager.d.ts.map +1 -0
  10. package/dist/core/agent-model-manager.js +120 -0
  11. package/dist/core/agent-model-manager.js.map +1 -0
  12. package/dist/core/cost-tracker.d.ts +108 -0
  13. package/dist/core/cost-tracker.d.ts.map +1 -0
  14. package/dist/core/cost-tracker.js +281 -0
  15. package/dist/core/cost-tracker.js.map +1 -0
  16. package/dist/core/model-selector.d.ts +57 -0
  17. package/dist/core/model-selector.d.ts.map +1 -0
  18. package/dist/core/model-selector.js +115 -0
  19. package/dist/core/model-selector.js.map +1 -0
  20. package/dist/core/phase-detector.d.ts +62 -0
  21. package/dist/core/phase-detector.d.ts.map +1 -0
  22. package/dist/core/phase-detector.js +229 -0
  23. package/dist/core/phase-detector.js.map +1 -0
  24. package/dist/types/cost-tracking.d.ts +43 -0
  25. package/dist/types/cost-tracking.d.ts.map +1 -0
  26. package/dist/types/cost-tracking.js +8 -0
  27. package/dist/types/cost-tracking.js.map +1 -0
  28. package/dist/types/model-selection.d.ts +53 -0
  29. package/dist/types/model-selection.d.ts.map +1 -0
  30. package/dist/types/model-selection.js +12 -0
  31. package/dist/types/model-selection.js.map +1 -0
  32. package/dist/utils/cost-reporter.d.ts +58 -0
  33. package/dist/utils/cost-reporter.d.ts.map +1 -0
  34. package/dist/utils/cost-reporter.js +224 -0
  35. package/dist/utils/cost-reporter.js.map +1 -0
  36. package/dist/utils/pricing-constants.d.ts +70 -0
  37. package/dist/utils/pricing-constants.d.ts.map +1 -0
  38. package/dist/utils/pricing-constants.js +71 -0
  39. package/dist/utils/pricing-constants.js.map +1 -0
  40. package/package.json +1 -1
  41. package/src/agents/architect/AGENT.md +3 -0
  42. package/src/agents/code-reviewer.md +156 -0
  43. package/src/agents/data-scientist/AGENT.md +181 -0
  44. package/src/agents/database-optimizer/AGENT.md +147 -0
  45. package/src/agents/devops/AGENT.md +3 -0
  46. package/src/agents/diagrams-architect/AGENT.md +3 -0
  47. package/src/agents/docs-writer/AGENT.md +3 -0
  48. package/src/agents/kubernetes-architect/AGENT.md +142 -0
  49. package/src/agents/ml-engineer/AGENT.md +150 -0
  50. package/src/agents/mlops-engineer/AGENT.md +201 -0
  51. package/src/agents/network-engineer/AGENT.md +149 -0
  52. package/src/agents/observability-engineer/AGENT.md +213 -0
  53. package/src/agents/payment-integration/AGENT.md +35 -0
  54. package/src/agents/performance/AGENT.md +3 -0
  55. package/src/agents/performance-engineer/AGENT.md +153 -0
  56. package/src/agents/pm/AGENT.md +3 -0
  57. package/src/agents/qa-lead/AGENT.md +3 -0
  58. package/src/agents/security/AGENT.md +3 -0
  59. package/src/agents/sre/AGENT.md +3 -0
  60. package/src/agents/tdd-orchestrator/AGENT.md +169 -0
  61. package/src/agents/tech-lead/AGENT.md +3 -0
  62. package/src/commands/specweave.costs.md +261 -0
  63. package/src/commands/specweave.ml-pipeline.md +292 -0
  64. package/src/commands/specweave.monitor-setup.md +501 -0
  65. package/src/commands/specweave.slo-implement.md +1055 -0
  66. package/src/commands/specweave.sync-github.md +1 -1
  67. package/src/commands/specweave.tdd-cycle.md +199 -0
  68. package/src/commands/specweave.tdd-green.md +842 -0
  69. package/src/commands/specweave.tdd-red.md +135 -0
  70. package/src/commands/specweave.tdd-refactor.md +165 -0
  71. package/src/skills/SKILLS-INDEX.md +18 -10
  72. package/src/skills/billing-automation/SKILL.md +559 -0
  73. package/src/skills/distributed-tracing/SKILL.md +438 -0
  74. package/src/skills/e2e-playwright/README.md +1 -1
  75. package/src/skills/e2e-playwright/package.json +1 -1
  76. package/src/skills/gitops-workflow/SKILL.md +285 -0
  77. package/src/skills/gitops-workflow/references/argocd-setup.md +134 -0
  78. package/src/skills/gitops-workflow/references/sync-policies.md +131 -0
  79. package/src/skills/grafana-dashboards/SKILL.md +369 -0
  80. package/src/skills/helm-chart-scaffolding/SKILL.md +544 -0
  81. package/src/skills/helm-chart-scaffolding/assets/Chart.yaml.template +42 -0
  82. package/src/skills/helm-chart-scaffolding/assets/values.yaml.template +185 -0
  83. package/src/skills/helm-chart-scaffolding/references/chart-structure.md +500 -0
  84. package/src/skills/helm-chart-scaffolding/scripts/validate-chart.sh +244 -0
  85. package/src/skills/k8s-manifest-generator/SKILL.md +511 -0
  86. package/src/skills/k8s-manifest-generator/assets/configmap-template.yaml +296 -0
  87. package/src/skills/k8s-manifest-generator/assets/deployment-template.yaml +203 -0
  88. package/src/skills/k8s-manifest-generator/assets/service-template.yaml +171 -0
  89. package/src/skills/k8s-manifest-generator/references/deployment-spec.md +753 -0
  90. package/src/skills/k8s-manifest-generator/references/service-spec.md +724 -0
  91. package/src/skills/k8s-security-policies/SKILL.md +334 -0
  92. package/src/skills/k8s-security-policies/assets/network-policy-template.yaml +177 -0
  93. package/src/skills/k8s-security-policies/references/rbac-patterns.md +187 -0
  94. package/src/skills/ml-pipeline-workflow/SKILL.md +245 -0
  95. package/src/skills/paypal-integration/SKILL.md +467 -0
  96. package/src/skills/pci-compliance/SKILL.md +466 -0
  97. package/src/skills/prometheus-configuration/SKILL.md +392 -0
  98. package/src/skills/slo-implementation/SKILL.md +329 -0
  99. package/src/skills/stripe-integration/SKILL.md +442 -0
  100. package/src/skills/tdd-workflow/SKILL.md +378 -0
  101. package/src/templates/README.md.template +1 -1
  102. package/src/skills/bmad-method-expert/SKILL.md +0 -626
  103. package/src/skills/bmad-method-expert/scripts/analyze-project.js +0 -318
  104. package/src/skills/bmad-method-expert/scripts/check-setup.js +0 -208
  105. package/src/skills/bmad-method-expert/scripts/generate-template.js +0 -1149
  106. package/src/skills/bmad-method-expert/scripts/validate-documents.js +0 -340
  107. package/src/skills/context-optimizer/SKILL.md +0 -588
  108. package/src/skills/figma-designer/SKILL.md +0 -149
  109. package/src/skills/figma-implementer/SKILL.md +0 -148
  110. package/src/skills/figma-mcp-connector/SKILL.md +0 -136
  111. package/src/skills/figma-to-code/SKILL.md +0 -128
  112. package/src/skills/spec-kit-expert/SKILL.md +0 -1010
@@ -0,0 +1,185 @@
1
+ # Global values shared with subcharts
2
+ global:
3
+ imageRegistry: docker.io
4
+ imagePullSecrets: []
5
+ storageClass: ""
6
+
7
+ # Image configuration
8
+ image:
9
+ registry: docker.io
10
+ repository: myapp/web
11
+ tag: "" # Defaults to .Chart.AppVersion
12
+ pullPolicy: IfNotPresent
13
+
14
+ # Override chart name
15
+ nameOverride: ""
16
+ fullnameOverride: ""
17
+
18
+ # Number of replicas
19
+ replicaCount: 3
20
+ revisionHistoryLimit: 10
21
+
22
+ # ServiceAccount
23
+ serviceAccount:
24
+ create: true
25
+ annotations: {}
26
+ name: ""
27
+
28
+ # Pod annotations
29
+ podAnnotations:
30
+ prometheus.io/scrape: "true"
31
+ prometheus.io/port: "9090"
32
+ prometheus.io/path: "/metrics"
33
+
34
+ # Pod security context
35
+ podSecurityContext:
36
+ runAsNonRoot: true
37
+ runAsUser: 1000
38
+ runAsGroup: 1000
39
+ fsGroup: 1000
40
+ seccompProfile:
41
+ type: RuntimeDefault
42
+
43
+ # Container security context
44
+ securityContext:
45
+ allowPrivilegeEscalation: false
46
+ readOnlyRootFilesystem: true
47
+ capabilities:
48
+ drop:
49
+ - ALL
50
+
51
+ # Service configuration
52
+ service:
53
+ type: ClusterIP
54
+ port: 80
55
+ targetPort: http
56
+ annotations: {}
57
+ sessionAffinity: None
58
+
59
+ # Ingress configuration
60
+ ingress:
61
+ enabled: false
62
+ className: nginx
63
+ annotations: {}
64
+ hosts:
65
+ - host: app.example.com
66
+ paths:
67
+ - path: /
68
+ pathType: Prefix
69
+ tls: []
70
+
71
+ # Resources
72
+ resources:
73
+ limits:
74
+ cpu: 500m
75
+ memory: 512Mi
76
+ requests:
77
+ cpu: 250m
78
+ memory: 256Mi
79
+
80
+ # Liveness probe
81
+ livenessProbe:
82
+ httpGet:
83
+ path: /health/live
84
+ port: http
85
+ initialDelaySeconds: 30
86
+ periodSeconds: 10
87
+
88
+ # Readiness probe
89
+ readinessProbe:
90
+ httpGet:
91
+ path: /health/ready
92
+ port: http
93
+ initialDelaySeconds: 5
94
+ periodSeconds: 5
95
+
96
+ # Autoscaling
97
+ autoscaling:
98
+ enabled: false
99
+ minReplicas: 2
100
+ maxReplicas: 10
101
+ targetCPUUtilizationPercentage: 80
102
+ targetMemoryUtilizationPercentage: 80
103
+
104
+ # Pod Disruption Budget
105
+ podDisruptionBudget:
106
+ enabled: true
107
+ minAvailable: 1
108
+
109
+ # Node selection
110
+ nodeSelector: {}
111
+ tolerations: []
112
+ affinity:
113
+ podAntiAffinity:
114
+ preferredDuringSchedulingIgnoredDuringExecution:
115
+ - weight: 100
116
+ podAffinityTerm:
117
+ labelSelector:
118
+ matchExpressions:
119
+ - key: app.kubernetes.io/name
120
+ operator: In
121
+ values:
122
+ - '{{ include "my-app.name" . }}'
123
+ topologyKey: kubernetes.io/hostname
124
+
125
+ # Environment variables
126
+ env: []
127
+ # - name: LOG_LEVEL
128
+ # value: "info"
129
+
130
+ # ConfigMap data
131
+ configMap:
132
+ enabled: true
133
+ data: {}
134
+ # APP_MODE: production
135
+ # DATABASE_HOST: postgres.example.com
136
+
137
+ # Secrets (use external secret management in production)
138
+ secrets:
139
+ enabled: false
140
+ data: {}
141
+
142
+ # Persistent Volume
143
+ persistence:
144
+ enabled: false
145
+ storageClass: ""
146
+ accessMode: ReadWriteOnce
147
+ size: 10Gi
148
+ annotations: {}
149
+
150
+ # PostgreSQL dependency
151
+ postgresql:
152
+ enabled: false
153
+ auth:
154
+ database: myapp
155
+ username: myapp
156
+ password: changeme
157
+ primary:
158
+ persistence:
159
+ enabled: true
160
+ size: 10Gi
161
+
162
+ # Redis dependency
163
+ redis:
164
+ enabled: false
165
+ auth:
166
+ enabled: false
167
+ master:
168
+ persistence:
169
+ enabled: false
170
+
171
+ # ServiceMonitor for Prometheus Operator
172
+ serviceMonitor:
173
+ enabled: false
174
+ interval: 30s
175
+ scrapeTimeout: 10s
176
+ labels: {}
177
+
178
+ # Network Policy
179
+ networkPolicy:
180
+ enabled: false
181
+ policyTypes:
182
+ - Ingress
183
+ - Egress
184
+ ingress: []
185
+ egress: []
@@ -0,0 +1,500 @@
1
+ # Helm Chart Structure Reference
2
+
3
+ Complete guide to Helm chart organization, file conventions, and best practices.
4
+
5
+ ## Standard Chart Directory Structure
6
+
7
+ ```
8
+ my-app/
9
+ ├── Chart.yaml # Chart metadata (required)
10
+ ├── Chart.lock # Dependency lock file (generated)
11
+ ├── values.yaml # Default configuration values (required)
12
+ ├── values.schema.json # JSON schema for values validation
13
+ ├── .helmignore # Patterns to ignore when packaging
14
+ ├── README.md # Chart documentation
15
+ ├── LICENSE # Chart license
16
+ ├── charts/ # Chart dependencies (bundled)
17
+ │ └── postgresql-12.0.0.tgz
18
+ ├── crds/ # Custom Resource Definitions
19
+ │ └── my-crd.yaml
20
+ ├── templates/ # Kubernetes manifest templates (required)
21
+ │ ├── NOTES.txt # Post-install instructions
22
+ │ ├── _helpers.tpl # Template helper functions
23
+ │ ├── deployment.yaml
24
+ │ ├── service.yaml
25
+ │ ├── ingress.yaml
26
+ │ ├── configmap.yaml
27
+ │ ├── secret.yaml
28
+ │ ├── serviceaccount.yaml
29
+ │ ├── hpa.yaml
30
+ │ ├── pdb.yaml
31
+ │ ├── networkpolicy.yaml
32
+ │ └── tests/
33
+ │ └── test-connection.yaml
34
+ └── files/ # Additional files to include
35
+ └── config/
36
+ └── app.conf
37
+ ```
38
+
39
+ ## Chart.yaml Specification
40
+
41
+ ### API Version v2 (Helm 3+)
42
+
43
+ ```yaml
44
+ apiVersion: v2 # Required: API version
45
+ name: my-application # Required: Chart name
46
+ version: 1.2.3 # Required: Chart version (SemVer)
47
+ appVersion: "2.5.0" # Application version
48
+ description: A Helm chart for my application # Required
49
+ type: application # Chart type: application or library
50
+ keywords: # Search keywords
51
+ - web
52
+ - api
53
+ - backend
54
+ home: https://example.com # Project home page
55
+ sources: # Source code URLs
56
+ - https://github.com/example/my-app
57
+ maintainers: # Maintainer list
58
+ - name: John Doe
59
+ email: john@example.com
60
+ url: https://github.com/johndoe
61
+ icon: https://example.com/icon.png # Chart icon URL
62
+ kubeVersion: ">=1.24.0" # Compatible Kubernetes versions
63
+ deprecated: false # Mark chart as deprecated
64
+ annotations: # Arbitrary annotations
65
+ example.com/release-notes: https://example.com/releases/v1.2.3
66
+ dependencies: # Chart dependencies
67
+ - name: postgresql
68
+ version: "12.0.0"
69
+ repository: "https://charts.bitnami.com/bitnami"
70
+ condition: postgresql.enabled
71
+ tags:
72
+ - database
73
+ import-values:
74
+ - child: database
75
+ parent: database
76
+ alias: db
77
+ ```
78
+
79
+ ## Chart Types
80
+
81
+ ### Application Chart
82
+ ```yaml
83
+ type: application
84
+ ```
85
+ - Standard Kubernetes applications
86
+ - Can be installed and managed
87
+ - Contains templates for K8s resources
88
+
89
+ ### Library Chart
90
+ ```yaml
91
+ type: library
92
+ ```
93
+ - Shared template helpers
94
+ - Cannot be installed directly
95
+ - Used as dependency by other charts
96
+ - No templates/ directory
97
+
98
+ ## Values Files Organization
99
+
100
+ ### values.yaml (defaults)
101
+ ```yaml
102
+ # Global values (shared with subcharts)
103
+ global:
104
+ imageRegistry: docker.io
105
+ imagePullSecrets: []
106
+
107
+ # Image configuration
108
+ image:
109
+ registry: docker.io
110
+ repository: myapp/web
111
+ tag: "" # Defaults to .Chart.AppVersion
112
+ pullPolicy: IfNotPresent
113
+
114
+ # Deployment settings
115
+ replicaCount: 1
116
+ revisionHistoryLimit: 10
117
+
118
+ # Pod configuration
119
+ podAnnotations: {}
120
+ podSecurityContext:
121
+ runAsNonRoot: true
122
+ runAsUser: 1000
123
+ fsGroup: 1000
124
+
125
+ # Container security
126
+ securityContext:
127
+ allowPrivilegeEscalation: false
128
+ readOnlyRootFilesystem: true
129
+ capabilities:
130
+ drop:
131
+ - ALL
132
+
133
+ # Service
134
+ service:
135
+ type: ClusterIP
136
+ port: 80
137
+ targetPort: http
138
+ annotations: {}
139
+
140
+ # Resources
141
+ resources:
142
+ limits:
143
+ cpu: 100m
144
+ memory: 128Mi
145
+ requests:
146
+ cpu: 100m
147
+ memory: 128Mi
148
+
149
+ # Autoscaling
150
+ autoscaling:
151
+ enabled: false
152
+ minReplicas: 1
153
+ maxReplicas: 100
154
+ targetCPUUtilizationPercentage: 80
155
+
156
+ # Node selection
157
+ nodeSelector: {}
158
+ tolerations: []
159
+ affinity: {}
160
+
161
+ # Monitoring
162
+ serviceMonitor:
163
+ enabled: false
164
+ interval: 30s
165
+ ```
166
+
167
+ ### values.schema.json (validation)
168
+ ```json
169
+ {
170
+ "$schema": "https://json-schema.org/draft-07/schema#",
171
+ "type": "object",
172
+ "properties": {
173
+ "replicaCount": {
174
+ "type": "integer",
175
+ "minimum": 1
176
+ },
177
+ "image": {
178
+ "type": "object",
179
+ "required": ["repository"],
180
+ "properties": {
181
+ "repository": {
182
+ "type": "string"
183
+ },
184
+ "tag": {
185
+ "type": "string"
186
+ },
187
+ "pullPolicy": {
188
+ "type": "string",
189
+ "enum": ["Always", "IfNotPresent", "Never"]
190
+ }
191
+ }
192
+ }
193
+ },
194
+ "required": ["image"]
195
+ }
196
+ ```
197
+
198
+ ## Template Files
199
+
200
+ ### Template Naming Conventions
201
+
202
+ - **Lowercase with hyphens**: `deployment.yaml`, `service-account.yaml`
203
+ - **Partial templates**: Prefix with underscore `_helpers.tpl`
204
+ - **Tests**: Place in `templates/tests/`
205
+ - **CRDs**: Place in `crds/` (not templated)
206
+
207
+ ### Common Templates
208
+
209
+ #### _helpers.tpl
210
+ ```yaml
211
+ {{/*
212
+ Standard naming helpers
213
+ */}}
214
+ {{- define "my-app.name" -}}
215
+ {{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" -}}
216
+ {{- end -}}
217
+
218
+ {{- define "my-app.fullname" -}}
219
+ {{- if .Values.fullnameOverride -}}
220
+ {{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" -}}
221
+ {{- else -}}
222
+ {{- $name := default .Chart.Name .Values.nameOverride -}}
223
+ {{- if contains $name .Release.Name -}}
224
+ {{- .Release.Name | trunc 63 | trimSuffix "-" -}}
225
+ {{- else -}}
226
+ {{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" -}}
227
+ {{- end -}}
228
+ {{- end -}}
229
+ {{- end -}}
230
+
231
+ {{- define "my-app.chart" -}}
232
+ {{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" -}}
233
+ {{- end -}}
234
+
235
+ {{/*
236
+ Common labels
237
+ */}}
238
+ {{- define "my-app.labels" -}}
239
+ helm.sh/chart: {{ include "my-app.chart" . }}
240
+ {{ include "my-app.selectorLabels" . }}
241
+ {{- if .Chart.AppVersion }}
242
+ app.kubernetes.io/version: {{ .Chart.AppVersion | quote }}
243
+ {{- end }}
244
+ app.kubernetes.io/managed-by: {{ .Release.Service }}
245
+ {{- end -}}
246
+
247
+ {{- define "my-app.selectorLabels" -}}
248
+ app.kubernetes.io/name: {{ include "my-app.name" . }}
249
+ app.kubernetes.io/instance: {{ .Release.Name }}
250
+ {{- end -}}
251
+
252
+ {{/*
253
+ Image name helper
254
+ */}}
255
+ {{- define "my-app.image" -}}
256
+ {{- $registry := .Values.global.imageRegistry | default .Values.image.registry -}}
257
+ {{- $repository := .Values.image.repository -}}
258
+ {{- $tag := .Values.image.tag | default .Chart.AppVersion -}}
259
+ {{- printf "%s/%s:%s" $registry $repository $tag -}}
260
+ {{- end -}}
261
+ ```
262
+
263
+ #### NOTES.txt
264
+ ```
265
+ Thank you for installing {{ .Chart.Name }}.
266
+
267
+ Your release is named {{ .Release.Name }}.
268
+
269
+ To learn more about the release, try:
270
+
271
+ $ helm status {{ .Release.Name }}
272
+ $ helm get all {{ .Release.Name }}
273
+
274
+ {{- if .Values.ingress.enabled }}
275
+
276
+ Application URL:
277
+ {{- range .Values.ingress.hosts }}
278
+ http{{ if $.Values.ingress.tls }}s{{ end }}://{{ .host }}{{ .path }}
279
+ {{- end }}
280
+ {{- else }}
281
+
282
+ Get the application URL by running:
283
+ export POD_NAME=$(kubectl get pods --namespace {{ .Release.Namespace }} -l "app.kubernetes.io/name={{ include "my-app.name" . }}" -o jsonpath="{.items[0].metadata.name}")
284
+ kubectl port-forward $POD_NAME 8080:80
285
+ echo "Visit http://127.0.0.1:8080"
286
+ {{- end }}
287
+ ```
288
+
289
+ ## Dependencies Management
290
+
291
+ ### Declaring Dependencies
292
+
293
+ ```yaml
294
+ # Chart.yaml
295
+ dependencies:
296
+ - name: postgresql
297
+ version: "12.0.0"
298
+ repository: "https://charts.bitnami.com/bitnami"
299
+ condition: postgresql.enabled # Enable/disable via values
300
+ tags: # Group dependencies
301
+ - database
302
+ import-values: # Import values from subchart
303
+ - child: database
304
+ parent: database
305
+ alias: db # Reference as .Values.db
306
+ ```
307
+
308
+ ### Managing Dependencies
309
+
310
+ ```bash
311
+ # Update dependencies
312
+ helm dependency update
313
+
314
+ # List dependencies
315
+ helm dependency list
316
+
317
+ # Build dependencies
318
+ helm dependency build
319
+ ```
320
+
321
+ ### Chart.lock
322
+
323
+ Generated automatically by `helm dependency update`:
324
+
325
+ ```yaml
326
+ dependencies:
327
+ - name: postgresql
328
+ repository: https://charts.bitnami.com/bitnami
329
+ version: 12.0.0
330
+ digest: sha256:abcd1234...
331
+ generated: "2024-01-01T00:00:00Z"
332
+ ```
333
+
334
+ ## .helmignore
335
+
336
+ Exclude files from chart package:
337
+
338
+ ```
339
+ # Development files
340
+ .git/
341
+ .gitignore
342
+ *.md
343
+ docs/
344
+
345
+ # Build artifacts
346
+ *.swp
347
+ *.bak
348
+ *.tmp
349
+ *.orig
350
+
351
+ # CI/CD
352
+ .travis.yml
353
+ .gitlab-ci.yml
354
+ Jenkinsfile
355
+
356
+ # Testing
357
+ test/
358
+ *.test
359
+
360
+ # IDE
361
+ .vscode/
362
+ .idea/
363
+ *.iml
364
+ ```
365
+
366
+ ## Custom Resource Definitions (CRDs)
367
+
368
+ Place CRDs in `crds/` directory:
369
+
370
+ ```
371
+ crds/
372
+ ├── my-app-crd.yaml
373
+ └── another-crd.yaml
374
+ ```
375
+
376
+ **Important CRD notes:**
377
+ - CRDs are installed before any templates
378
+ - CRDs are NOT templated (no `{{ }}` syntax)
379
+ - CRDs are NOT upgraded or deleted with chart
380
+ - Use `helm install --skip-crds` to skip installation
381
+
382
+ ## Chart Versioning
383
+
384
+ ### Semantic Versioning
385
+
386
+ - **Chart Version**: Increment when chart changes
387
+ - MAJOR: Breaking changes
388
+ - MINOR: New features, backward compatible
389
+ - PATCH: Bug fixes
390
+
391
+ - **App Version**: Application version being deployed
392
+ - Can be any string
393
+ - Not required to follow SemVer
394
+
395
+ ```yaml
396
+ version: 2.3.1 # Chart version
397
+ appVersion: "1.5.0" # Application version
398
+ ```
399
+
400
+ ## Chart Testing
401
+
402
+ ### Test Files
403
+
404
+ ```yaml
405
+ # templates/tests/test-connection.yaml
406
+ apiVersion: v1
407
+ kind: Pod
408
+ metadata:
409
+ name: "{{ include "my-app.fullname" . }}-test-connection"
410
+ annotations:
411
+ "helm.sh/hook": test
412
+ "helm.sh/hook-delete-policy": before-hook-creation,hook-succeeded
413
+ spec:
414
+ containers:
415
+ - name: wget
416
+ image: busybox
417
+ command: ['wget']
418
+ args: ['{{ include "my-app.fullname" . }}:{{ .Values.service.port }}']
419
+ restartPolicy: Never
420
+ ```
421
+
422
+ ### Running Tests
423
+
424
+ ```bash
425
+ helm test my-release
426
+ helm test my-release --logs
427
+ ```
428
+
429
+ ## Hooks
430
+
431
+ Helm hooks allow intervention at specific points:
432
+
433
+ ```yaml
434
+ apiVersion: batch/v1
435
+ kind: Job
436
+ metadata:
437
+ name: {{ include "my-app.fullname" . }}-migration
438
+ annotations:
439
+ "helm.sh/hook": pre-upgrade,pre-install
440
+ "helm.sh/hook-weight": "-5"
441
+ "helm.sh/hook-delete-policy": before-hook-creation,hook-succeeded
442
+ ```
443
+
444
+ ### Hook Types
445
+
446
+ - `pre-install`: Before templates rendered
447
+ - `post-install`: After all resources loaded
448
+ - `pre-delete`: Before any resources deleted
449
+ - `post-delete`: After all resources deleted
450
+ - `pre-upgrade`: Before upgrade
451
+ - `post-upgrade`: After upgrade
452
+ - `pre-rollback`: Before rollback
453
+ - `post-rollback`: After rollback
454
+ - `test`: Run with `helm test`
455
+
456
+ ### Hook Weight
457
+
458
+ Controls hook execution order (-5 to 5, lower runs first)
459
+
460
+ ### Hook Deletion Policies
461
+
462
+ - `before-hook-creation`: Delete previous hook before new one
463
+ - `hook-succeeded`: Delete after successful execution
464
+ - `hook-failed`: Delete if hook fails
465
+
466
+ ## Best Practices
467
+
468
+ 1. **Use helpers** for repeated template logic
469
+ 2. **Quote strings** in templates: `{{ .Values.name | quote }}`
470
+ 3. **Validate values** with values.schema.json
471
+ 4. **Document all values** in values.yaml
472
+ 5. **Use semantic versioning** for chart versions
473
+ 6. **Pin dependency versions** exactly
474
+ 7. **Include NOTES.txt** with usage instructions
475
+ 8. **Add tests** for critical functionality
476
+ 9. **Use hooks** for database migrations
477
+ 10. **Keep charts focused** - one application per chart
478
+
479
+ ## Chart Repository Structure
480
+
481
+ ```
482
+ helm-charts/
483
+ ├── index.yaml
484
+ ├── my-app-1.0.0.tgz
485
+ ├── my-app-1.1.0.tgz
486
+ ├── my-app-1.2.0.tgz
487
+ └── another-chart-2.0.0.tgz
488
+ ```
489
+
490
+ ### Creating Repository Index
491
+
492
+ ```bash
493
+ helm repo index . --url https://charts.example.com
494
+ ```
495
+
496
+ ## Related Resources
497
+
498
+ - [Helm Documentation](https://helm.sh/docs/)
499
+ - [Chart Template Guide](https://helm.sh/docs/chart_template_guide/)
500
+ - [Best Practices](https://helm.sh/docs/chart_best_practices/)