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.
75
94%
Does it follow best practices?
Run evals on this skill
Adds up to 20 points to the overall score
View guide
Passed
No findings from the security scan
Generate and validate mirrord.json configuration files:
Step 1: Load references
Read BOTH reference files from this skill's references/ directory:
references/schema.json - Authoritative JSON Schemareferences/configuration.md - Configuration referenceIf 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: Check mirrord CLI availability
# Check if installed
which mirrordIf mirrord is not available:
references/schema.json until CLI validation is possibleStep 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/configuration.md → "fs.mode internals".
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/configuration.md → "fs.mode internals" 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:
references/schema.json. Schema validation is mandatory and sufficient.mirrord is already installed locally, save the config to a temporary file and run mirrord verify-config <file> for an extra check. Do not treat the CLI as a prerequisite for this skill.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:
{
"target": {
"path": "pod/api-7c8d9",
"namespace": "staging"
},
"feature": {
"env": {
"exclude": "SECRET_ENV"
},
"network": {
"incoming": {
"mode": "steal"
}
}
}
}The local app listening on port 8080 is what makes mirrord steal that port — no port key is needed, so none is added.
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