sim-helm
Sim-helm is a diagnostic-first operations skill for deploying, upgrading, and troubleshooting the Sim Helm chart on Kubernetes clusters. Use it when installing Sim, authoring or debugging values.yaml files, resolving pod startup failures, managing secrets through inline values or External Secrets Operator, or wiring Sim into external secret managers like Vault or AWS Secrets Manager. The skill systematically captures cluster context, secret strategy, and database configuration before recommending actions.
git clone --depth 1 https://github.com/simstudioai/sim /tmp/sim-helm && cp -r /tmp/sim-helm/helm/sim/.claude/skills/sim-helm ~/.claude/skills/sim-helmSKILL.md
# Sim Helm Chart — Operations Skill This skill helps an agent deploy and operate the **Sim** Helm chart at `helm/sim/` in the [simstudioai/sim](https://github.com/simstudioai/sim) repository. Use it when the user is installing, upgrading, troubleshooting, or authoring values for the Sim chart. The skill is **diagnostic-first**: capture context, classify the situation, load only the references that apply, then act. Do not dump the README at the user. Do not invent values that are not in their current state. --- ## Workflow — follow in order ### 1. Capture context Before recommending anything, ask (or infer from the conversation) all of these. **Never skip this step.** A wrong assumption here corrupts every downstream step. | Question | Why it matters | |---|---| | Cluster: EKS / GKE / AKS / OpenShift / kind / other? | Storage class, ingress class, identity provider differ | | Secret strategy: inline `--set`, pre-existing K8s Secret, or External Secrets Operator (ESO)? | The chart has three distinct code paths | | Postgres: chart-bundled, or external (RDS / Cloud SQL / Azure DB)? | Different value blocks (`postgresql.*` vs `externalDatabase.*`) | | Public-facing? Ingress class? TLS? | `ingress.enabled`, `ingress.className`, cert-manager wiring | | HA? (target replicas) | Drives `autoscaling.enabled`, `app.replicaCount`, PDB activation | | Existing values.yaml the user is editing? | Always read it before proposing a diff — never write blind | If the user has a `values.yaml`, read it. If they don't, ask before writing one. ### 2. Diagnose Map the user's request to one of these categories and load the matching reference(s): | Situation | Reference | |---|---| | User wants to install for the first time | `references/install-paths.md` then `references/secrets.md` | | User needs to generate the required secrets | `references/secrets.md` | | User asks "what does this value do" / wants to author values.yaml | `references/values-model.md` | | Pod won't start, error message, `CrashLoopBackOff`, image pull error, ingress not routing | `references/troubleshooting.md` | | User asks about ESO / Vault / AWS Secrets Manager / Azure Key Vault / GCP Secret Manager | `references/install-paths.md` (ESO section) | | User asks "is X production-ready" / autoscaling / network policy / security context | Read the README's "Production checklist" section directly — no separate reference | Load **only** what the situation requires. Loading every reference burns tokens and produces vague answers. ### 3. Propose When proposing values changes: - Show the **minimal diff** against the user's current values.yaml. Don't rewrite the file. - Name the **risk** (e.g., "this puts the secret in `helm get values` output — fine for dev, not for prod"). - Name the **rollback** (e.g., "if this breaks, `helm rollback sim 1` reverts"). - Cite the canonical source (`helm/sim/values.yaml` line numbers, README section, or this skill's reference file). ### 4. Validate before applying Always run these before telling the user to `helm install` / `helm upgrade`: ```bash # Schema + value validation helm lint helm/sim --values <user-values>.yaml # Render full manifest set to catch template errors helm template sim helm/sim --values <user-values>.yaml > /tmp/render.yaml # For upgrades, render against the live release first helm upgrade --dry-run sim helm/sim --values <user-values>.yaml ``` If lint or template fails, fix the values — do not work around chart validation. The chart's `fail` statements exist to catch misconfigurations that would otherwise surface as `CrashLoopBackOff` at runtime. ### 5. Deliver Every recommendation should include: - The exact command(s) to run - A one-line summary of what will change - The success signal (e.g., "`kubectl rollout status deploy/sim-app` returns Ready") - The rollback command if something breaks --- ## Quick reference — the three secret modes | Mode | When | Code path | |---|---|---| | **Inline (`--set`)** | Dev / kind / dry-run only. Values leak into `helm get values`. | `app.env.<KEY>: "..."` | | **Pre-existing Secret** | GitOps with Sealed Secrets / SOPS, or hand-managed Secrets. Chart references a Secret you create. | `app.secrets.existingSecret.enabled: true` + `.name` | | **External Secrets Operator (recommended for prod)** | Vault, AWS SM, Azure KV, GCP SM. Chart renders an `ExternalSecret` that ESO syncs. | `externalSecrets.enabled: true` + `secretStoreRef` + `remoteRefs.app.<KEY>` | These modes are **mutually exclusive** for the app Secret. ESO takes precedence over inline. `existingSecret` takes precedence over inline. The chart **fails template rendering** when ESO is enabled and a required key (`BETTER_AUTH_SECRET`, `ENCRYPTION_KEY`, `INTERNAL_API_SECRET`, plus `CRON_SECRET` when cronjobs are enabled) is neither in `app.env` nor mapped in `remoteRefs.app` — see `references/install-paths.md`. --- ## Quick reference — the four required secrets | Key | Generate with | Notes | |---|---|---| | `BETTER_AUTH_SECRET` | `openssl rand -hex 32` | Session signing | | `ENCRYPTION_KEY` | `openssl rand -hex 32` | App-level encryption | | `INTERNAL_API_SECRET` | `openssl rand -hex 32` | Service-to-service auth (app ↔ realtime) | | `CRON_SECRET` | `openssl rand -hex 32` | Required iff `cronjobs.enabled=true` (default true) | Optional but commonly needed: | Key | Generate with | Notes | |---|---|---| | `API_ENCRYPTION_KEY` | `openssl rand -hex 32` | Must be **exactly 64 hex chars**. Required to encrypt user API keys at rest. | | `postgresql.auth.password` | `openssl rand -base64 24 \| tr -d '/+='` | Only if using chart-bundled Postgres. Must match `^[a-zA-Z0-9._-]+$` for DATABASE_URL compatibility. | See `references/secrets.md` for storage patterns and rotation guidance. --- ## Rules of engagement These are non-negotiable. Violating any of these has burned users in the past. 1. **Never recommend `--set` for production secrets.** They land in `helm get values` and Helm r
Create or update a Sim integration block with correct subBlocks, conditions, dependsOn, modes, canonicalParamId usage, outputs, and tool wiring. Use when working on `apps/sim/blocks/blocks/{service}.ts` or aligning a block with its tools.
Add or update a Sim knowledge base connector for syncing documents from an external source, including auth mode, config fields, pagination, document mapping, tags, and registry wiring. Use when working in `apps/sim/connectors/{service}/` or adding a new external document source.
Add a code-defined table enrichment (registry entry) under `apps/sim/enrichments/` backed by an ordered provider cascade, ensuring every provider tool it calls has hosted-key support. Use when adding a per-row table enrichment that fills cells via existing Sim tools.
Add hosted API key support to a tool so Sim provides the key (metered and billed to the workspace) when a user has not brought their own. Use when adding a `hosting` config to a tool under `apps/sim/tools/{service}/`.
Add a complete Sim integration from API docs, covering tools, block, icon, optional triggers, registrations, resolved-secret/model-input safety, and integration conventions. Use when introducing a new service under `apps/sim/tools`, `apps/sim/blocks`, and `apps/sim/triggers`.
Add a new LLM model to apps/sim/providers/models.ts with specs verified against the provider's live API docs (no hallucination)
Create tool configurations for a Sim integration by reading API docs
Create webhook or polling triggers for a Sim integration