Writing Skills
writing-skills
效率与协作技能,来自 obra/superpowers,查看原文获取完整用途和操作说明。
mirrord-config【部署与运维】Helps users generate, edit, and validate mirrord.json configuration files for mirrord (MetalBear). Use when the user wants to connect their local process to a Kubernetes environment, configure features (env/fs/network), or needs feedback on an existing mirrord.json. Always ensures output JSON is valid and schema-conformant.
独立 GitHub 快照 · 自动分类 · 以原作者文档为准
Generate and validate mirrord.json configuration files:
Step 1: Look up options when you need them
Do not read reference files up front. To look up an option, call explain_config_option if the mirrord MCP server is connected; otherwise search references/configuration.md in this skill's references/ directory for it.
If using absolute paths, these are located relative to this skill's installation directory. Search for them if needed using patterns like **/mirrord-config/references/*.
Step 2: Pick the validator Use the first of these that is available:
validate_config tool.mirrord verify-config <file>.references/schema.json, after parsing the config as strict JSON: read only the schema's top level (root properties, required, additionalProperties) and the definitions for the options the config uses (search the file for each key), not the whole file. Do NOT run installers, package managers, or remote scripts automatically; if the user wants CLI validation, ask them to install mirrord themselves via their approved process.Open the schema only in the third case.
Step 3: Validate before presenting Every generated or modified config must pass the Validation Workflow below (see "Validation Workflow") before you present it to the user.
fs.modeThe single most common wrong config. An agent reasons "the app must run my local source, so I need a local filesystem mode" and sets fs.mode to local or localwithoverrides. This is backwards. mirrord already reads your code locally in every fs mode, including the default read.
A built-in local-by-default list applies in all modes — it covers the process's current working directory (your entire project tree), the executable being run, common runtime and package-manager paths, source and build artifacts by extension, system paths, and hidden files under $HOME. The full list, with its provenance in the mirrord source, is in references/fs-mode-internals.md.
So ts-node, nodemon, python -m, go run, dotnet watch etc. all load local source under the default config. No fs setting is needed for that. What fs.mode: "read" gives you on top is the pod's config files, secrets and mounted volumes — which is usually the entire reason to use mirrord.
Consequences of getting this wrong: setting local or localwithoverrides silently cuts the app off from the remote pod's ConfigMaps, mounted Secrets, TLS certs and volumes. The app often still starts, then fails later in a way that looks unrelated to mirrord.
Correct reasons to reach for these modes — all of them are about the remote FS, never about local code:
| Need | Mode |
|---|---|
| Read pod config/secrets/volumes (almost always) | read — the default, so omit fs entirely |
| App must write files that land in the pod | write, or list paths in fs.read_write |
| Reading the pod's FS actively breaks the app, and you need nothing from it | local |
Same as local, but cluster DNS must keep working | localwithoverrides |
localwithoverrides reads only /etc/resolv.conf, /etc/hosts and /etc/hostname remotely by default — plus whatever you add to fs.read_only / fs.read_write. It is a rescue for local mode, not an upgrade to read. If you did not already need local, you do not need localwithoverrides. (See references/fs-mode-internals.md for the underlying default lists.)
Every key in a generated config must be traceable to something the user actually asked for or a failure they actually reported. Do not add options because they seem prudent, and never present a change as required when it is a guess.
network.outgoing.tcp/udp default to true). An outgoing.filter is only correct when the user has stated that a specific destination must be reached from their machine, e.g. a service on their VPN that the cluster cannot route to. Adding a filter does not fix cluster-side timeouts.User describes what they want without providing JSON.
User provides JSON to check.
User wants changes to their config.
{
"type": "Success",
"warnings": [],
"compatible_target_types": [...]
}
Target selection:
"target": "pod/name" or {"path": "pod/name", "namespace": "staging"}operator if using operator modekube_context if neededFeatures:
"env": true - Mirror environment variables"env": {"include": "VAR1;VAR2"} - Selective inclusion"fs": "read" - Read pod files, write locally. This is the default — omit it unless overriding"network": true - Enable network mirroring"network": {"incoming": {"mode": "steal"}} - Steal incoming trafficNetwork modes:
incoming.mode values (e.g., "steal", "mirror", "off")Templating:
"target": "{{ get_env(name=\"TARGET\", default=\"pod/fallback\") }}"{{key}}, use it verbatim — do not expand it into a get_env() call or any other Tera expression. The user's {{key}} is the value they want.fs setting required; local code is already local in every mode. Do not set local/localwithoverridesoutgoing.filter or an fs mode change and present it as a fixIf request is under-specified, ask for ONE detail:
Otherwise provide safe defaults and note assumptions.
Every generated or modified config MUST be validated before presentation. Never skip validation.
Must enforce on every config:
additionalProperties where schema forbids themSteps:
validate_config on the config.mirrord verify-config <file>. Do not treat the CLI as a prerequisite for this skill.references/schema.json, after parsing the config as strict JSON: read only the schema's top level (root properties, required, additionalProperties) and the definitions for the options the config uses (search the file for each key), not the whole file.Path notation for errors:
Use JSON Pointer style: /feature/network/incoming/mode
"Connect to pod api-7c8d9 in staging, steal traffic on port 8080, exclude secret env vars"
→ Read references, generate a minimal config with target, network.incoming, and env.exclude. Default to a filtered steal on the session key so only requests tagged for this session reach the local app, and the rest of the cluster's traffic is left alone:
{
"target": {
"path": "pod/api-7c8d9",
"namespace": "staging"
},
"feature": {
"env": {
"exclude": "SECRET_ENV"
},
"network": {
"incoming": {
"mode": "steal",
"http_filter": {
"header_filter": "^baggage: .*mirrord-session={{ key }}.*quot;
}
}
}
}
}
The local app listening on port 8080 is what makes mirrord steal that port — no port key is needed, so none is added. Requests reach the local app only when they carry mirrord-session=<key> in their W3C baggage header. Drop http_filter only when the user explicitly wants every request on the port.
User provides invalid JSON with trailing comma → Parse error → Fix syntax → Validate against schema → Explain issues → Provide corrected config
"Is my config valid?" + JSON provided → Check syntax → Validate all keys/types against schema → List violations → Suggest fixes