claudient 0.1.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 (283) hide show
  1. package/.claude-plugin/plugin.json +42 -0
  2. package/CONTEXT.md +58 -0
  3. package/README.md +165 -0
  4. package/agents/build-resolvers/de/python-resolver.md +64 -0
  5. package/agents/build-resolvers/de/typescript-resolver.md +65 -0
  6. package/agents/build-resolvers/es/python-resolver.md +64 -0
  7. package/agents/build-resolvers/es/typescript-resolver.md +65 -0
  8. package/agents/build-resolvers/fr/python-resolver.md +64 -0
  9. package/agents/build-resolvers/fr/typescript-resolver.md +65 -0
  10. package/agents/build-resolvers/nl/python-resolver.md +64 -0
  11. package/agents/build-resolvers/nl/typescript-resolver.md +65 -0
  12. package/agents/build-resolvers/python-resolver.md +62 -0
  13. package/agents/build-resolvers/typescript-resolver.md +63 -0
  14. package/agents/core/architect.md +64 -0
  15. package/agents/core/code-reviewer.md +78 -0
  16. package/agents/core/de/architect.md +66 -0
  17. package/agents/core/de/code-reviewer.md +80 -0
  18. package/agents/core/de/planner.md +63 -0
  19. package/agents/core/de/security-reviewer.md +93 -0
  20. package/agents/core/es/architect.md +66 -0
  21. package/agents/core/es/code-reviewer.md +80 -0
  22. package/agents/core/es/planner.md +63 -0
  23. package/agents/core/es/security-reviewer.md +93 -0
  24. package/agents/core/fr/architect.md +66 -0
  25. package/agents/core/fr/code-reviewer.md +80 -0
  26. package/agents/core/fr/planner.md +63 -0
  27. package/agents/core/fr/security-reviewer.md +93 -0
  28. package/agents/core/nl/architect.md +66 -0
  29. package/agents/core/nl/code-reviewer.md +80 -0
  30. package/agents/core/nl/planner.md +63 -0
  31. package/agents/core/nl/security-reviewer.md +93 -0
  32. package/agents/core/planner.md +61 -0
  33. package/agents/core/security-reviewer.md +91 -0
  34. package/guides/agent-orchestration.md +231 -0
  35. package/guides/de/agent-orchestration.md +174 -0
  36. package/guides/de/getting-started.md +164 -0
  37. package/guides/de/hooks-cookbook.md +160 -0
  38. package/guides/de/memory-management.md +153 -0
  39. package/guides/de/security.md +180 -0
  40. package/guides/de/skill-authoring.md +214 -0
  41. package/guides/de/token-optimization.md +156 -0
  42. package/guides/es/agent-orchestration.md +174 -0
  43. package/guides/es/getting-started.md +164 -0
  44. package/guides/es/hooks-cookbook.md +160 -0
  45. package/guides/es/memory-management.md +153 -0
  46. package/guides/es/security.md +180 -0
  47. package/guides/es/skill-authoring.md +214 -0
  48. package/guides/es/token-optimization.md +156 -0
  49. package/guides/fr/agent-orchestration.md +174 -0
  50. package/guides/fr/getting-started.md +164 -0
  51. package/guides/fr/hooks-cookbook.md +227 -0
  52. package/guides/fr/memory-management.md +169 -0
  53. package/guides/fr/security.md +180 -0
  54. package/guides/fr/skill-authoring.md +214 -0
  55. package/guides/fr/token-optimization.md +158 -0
  56. package/guides/getting-started.md +164 -0
  57. package/guides/hooks-cookbook.md +423 -0
  58. package/guides/memory-management.md +192 -0
  59. package/guides/nl/agent-orchestration.md +174 -0
  60. package/guides/nl/getting-started.md +164 -0
  61. package/guides/nl/hooks-cookbook.md +160 -0
  62. package/guides/nl/memory-management.md +153 -0
  63. package/guides/nl/security.md +180 -0
  64. package/guides/nl/skill-authoring.md +214 -0
  65. package/guides/nl/token-optimization.md +156 -0
  66. package/guides/security.md +229 -0
  67. package/guides/skill-authoring.md +226 -0
  68. package/guides/token-optimization.md +169 -0
  69. package/hooks/lifecycle/cost-tracker.md +49 -0
  70. package/hooks/lifecycle/cost-tracker.sh +59 -0
  71. package/hooks/lifecycle/pre-compact-save.md +56 -0
  72. package/hooks/lifecycle/pre-compact-save.sh +37 -0
  73. package/hooks/lifecycle/session-start.md +50 -0
  74. package/hooks/lifecycle/session-start.sh +47 -0
  75. package/hooks/post-tool-use/audit-log.md +53 -0
  76. package/hooks/post-tool-use/audit-log.sh +53 -0
  77. package/hooks/post-tool-use/prettier.md +53 -0
  78. package/hooks/post-tool-use/prettier.sh +49 -0
  79. package/hooks/pre-tool-use/block-dangerous.md +48 -0
  80. package/hooks/pre-tool-use/block-dangerous.sh +76 -0
  81. package/hooks/pre-tool-use/git-push-confirm.md +46 -0
  82. package/hooks/pre-tool-use/git-push-confirm.sh +36 -0
  83. package/mcp/configs/github.json +11 -0
  84. package/mcp/configs/postgres.json +11 -0
  85. package/mcp/de/recommended-servers.md +170 -0
  86. package/mcp/es/recommended-servers.md +170 -0
  87. package/mcp/fr/recommended-servers.md +170 -0
  88. package/mcp/nl/recommended-servers.md +170 -0
  89. package/mcp/recommended-servers.md +168 -0
  90. package/package.json +45 -0
  91. package/prompts/project-starters/de/fastapi-project.md +62 -0
  92. package/prompts/project-starters/de/nextjs-project.md +82 -0
  93. package/prompts/project-starters/es/fastapi-project.md +62 -0
  94. package/prompts/project-starters/es/nextjs-project.md +82 -0
  95. package/prompts/project-starters/fastapi-project.md +60 -0
  96. package/prompts/project-starters/fr/fastapi-project.md +62 -0
  97. package/prompts/project-starters/fr/nextjs-project.md +82 -0
  98. package/prompts/project-starters/nextjs-project.md +80 -0
  99. package/prompts/project-starters/nl/fastapi-project.md +62 -0
  100. package/prompts/project-starters/nl/nextjs-project.md +82 -0
  101. package/prompts/system-prompts/ai-product.md +80 -0
  102. package/prompts/system-prompts/data-pipeline.md +76 -0
  103. package/prompts/system-prompts/de/ai-product.md +82 -0
  104. package/prompts/system-prompts/de/data-pipeline.md +78 -0
  105. package/prompts/system-prompts/de/saas-backend.md +71 -0
  106. package/prompts/system-prompts/es/ai-product.md +82 -0
  107. package/prompts/system-prompts/es/data-pipeline.md +78 -0
  108. package/prompts/system-prompts/es/saas-backend.md +71 -0
  109. package/prompts/system-prompts/fr/ai-product.md +82 -0
  110. package/prompts/system-prompts/fr/data-pipeline.md +78 -0
  111. package/prompts/system-prompts/fr/saas-backend.md +71 -0
  112. package/prompts/system-prompts/nl/ai-product.md +82 -0
  113. package/prompts/system-prompts/nl/data-pipeline.md +78 -0
  114. package/prompts/system-prompts/nl/saas-backend.md +71 -0
  115. package/prompts/system-prompts/saas-backend.md +69 -0
  116. package/prompts/task-specific/changelog.md +81 -0
  117. package/prompts/task-specific/de/changelog.md +83 -0
  118. package/prompts/task-specific/de/debugging.md +78 -0
  119. package/prompts/task-specific/de/pr-description.md +69 -0
  120. package/prompts/task-specific/debugging.md +76 -0
  121. package/prompts/task-specific/es/changelog.md +83 -0
  122. package/prompts/task-specific/es/debugging.md +78 -0
  123. package/prompts/task-specific/es/pr-description.md +69 -0
  124. package/prompts/task-specific/fr/changelog.md +83 -0
  125. package/prompts/task-specific/fr/debugging.md +78 -0
  126. package/prompts/task-specific/fr/pr-description.md +69 -0
  127. package/prompts/task-specific/nl/changelog.md +83 -0
  128. package/prompts/task-specific/nl/debugging.md +78 -0
  129. package/prompts/task-specific/nl/pr-description.md +69 -0
  130. package/prompts/task-specific/pr-description.md +67 -0
  131. package/rules/common/coding-style.md +45 -0
  132. package/rules/common/de/coding-style.md +47 -0
  133. package/rules/common/de/git.md +48 -0
  134. package/rules/common/de/performance.md +40 -0
  135. package/rules/common/de/security.md +45 -0
  136. package/rules/common/de/testing.md +45 -0
  137. package/rules/common/es/coding-style.md +47 -0
  138. package/rules/common/es/git.md +48 -0
  139. package/rules/common/es/performance.md +40 -0
  140. package/rules/common/es/security.md +45 -0
  141. package/rules/common/es/testing.md +45 -0
  142. package/rules/common/fr/coding-style.md +47 -0
  143. package/rules/common/fr/git.md +48 -0
  144. package/rules/common/fr/performance.md +40 -0
  145. package/rules/common/fr/security.md +45 -0
  146. package/rules/common/fr/testing.md +45 -0
  147. package/rules/common/git.md +46 -0
  148. package/rules/common/nl/coding-style.md +47 -0
  149. package/rules/common/nl/git.md +48 -0
  150. package/rules/common/nl/performance.md +40 -0
  151. package/rules/common/nl/security.md +45 -0
  152. package/rules/common/nl/testing.md +45 -0
  153. package/rules/common/performance.md +38 -0
  154. package/rules/common/security.md +43 -0
  155. package/rules/common/testing.md +43 -0
  156. package/rules/language-specific/de/go.md +48 -0
  157. package/rules/language-specific/de/python.md +38 -0
  158. package/rules/language-specific/de/typescript.md +51 -0
  159. package/rules/language-specific/es/go.md +48 -0
  160. package/rules/language-specific/es/python.md +38 -0
  161. package/rules/language-specific/es/typescript.md +51 -0
  162. package/rules/language-specific/fr/go.md +48 -0
  163. package/rules/language-specific/fr/python.md +38 -0
  164. package/rules/language-specific/fr/typescript.md +51 -0
  165. package/rules/language-specific/go.md +46 -0
  166. package/rules/language-specific/nl/go.md +48 -0
  167. package/rules/language-specific/nl/python.md +38 -0
  168. package/rules/language-specific/nl/typescript.md +51 -0
  169. package/rules/language-specific/python.md +36 -0
  170. package/rules/language-specific/typescript.md +49 -0
  171. package/scripts/cli.js +161 -0
  172. package/scripts/link-skills.sh +35 -0
  173. package/scripts/list-skills.sh +34 -0
  174. package/skills/ai-engineering/agent-construction.md +285 -0
  175. package/skills/ai-engineering/claude-api.md +248 -0
  176. package/skills/ai-engineering/de/agent-construction.md +287 -0
  177. package/skills/ai-engineering/de/claude-api.md +250 -0
  178. package/skills/ai-engineering/es/agent-construction.md +287 -0
  179. package/skills/ai-engineering/es/claude-api.md +250 -0
  180. package/skills/ai-engineering/fr/agent-construction.md +287 -0
  181. package/skills/ai-engineering/fr/claude-api.md +250 -0
  182. package/skills/ai-engineering/nl/agent-construction.md +287 -0
  183. package/skills/ai-engineering/nl/claude-api.md +250 -0
  184. package/skills/backend/dotnet/csharp.md +304 -0
  185. package/skills/backend/dotnet/de/csharp.md +306 -0
  186. package/skills/backend/dotnet/es/csharp.md +306 -0
  187. package/skills/backend/dotnet/fr/csharp.md +306 -0
  188. package/skills/backend/dotnet/nl/csharp.md +306 -0
  189. package/skills/backend/go/de/go.md +307 -0
  190. package/skills/backend/go/es/go.md +307 -0
  191. package/skills/backend/go/fr/go.md +307 -0
  192. package/skills/backend/go/go.md +305 -0
  193. package/skills/backend/go/nl/go.md +307 -0
  194. package/skills/backend/nodejs/de/nestjs.md +274 -0
  195. package/skills/backend/nodejs/de/nextjs.md +222 -0
  196. package/skills/backend/nodejs/es/nestjs.md +274 -0
  197. package/skills/backend/nodejs/es/nextjs.md +222 -0
  198. package/skills/backend/nodejs/fr/nestjs.md +274 -0
  199. package/skills/backend/nodejs/fr/nextjs.md +222 -0
  200. package/skills/backend/nodejs/nestjs.md +272 -0
  201. package/skills/backend/nodejs/nextjs.md +220 -0
  202. package/skills/backend/nodejs/nl/nestjs.md +274 -0
  203. package/skills/backend/nodejs/nl/nextjs.md +222 -0
  204. package/skills/backend/python/de/django.md +285 -0
  205. package/skills/backend/python/de/fastapi.md +244 -0
  206. package/skills/backend/python/django.md +283 -0
  207. package/skills/backend/python/es/django.md +285 -0
  208. package/skills/backend/python/es/fastapi.md +244 -0
  209. package/skills/backend/python/fastapi.md +242 -0
  210. package/skills/backend/python/fr/django.md +285 -0
  211. package/skills/backend/python/fr/fastapi.md +244 -0
  212. package/skills/backend/python/nl/django.md +285 -0
  213. package/skills/backend/python/nl/fastapi.md +244 -0
  214. package/skills/data-ml/dbt-data-pipelines.md +155 -0
  215. package/skills/data-ml/de/dbt-data-pipelines.md +157 -0
  216. package/skills/data-ml/de/pandas-polars.md +147 -0
  217. package/skills/data-ml/de/pytorch-tensorflow.md +171 -0
  218. package/skills/data-ml/es/dbt-data-pipelines.md +157 -0
  219. package/skills/data-ml/es/pandas-polars.md +147 -0
  220. package/skills/data-ml/es/pytorch-tensorflow.md +171 -0
  221. package/skills/data-ml/fr/dbt-data-pipelines.md +157 -0
  222. package/skills/data-ml/fr/pandas-polars.md +147 -0
  223. package/skills/data-ml/fr/pytorch-tensorflow.md +171 -0
  224. package/skills/data-ml/nl/dbt-data-pipelines.md +157 -0
  225. package/skills/data-ml/nl/pandas-polars.md +147 -0
  226. package/skills/data-ml/nl/pytorch-tensorflow.md +171 -0
  227. package/skills/data-ml/pandas-polars.md +145 -0
  228. package/skills/data-ml/pytorch-tensorflow.md +169 -0
  229. package/skills/database/de/graphql.md +181 -0
  230. package/skills/database/es/graphql.md +181 -0
  231. package/skills/database/fr/graphql.md +181 -0
  232. package/skills/database/graphql.md +179 -0
  233. package/skills/database/nl/graphql.md +181 -0
  234. package/skills/devops-infra/de/docker.md +133 -0
  235. package/skills/devops-infra/de/github-actions.md +179 -0
  236. package/skills/devops-infra/de/kubernetes.md +129 -0
  237. package/skills/devops-infra/de/terraform.md +130 -0
  238. package/skills/devops-infra/docker.md +131 -0
  239. package/skills/devops-infra/es/docker.md +133 -0
  240. package/skills/devops-infra/es/github-actions.md +179 -0
  241. package/skills/devops-infra/es/kubernetes.md +129 -0
  242. package/skills/devops-infra/es/terraform.md +130 -0
  243. package/skills/devops-infra/fr/docker.md +133 -0
  244. package/skills/devops-infra/fr/github-actions.md +179 -0
  245. package/skills/devops-infra/fr/kubernetes.md +129 -0
  246. package/skills/devops-infra/fr/terraform.md +130 -0
  247. package/skills/devops-infra/github-actions.md +177 -0
  248. package/skills/devops-infra/kubernetes.md +127 -0
  249. package/skills/devops-infra/nl/docker.md +133 -0
  250. package/skills/devops-infra/nl/github-actions.md +179 -0
  251. package/skills/devops-infra/nl/kubernetes.md +129 -0
  252. package/skills/devops-infra/nl/terraform.md +130 -0
  253. package/skills/devops-infra/terraform.md +128 -0
  254. package/skills/finance-payments/de/stripe.md +187 -0
  255. package/skills/finance-payments/es/stripe.md +187 -0
  256. package/skills/finance-payments/fr/stripe.md +187 -0
  257. package/skills/finance-payments/nl/stripe.md +187 -0
  258. package/skills/finance-payments/stripe.md +185 -0
  259. package/workflows/code-review.md +151 -0
  260. package/workflows/de/code-review.md +153 -0
  261. package/workflows/de/debugging-session.md +146 -0
  262. package/workflows/de/feature-development.md +155 -0
  263. package/workflows/de/new-project-bootstrap.md +175 -0
  264. package/workflows/de/refactor-safely.md +150 -0
  265. package/workflows/debugging-session.md +144 -0
  266. package/workflows/es/code-review.md +153 -0
  267. package/workflows/es/debugging-session.md +146 -0
  268. package/workflows/es/feature-development.md +155 -0
  269. package/workflows/es/new-project-bootstrap.md +175 -0
  270. package/workflows/es/refactor-safely.md +150 -0
  271. package/workflows/feature-development.md +153 -0
  272. package/workflows/fr/code-review.md +153 -0
  273. package/workflows/fr/debugging-session.md +146 -0
  274. package/workflows/fr/feature-development.md +155 -0
  275. package/workflows/fr/new-project-bootstrap.md +175 -0
  276. package/workflows/fr/refactor-safely.md +150 -0
  277. package/workflows/new-project-bootstrap.md +173 -0
  278. package/workflows/nl/code-review.md +153 -0
  279. package/workflows/nl/debugging-session.md +146 -0
  280. package/workflows/nl/feature-development.md +155 -0
  281. package/workflows/nl/new-project-bootstrap.md +175 -0
  282. package/workflows/nl/refactor-safely.md +150 -0
  283. package/workflows/refactor-safely.md +148 -0
