# Capability diagnostics
简体中文
·
Guide
·
Plugin packages
Reasonix ships a read-only capability diagnostics model shared by the CLI and
desktop **Settings → Diagnostics**. It reports Skills, Commands, Hooks, plugin
packages, MCP servers, and instruction docs (`AGENTS.md` / `REASONIX.md` /
`CLAUDE.md`).
**Write policy**
| Mode | Config files | MCP stats / schema cache | Network / MCP processes |
| --- | --- | --- | --- |
| Static (default) + desktop | Never written (`LoadForRootReadOnly`) | Never written | None |
| CLI `--live` | Never written | **Not written** (`SkipPersistence`) | Starts automatic MCP in an isolated Host |
## How to use (quick start)
| Goal | What to run |
| --- | --- |
| Check this workspace’s skills / hooks / MCP / plugins | `reasonix doctor capabilities` |
| Machine-readable report (CI / support) | `reasonix doctor capabilities --json` |
| Another project root | `reasonix doctor capabilities --root /path/to/project` |
| Probe MCP startup for real (starts third-party servers) | `reasonix doctor capabilities --live --timeout 5s` |
| Ask the agent to walk through config / fix guidance | `/reasonix-guide` in chat, or ask naturally |
| GUI health view | Desktop **Settings → Diagnostics** |
**Default is static and safe:** no network, no MCP child processes. Use `--live`
only when you explicitly want to start automatic MCP servers.
Related (unchanged) doctor commands:
```bash
reasonix doctor # env / providers / sandbox snapshot
reasonix doctor session # support session bundle
reasonix doctor redact-sessions # redact secrets in session files
```
## Everyday workflows
### 1. “Skill / command is missing or wrong”
```bash
reasonix doctor capabilities --json | jq '.skills.entries, .commands.entries, .issues'
```
Look for:
- `skill.shadowed` / `command.shadowed` — a higher-priority path won
- `skill.disabled` — name is in `[skills].disabled_skills`
- `skill.missing_description` — skill loads but index quality is weak
- `command.read_failed` — unreadable or broken markdown
Then open **Settings → Skills** (or fix the file under `.reasonix/skills` /
`.reasonix/commands`).
### 2. “Project hooks never fire”
```bash
reasonix doctor capabilities | sed -n '/Hooks/,/Plugins/p'
```
If you see `hook.untrusted_project`, trust the workspace in **Settings → Hooks**
(or the CLI trust flow). Matchers are **anchored** regexes: `file` does not match
`read_file`.
### 3. “MCP tools don’t show up”
1. Static first (no side effects):
```bash
reasonix doctor capabilities --json | jq '.mcp.servers, .issues[] | select(.subsystem=="mcp")'
```
2. Only if you accept starting third-party servers:
```bash
reasonix doctor capabilities --live --timeout 10s --json
```
Common codes: `mcp.command_not_found`, `mcp.invalid_transport`,
`mcp.start_failed`, `mcp.no_tools`. On desktop, prefer **Settings → Diagnostics**
with “Include current session runtime” to read the **active tab Host** without
starting a second Host.
### 4. Ask the agent (`reasonix-guide`)
In an interactive session:
```text
/reasonix-guide
```
or:
```text
My MCP server X is configured but the model never sees its tools — diagnose.
```
The built-in skill is **inline** (`runAs: inline`). It tells the model to prefer:
```bash
reasonix doctor capabilities --json
```
and to use `--live` only after you explicitly allow external MCP. Project or
global skills named `reasonix-guide` override the builtin; you can also hide it
with `[skills].disabled_skills = ["reasonix-guide"]`.
## CLI reference
```bash
reasonix doctor capabilities [--root PATH] [--json] [--live] [--timeout 5s]
```
| Flag | Meaning |
| --- | --- |
| `--root` | Workspace root (default: current directory). Uses `config.LoadForRoot`. |
| `--json` | Write one JSON object to **stdout** only (warnings go to stderr). |
| `--live` | Start **automatic** MCP servers in an isolated Host (may network). |
| `--timeout` | Per-server live timeout, **1s–60s**, default `5s`. Requires `--live`. |
### Modes
| Mode | Behavior |
| --- | --- |
| **Static (default)** | No network; no stdio / HTTP / SSE MCP child processes. |
| **Live (`--live`)** | Stderr risk banner; only servers with automatic start intent; `auto_start=false` → `skipped`; concurrency 4; Host always closed. |
Desktop “include current session runtime” is **not** CLI `--live`: the desktop
only **reads** the active tab Host and never starts MCP.
### Exit codes
| Code | Meaning |
| --- | --- |
| `0` | No `error`-severity issues (warnings/info are allowed) |
| `1` | One or more `error` issues, or live MCP start failures |
| `2` | Bad flags / usage |
Examples:
```bash
# Human-readable, current directory
reasonix doctor capabilities
# Fail CI only on hard errors
reasonix doctor capabilities --json
# shell: exit code 1 if summary.errors > 0
# Live probe with a longer timeout
reasonix doctor capabilities --live --timeout 15s --json 2>live-warn.txt
```
Existing `reasonix doctor`, `doctor session`, and `doctor redact-sessions`
commands keep their own JSON schemas — capability fields are **not** mixed into
those reports.
## Desktop
Open **Settings → Diagnostics**:
| Control | Behavior |
| --- | --- |
| Open page | Loads a **static** report for the active workspace root |
| Refresh | Re-runs collection with the current runtime toggle |
| Copy redacted JSON | Clipboard paste-safe report (paths already redacted) |
| Include current session runtime | Merge connected / failed / deferred / disabled from the **active tab Host** only |
| Open settings (on an issue) | Jumps to MCP / Skills / Plugins / Hooks when `settings_tab` is set |
The page never auto-edits config, auto-trusts projects, auto-enables packages,
or reconnects MCP. Opening Diagnostics does not rebuild the controller or
snapshot the session.
## JSON schema (version 1)
Top-level fields:
- `schema_version` (always `1`)
- `root` (display path)
- `live` (bool)
- `summary` — error/warning/info counts and resource counts
- `instructions`, `skills`, `commands`, `hooks`, `plugins`, `mcp`
- `issues[]` — ordered list of findings
Issue shape:
```json
{
"severity": "error|warning|info",
"code": "skill.shadowed",
"subsystem": "skills",
"name": "demo",
"source": "/.reasonix/skills/demo/SKILL.md",
"message": "...",
"remediation": "...",
"settings_tab": "skills"
}
```
Stable codes include:
- `skill.shadowed`, `skill.missing_description`, `skill.disabled`
- `command.shadowed`, `command.read_failed`
- `hook.untrusted_project`, `hook.invalid_matcher`, `hook.missing_command`, `hook.malformed_settings`
- `plugin.missing_root`, `plugin.invalid_manifest`, `plugin.compatibility`
- `mcp.invalid_transport`, `mcp.command_not_found`, `mcp.missing_command`, `mcp.missing_url`
- `mcp.start_failed`, `mcp.no_tools`, `mcp.runtime_unavailable`
Array and issue order is deterministic for scripting and tests.
### Severity
| Severity | Meaning | CLI exit |
| --- | --- | --- |
| `error` | Broken config or failed live start | `1` |
| `warning` | Actionable but non-fatal (e.g. untrusted project hooks) | `0` |
| `info` | Shadowing, disabled assets, runtime unavailable | `0` |
## Path and secret safety
Reports rewrite paths as:
- `/...` under the diagnosis root
- `~/...` under the user home
- `/basename` for other absolute paths (no full external path)
They never intentionally emit usernames, full external paths, environment
variable **values**, header **values**, tokens, or URL query strings. MCP
entries list env/header **keys** only. Error text that may carry raw HTTP
response bodies or MCP stderr passes through the product-wide secret redactor
(Authorization schemes, Bearer/JWT/vendor tokens, `KEY=value` and JSON
`"key":"value"` credential forms, Cookie/Set-Cookie values) and is truncated to
400 characters. Prefer copying report JSON into issues or chat over pasting raw
config files.
## What is *not* diagnosed here
| Need | Use instead |
| --- | --- |
| Provider keys, proxy, sandbox OS support | `reasonix doctor` |
| Full session transcript for support | `reasonix doctor session ` |
| One plugin package only | `reasonix plugin doctor ` |
| Interactive MCP list in a chat session | `/mcp` |
## Cache impact
Adding the built-in `reasonix-guide` skill appends **one stable index line** to
the system-prompt skills index after upgrade. The skill body is loaded only on
invocation. Diagnostics itself is not part of the provider prompt.