Add gitops-argo-cd agent skill

Consolidates the five cogarchhubgitops-* source skills into one skill with
scope routing: ArgoCD Applications, Copier templates, Helm values, environment
answer files, and the end-to-end resource-addition walkthrough.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-07-29 23:48:32 +03:00
co-authored by Claude Opus 5
parent 89a9cf9320
commit 50d746d03f
11 changed files with 1615 additions and 1 deletions
@@ -0,0 +1,37 @@
{# ---------------------------------------------------------------------------
Template for cluster/argocd/{{ '<NNN>-<name>' if <domain>.<descriptor>_is_enabled }}/application.yaml.jinja
Replace:
<NNN>-<name> three-digit band number + kebab-case descriptor (e.g. 210-eso-operator-group)
<target-namespace> namespace the workload deploys into
<domain> copier.yaml domain object (operators, databases, applications, …)
<descriptor> this resource's key inside that domain
The parent directory name must be the Jinja2 conditional expression, and it must be
character-identical to the one used for the cluster/resources/ mirror.
--------------------------------------------------------------------------- #}
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
name: <NNN>-<name>
namespace: openshift-gitops
finalizers:
- resources-finalizer.argocd.argoproj.io
spec:
project: default
source:
repoURL: {{ gitops.repo_url }}
targetRevision: {{ gitops.branch }}
path: cluster/resources/<NNN>-<name>
helm:
valueFiles:
- values.yaml
destination:
server: https://kubernetes.default.svc
namespace: <target-namespace>
syncPolicy:
automated:
prune: true
selfHeal: true
syncOptions:
- CreateNamespace=true
@@ -0,0 +1,46 @@
# ---------------------------------------------------------------------------
# Snippet to merge into copier.yaml when adding a new cluster resource.
#
# Replace:
# <domain> existing domain object (operators, configuration, databases,
# advantage_mcp, applications) — never add a top-level variable
# <descriptor> this resource's key inside that domain
# <NNN>-<name> the directory / ArgoCD Application name
#
# The flag name used here must be the one appearing in BOTH conditional directory
# expressions (cluster/argocd/ and cluster/resources/).
# ---------------------------------------------------------------------------
<domain>:
<descriptor>_is_enabled:
type: bool
default: false
help: "Enable <NNN>-<name>"
<descriptor>:
image:
address:
type: str
default: ""
help: "Container image for <name>"
tag:
type: str
default: ""
help: "Container image tag for <name>"
replicas:
type: str
default: "1"
help: "Replica count for <name>"
# ---------------------------------------------------------------------------
# Matching snippet for <env>/copier-answers.yaml in each environment that should
# run this resource. Feature flags are YAML booleans; Helm string-booleans such as
# is_internal / maintenance are quoted strings — see references/environments.md §4.
# ---------------------------------------------------------------------------
#
# <domain>:
# <descriptor>_is_enabled: true
# <descriptor>:
# image:
# address: <registry>/<image>
# tag: <version>
@@ -0,0 +1,48 @@
{# ---------------------------------------------------------------------------
Template for cluster/resources/{{ '<NNN>-<name>' if <domain>.<descriptor>_is_enabled }}/values.yaml.jinja
Standalone-chart shape. For services sharing one release via a `global` block,
use the shared-chart shape in references/helm-values.md §4 instead.
The macro wrapper and the four-line stripping footer are mandatory — they remove
blank lines left by unexpanded Jinja2 constructs, which would otherwise break the
rendered YAML.
--------------------------------------------------------------------------- #}
{% macro render() %}
# values for <NNN>-<name>
replicaCount: {{ <domain>.get('<descriptor>', {}).get('replicas', 1) }}
image:
repository: {{ <domain>.get('<descriptor>', {}).get('image', {}).get('address', '') }}
tag: {{ <domain>.get('<descriptor>', {}).get('image', {}).get('tag', '') }}
pullPolicy: Always
imagePullSecrets:
- name: "storage-images"
service:
type: ClusterIP
port: 80
livenessProbe:
httpGet:
path: /health
port: <app-port>
periodSeconds: 60
readinessProbe:
httpGet:
path: /health
port: <app-port>
periodSeconds: 60
env:
targetPort: <app-port>
<env_var>: {{ <domain>.get('<descriptor>', {}).get('env', {}).get('<env_var>', '') }}
{% endmacro %}
{%- set result = render() -%}
{%- for line in result.split('\n') -%}
{% if line | trim | length != 0 -%}
{{ line }}
{% endif -%}
{%- endfor %}