@@ -0,0 +1,129 @@
1
+ > 🇪🇸 Esta es la traducción en español. [Versión en inglés](../kubernetes.md).
2
+
3
+ # Skill de Kubernetes
4
+
5
+ ## Cuándo activar
6
+ - Escribir manifiestos de Kubernetes (Deployments, Services, ConfigMaps, Secrets, Ingress)
7
+ - Configurar charts de Helm o archivos de valores para una aplicación
8
+ - Depurar un Pod fallido, CrashLoopBackOff o contenedor OOMKilled
9
+ - Configurar escalado horizontal de pods (HPA) o escalado vertical (VPA)
10
+ - Definir solicitudes y límites de recursos para contenedores
11
+ - Escribir o revisar políticas RBAC (Roles, ClusterRoles, RoleBindings)
12
+ - Configurar sondas de liveness, readiness y startup
13
+ - Configurar volúmenes persistentes y reclamaciones de volúmenes persistentes
14
+ - Escribir políticas de red para controlar el tráfico entre pods
15
+ - Configurar namespaces y aislamiento multi-tenant
16
+
17
+ ## Cuándo NO usar
18
+ - Configuraciones de Docker Compose que no se están migrando a Kubernetes
19
+ - Serverless (Cloud Run, Lambda, Fargate) — modelo de despliegue diferente
20
+ - Aplicaciones simples de un solo contenedor que no necesitan orquestación
21
+ - Entornos de desarrollo local donde Docker solo es suficiente
22
+ - Nomad, Mesos u otros orquestadores que no son Kubernetes
23
+
24
+ ## Instrucciones
25
+
26
+ ### Estructura del manifiesto
27
+ Siempre establece estos campos en cada Deployment:
28
+ ```yaml
29
+ apiVersion: apps/v1
30
+ kind: Deployment
31
+ metadata:
32
+ name: app-name
33
+ namespace: production # Siempre explícito — nunca confiar en el namespace por defecto
34
+ labels:
35
+ app: app-name
36
+ version: "1.0.0"
37
+ spec:
38
+ replicas: 3
39
+ selector:
40
+ matchLabels:
41
+ app: app-name
42
+ template:
43
+ metadata:
44
+ labels:
45
+ app: app-name
46
+ version: "1.0.0"
47
+ spec:
48
+ containers:
49
+ - name: app-name
50
+ image: registry/app-name:tag # Nunca usar :latest en producción
51
+ resources:
52
+ requests:
53
+ cpu: "100m"
54
+ memory: "128Mi"
55
+ limits:
56
+ cpu: "500m"
57
+ memory: "512Mi"
58
+ ```
59
+
60
+ ### Solicitudes y límites de recursos
61
+ - Siempre establece tanto `requests` como `limits` — nunca los omitas
62
+ - `requests` = recursos garantizados (usados para la programación)
63
+ - `limits` = máximo permitido (OOMKilled si se supera la memoria)
64
+ - Los límites de CPU son opcionales en clústeres con throttling de CPU desactivado — pero los límites de memoria son obligatorios
65
+ - Empieza de forma conservadora: requests al ~25% del esperado, limits al 2x del esperado, luego ajusta con métricas reales
66
+
67
+ ### Sondas de salud
68
+ Todos los contenedores en producción deben tener sondas:
69
+ ```yaml
70
+ livenessProbe:
71
+ httpGet:
72
+ path: /healthz
73
+ port: 8080
74
+ initialDelaySeconds: 15
75
+ periodSeconds: 20
76
+ failureThreshold: 3
77
+
78
+ readinessProbe:
79
+ httpGet:
80
+ path: /ready
81
+ port: 8080
82
+ initialDelaySeconds: 5
83
+ periodSeconds: 10
84
+ failureThreshold: 3
85
+ ```
86
+ - El fallo de `livenessProbe` → reinicio del contenedor
87
+ - El fallo de `readinessProbe` → eliminado del balanceador de carga del Service (sin tráfico, sin reinicio)
88
+ - Nunca apuntes ambas al mismo endpoint — la readiness debe verificar dependencias, la liveness no
89
+
90
+ ### Gestión de secretos
91
+ - Nunca pongas secretos en ConfigMaps — usa Secrets
92
+ - Nunca hagas commit de manifiestos Secret con valores reales — usa sealed-secrets, external-secrets-operator o Vault
93
+ - Referencia los secretos como variables de entorno, no como volúmenes, a menos que la aplicación requiera específicamente secretos basados en archivos:
94
+ ```yaml
95
+ env:
96
+ - name: DATABASE_URL
97
+ valueFrom:
98
+ secretKeyRef:
99
+ name: app-secrets
100
+ key: database-url
101
+ ```
102
+
103
+ ### Convenciones de namespaces
104
+ - Namespace `default`: solo para dev/testing
105
+ - Las cargas de trabajo de producción siempre en namespaces con nombre
106
+ - Usa `ResourceQuota` y `LimitRange` en cada namespace de producción
107
+ - RBAC: los desarrolladores obtienen edit en namespaces de dev, view en producción
108
+
109
+ ### Causas comunes de CrashLoopBackOff y soluciones
110
+ 1. Variable de entorno faltante → revisa la sección Events de `kubectl describe pod`
111
+ 2. Healthcheck fallido → los logs muestran el error real, la sonda solo lo detecta
112
+ 3. OOMKilled → aumenta el límite de memoria o soluciona la fuga de memoria
113
+ 4. Error al obtener la imagen → revisa imagePullPolicy y credenciales del registro
114
+ 5. Fallo del contenedor init → `kubectl logs pod-name -c init-container-name`
115
+
116
+ ## Ejemplo
117
+
118
+ **Usuario:** Desplegar una aplicación FastAPI con conexión a PostgreSQL, 3 réplicas, límites de recursos y health checks.
119
+
120
+ **Estructura de salida esperada:**
121
+ - Manifiesto de Namespace
122
+ - Secret para `DATABASE_URL`
123
+ - Deployment con 3 réplicas, requests/limits de recursos, sondas liveness + readiness apuntando a `/healthz` y `/ready`
124
+ - Service (ClusterIP) exponiendo el puerto 80 → puerto 8080 del contenedor
125
+ - HorizontalPodAutoscaler con objetivo de 70% de utilización de CPU, mínimo 3 / máximo 10 réplicas
126
+
127
+ ---
128
+
129
+ > **Trabaja con nosotros:** Claudient está respaldado por [Uitbreiden](https://uitbreiden.com/) — construimos productos de IA y soluciones B2B con comunidades de desarrolladores. ¿Construyendo infraestructura Kubernetes o productos de IA cloud-native? [uitbreiden.com](https://uitbreiden.com/)
@@ -0,0 +1,130 @@
1
+ > 🇪🇸 Esta es la traducción en español. [Versión en inglés](../terraform.md).
2
+
3
+ # Skill de Terraform
4
+
5
+ ## Cuándo activar
6
+ - Escribir módulos de Terraform para infraestructura en AWS, GCP o Azure
7
+ - Definir VPCs, subredes, grupos de seguridad y recursos de red
8
+ - Aprovisionar recursos de cómputo (EC2, GKE, AKS, ECS, Lambda)
9
+ - Gestionar infraestructura de bases de datos (RDS, Cloud SQL, Aurora)
10
+ - Configurar roles IAM, políticas y cuentas de servicio
11
+ - Escribir configuración de estado remoto (backend S3, GCS, Terraform Cloud)
12
+ - Refactorizar Terraform existente para usar módulos
13
+ - Escribir pipelines de CI/CD para `terraform plan` y `terraform apply`
14
+ - Importar infraestructura existente al estado de Terraform
15
+
16
+ ## Cuándo NO usar
17
+ - Pulumi, CDK o Crossplane — herramientas IaC diferentes, patrones diferentes
18
+ - Configuración de charts de Helm (usar el skill de Kubernetes en su lugar)
19
+ - Configuración a nivel de aplicación (ConfigMaps de Kubernetes, variables de entorno de la app)
20
+ - Operaciones CLI puntuales que no se van a repetir
21
+
22
+ ## Instrucciones
23
+
24
+ ### Estructura del módulo
25
+ Cada proyecto de Terraform debe seguir esta estructura:
26
+ ```
27
+ infrastructure/
28
+ ├── modules/
29
+ │ ├── networking/
30
+ │ │ ├── main.tf
31
+ │ │ ├── variables.tf
32
+ │ │ ├── outputs.tf
33
+ │ │ └── versions.tf
34
+ │ └── compute/
35
+ │ ├── main.tf
36
+ │ ├── variables.tf
37
+ │ └── outputs.tf
38
+ ├── environments/
39
+ │ ├── production/
40
+ │ │ ├── main.tf ← llama a los módulos
41
+ │ │ ├── variables.tf
42
+ │ │ ├── terraform.tfvars
43
+ │ │ └── backend.tf
44
+ │ └── staging/
45
+ │ └── ...
46
+ └── versions.tf ← versiones del proveedor raíz
47
+ ```
48
+
49
+ ### Gestión de estado — siempre remoto
50
+ ```hcl
51
+ # backend.tf
52
+ terraform {
53
+ backend "s3" {
54
+ bucket = "company-terraform-state"
55
+ key = "production/networking/terraform.tfstate"
56
+ region = "eu-west-1"
57
+ encrypt = true
58
+ dynamodb_table = "terraform-state-lock"
59
+ }
60
+ }
61
+ ```
62
+ - Nunca uses estado local para nada compartido
63
+ - Habilita el cifrado y el bloqueo de estado (DynamoDB para backend S3)
64
+ - Archivos de estado separados por entorno y por módulo (no un estado gigante)
65
+
66
+ ### Disciplina de variables y outputs
67
+ ```hcl
68
+ # variables.tf — siempre incluir descripción y tipo
69
+ variable "environment" {
70
+ description = "Deployment environment (production, staging, development)"
71
+ type = string
72
+ validation {
73
+ condition = contains(["production", "staging", "development"], var.environment)
74
+ error_message = "Environment must be production, staging, or development."
75
+ }
76
+ }
77
+
78
+ # outputs.tf — exportar todo lo que un módulo consumidor pueda necesitar
79
+ output "vpc_id" {
80
+ description = "The ID of the VPC"
81
+ value = aws_vpc.main.id
82
+ }
83
+ ```
84
+
85
+ ### Secretos — nunca en el estado ni en el código
86
+ - Nunca pongas secretos en `terraform.tfvars` ni los hardcodees en archivos `.tf`
87
+ - Usa `data "aws_secretsmanager_secret_version"` o `data "google_secret_manager_secret_version"` para leer secretos en el momento de apply
88
+ - Outputs sensibles: márcalos con `sensitive = true` para suprimir en la salida del plan
89
+ - `.gitignore` debe incluir: `*.tfvars`, `*.tfstate`, `*.tfstate.backup`, `.terraform/`
90
+
91
+ ### Convenciones de nomenclatura de recursos
92
+ ```hcl
93
+ # Nomenclatura consistente: {proyecto}-{entorno}-{recurso}-{sufijo}
94
+ resource "aws_vpc" "main" {
95
+ cidr_block = var.vpc_cidr
96
+ tags = {
97
+ Name = "${var.project}-${var.environment}-vpc"
98
+ Environment = var.environment
99
+ ManagedBy = "terraform"
100
+ }
101
+ }
102
+ ```
103
+ Siempre etiqueta cada recurso con `Environment` y `ManagedBy = "terraform"`.
104
+
105
+ ### Planificar antes de aplicar — siempre
106
+ - Pipeline CI/CD: `terraform plan -out=tfplan` en el PR, `terraform apply tfplan` al hacer merge
107
+ - Nunca ejecutes `terraform apply` sin un plan guardado en producción
108
+ - Usa `-target` con moderación — crea deriva entre el estado real y el plan
109
+
110
+ ### Problemas comunes
111
+ - `terraform destroy` sin `-target` destruye todo — siempre confirma el alcance
112
+ - Cambiar un atributo de recurso que fuerza reemplazo (p.ej., CIDR de VPC) elimina y recrea — revisa el plan con cuidado
113
+ - El versionado del proveedor es obligatorio: usa `~> 5.0` no `>= 5.0`
114
+ - `count` vs `for_each`: usa `for_each` con mapas — `count` causa deriva de índice cuando se eliminan elementos
115
+
116
+ ## Ejemplo
117
+
118
+ **Usuario:** Crear un módulo de Terraform para una instancia privada de RDS PostgreSQL en AWS con Multi-AZ, almacenamiento cifrado y un grupo de seguridad dedicado.
119
+
120
+ **Estructura de salida esperada:**
121
+ - `modules/rds/main.tf` — `aws_db_instance`, `aws_db_subnet_group`, `aws_security_group`
122
+ - `modules/rds/variables.tf` — clase de instancia, versión del motor, nombre de la BD, IDs de VPC/subred, CIDR de entrada
123
+ - `modules/rds/outputs.tf` — endpoint, puerto, ID del grupo de seguridad
124
+ - Grupo de seguridad: permite PostgreSQL (5432) solo desde el grupo de seguridad de la app, sin acceso público
125
+ - `storage_encrypted = true`, `multi_az = true`, `deletion_protection = true` para producción
126
+ - Contraseña mediante referencia a `aws_secretsmanager_secret`, nunca hardcodeada
127
+
128
+ ---
129
+
130
+ > **Trabaja con nosotros:** Claudient está respaldado por [Uitbreiden](https://uitbreiden.com/) — construimos productos de IA y soluciones B2B con comunidades de desarrolladores. ¿Construyendo infraestructura cloud o pipelines IaC? [uitbreiden.com](https://uitbreiden.com/)
@@ -0,0 +1,133 @@
1
+ > 🇫🇷 This is the French translation. [English version](../docker.md).
2
+
3
+ # Compétence Docker
4
+
5
+ ## Quand activer
6
+ - Rédiger ou optimiser des Dockerfiles pour la production
7
+ - Configurer des builds multi-étapes pour réduire la taille des images
8
+ - Rédiger des fichiers Docker Compose pour le développement local
9
+ - Déboguer des échecs de démarrage de conteneurs ou des problèmes de cache de couches
10
+ - Configurer des utilisateurs non-root, des health checks et la sécurité des images
11
+ - Configurer .dockerignore pour des builds efficaces
12
+ - Rédiger des scripts de build ou des pipelines CI/CD de build Docker
13
+
14
+ ## Quand NE PAS utiliser
15
+ - Manifests Kubernetes (utiliser la compétence Kubernetes)
16
+ - Buildpacks (Heroku, Cloud Native Buildpacks) — système de build différent
17
+ - Provisionnement de machines virtuelles (niveau d'abstraction différent)
18
+ - Builds reproductibles basés sur Nix
19
+
20
+ ## Instructions
21
+
22
+ ### Structure du Dockerfile de production
23
+ Toujours utiliser des builds multi-étapes pour les langages compilés et Node.js :
24
+
25
+ ```dockerfile
26
+ # Étape 1 : Build
27
+ FROM node:20-alpine AS builder
28
+ WORKDIR /app
29
+ COPY package*.json ./
30
+ RUN npm ci --only=production
31
+
32
+ # Étape 2 : Runtime — image minimale
33
+ FROM node:20-alpine AS runtime
34
+ RUN addgroup -S appgroup && adduser -S appuser -G appgroup
35
+ WORKDIR /app
36
+ COPY --from=builder /app/node_modules ./node_modules
37
+ COPY . .
38
+ USER appuser
39
+ EXPOSE 8080
40
+ HEALTHCHECK --interval=30s --timeout=5s --start-period=10s --retries=3 \
41
+ CMD wget -qO- http://localhost:8080/healthz || exit 1
42
+ CMD ["node", "server.js"]
43
+ ```
44
+
45
+ ### Règles de sécurité
46
+ - Ne jamais s'exécuter en tant que root en production — toujours créer et basculer vers un utilisateur non-root
47
+ - Ne jamais utiliser le tag `latest` — épingler à une version spécifique ou un digest
48
+ - Préférer les images de base Alpine ou distroless plutôt que Debian/Ubuntu complet
49
+ - Ne jamais copier des fichiers `.env` dans l'image — passer les secrets comme variables d'environnement à l'exécution
50
+ - Scanner les images avec `docker scout` ou Trivy avant de pousser en production
51
+
52
+ ### Optimisation du cache de couches
53
+ Ordonner les instructions Dockerfile du moins au plus fréquemment modifié :
54
+ 1. Image de base (change rarement)
55
+ 2. Dépendances système (`apt-get`, `apk add`)
56
+ 3. Fichiers du gestionnaire de paquets (`package.json`, `requirements.txt`)
57
+ 4. Installation des paquets (`npm ci`, `pip install`)
58
+ 5. Code applicatif (`COPY . .`) — change le plus souvent, doit être en dernier
59
+
60
+ ### .dockerignore — toujours inclure
61
+ ```
62
+ node_modules/
63
+ .git/
64
+ .env
65
+ .env.*
66
+ *.md
67
+ Dockerfile*
68
+ docker-compose*
69
+ .dockerignore
70
+ coverage/
71
+ .nyc_output/
72
+ __pycache__/
73
+ *.pyc
74
+ .pytest_cache/
75
+ ```
76
+
77
+ ### Docker Compose pour le développement local
78
+ ```yaml
79
+ services:
80
+ app:
81
+ build:
82
+ context: .
83
+ target: builder # Utiliser l'étape de build, pas l'étape runtime en local
84
+ volumes:
85
+ - .:/app # Hot reload
86
+ - /app/node_modules # Ne pas écraser les node_modules du conteneur
87
+ ports:
88
+ - "8080:8080"
89
+ environment:
90
+ - NODE_ENV=development
91
+ depends_on:
92
+ db:
93
+ condition: service_healthy
94
+
95
+ db:
96
+ image: postgres:16-alpine
97
+ environment:
98
+ POSTGRES_USER: app
99
+ POSTGRES_PASSWORD: dev_password # Dev uniquement — jamais en production
100
+ POSTGRES_DB: appdb
101
+ ports:
102
+ - "5432:5432"
103
+ healthcheck:
104
+ test: ["CMD-SHELL", "pg_isready -U app -d appdb"]
105
+ interval: 5s
106
+ timeout: 5s
107
+ retries: 5
108
+ volumes:
109
+ - postgres_data:/var/lib/postgresql/data
110
+
111
+ volumes:
112
+ postgres_data:
113
+ ```
114
+
115
+ ### Échecs de build courants
116
+ - `COPY` échoue silencieusement si la source n'existe pas — vérifier que `.dockerignore` n'exclut pas les fichiers nécessaires
117
+ - Cache de couche invalidé de façon inattendue — vérifier si un `COPY` avant les étapes d'installation récupère des fichiers modifiés
118
+ - Permission refusée à l'exécution — vérifier la propriété des fichiers lors de l'utilisation de `COPY --from` avec un utilisateur non-root
119
+
120
+ ## Exemple
121
+
122
+ **Utilisateur :** Rédiger un Dockerfile de production pour une application Python FastAPI avec build multi-étapes, utilisateur non-root et health check.
123
+
124
+ **Sortie attendue :**
125
+ - Étape 1 (builder) : `python:3.12-slim`, installer les dépendances avec `pip install --no-cache-dir`
126
+ - Étape 2 (runtime) : `python:3.12-slim`, utilisateur non-root, copier uniquement les wheels/deps depuis le builder + code applicatif
127
+ - `HEALTHCHECK` ciblant l'endpoint `/healthz`
128
+ - `CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8080"]`
129
+ - `.dockerignore` couvrant `__pycache__`, `.env`, `.git`, `*.pyc`
130
+
131
+ ---
132
+
133
+ > **Travaillez avec nous :** Claudient est soutenu par [Uitbreiden](https://uitbreiden.com/) — nous construisons des produits IA et des solutions B2B avec des communautés de développeurs. Vous containerisez des workloads IA ou construisez des systèmes cloud-native ? [uitbreiden.com](https://uitbreiden.com/)
@@ -0,0 +1,179 @@
1
+ > 🇫🇷 This is the French translation. [English version](../github-actions.md).
2
+
3
+ # Compétence GitHub Actions
4
+
5
+ ## Quand activer
6
+ - Rédiger des pipelines CI/CD pour les tests, le lint, le build et le déploiement
7
+ - Configurer des builds matrix sur plusieurs OS ou versions de langage
8
+ - Configurer des règles de protection d'environnement et des gates de déploiement
9
+ - Rédiger des workflows réutilisables ou des actions composites
10
+ - Configurer le build Docker et le push vers un registre de conteneurs
11
+ - Configurer l'authentification OIDC vers les fournisseurs cloud (pas de secrets longue durée)
12
+ - Déboguer des workflows en échec ou comprendre des erreurs de syntaxe de workflow
13
+ - Configurer le cache des dépendances (npm, pip, modules Go)
14
+
15
+ ## Quand NE PAS utiliser
16
+ - GitLab CI, CircleCI, Jenkins — systèmes de pipeline différents
17
+ - Automatisation du développement local (utiliser Makefile ou des scripts)
18
+ - Tâches cron non liées à un dépôt (utiliser le planificateur cloud)
19
+
20
+ ## Instructions
21
+
22
+ ### Structure du fichier workflow
23
+ ```yaml
24
+ name: CI
25
+
26
+ on:
27
+ push:
28
+ branches: [main]
29
+ pull_request:
30
+ branches: [main]
31
+
32
+ # Permissions explicites — ne jamais utiliser write-all par défaut
33
+ permissions:
34
+ contents: read
35
+ pull-requests: write # Uniquement si nécessaire (ex: poster des commentaires)
36
+
37
+ jobs:
38
+ test:
39
+ runs-on: ubuntu-latest
40
+ steps:
41
+ - uses: actions/checkout@v4
42
+ - name: Set up Node.js
43
+ uses: actions/setup-node@v4
44
+ with:
45
+ node-version: '20'
46
+ cache: 'npm'
47
+ - run: npm ci
48
+ - run: npm test
49
+ ```
50
+
51
+ ### Permissions — toujours explicites
52
+ Ne jamais utiliser `permissions: write-all` par défaut. Toujours déclarer les permissions minimales requises :
53
+ ```yaml
54
+ permissions:
55
+ contents: read # Lire le dépôt
56
+ packages: write # Pousser vers GitHub Container Registry
57
+ id-token: write # OIDC pour l'auth cloud
58
+ pull-requests: write # Commenter les PRs
59
+ ```
60
+
61
+ ### Secrets — OIDC plutôt que des credentials longue durée
62
+ Utiliser OIDC (OpenID Connect) pour l'authentification cloud — pas de secrets stockés :
63
+
64
+ ```yaml
65
+ # AWS OIDC — pas besoin de AWS_ACCESS_KEY_ID
66
+ - name: Configure AWS credentials
67
+ uses: aws-actions/configure-aws-credentials@v4
68
+ with:
69
+ role-to-assume: arn:aws:iam::123456789:role/github-actions-role
70
+ aws-region: eu-west-1
71
+
72
+ # GCP OIDC
73
+ - name: Authenticate to GCP
74
+ uses: google-github-actions/auth@v2
75
+ with:
76
+ workload_identity_provider: projects/123/locations/global/workloadIdentityPools/pool/providers/github
77
+ service_account: deploy@project.iam.gserviceaccount.com
78
+ ```
79
+
80
+ ### Cache des dépendances
81
+ Toujours mettre en cache les dépendances pour réduire le temps de build :
82
+ ```yaml
83
+ # Node.js
84
+ - uses: actions/setup-node@v4
85
+ with:
86
+ node-version: '20'
87
+ cache: 'npm' # Cache intégré — pas d'étape de cache manuelle nécessaire
88
+
89
+ # Python
90
+ - uses: actions/setup-python@v5
91
+ with:
92
+ python-version: '3.12'
93
+ cache: 'pip'
94
+
95
+ # Go
96
+ - uses: actions/setup-go@v5
97
+ with:
98
+ go-version: '1.22'
99
+ cache: true
100
+ ```
101
+
102
+ ### Gates d'environnement pour les déploiements en production
103
+ ```yaml
104
+ jobs:
105
+ deploy-production:
106
+ environment: production # Référence l'environnement GitHub avec des règles de protection
107
+ needs: [test, build]
108
+ runs-on: ubuntu-latest
109
+ steps:
110
+ - name: Deploy
111
+ run: ./scripts/deploy.sh
112
+ ```
113
+
114
+ Configurer des règles de protection d'environnement dans les paramètres GitHub :
115
+ - Réviseurs requis pour les déploiements en production
116
+ - Timer d'attente entre staging et production
117
+ - Restreindre aux branches spécifiques (uniquement `main`)
118
+
119
+ ### Builds matrix
120
+ ```yaml
121
+ jobs:
122
+ test:
123
+ strategy:
124
+ matrix:
125
+ node-version: [18, 20, 22]
126
+ os: [ubuntu-latest, windows-latest]
127
+ fail-fast: false # Ne pas annuler tout au premier échec
128
+ runs-on: ${{ matrix.os }}
129
+ steps:
130
+ - uses: actions/checkout@v4
131
+ - uses: actions/setup-node@v4
132
+ with:
133
+ node-version: ${{ matrix.node-version }}
134
+ ```
135
+
136
+ ### Workflows réutilisables
137
+ ```yaml
138
+ # .github/workflows/deploy.yml — réutilisable
139
+ on:
140
+ workflow_call:
141
+ inputs:
142
+ environment:
143
+ required: true
144
+ type: string
145
+ secrets:
146
+ deploy-token:
147
+ required: true
148
+
149
+ # Appelant
150
+ jobs:
151
+ deploy:
152
+ uses: ./.github/workflows/deploy.yml
153
+ with:
154
+ environment: production
155
+ secrets:
156
+ deploy-token: ${{ secrets.DEPLOY_TOKEN }}
157
+ ```
158
+
159
+ ### Échecs courants
160
+ - `actions/checkout@v4` manquant — toujours la première étape
161
+ - Secrets non accessibles dans les forks — utiliser `pull_request_target` avec précaution (risque de sécurité)
162
+ - Cache non trouvé — la clé doit correspondre exactement ; utiliser `restore-keys` comme solution de repli
163
+ - OIDC échoue — vérifier que la politique de confiance côté fournisseur cloud autorise le dépôt et la branche
164
+
165
+ ## Exemple
166
+
167
+ **Utilisateur :** Rédiger un pipeline CI/CD pour une application Node.js : exécuter les tests sur les PRs, build et push de l'image Docker lors de la fusion sur main, déployer en production avec une gate d'approbation manuelle.
168
+
169
+ **Sortie attendue :**
170
+ - Déclencheurs `on: push/pull_request`
171
+ - Job `test` : checkout, setup-node avec cache, `npm ci`, `npm test`
172
+ - Job `build` (sur push vers main, dépend de test) : Docker build + push vers GHCR avec OIDC
173
+ - Job `deploy` : `environment: production` (nécessite une approbation), appelle le script de déploiement
174
+ - Bloc `permissions:` explicite — minimum requis
175
+ - Pas de secrets codés en dur — OIDC pour l'auth au registre
176
+
177
+ ---
178
+
179
+ > **Travaillez avec nous :** Claudient est soutenu par [Uitbreiden](https://uitbreiden.com/) — nous construisons des produits IA et des solutions B2B avec des communautés de développeurs. Vous construisez de la CI/CD pour des produits IA ou des déploiements cloud ? [uitbreiden.com](https://uitbreiden.com/)