@rashidee/co2 1.2.5

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 (190) hide show
  1. package/dist/index.js +25449 -0
  2. package/drizzle/0000_remarkable_charles_xavier.sql +210 -0
  3. package/drizzle/0001_wise_wolf_cub.sql +13 -0
  4. package/drizzle/0002_secret_spyke.sql +16 -0
  5. package/drizzle/0003_workspace_config_singleton.sql +16 -0
  6. package/drizzle/0004_terminal_claim_v120.sql +11 -0
  7. package/drizzle/0005_brainstorm_v124.sql +10 -0
  8. package/drizzle/0006_project_v140.sql +6 -0
  9. package/drizzle/0007_prd_wizard_v124.sql +14 -0
  10. package/drizzle/0008_workflow_artifact_v126.sql +24 -0
  11. package/drizzle/0009_project_import_v150.sql +7 -0
  12. package/drizzle/0010_quality_v151.sql +3 -0
  13. package/drizzle/meta/0000_snapshot.json +1335 -0
  14. package/drizzle/meta/0001_snapshot.json +1416 -0
  15. package/drizzle/meta/0002_snapshot.json +1510 -0
  16. package/drizzle/meta/_journal.json +83 -0
  17. package/package.json +41 -0
  18. package/plugin/.claude-plugin/marketplace.json +36 -0
  19. package/plugin/.claude-plugin/plugin.json +22 -0
  20. package/plugin/README.md +625 -0
  21. package/plugin/SKILLS.md +350 -0
  22. package/plugin/co2.svg +5 -0
  23. package/plugin/commands/brainstorm-loop.md +129 -0
  24. package/plugin/skills/conductor-defect/SKILL.md +898 -0
  25. package/plugin/skills/conductor-feature-develop/SKILL.md +1383 -0
  26. package/plugin/skills/conductor-feature-develop/references/implementation-domain-template.md +131 -0
  27. package/plugin/skills/conductor-feature-develop/references/implementation-master-template.md +89 -0
  28. package/plugin/skills/conductor-feature-develop/references/playwright-setup.md +224 -0
  29. package/plugin/skills/conductor-feature-prepare/SKILL.md +604 -0
  30. package/plugin/skills/depgen-k8s/SKILL.md +468 -0
  31. package/plugin/skills/depgen-k8s/references/dockerfile-laravel.md +197 -0
  32. package/plugin/skills/depgen-k8s/references/dockerfile-nodejs.md +163 -0
  33. package/plugin/skills/depgen-k8s/references/dockerfile-spring-boot.md +174 -0
  34. package/plugin/skills/depgen-k8s/references/k8s-patterns.md +869 -0
  35. package/plugin/skills/mockgen-shadcn/SKILL.md +1067 -0
  36. package/plugin/skills/mockgen-shadcn/references/admin-layout-template.md +1467 -0
  37. package/plugin/skills/mockgen-shadcn/references/mockup-hub-template.md +498 -0
  38. package/plugin/skills/mockgen-shadcn/references/mockup-index-template.md +216 -0
  39. package/plugin/skills/mockgen-tailwind/SKILL.md +904 -0
  40. package/plugin/skills/mockgen-tailwind/references/admin-layout-template.md +720 -0
  41. package/plugin/skills/mockgen-tailwind/references/mockup-hub-template.md +498 -0
  42. package/plugin/skills/mockgen-tailwind/references/mockup-index-template.md +190 -0
  43. package/plugin/skills/modelgen-nosql/SKILL.md +617 -0
  44. package/plugin/skills/modelgen-nosql/references/model-extraction-methodology.md +497 -0
  45. package/plugin/skills/modelgen-nosql/references/nosql-design-guide.md +258 -0
  46. package/plugin/skills/modelgen-relational/SKILL.md +707 -0
  47. package/plugin/skills/modelgen-relational/references/model-extraction-methodology.md +499 -0
  48. package/plugin/skills/specgen-flutter-riverpod/SKILL.md +898 -0
  49. package/plugin/skills/specgen-flutter-riverpod/references/component-patterns.md +971 -0
  50. package/plugin/skills/specgen-flutter-riverpod/references/notification-patterns.md +457 -0
  51. package/plugin/skills/specgen-flutter-riverpod/references/routing-patterns.md +362 -0
  52. package/plugin/skills/specgen-flutter-riverpod/references/security-patterns.md +709 -0
  53. package/plugin/skills/specgen-flutter-riverpod/references/spec-template.md +1566 -0
  54. package/plugin/skills/specgen-flutter-riverpod/references/state-patterns.md +518 -0
  55. package/plugin/skills/specgen-flutter-riverpod/references/storage-patterns.md +370 -0
  56. package/plugin/skills/specgen-laravel-eloquent-bladehtmx/SKILL.md +984 -0
  57. package/plugin/skills/specgen-laravel-eloquent-bladehtmx/references/batch-patterns.md +359 -0
  58. package/plugin/skills/specgen-laravel-eloquent-bladehtmx/references/messaging-patterns.md +468 -0
  59. package/plugin/skills/specgen-laravel-eloquent-bladehtmx/references/modulith-patterns.md +461 -0
  60. package/plugin/skills/specgen-laravel-eloquent-bladehtmx/references/reporting-patterns.md +803 -0
  61. package/plugin/skills/specgen-laravel-eloquent-bladehtmx/references/security-patterns.md +501 -0
  62. package/plugin/skills/specgen-laravel-eloquent-bladehtmx/references/spec-template.md +1268 -0
  63. package/plugin/skills/specgen-laravel-eloquent-bladehtmx/references/web-patterns.md +301 -0
  64. package/plugin/skills/specgen-node-cli-web/SKILL.md +561 -0
  65. package/plugin/skills/specgen-node-cli-web/references/auth-patterns.md +293 -0
  66. package/plugin/skills/specgen-node-cli-web/references/cli-packaging-patterns.md +250 -0
  67. package/plugin/skills/specgen-node-cli-web/references/server-patterns.md +247 -0
  68. package/plugin/skills/specgen-node-cli-web/references/spec-template.md +401 -0
  69. package/plugin/skills/specgen-node-cli-web/references/testing-patterns.md +174 -0
  70. package/plugin/skills/specgen-react-mui/SKILL.md +789 -0
  71. package/plugin/skills/specgen-react-mui/references/component-patterns.md +1077 -0
  72. package/plugin/skills/specgen-react-mui/references/reporting-patterns.md +1998 -0
  73. package/plugin/skills/specgen-react-mui/references/routing-patterns.md +461 -0
  74. package/plugin/skills/specgen-react-mui/references/security-patterns.md +599 -0
  75. package/plugin/skills/specgen-react-mui/references/spec-template.md +1030 -0
  76. package/plugin/skills/specgen-react-mui/references/state-patterns.md +327 -0
  77. package/plugin/skills/specgen-react-tailwind/SKILL.md +859 -0
  78. package/plugin/skills/specgen-react-tailwind/references/component-patterns.md +1212 -0
  79. package/plugin/skills/specgen-react-tailwind/references/reporting-patterns.md +1529 -0
  80. package/plugin/skills/specgen-react-tailwind/references/routing-patterns.md +669 -0
  81. package/plugin/skills/specgen-react-tailwind/references/security-patterns.md +656 -0
  82. package/plugin/skills/specgen-react-tailwind/references/spec-template.md +1237 -0
  83. package/plugin/skills/specgen-react-tailwind/references/state-patterns.md +327 -0
  84. package/plugin/skills/specgen-sdk-java/SKILL.md +933 -0
  85. package/plugin/skills/specgen-sdk-java/references/api-extraction-patterns.md +247 -0
  86. package/plugin/skills/specgen-sdk-java/references/http-client-patterns.md +495 -0
  87. package/plugin/skills/specgen-sdk-java/references/packaging-patterns.md +366 -0
  88. package/plugin/skills/specgen-sdk-java/references/spec-template.md +956 -0
  89. package/plugin/skills/specgen-spring-jpa-jtehtmx/SKILL.md +1284 -0
  90. package/plugin/skills/specgen-spring-jpa-jtehtmx/references/batch-patterns.md +1224 -0
  91. package/plugin/skills/specgen-spring-jpa-jtehtmx/references/jasper-patterns.md +1638 -0
  92. package/plugin/skills/specgen-spring-jpa-jtehtmx/references/messaging-patterns.md +512 -0
  93. package/plugin/skills/specgen-spring-jpa-jtehtmx/references/modulith-patterns.md +354 -0
  94. package/plugin/skills/specgen-spring-jpa-jtehtmx/references/security-patterns.md +551 -0
  95. package/plugin/skills/specgen-spring-jpa-jtehtmx/references/spec-template.md +2502 -0
  96. package/plugin/skills/specgen-spring-jpa-jtehtmx/references/web-patterns.md +503 -0
  97. package/plugin/skills/specgen-spring-jpa-restapi/SKILL.md +990 -0
  98. package/plugin/skills/specgen-spring-jpa-restapi/references/batch-patterns.md +1224 -0
  99. package/plugin/skills/specgen-spring-jpa-restapi/references/messaging-patterns.md +512 -0
  100. package/plugin/skills/specgen-spring-jpa-restapi/references/modulith-patterns.md +279 -0
  101. package/plugin/skills/specgen-spring-jpa-restapi/references/reporting-patterns.md +1536 -0
  102. package/plugin/skills/specgen-spring-jpa-restapi/references/restapi-patterns.md +722 -0
  103. package/plugin/skills/specgen-spring-jpa-restapi/references/security-patterns.md +351 -0
  104. package/plugin/skills/specgen-spring-jpa-restapi/references/spec-template.md +553 -0
  105. package/plugin/skills/specgen-ts-cli/SKILL.md +861 -0
  106. package/plugin/skills/specgen-ts-cli/references/async-patterns.md +1101 -0
  107. package/plugin/skills/specgen-ts-cli/references/command-patterns.md +383 -0
  108. package/plugin/skills/specgen-ts-cli/references/config-patterns.md +430 -0
  109. package/plugin/skills/specgen-ts-cli/references/database-patterns.md +750 -0
  110. package/plugin/skills/specgen-ts-cli/references/packaging-patterns.md +426 -0
  111. package/plugin/skills/specgen-ts-cli/references/spec-template.md +1391 -0
  112. package/plugin/skills/specgen-ts-cli/references/testing-patterns.md +909 -0
  113. package/plugin/skills/testgen-functional/SKILL.md +1381 -0
  114. package/plugin/skills/tracegen-matrix/SKILL.md +243 -0
  115. package/plugin/skills/util-preparek8senv/SKILL.md +422 -0
  116. package/plugin/skills/util-projectinit/SKILL.md +307 -0
  117. package/plugin/skills/util-projectinit/reference/brainstorm-loop.md +129 -0
  118. package/plugin/skills/util-projectinit/reference/brainstorm-protocol.md +144 -0
  119. package/plugin/skills/util-projectinit/reference/brainstorm-setup-guide.md +153 -0
  120. package/plugin/skills/util-projectinit/reference/brainstorm-template-appdev.md +87 -0
  121. package/plugin/skills/util-projectinit/reference/co2-context-generation-guide.md +761 -0
  122. package/plugin/skills/util-projectsync/SKILL.md +501 -0
  123. package/plugin/skills/util-updprd/SKILL.md +324 -0
  124. package/plugin/skills/util-usanalyzer/SKILL.md +307 -0
  125. package/plugin/skills/util-ustagger/SKILL.md +154 -0
  126. package/static/assets/abnfDiagram-VRR7QNED-DvPuwyCV.js +1 -0
  127. package/static/assets/arc-DRKw7sjs.js +1 -0
  128. package/static/assets/architectureDiagram-ZJ3FMSHR-CaNcxUbC.js +36 -0
  129. package/static/assets/blockDiagram-677ZJIJ3-Demd4AOK.js +132 -0
  130. package/static/assets/c4Diagram-LMCZKHZV-PVKUfc2x.js +10 -0
  131. package/static/assets/channel-C2nVbuwv.js +1 -0
  132. package/static/assets/chunk-2Q5K7J3B-CExf8ww_.js +1 -0
  133. package/static/assets/chunk-32BRIVSS-CFPaoONF.js +1 -0
  134. package/static/assets/chunk-5VM5RSS4-DE2esM67.js +15 -0
  135. package/static/assets/chunk-EX3LRPZG-SON_YdDG.js +231 -0
  136. package/static/assets/chunk-JWPE2WC7-Qxah8LNr.js +1 -0
  137. package/static/assets/chunk-MOJQB5TN-BcWGQV3j.js +88 -0
  138. package/static/assets/chunk-RYQCIY6F-DkDj-OR5.js +1 -0
  139. package/static/assets/chunk-V7JOEXUC-BlI1Mrah.js +206 -0
  140. package/static/assets/chunk-VR4S4FIN-Agf__duj.js +1 -0
  141. package/static/assets/chunk-XXDRQBXY-B5CfAh85.js +1 -0
  142. package/static/assets/classDiagram-OUVF2IWQ-DXJIljsR.js +1 -0
  143. package/static/assets/classDiagram-v2-EOCWNBFH-DXJIljsR.js +1 -0
  144. package/static/assets/cose-bilkent-JH36ORCC-DO0cQkcy.js +1 -0
  145. package/static/assets/cynefin-VYW2F7L2-CfOnsnXc.js +178 -0
  146. package/static/assets/cynefinDiagram-TSTJHNR4-BJ8tULAv.js +62 -0
  147. package/static/assets/cytoscape.esm-DTSO7Bv0.js +331 -0
  148. package/static/assets/dagre-VKFMJZFB-DfjwzHqP.js +4 -0
  149. package/static/assets/defaultLocale-DX6XiGOO.js +1 -0
  150. package/static/assets/diagram-FQU43EPY-CndSOIIM.js +3 -0
  151. package/static/assets/diagram-G47NLZAW-Czf5hN0Z.js +24 -0
  152. package/static/assets/diagram-NH7WQ7WH-COAyojGh.js +24 -0
  153. package/static/assets/diagram-OA4YK3LP-H8PoiN2m.js +30 -0
  154. package/static/assets/diagram-WEI45ONY-DzcaVzjp.js +41 -0
  155. package/static/assets/ebnfDiagram-CCIWWBDH-DPazGYLJ.js +1 -0
  156. package/static/assets/erDiagram-Q63AITRT-Bo-fubgF.js +85 -0
  157. package/static/assets/flowDiagram-23GEKE2U-CSvxUDwh.js +156 -0
  158. package/static/assets/ganttDiagram-NO4QXBWP-DnBveWX6.js +292 -0
  159. package/static/assets/gitGraphDiagram-IHSO6WYX-B3rVL8c-.js +106 -0
  160. package/static/assets/graph-C9eacEi8.js +1 -0
  161. package/static/assets/index-LZSQkLE2.css +41 -0
  162. package/static/assets/index-y7XDSgMG.js +495 -0
  163. package/static/assets/infoDiagram-FWYZ7A6U-CvWV9yy2.js +2 -0
  164. package/static/assets/init-Gi6I4Gst.js +1 -0
  165. package/static/assets/ishikawaDiagram-FXEZZL3T-DF28a1N6.js +70 -0
  166. package/static/assets/journeyDiagram-5HDEW3XC-CB6CugYk.js +139 -0
  167. package/static/assets/kanban-definition-HUTT4EX6-ResSLF6d.js +89 -0
  168. package/static/assets/katex-C5jXJg4s.js +257 -0
  169. package/static/assets/layout-DEXfKzaS.js +1 -0
  170. package/static/assets/linear-CLO--ryk.js +1 -0
  171. package/static/assets/map-Czzmt4hB.js +1 -0
  172. package/static/assets/mindmap-definition-LN4V7U3C-BvW3EbxX.js +96 -0
  173. package/static/assets/ordinal-Cboi1Yqb.js +1 -0
  174. package/static/assets/pegDiagram-2B236MQR-BHCgqrrM.js +1 -0
  175. package/static/assets/pieDiagram-ENE6RG2P-DVmCQ5FA.js +39 -0
  176. package/static/assets/quadrantDiagram-ABIIQ3AL-B3e5KR52.js +7 -0
  177. package/static/assets/railroadDiagram-RFXS5EU6-Csv5ysLc.js +1 -0
  178. package/static/assets/requirementDiagram-TGXJPOKE-DOMVzvnB.js +84 -0
  179. package/static/assets/sankeyDiagram-HTMAVEWB-B1dcTOvy.js +40 -0
  180. package/static/assets/sequenceDiagram-DBY2YBRQ-BY414yeO.js +162 -0
  181. package/static/assets/sizeCapture-X5ZJPWSS-CuJfrfBN.js +1 -0
  182. package/static/assets/stateDiagram-2N3HPSRC-FX4rJkzV.js +1 -0
  183. package/static/assets/stateDiagram-v2-6OUMAXLB-BVufbO_H.js +1 -0
  184. package/static/assets/swimlanes-5IMT3BWC-Sfy58mmv.js +2 -0
  185. package/static/assets/swimlanesDiagram-G3AALYLV-wDCDw08H.js +8 -0
  186. package/static/assets/timeline-definition-FHXFAJF6-CmV7by8p.js +120 -0
  187. package/static/assets/vennDiagram-L72KCM5P-FqIyFZFt.js +34 -0
  188. package/static/assets/wardleyDiagram-EHGQE667-BZ06O45i.js +78 -0
  189. package/static/assets/xychartDiagram-FW5EYKEG-BOkffR06.js +7 -0
  190. package/static/index.html +24 -0
