anthropics/skills180kfrontend-design
Guidance for distinctive, intentional visual design when building new UI or reshaping an existing one. Helps with aesthetic direction, typography, and making choices that don't read as templated defaults.
前端开发
Helps DevOps engineers configure mirrord Operator's Temporal task queue splitting feature end-to-end. Generates the MirrordSplitConfig and MirrordPropertyList Kubernetes CRD YAMLs, the matching mirrord.json split_queues section with message_filter and jq_filter, and Helm value guidance. Use this skill whenever the user mentions Temporal splitting with mirrord, Temporal task queue splitting, splitting a Temporal worker, configuring mirrord with Temporal or Temporal Cloud, routing Temporal workflow or activity tasks to a local worker, or troubleshooting Temporal splitting sessions. Also trigger on split_queues with queue_type Temporal, or connecting mirrord to a Temporal frontend. This is an alpha Team/Enterprise feature of mirrord.
把这段话发给 Claude Code、Codex 或 Cursor。智能体会先检查安全性,你确认后才安装。
读取 https://funcoding.ai/skills/metalbear-co/mirrord/mirrord-temporal/install.md ,按里面的步骤帮我安装这个 Skill。
Temporal splitting is configured with
MirrordSplitConfig(which task queues to split + how the worker finds their names) andMirrordPropertyList(the Temporal frontend connection). Temporal has no native way to split a task queue, so the operator does it with a small gRPC proxy and virtual task queues — see "How it works" below. This is an alpha feature. Requires operator 3.170.0+ and CLI 3.221.0+.
IMPORTANT: Follow these security rules for all operations in this skill.
MirrordPropertyList YAML. Reference a Kubernetes Secret with valueFrom.secretKeyRef per property.kubectl create secret generic ... --from-file=... reading values from files (then delete the files). Do not suggest --from-literal for credential values — it exposes secrets in argv/shell history.^[a-z0-9]([a-z0-9-]{0,61}[a-z0-9])?$ and reject shell metacharacters before interpolating into commands.kubectl get / kubectl config calls are read-only and safe. Never run kubectl apply/create/delete or helm install/upgrade on the user's behalf — present generated YAML and cluster-modifying commands for the user to review and run themselves.Guide DevOps engineers through the full setup of mirrord Operator's Temporal task queue splitting:
operator.temporalSplitting (and optionally set the proxy port)feature.split_queues section developers use to filter tasks (message_filter on task metadata, jq_filter on task content)When a Temporal splitting session starts, the operator starts polling the real task queue itself, buffering tasks in memory. It patches the deployed worker to poll a main virtual task queue and to talk to an operator-hosted Temporal proxy instead of the real frontend. The proxy serves polls for the virtual queues from the buffered tasks and forwards everything else (task completions, heartbeats) to the real frontend unchanged.
Each user session gets its own session virtual task queue; the operator routes tasks matching that user's filter to it, and everything else to the main virtual queue read by the deployed worker. Tasks still buffered when a session ends overflow back to the main queue so they are not lost. If two users' filters match the same task, it goes to whichever session started most recently.
Step 1: Load reference files
references/temporal-property-list.md — MirrordPropertyList field spec for Temporal: connection properties, TLS/mTLS, Temporal Cloudreferences/temporal-split-config.md — MirrordSplitConfig field spec for kind: temporal queues, per-queue options, drain timeoutAlways read the relevant reference for any resource you generate.
Step 2: Inspect the cluster (if kubectl is available)
kubectl config current-context
kubectl cluster-info 2>/dev/null | head -5
# Operator present?
kubectl get ns mirrord --no-headers 2>/dev/null
kubectl get deploy mirrord-operator -n mirrord --no-headers 2>/dev/null
# Temporal splitting enabled? (CRDs are defined when operator.temporalSplitting is on)
kubectl get crd mirrordsplitconfigs.queues.mirrord.metalbear.co --no-headers 2>/dev/null
kubectl get crd mirrordpropertylists.mirrord.metalbear.co --no-headers 2>/dev/null
# Existing configs
kubectl get mirrordsplitconfigs --all-namespaces --no-headers 2>/dev/null
kubectl get mirrordpropertylists --all-namespaces --no-headers 2>/dev/null
If the operator is missing and the cluster has no mirrord for Teams license, an AI agent can offer the user a seven-day Enterprise trial and, once they agree, start it and install the operator: see the mirrord-operator skill, "Agent-started trial".
Inspect the target worker to extract container names and env vars, and look for the Temporal frontend service:
kubectl get deployment/<name> -n <ns> -o yaml 2>/dev/null # or statefulset / rollout
kubectl get svc --all-namespaces --no-headers 2>/dev/null | grep -i temporal
This auto-discovery reduces the questions you need to ask (frontend address from a Temporal service; task queue / address / namespace env vars from the worker's pod spec). If kubectl isn't available, ask.
Step 3: Gather remaining context
For MirrordPropertyList:
host:port or full URL) and Temporal namespaceFor MirrordSplitConfig:
MirrordPropertyList name to referenceRemind the user once, early, to enable Temporal splitting:
operator:
temporalSplitting: true
# Optional — the operator's Temporal proxy port (default 7233):
# temporalProxy:
# port: 7233
When enabled, the operator runs a Temporal proxy that deployed workers connect to during a split.
Rules:
MirrordSplitConfig) — the recommended primary location, and it wins if a list of the same name also exists in the operator's namespace. The operator (3.191.0+) also looks the list up in its own namespace as a fallback, so one connection config can be shared across many teams/namespaces — only reach for that when the user explicitly wants a shared config. ConfigMap/Secret refs inside the list resolve in whichever namespace the list itself was found in.address and namespace are required. A bare host:port address gets its scheme from the tls setting.valueFrom.secretKeyRef for any credential (apiKey, tlsClientCert, tlsClientKey, and typically tlsCaCert).tls* property implies tls: "true". tlsClientCert and tlsClientKey always go together — setting only one fails when the split starts.tls: "true" + apiKey (publicly trusted cert). A private CA needs tlsCaCert; mTLS needs tlsClientCert + tlsClientKey.apiVersion: mirrord.metalbear.co/v1
kind: MirrordPropertyList
metadata:
name: temporal-config
namespace: <target-namespace>
spec:
properties:
- name: address
value: temporal-frontend.temporal.svc.cluster.local:7233
- name: namespace
value: default
# tls / apiKey / tlsCaCert / tlsClientCert / tlsClientKey via secretKeyRef as needed
See references/temporal-property-list.md for the full property table, Temporal Cloud, and mTLS examples.
Note to convey: TLS applies to the operator → Temporal frontend connection. Deployed workers patched into a split talk to the operator's in-cluster proxy over plaintext gRPC.
Rules:
spec.targetRef = { apiVersion, kind, name } (Deployment/StatefulSet/Rollout).spec.queues[] needs id, kind: temporal, a clientConfig (the MirrordPropertyList name; or set once via spec.clientConfigs.temporal), and appConfig.taskQueue.appConfig.temporalAddress (optional) names the env var holding the frontend address — the operator patches it so the worker connects to the operator's proxy. appConfig.temporalNamespace (optional) names the env var holding the Temporal namespace.appConfig field uses the same source structure as other queue services: env, envLike, volume (read from a file mounted from a ConfigMap volume instead of an env var — operator 3.198.0+), podFile (read from a file that exists only inside the running pods, e.g. Vault- or CSI-injected, with no ConfigMap/Secret behind it — operator 3.201.0+), fallback, valueSelector, valuePattern, containers.max_buffered_tasks) live in a separate MirrordPropertyList referenced by the queue's queueConfig.spec.drainTimeout (seconds) keeps the split's temporary resources alive after the last session ends so a new session can reuse them; unset or 0 tears down immediately. It does not wait for in-flight work.apiVersion: queues.mirrord.metalbear.co/v1
kind: MirrordSplitConfig
metadata:
name: <workload>-split
namespace: <target-namespace>
spec:
targetRef:
apiVersion: apps/v1
kind: Deployment
name: <workload-name>
clientConfigs:
temporal: temporal-config
queues:
- id: <queue-id>
kind: temporal
appConfig:
taskQueue:
- env: <TASK_QUEUE_ENV_VAR>
containers: [<container>]
temporalAddress:
- env: <ADDRESS_ENV_VAR>
temporalNamespace:
- env: <NAMESPACE_ENV_VAR>
The operator can only read the worker's env vars if they are defined directly in the pod template (value, or valueFrom a ConfigMap reference) or loaded from ConfigMaps via envFrom. Vault-style injected env vars are invisible to it as env vars — but a podFile source (operator 3.201.0+) can read the same value straight from the rendered file (see references/temporal-split-config.md).
Show the developer-facing config referencing the queue IDs. Temporal uses queue_type: "Temporal". Two filter kinds, and you can combine them:
Filter on task metadata (message_filter):
{
"operator": true,
"target": "deployment/<workload>",
"feature": {
"split_queues": {
"<queue-id>": {
"queue_type": "Temporal",
"message_filter": { "workflow_id": "^test-local-" }
}
}
}
}
Supported message_filter keys — each maps a key to a regex, and all specified entries must match:
workflow_id — the workflow IDworkflow_type — the workflow type nameactivity_type — the activity type nameheader.<name> — a Temporal header value (e.g. header.x-user)An empty message_filter: {} with no jq_filter is match-none (the local worker gets zero tasks).
Composable metadata filter (filter) — NEW, alternative to message_filter:
{
"operator": true,
"target": "deployment/<workload>",
"feature": {
"split_queues": {
"<queue-id>": {
"queue_type": "Temporal",
"filter": {
"any_of": [
{ "metadata": "^header.baggage: .*mirrord-session={{ key }}.*$" },
{ "metadata": "^header.test: .*mirrord-session={{ key }}.*$" }
]
}
}
}
}
}
filter takes a single { "metadata": "<regex>" }, or an any_of/all_of list of them. Each metadata regex is matched against every task metadata entry (the same keys message_filter supports — workflow_id, header.<name>, search attributes, …) rendered as <name>: <value>. Use either filter or message_filter on an entry, not both. Requires mirrord 3.264.0+ and operator 3.212.0+. A metadata regex can't be verified against a specific attribute name, so a queue covered by a splitQueues policy rule rejects a lone metadata filter the same way it rejects a lone jq_filter — use message_filter there instead.
Filter on task content (jq_filter):
{
"operator": true,
"target": "deployment/<workload>",
"feature": {
"split_queues": {
"<queue-id>": {
"queue_type": "Temporal",
"jq_filter": "(.input[0] | startswith(\"test-jq-\"))"
}
}
}
}
jq_filter runs a jq program over a JSON doc the operator builds per task. Every doc has task_type ("activity" or "workflow"):
workflow_namespace, workflow_id, run_id, workflow_type, activity_type, activity_id, attempt, header, input (array of decoded payloads)workflow_id, run_id, workflow_type, attempt, task_queue, cron_schedule, identity, first_execution_run_id, header, search_attributes, memo, inputA task matches if the program outputs true.
Notes to convey:
queue_mode: "mirror" is not supported for Temporal — a Temporal task is always stolen (only the matching local worker gets it). Don't offer mirror mode.filter/message_filter and a jq_filter are both set, both must match.queue_id per entry.operator.injectSessionKeyHeader enabled, tasks routed to a session are stamped with a mirrord-key activity task header. Workflow tasks are never stamped (their header lives in replayed workflow history).If the user has the mirrord-config skill, point them there for the full mirrord.json.
MirrordPropertyList (in the target's namespace, or the operator's namespace if sharing) has both address and namespace.tlsClientCert and tlsClientKey are either both set or both absent.apiKey and TLS material come from secretKeyRef.MirrordSplitConfig is in the target's namespace with spec.targetRef (apiVersion, kind, name).id, kind: temporal, a clientConfig (or spec.clientConfigs.temporal), and appConfig.taskQueue.kind (targetRef) is one of Deployment, StatefulSet, Rollout.clientConfig resolves to a MirrordPropertyList, looked up in the target's namespace first, then the operator's namespace (operator 3.191.0+).target matches the MirrordSplitConfig targetRef.queue_type: "Temporal" and no queue_mode: "mirror".appConfig are readable by the operator (pod template value/ConfigMap valueFrom, or envFrom ConfigMaps).podFile source (operator 3.201.0+) to read it straight from the injected file.max_buffered_tasks (overflow goes to the deployed worker's main queue).drainTimeout: 0 / unset → immediate teardown; in-flight work may be lost.grpc compression not supported → the operator's Temporal proxy doesn't support gRPC compression, but temporalio's Python SDK enables gzip by default. Disable it on the worker client, e.g. grpc_compression=GrpcCompression.NONE on Client.connect.Present results as:
✅ Validation passed
⚠️ Warning: [description + workaround]
❌ Error: [what's wrong + how to fix]
Full setup: brief overview of the 2 resources → MirrordPropertyList YAML → MirrordSplitConfig YAML → example mirrord.json → validation → warnings.
Single resource: YAML → validation → warnings.
Troubleshooting: ask for the operator version (kubectl get deploy mirrord-operator -n mirrord -o jsonpath='{.spec.template.spec.containers[0].image}'), check splitting status with mirrord queues status / kubectl get queuesplits -A (operator + CLI 3.223.0+), and suggest checking operator logs (kubectl logs -n mirrord deployment/mirrord-operator --tail 100).
"Set up Temporal splitting for my worker" → ask for frontend address + namespace, auth, workload name/namespace, task queue env var → generate MirrordPropertyList + MirrordSplitConfig + mirrord.json example.
"We use Temporal Cloud" → address = <ns>.<id>.tmprl.cloud:7233, namespace = <ns>.<id>, tls: "true", apiKey via Secret — or mTLS with tlsClientCert + tlsClientKey for certificate-based auth.
"Our frontend uses a private CA / mTLS" → tlsCaCert for the private CA; add tlsClientCert + tlsClientKey (always together) for mTLS, all via one Secret.
"Only route my test workflows to my laptop" → message_filter on workflow_id (e.g. "^test-local-"), or on a header / search attribute the app already sets.
"Filter on a workflow's input payload" → jq_filter over .input, e.g. (.input[0] | fromjson | .tenantId == \"acme\") when the payload is JSON.
"Two of us need the same task queue" → each developer sets their own filter; explain that a task matching both filters goes to the most recently started session.
"Tasks pile up while I'm on a breakpoint" → set max_buffered_tasks in a queueConfig property list; overflow goes back to the deployed worker.
queue_mode: "mirror" for Temporal — it's not supported; Temporal tasks are steal-only.kind: kafka field names (topic, groupId, appId) in a Temporal queue — Temporal uses taskQueue, temporalAddress, temporalNamespace.tlsClientCert/tlsClientKey — the split fails at start.secretKeyRef.MirrordPropertyList to the operator's namespace — the target's namespace is the recommended default; only use the operator's namespace (operator 3.191.0+) when the user wants to share one connection config across namespaces.mirrord-key stamping — only activity tasks carry the session key header.
anthropics/skills180kGuidance for distinctive, intentional visual design when building new UI or reshaping an existing one. Helps with aesthetic direction, typography, and making choices that don't read as templated defaults.
前端开发
anthropics/skills180kSuite of tools for creating elaborate, multi-component claude.ai HTML artifacts using modern frontend web technologies (React, Tailwind CSS, shadcn/ui). Use for complex artifacts requiring state management, routing, or shadcn/ui components - not for simple single-file HTML/JSX artifacts.
前端开发
addyosmani/agent-skills103kGuides stable API and interface design. Use when designing APIs, module boundaries, or any public interface. Use when creating REST or GraphQL endpoints, defining type contracts between modules, or establishing boundaries between frontend and backend.
前端开发
addyosmani/agent-skills103kBuilds production-quality, accessible, responsive user-facing UIs. Use when building or modifying interfaces and pages, creating components, implementing layouts, meeting WCAG accessibility requirements, managing state, or when the output needs to look and feel production-quality rather than AI-generated.
前端开发
addyosmani/agent-skills103kOptimizes application performance across frontend, backend, queries, and databases. Use when performance requirements exist, when you suspect performance regressions, when Core Web Vitals or load times need improvement, when N+1 query patterns need fixing, or when profiling reveals bottlenecks.
前端开发
nexu-io/open-design100kOpenDesign's feature business case for the plugin marketplace: the user pain, options, tradeoffs, and the measure of success. Built as a decision-grade product management deck for PM, eng, design, leadership.
前端开发