skill-bridge
Bring a non-mavis skill into the mavis world. The skill itself is the thin LLM-facing layer; the heavy lifting lives in the stdio MCP server declared in mcp.json at the plugin root.
The MCP server exposes four tools, named after the original v0.1 CLI subcommands:
| Tool |
Purpose |
detect(source) |
Identify UTF-8 vs GBK; restore mojibake if needed. |
analyze(source) |
Full report: frontmatter, body, hardcoded paths, external commands. |
classify(source) |
One of pure (translatable), pure-wrapped-fix, wrapped-*, or abandon. |
convert(source, target_dir, force?, run_lint?) |
Run the full pipeline; write to target_dir. Lint runs unless run_lint=false. |
source accepts either an absolute path to a SKILL.md file or to a directory containing one. target_dir is an absolute path that will be created or replaced atomically.
When to use this skill
- The user has an
openclaw workspace (or any non-mavis skill bundle) and wants to use those skills inside mavis.
- The user found a skill on GitHub written in a different agent framework and wants to reuse it.
- The user wrote a
SKILL.md themselves years ago and wants to bring it up to mavis's current schema.
Do not use this skill for:
- Creating a new skill from scratch →
skill-creator
- Fixing or refining an existing mavis skill →
skill-refiner
- Listing what skills are available → read
<available_skills> from the system prompt
Inputs to collect
- Source path: an absolute path to either a
SKILL.md file or to a folder containing one. If the user gave a relative path, resolve it against the user's cwd before calling the tool.
- Output path: an absolute path for the converted skill. Default: a folder whose basename matches the kebab-case name. If the user names a scope:
- user →
<homedir>/.minimax/skills/<name>/
- agent →
<homedir>/.minimax/agents/mavis/skills/<name>/
- project →
<repo>/.minimax/skills/<name>/
- Force overwrite (optional): only confirm with the user if the target already exists. The server is safe to re-run;
force is informational.
Procedure
- Detect the source. Call
detect(source) and inspect encoding.
- If
encoding === "unknown", warn the user before continuing.
- If
encoding === "gbk" and replaced === true, tell the user the source was GBK and we restored it.
- Analyze the full report. Call
analyze(source) and check hardcodedPaths and externalCommands.
- Non-empty
externalCommands → the skill is likely wrapped-* (v0.2 only emits pure; stop and tell the user).
- Classify. Call
classify(source). In v0.2, proceed only if tier === "pure".
- Convert. Call
convert(source, target_dir).
- If the tool returns
ok: false with tier: "abandon" or tier: "wrapped", stop and explain why.
- If
ok: true, read target_dir/conversion-report.md and surface the warnings array to the user verbatim.
- Skim
target_dir/SKILL.md. If anything looks wrong (missing section, garbled encoding, broken path), tell the user before claiming success.
- Lint feedback. The
convert response already includes the lint object (ok, code, stdout, stderr). If ok === false, surface the lint output and do not claim the conversion is done.
- Tell the user what was written, what to review, and how to use the new skill. Suggest
skill({name: "<converted-name>"}) to verify it loads.
Output contract
- A directory at
target_dir containing at minimum:
SKILL.md — mavis-schema-compliant
conversion-report.md — what was changed
- optionally
references/<topic>.md if the body was split
The server replaces target_dir atomically: at every observable point in time the directory is either the OLD content or the NEW content, never empty or half-written. Re-running with the same target_dir is always safe.
Failure handling
tier: abandon from classify → do not write; explain the reason to the user.
tier: wrapped in v0.2 → tell the user the server only supports pure right now; v0.3 will add wrapped.
lint.ok === false → do not claim success; show the lint.stdout and lint.stderr verbatim.
encoding === "unknown" → ask the user to confirm the source is genuinely UTF-8 before writing.
- Target already exists → atomic replace happens by default; only ask the user if you want to confirm before overwriting.
Examples
Input: /path/to/openclaw/skills/task-tracker
Good path:
detect(...) → utf-8, no replacement.
classify(...) → pure / pure-wrapped-fix (one hardcoded path group).
convert(source, target_dir) → ok: true, two warnings about path parameterization.
- Confirm
lint.ok === true, surface the two warnings to the user.
Bad path: copy the SKILL.md to <homedir>/.minimax/agents/mavis/skills/<name>/ directly. The user's previous attempt at this failed because (a) the path is not in the mavis scan list and (b) GBK content was not detected.
Additional resources
references/compatibility-matrix.md — known openclaw skills and their tier
references/path-patterns.md — the hardcoded path patterns we replace
- The MCP server itself: see
mcp.json + server.mjs in the plugin root
- The plan that produced this skill: see the plugin's
README.md
1---2name: skill-bridge3description: Convert an openclaw (or similar) skill folder into a mavis/mcode-compatible skill via the bundled stdio MCP server `skill-bridge`. Use when the user wants to migrate a skill from openclaw, reuse a skill from another framework, or port a hand-written skill that does not follow the mavis schema. Do NOT use to create a brand-new skill from scratch (use `skill-creator` instead), or to lint/refine an existing mavis skill (use `skill-refiner`).4---56# skill-bridge78Bring a non-mavis skill into the mavis world. The skill itself is the **thin LLM-facing layer**; the heavy lifting lives in the stdio MCP server declared in `mcp.json` at the plugin root.910The MCP server exposes four tools, named after the original v0.1 CLI subcommands:1112| Tool | Purpose |13| --- | --- |14| `detect(source)` | Identify UTF-8 vs GBK; restore mojibake if needed. |15| `analyze(source)` | Full report: frontmatter, body, hardcoded paths, external commands. |16| `classify(source)` | One of `pure` (translatable), `pure-wrapped-fix`, `wrapped-*`, or `abandon`. |17| `convert(source, target_dir, force?, run_lint?)` | Run the full pipeline; write to `target_dir`. Lint runs unless `run_lint=false`. |1819`source` accepts either an absolute path to a `SKILL.md` file or to a directory containing one. `target_dir` is an absolute path that will be created or replaced atomically.2021## When to use this skill2223- The user has an `openclaw` workspace (or any non-mavis skill bundle) and wants to use those skills inside mavis.24- The user found a skill on GitHub written in a different agent framework and wants to reuse it.25- The user wrote a `SKILL.md` themselves years ago and wants to bring it up to mavis's current schema.2627Do **not** use this skill for:2829- Creating a new skill from scratch → `skill-creator`30- Fixing or refining an existing mavis skill → `skill-refiner`31- Listing what skills are available → read `<available_skills>` from the system prompt3233## Inputs to collect3435- **Source path**: an absolute path to either a `SKILL.md` file or to a folder containing one. If the user gave a relative path, resolve it against the user's cwd before calling the tool.36- **Output path**: an absolute path for the converted skill. Default: a folder whose basename matches the kebab-case name. If the user names a scope:37 - user → `<homedir>/.minimax/skills/<name>/`38 - agent → `<homedir>/.minimax/agents/mavis/skills/<name>/`39 - project → `<repo>/.minimax/skills/<name>/`40- **Force overwrite (optional)**: only confirm with the user if the target already exists. The server is safe to re-run; `force` is informational.4142## Procedure43441. **Detect** the source. Call `detect(source)` and inspect `encoding`.45 - If `encoding === "unknown"`, warn the user before continuing.46 - If `encoding === "gbk"` and `replaced === true`, tell the user the source was GBK and we restored it.472. **Analyze** the full report. Call `analyze(source)` and check `hardcodedPaths` and `externalCommands`.48 - Non-empty `externalCommands` → the skill is likely `wrapped-*` (v0.2 only emits `pure`; stop and tell the user).493. **Classify**. Call `classify(source)`. In v0.2, proceed only if `tier === "pure"`.504. **Convert**. Call `convert(source, target_dir)`.51 - If the tool returns `ok: false` with `tier: "abandon"` or `tier: "wrapped"`, stop and explain why.52 - If `ok: true`, read `target_dir/conversion-report.md` and surface the `warnings` array to the user verbatim.53 - Skim `target_dir/SKILL.md`. If anything looks wrong (missing section, garbled encoding, broken path), tell the user **before** claiming success.545. **Lint feedback**. The `convert` response already includes the `lint` object (`ok`, `code`, `stdout`, `stderr`). If `ok === false`, surface the lint output and do not claim the conversion is done.556. **Tell the user** what was written, what to review, and how to use the new skill. Suggest `skill({name: "<converted-name>"})` to verify it loads.5657## Output contract5859- A directory at `target_dir` containing at minimum:60 - `SKILL.md` — mavis-schema-compliant61 - `conversion-report.md` — what was changed62 - optionally `references/<topic>.md` if the body was split6364The server replaces `target_dir` atomically: at every observable point in time the directory is either the OLD content or the NEW content, never empty or half-written. Re-running with the same `target_dir` is always safe.6566## Failure handling6768- `tier: abandon` from `classify` → do not write; explain the reason to the user.69- `tier: wrapped` in v0.2 → tell the user the server only supports `pure` right now; v0.3 will add `wrapped`.70- `lint.ok === false` → do not claim success; show the `lint.stdout` and `lint.stderr` verbatim.71- `encoding === "unknown"` → ask the user to confirm the source is genuinely UTF-8 before writing.72- Target already exists → atomic replace happens by default; only ask the user if you want to confirm before overwriting.7374## Examples7576**Input**: `/path/to/openclaw/skills/task-tracker`7778**Good path**:791. `detect(...)` → `utf-8`, no replacement.802. `classify(...)` → `pure / pure-wrapped-fix` (one hardcoded path group).813. `convert(source, target_dir)` → `ok: true`, two warnings about path parameterization.824. Confirm `lint.ok === true`, surface the two warnings to the user.8384**Bad path**: copy the `SKILL.md` to `<homedir>/.minimax/agents/mavis/skills/<name>/` directly. The user's previous attempt at this failed because (a) the path is not in the mavis scan list and (b) GBK content was not detected.8586## Additional resources8788- `references/compatibility-matrix.md` — known openclaw skills and their tier89- `references/path-patterns.md` — the hardcoded path patterns we replace90- The MCP server itself: see `mcp.json` + `server.mjs` in the plugin root91- The plan that produced this skill: see the plugin's `README.md`