@@ -0,0 +1,869 @@
1
+ # Kubernetes Manifest Patterns
2
+
3
+ Complete Kubernetes manifest patterns for deploying containerized applications and their
4
+ dependent services.
5
+
6
+ ## Application Manifests
7
+
8
+ ### Namespace
9
+
10
+ ```yaml
11
+ apiVersion: v1
12
+ kind: Namespace
13
+ metadata:
14
+ name: {namespace}
15
+ labels:
16
+ app.kubernetes.io/part-of: {project_name}
17
+ ```
18
+
19
+ ### ConfigMap
20
+
21
+ Generated from all non-sensitive environment variables detected in the application config.
22
+
23
+ ```yaml
24
+ apiVersion: v1
25
+ kind: ConfigMap
26
+ metadata:
27
+ name: {app_name}-config
28
+ namespace: {namespace}
29
+ labels:
30
+ app.kubernetes.io/name: {app_name}
31
+ app.kubernetes.io/version: "{app_version}"
32
+ data:
33
+ # Server
34
+ SERVER_PORT: "{server_port}"
35
+ CORS_ALLOWED_ORIGINS: "https://{app_domain}"
36
+
37
+ # Database
38
+ MONGODB_URI: "mongodb://mongo-svc:27017/{db_name}"
39
+
40
+ # Authentication
41
+ KEYCLOAK_SERVER_URL: "http://keycloak-svc:8080"
42
+ KEYCLOAK_REALM: "{realm}"
43
+ KEYCLOAK_ISSUER_URI: "http://keycloak-svc:8080/realms/{realm}"
44
+ KEYCLOAK_CLIENT_ID: "{client_id}"
45
+
46
+ # Messaging
47
+ RABBITMQ_HOST: "rabbitmq-svc"
48
+ RABBITMQ_PORT: "5672"
49
+
50
+ # Mail
51
+ MAIL_HOST: "smtp-svc"
52
+ MAIL_PORT: "587"
53
+
54
+ # Logging
55
+ LOG_LEVEL_ROOT: "INFO"
56
+ LOG_LEVEL_APP: "INFO"
57
+
58
+ # Stack-specific (examples)
59
+ # Spring Boot:
60
+ JTE_DEV_MODE: "false"
61
+ JTE_PRECOMPILED: "true"
62
+ DEVTOOLS_RESTART: "false"
63
+ DEVTOOLS_LIVERELOAD: "false"
64
+ # Laravel:
65
+ # APP_ENV: "production"
66
+ # APP_DEBUG: "false"
67
+ # Node.js:
68
+ # NODE_ENV: "production"
69
+ ```
70
+
71
+ ### Secret
72
+
73
+ Generated from all sensitive environment variables. Values are base64-encoded.
74
+
75
+ ```yaml
76
+ apiVersion: v1
77
+ kind: Secret
78
+ metadata:
79
+ name: {app_name}-secret
80
+ namespace: {namespace}
81
+ labels:
82
+ app.kubernetes.io/name: {app_name}
83
+ type: Opaque
84
+ stringData:
85
+ KEYCLOAK_ADMIN_USERNAME: "{admin_username}"
86
+ KEYCLOAK_ADMIN_PASSWORD: "{admin_password}"
87
+ RABBITMQ_USERNAME: "{rmq_username}"
88
+ RABBITMQ_PASSWORD: "{rmq_password}"
89
+ # DB_PASSWORD: "{db_password}" # If database requires auth
90
+ ```
91
+
92
+ **Production note**: For production environments, use external secret management:
93
+ - **HashiCorp Vault** with the Vault Secrets Operator
94
+ - **AWS Secrets Manager** with External Secrets Operator
95
+ - **Azure Key Vault** with Azure Key Vault Provider for Secrets Store CSI Driver
96
+
97
+ ### Deployment
98
+
99
+ ```yaml
100
+ apiVersion: apps/v1
101
+ kind: Deployment
102
+ metadata:
103
+ name: {app_name}
104
+ namespace: {namespace}
105
+ labels:
106
+ app.kubernetes.io/name: {app_name}
107
+ app.kubernetes.io/version: "{app_version}"
108
+ spec:
109
+ replicas: 2
110
+ strategy:
111
+ type: RollingUpdate
112
+ rollingUpdate:
113
+ maxSurge: 1
114
+ maxUnavailable: 0
115
+ selector:
116
+ matchLabels:
117
+ app: {app_name}
118
+ template:
119
+ metadata:
120
+ labels:
121
+ app: {app_name}
122
+ app.kubernetes.io/name: {app_name}
123
+ app.kubernetes.io/version: "{app_version}"
124
+ spec:
125
+ serviceAccountName: {app_name}
126
+ securityContext:
127
+ runAsNonRoot: true
128
+ runAsUser: 1000
129
+ fsGroup: 1000
130
+ # --- hostAliases (conditional) ---
131
+ # Include when ConfigMap values reference the environment's Domain (from
132
+ # CLAUDE.md) and that Domain is NOT a K8s service name or publicly
133
+ # resolvable DNS name. Maps the custom domain to the environment's IP
134
+ # so pods can resolve it. Omit when Domain is `localhost`.
135
+ # hostAliases:
136
+ # - ip: "{environment_ip}"
137
+ # hostnames:
138
+ # - "{environment_domain}"
139
+ containers:
140
+ - name: {app_name}
141
+ image: {registry}/{image_name}:{app_version}
142
+ imagePullPolicy: IfNotPresent
143
+ ports:
144
+ - name: http
145
+ containerPort: {server_port}
146
+ protocol: TCP
147
+ envFrom:
148
+ - configMapRef:
149
+ name: {app_name}-config
150
+ - secretRef:
151
+ name: {app_name}-secret
152
+ resources:
153
+ requests:
154
+ cpu: {cpu_request}
155
+ memory: {mem_request}
156
+ limits:
157
+ cpu: {cpu_limit}
158
+ memory: {mem_limit}
159
+ livenessProbe:
160
+ httpGet:
161
+ path: {health_endpoint}
162
+ port: http
163
+ initialDelaySeconds: {liveness_delay}
164
+ periodSeconds: 30
165
+ timeoutSeconds: 10
166
+ failureThreshold: 3
167
+ readinessProbe:
168
+ httpGet:
169
+ path: {health_endpoint}
170
+ port: http
171
+ initialDelaySeconds: {readiness_delay}
172
+ periodSeconds: 10
173
+ timeoutSeconds: 5
174
+ failureThreshold: 3
175
+ startupProbe:
176
+ httpGet:
177
+ path: {health_endpoint}
178
+ port: http
179
+ initialDelaySeconds: 10
180
+ periodSeconds: 10
181
+ failureThreshold: 30
182
+ imagePullSecrets:
183
+ - name: registry-credentials
184
+ ```
185
+
186
+ **Resource defaults by stack:**
187
+
188
+ | Stack | CPU Request | CPU Limit | Memory Request | Memory Limit | Liveness Delay | Readiness Delay |
189
+ |---|---|---|---|---|---|---|
190
+ | Spring Boot | 250m | 1000m | 512Mi | 1024Mi | 60s | 30s |
191
+ | Laravel | 100m | 500m | 128Mi | 512Mi | 15s | 10s |
192
+ | Node.js | 100m | 500m | 128Mi | 512Mi | 15s | 10s |
193
+
194
+ ### hostAliases — Custom Domain Resolution
195
+
196
+ When an environment's ConfigMap values reference a custom domain name that is NOT a
197
+ Kubernetes service name (e.g., `home.server` instead of `hub-single-sign-on`), pods
198
+ cannot resolve it because K8s cluster DNS only handles service names and external DNS.
199
+ Add `hostAliases` to the Deployment `spec.template.spec` to map the custom domain to
200
+ its IP address.
201
+
202
+ **Detection rule**: Compare the environment's `Domain` field from CLAUDE.md against
203
+ the hostnames used in ConfigMap values. If any ConfigMap value contains the
204
+ environment's Domain (and it is not `localhost`), uncomment the `hostAliases` block
205
+ and substitute `{environment_ip}` and `{environment_domain}`.
206
+
207
+ Example — CLAUDE.md defines:
208
+ ```
209
+ ## Home Server
210
+ - Domain: `home.server`
211
+ - SSH Configuration:
212
+ - IP: `192.168.1.126`
213
+ ```
214
+ ConfigMap has: `KEYCLOAK_ISSUER_URI: "http://home.server:30040/realms/hub"`
215
+
216
+ Generated hostAliases:
217
+ ```yaml
218
+ hostAliases:
219
+ - ip: "192.168.1.126"
220
+ hostnames:
221
+ - "home.server"
222
+ ```
223
+
224
+ **Do NOT add hostAliases when**:
225
+ - Domain is `localhost` (loopback is always resolvable)
226
+ - All ConfigMap URLs use K8s service names (e.g., `hub-single-sign-on:8180`)
227
+ - Domain is a publicly resolvable DNS name (e.g., `app.example.com`)
228
+
229
+ ### Service
230
+
231
+ ```yaml
232
+ apiVersion: v1
233
+ kind: Service
234
+ metadata:
235
+ name: {app_name}-svc
236
+ namespace: {namespace}
237
+ labels:
238
+ app.kubernetes.io/name: {app_name}
239
+ spec:
240
+ type: ClusterIP
241
+ selector:
242
+ app: {app_name}
243
+ ports:
244
+ - name: http
245
+ port: {server_port}
246
+ targetPort: http
247
+ protocol: TCP
248
+ ```
249
+
250
+ ### ServiceAccount
251
+
252
+ ```yaml
253
+ apiVersion: v1
254
+ kind: ServiceAccount
255
+ metadata:
256
+ name: {app_name}
257
+ namespace: {namespace}
258
+ labels:
259
+ app.kubernetes.io/name: {app_name}
260
+ ```
261
+
262
+ ### Ingress
263
+
264
+ ```yaml
265
+ apiVersion: networking.k8s.io/v1
266
+ kind: Ingress
267
+ metadata:
268
+ name: {app_name}-ingress
269
+ namespace: {namespace}
270
+ labels:
271
+ app.kubernetes.io/name: {app_name}
272
+ annotations:
273
+ nginx.ingress.kubernetes.io/proxy-body-size: "50m"
274
+ nginx.ingress.kubernetes.io/proxy-read-timeout: "300"
275
+ cert-manager.io/cluster-issuer: "letsencrypt-prod"
276
+ spec:
277
+ ingressClassName: nginx
278
+ rules:
279
+ - host: {app_domain}
280
+ http:
281
+ paths:
282
+ - path: /
283
+ pathType: Prefix
284
+ backend:
285
+ service:
286
+ name: {app_name}-svc
287
+ port:
288
+ number: {server_port}
289
+ tls:
290
+ - hosts:
291
+ - {app_domain}
292
+ secretName: {app_name}-tls
293
+ ```
294
+
295
+ ### HorizontalPodAutoscaler
296
+
297
+ ```yaml
298
+ apiVersion: autoscaling/v2
299
+ kind: HorizontalPodAutoscaler
300
+ metadata:
301
+ name: {app_name}-hpa
302
+ namespace: {namespace}
303
+ spec:
304
+ scaleTargetRef:
305
+ apiVersion: apps/v1
306
+ kind: Deployment
307
+ name: {app_name}
308
+ minReplicas: 2
309
+ maxReplicas: 10
310
+ metrics:
311
+ - type: Resource
312
+ resource:
313
+ name: cpu
314
+ target:
315
+ type: Utilization
316
+ averageUtilization: 70
317
+ - type: Resource
318
+ resource:
319
+ name: memory
320
+ target:
321
+ type: Utilization
322
+ averageUtilization: 80
323
+ ```
324
+
325
+ ### NetworkPolicy
326
+
327
+ ```yaml
328
+ apiVersion: networking.k8s.io/v1
329
+ kind: NetworkPolicy
330
+ metadata:
331
+ name: {app_name}-netpol
332
+ namespace: {namespace}
333
+ spec:
334
+ podSelector:
335
+ matchLabels:
336
+ app: {app_name}
337
+ policyTypes:
338
+ - Ingress
339
+ - Egress
340
+ ingress:
341
+ - from:
342
+ - namespaceSelector: {}
343
+ podSelector:
344
+ matchLabels:
345
+ app.kubernetes.io/name: ingress-nginx
346
+ ports:
347
+ - port: {server_port}
348
+ protocol: TCP
349
+ egress:
350
+ # Allow DNS
351
+ - to: []
352
+ ports:
353
+ - port: 53
354
+ protocol: UDP
355
+ - port: 53
356
+ protocol: TCP
357
+ # Allow database
358
+ - to:
359
+ - podSelector:
360
+ matchLabels:
361
+ app: mongodb
362
+ ports:
363
+ - port: 27017
364
+ # Allow Keycloak
365
+ - to:
366
+ - podSelector:
367
+ matchLabels:
368
+ app: keycloak
369
+ ports:
370
+ - port: 8080
371
+ # Allow RabbitMQ
372
+ - to:
373
+ - podSelector:
374
+ matchLabels:
375
+ app: rabbitmq
376
+ ports:
377
+ - port: 5672
378
+ # Allow SMTP
379
+ - to:
380
+ - podSelector:
381
+ matchLabels:
382
+ app: mailcatcher
383
+ ports:
384
+ - port: 1025
385
+ ```
386
+
387
+ ---
388
+
389
+ ## Dependent Service Manifests
390
+
391
+ For each dependency, provide both Option A (deploy in K8s) and Option B (external reference).
392
+
393
+ ### MongoDB
394
+
395
+ #### Option A: StatefulSet
396
+
397
+ ```yaml
398
+ apiVersion: apps/v1
399
+ kind: StatefulSet
400
+ metadata:
401
+ name: mongodb
402
+ namespace: {namespace}
403
+ spec:
404
+ serviceName: mongo-svc
405
+ replicas: 1
406
+ selector:
407
+ matchLabels:
408
+ app: mongodb
409
+ template:
410
+ metadata:
411
+ labels:
412
+ app: mongodb
413
+ spec:
414
+ containers:
415
+ - name: mongodb
416
+ image: mongo:{mongodb_version}
417
+ ports:
418
+ - containerPort: 27017
419
+ volumeMounts:
420
+ - name: mongo-data
421
+ mountPath: /data/db
422
+ resources:
423
+ requests:
424
+ cpu: 250m
425
+ memory: 512Mi
426
+ limits:
427
+ cpu: 1000m
428
+ memory: 2Gi
429
+ volumeClaimTemplates:
430
+ - metadata:
431
+ name: mongo-data
432
+ spec:
433
+ accessModes: ["ReadWriteOnce"]
434
+ resources:
435
+ requests:
436
+ storage: 10Gi
437
+ ---
438
+ apiVersion: v1
439
+ kind: Service
440
+ metadata:
441
+ name: mongo-svc
442
+ namespace: {namespace}
443
+ spec:
444
+ type: ClusterIP
445
+ selector:
446
+ app: mongodb
447
+ ports:
448
+ - port: 27017
449
+ targetPort: 27017
450
+ ```
451
+
452
+ #### Option B: External Reference
453
+
454
+ ```yaml
455
+ apiVersion: v1
456
+ kind: Service
457
+ metadata:
458
+ name: mongo-svc
459
+ namespace: {namespace}
460
+ spec:
461
+ type: ExternalName
462
+ externalName: {external_mongodb_host}
463
+ ```
464
+
465
+ ### MySQL
466
+
467
+ #### Option A: StatefulSet
468
+
469
+ ```yaml
470
+ apiVersion: apps/v1
471
+ kind: StatefulSet
472
+ metadata:
473
+ name: mysql
474
+ namespace: {namespace}
475
+ spec:
476
+ serviceName: mysql-svc
477
+ replicas: 1
478
+ selector:
479
+ matchLabels:
480
+ app: mysql
481
+ template:
482
+ metadata:
483
+ labels:
484
+ app: mysql
485
+ spec:
486
+ containers:
487
+ - name: mysql
488
+ image: mysql:{mysql_version}
489
+ ports:
490
+ - containerPort: 3306
491
+ env:
492
+ - name: MYSQL_ROOT_PASSWORD
493
+ valueFrom:
494
+ secretKeyRef:
495
+ name: mysql-secret
496
+ key: root-password
497
+ volumeMounts:
498
+ - name: mysql-data
499
+ mountPath: /var/lib/mysql
500
+ resources:
501
+ requests:
502
+ cpu: 250m
503
+ memory: 512Mi
504
+ limits:
505
+ cpu: 1000m
506
+ memory: 2Gi
507
+ volumeClaimTemplates:
508
+ - metadata:
509
+ name: mysql-data
510
+ spec:
511
+ accessModes: ["ReadWriteOnce"]
512
+ resources:
513
+ requests:
514
+ storage: 10Gi
515
+ ---
516
+ apiVersion: v1
517
+ kind: Service
518
+ metadata:
519
+ name: mysql-svc
520
+ namespace: {namespace}
521
+ spec:
522
+ type: ClusterIP
523
+ selector:
524
+ app: mysql
525
+ ports:
526
+ - port: 3306
527
+ targetPort: 3306
528
+ ```
529
+
530
+ ### Keycloak
531
+
532
+ #### Option A: Deployment
533
+
534
+ ```yaml
535
+ apiVersion: apps/v1
536
+ kind: Deployment
537
+ metadata:
538
+ name: keycloak
539
+ namespace: {namespace}
540
+ spec:
541
+ replicas: 1
542
+ selector:
543
+ matchLabels:
544
+ app: keycloak
545
+ template:
546
+ metadata:
547
+ labels:
548
+ app: keycloak
549
+ spec:
550
+ containers:
551
+ - name: keycloak
552
+ image: quay.io/keycloak/keycloak:{keycloak_version}
553
+ args: ["start-dev"]
554
+ ports:
555
+ - containerPort: 8080
556
+ env:
557
+ - name: KEYCLOAK_ADMIN
558
+ value: "admin"
559
+ - name: KEYCLOAK_ADMIN_PASSWORD
560
+ valueFrom:
561
+ secretKeyRef:
562
+ name: keycloak-secret
563
+ key: admin-password
564
+ - name: KC_DB
565
+ value: "mysql"
566
+ - name: KC_DB_URL
567
+ value: "jdbc:mysql://mysql-svc:3306/{keycloak_db}"
568
+ - name: KC_DB_USERNAME
569
+ valueFrom:
570
+ secretKeyRef:
571
+ name: keycloak-secret
572
+ key: db-username
573
+ - name: KC_DB_PASSWORD
574
+ valueFrom:
575
+ secretKeyRef:
576
+ name: keycloak-secret
577
+ key: db-password
578
+ resources:
579
+ requests:
580
+ cpu: 500m
581
+ memory: 512Mi
582
+ limits:
583
+ cpu: 1000m
584
+ memory: 1Gi
585
+ readinessProbe:
586
+ httpGet:
587
+ path: /health/ready
588
+ port: 8080
589
+ initialDelaySeconds: 30
590
+ periodSeconds: 10
591
+ ---
592
+ apiVersion: v1
593
+ kind: Service
594
+ metadata:
595
+ name: keycloak-svc
596
+ namespace: {namespace}
597
+ spec:
598
+ type: ClusterIP
599
+ selector:
600
+ app: keycloak
601
+ ports:
602
+ - port: 8080
603
+ targetPort: 8080
604
+ ```
605
+
606
+ ### RabbitMQ
607
+
608
+ #### Option A: StatefulSet
609
+
610
+ ```yaml
611
+ apiVersion: apps/v1
612
+ kind: StatefulSet
613
+ metadata:
614
+ name: rabbitmq
615
+ namespace: {namespace}
616
+ spec:
617
+ serviceName: rabbitmq-svc
618
+ replicas: 1
619
+ selector:
620
+ matchLabels:
621
+ app: rabbitmq
622
+ template:
623
+ metadata:
624
+ labels:
625
+ app: rabbitmq
626
+ spec:
627
+ containers:
628
+ - name: rabbitmq
629
+ image: rabbitmq:{rabbitmq_version}-management-alpine
630
+ ports:
631
+ - containerPort: 5672
632
+ name: amqp
633
+ - containerPort: 15672
634
+ name: management
635
+ env:
636
+ - name: RABBITMQ_DEFAULT_USER
637
+ valueFrom:
638
+ secretKeyRef:
639
+ name: rabbitmq-secret
640
+ key: username
641
+ - name: RABBITMQ_DEFAULT_PASS
642
+ valueFrom:
643
+ secretKeyRef:
644
+ name: rabbitmq-secret
645
+ key: password
646
+ volumeMounts:
647
+ - name: rabbitmq-data
648
+ mountPath: /var/lib/rabbitmq
649
+ resources:
650
+ requests:
651
+ cpu: 250m
652
+ memory: 256Mi
653
+ limits:
654
+ cpu: 500m
655
+ memory: 512Mi
656
+ readinessProbe:
657
+ exec:
658
+ command: ["rabbitmq-diagnostics", "-q", "ping"]
659
+ initialDelaySeconds: 20
660
+ periodSeconds: 10
661
+ volumeClaimTemplates:
662
+ - metadata:
663
+ name: rabbitmq-data
664
+ spec:
665
+ accessModes: ["ReadWriteOnce"]
666
+ resources:
667
+ requests:
668
+ storage: 5Gi
669
+ ---
670
+ apiVersion: v1
671
+ kind: Service
672
+ metadata:
673
+ name: rabbitmq-svc
674
+ namespace: {namespace}
675
+ spec:
676
+ type: ClusterIP
677
+ selector:
678
+ app: rabbitmq
679
+ ports:
680
+ - name: amqp
681
+ port: 5672
682
+ targetPort: 5672
683
+ - name: management
684
+ port: 15672
685
+ targetPort: 15672
686
+ ```
687
+
688
+ ### Redis
689
+
690
+ #### Option A: StatefulSet
691
+
692
+ ```yaml
693
+ apiVersion: apps/v1
694
+ kind: StatefulSet
695
+ metadata:
696
+ name: redis
697
+ namespace: {namespace}
698
+ spec:
699
+ serviceName: redis-svc
700
+ replicas: 1
701
+ selector:
702
+ matchLabels:
703
+ app: redis
704
+ template:
705
+ metadata:
706
+ labels:
707
+ app: redis
708
+ spec:
709
+ containers:
710
+ - name: redis
711
+ image: redis:{redis_version}-alpine
712
+ ports:
713
+ - containerPort: 6379
714
+ volumeMounts:
715
+ - name: redis-data
716
+ mountPath: /data
717
+ resources:
718
+ requests:
719
+ cpu: 100m
720
+ memory: 128Mi
721
+ limits:
722
+ cpu: 250m
723
+ memory: 256Mi
724
+ readinessProbe:
725
+ exec:
726
+ command: ["redis-cli", "ping"]
727
+ initialDelaySeconds: 5
728
+ periodSeconds: 10
729
+ volumeClaimTemplates:
730
+ - metadata:
731
+ name: redis-data
732
+ spec:
733
+ accessModes: ["ReadWriteOnce"]
734
+ resources:
735
+ requests:
736
+ storage: 2Gi
737
+ ---
738
+ apiVersion: v1
739
+ kind: Service
740
+ metadata:
741
+ name: redis-svc
742
+ namespace: {namespace}
743
+ spec:
744
+ type: ClusterIP
745
+ selector:
746
+ app: redis
747
+ ports:
748
+ - port: 6379
749
+ targetPort: 6379
750
+ ```
751
+
752
+ ### Meilisearch
753
+
754
+ #### Option A: Deployment
755
+
756
+ ```yaml
757
+ apiVersion: apps/v1
758
+ kind: Deployment
759
+ metadata:
760
+ name: meilisearch
761
+ namespace: {namespace}
762
+ spec:
763
+ replicas: 1
764
+ selector:
765
+ matchLabels:
766
+ app: meilisearch
767
+ template:
768
+ metadata:
769
+ labels:
770
+ app: meilisearch
771
+ spec:
772
+ containers:
773
+ - name: meilisearch
774
+ image: getmeili/meilisearch:{meilisearch_version}
775
+ ports:
776
+ - containerPort: 7700
777
+ env:
778
+ - name: MEILI_MASTER_KEY
779
+ valueFrom:
780
+ secretKeyRef:
781
+ name: meilisearch-secret
782
+ key: master-key
783
+ volumeMounts:
784
+ - name: meili-data
785
+ mountPath: /meili_data
786
+ resources:
787
+ requests:
788
+ cpu: 250m
789
+ memory: 512Mi
790
+ limits:
791
+ cpu: 1000m
792
+ memory: 1Gi
793
+ volumes:
794
+ - name: meili-data
795
+ persistentVolumeClaim:
796
+ claimName: meilisearch-pvc
797
+ ---
798
+ apiVersion: v1
799
+ kind: Service
800
+ metadata:
801
+ name: meilisearch-svc
802
+ namespace: {namespace}
803
+ spec:
804
+ type: ClusterIP
805
+ selector:
806
+ app: meilisearch
807
+ ports:
808
+ - port: 7700
809
+ targetPort: 7700
810
+ ```
811
+
812
+ ### Mailcatcher (Dev/Staging Only)
813
+
814
+ ```yaml
815
+ apiVersion: apps/v1
816
+ kind: Deployment
817
+ metadata:
818
+ name: mailcatcher
819
+ namespace: {namespace}
820
+ labels:
821
+ app: mailcatcher
822
+ environment: dev
823
+ spec:
824
+ replicas: 1
825
+ selector:
826
+ matchLabels:
827
+ app: mailcatcher
828
+ template:
829
+ metadata:
830
+ labels:
831
+ app: mailcatcher
832
+ spec:
833
+ containers:
834
+ - name: mailcatcher
835
+ image: schickling/mailcatcher:latest
836
+ ports:
837
+ - containerPort: 1025
838
+ name: smtp
839
+ - containerPort: 1080
840
+ name: http
841
+ resources:
842
+ requests:
843
+ cpu: 50m
844
+ memory: 64Mi
845
+ limits:
846
+ cpu: 100m
847
+ memory: 128Mi
848
+ ---
849
+ apiVersion: v1
850
+ kind: Service
851
+ metadata:
852
+ name: mailcatcher-svc
853
+ namespace: {namespace}
854
+ spec:
855
+ type: ClusterIP
856
+ selector:
857
+ app: mailcatcher
858
+ ports:
859
+ - name: smtp
860
+ port: 1025
861
+ targetPort: 1025
862
+ - name: http
863
+ port: 1080
864
+ targetPort: 1080
865
+ ```
866
+
867
+ **Note**: Mailcatcher should ONLY be deployed in dev/staging environments. In production,
868
+ use a real SMTP service (e.g., AWS SES, SendGrid, Mailgun) and point `MAIL_HOST`/`MAIL_PORT`
869
+ to it via ConfigMap.