dsh-repo-health

by chenyinrusi

0 工具与能力github未核验到 manifest收录于 08-16

DeepSeek Harness只读仓库健康扫描器:定义漂移、未连接模块可达性、提示膨胀、证据门校准、注册完整性。CLI + MCP服务器。

Read-only repository health scanners for DeepSeek Harness and any repo: definition drift, unwired-module reachability, prompt bloat, evidence-gate calibration, registration completeness. CLI + MCP server.

安装

dsh plugin --profile web add github:chenyinrusi/dsh-repo-health

GitHub 源码安装:首次需按提示配置 allowBuilds 构建授权后重试

安装与环境配置指引、插件开发教程见 DSH 中文社区文档 ↗

安装即在你的机器上以你的权限运行第三方代码——它可读写文件、使用凭据、访问网络,DSH 的工具审批不会为插件代码加沙箱。「检测到 manifest」仅代表发现 dsh.bundle / dsh.plugin 清单,不构成兼容性或安全审查;安装前请审阅源码,不熟悉的插件先在不含密钥的环境试用。

README

目录

Read-only repository health scanners: definition drift, unwired-module reachability, prompt bloat, evidence-gate calibration, and registration completeness — as a CLI and an MCP server.

A codebase rots silently. The most damaging defects are the ones no test, type checker, or linter catches:

  • a concept defined in two places where only one copy gets updated (drift),
  • a module written but never wired up (unreachable),
  • a fixed-injected prompt segment quietly eating the context (bloat),
  • an extension point that exists but is never registered (registration).

repo-health is five read-only scanners that watch for exactly these. It is the extracted, generalized core of the quality-guard tooling behind a large production agent system, repackaged so any repository can run it.

Install

pip install "dsh-repo-health"        # CLI
pip install "dsh-repo-health[mcp]"   # + MCP server

Requires Python 3.11+ (the registration scanner uses tomllib; the others run on 3.10+).

Quick start

repo-health drift --root /path/to/repo           # definition drift report
repo-health reach --root /path/to/repo           # unwired-module report
repo-health prompt-bloat --root /path/to/repo    # prompt segment shares
repo-health evidence --path logs/evidence_gate.jsonl
repo-health registration --root /path/to/repo --config registration.toml
repo-health all --root /path/to/repo             # run every scanner

Every scanner also ships a --selftest that verifies the tool itself against a synthetic fixture before it is trusted to judge your code — the predecessor of these scanners shipped versions that produced pretty-but-wrong numbers, and only known-answer fixtures caught them.

The five scanners

drift — multi-source definition drift

Detects the same name defined in more than one place with overlapping member structure, and flags it when one copy changes but the other does not.

  • A class (guarded): same name and structure overlap ≥ 0.5 — watched for drift.
  • B class (not guarded): same name, disjoint structure — a name collision, confusing but not a data hazard.
  • Sync changes pass. If someone diligently updates both copies, that is correct behavior; a guard that punishes it gets disabled.
repo-health drift --root .                      # report
repo-health drift --root . --write-baseline     # freeze a baseline
repo-health drift --root . --check              # exit 1 on drift / new pairs

reach — unwired-module reachability

Builds the import graph and BFS-searches from startup entrypoints (__main__.py, if __name__ == "__main__" guards, main.py, launch scripts). Modules that cannot be reached are "wired but dead".

Its baseline carries auditable reasons: every unreachable module needs a structured {verdict, anchor} entry, validated deterministically (V1–V7) so a single wrong reason can never permanently hide code from every mechanism.

repo-health reach --root .                      # report
repo-health reach --root . --write-baseline     # freeze
repo-health reach --root . --check              # exit 1 on new unwired modules
repo-health reach --root . --audit-reasons      # validate baseline reasons

prompt-bloat — prompt segment share baseline

Reads prompt-inspection JSONL logs ({segments: [{name, pct, kind}]}) and watches the median share per segment, not the absolute size (absolute size varies naturally with task complexity; share reflects structural bloat).

repo-health prompt-bloat --root . --check --json

evidence — evidence-gate decision log calibration

Summarizes a decision log ({passed, suggested_action, tool, issues} JSONL) to answer "is the gate calibrated yet?" — insufficient samples or a false-positive-prone tool block any conclusion.

registration — config-driven registration completeness

Declares your architecture's extension points in a TOML config and verifies every defined item appears in its registry. See config/registration.example.toml for an annotated example covering agent roles, checkers, API routers, sidebar pages, and LLM providers.

MCP server (DeepSeek Harness & any MCP client)

pip install "dsh-repo-health[mcp]"
python -m repo_health.mcp_server

Exposes the scanners as read-only MCP tools (drift_scan, reach_scan, reach_reason_audit, prompt_bloat, evidence_calibration, registration). Register it in DeepSeek Harness's MCP settings (or any MCP client) to let an agent diagnose its own repository. Large repositories may exceed MCP's default tool timeout — pass narrower root values or raise the client timeout.

Methodology (why this is not "yet another linter")

The scanners share a discipline learned the hard way:

  1. Watch events, not states. "Duplicated" is a state; "one side changed and the other didn't" is the event that actually corrupts data.
  2. Guard must not punish correct behavior. Sync updates pass; else the guard gets disabled within a week.
  3. Never freeze a baseline from insufficient samples. A median from three records is not a fact — a baseline frozen from it is false confidence.
  4. Reasons must be checkable. Free-text baseline justifications are how code permanently hides from every mechanism; make them {verdict, anchor}.
  5. Self-test the scanner before it judges anything. Known-answer fixtures are the only thing that caught the predecessor's wrong-but-plausible output.

Known limitations

  • drift scans Python only (.py under the configured package dirs).
  • reach is module-granular: a reachable module whose functions are never called is not reported; dynamic imports (importlib, plugin loaders) are invisible and belong in the baseline.
  • evidence and prompt-bloat consume a specific JSONL schema; adapt your logger to emit it (examples in the docstrings).

License

MIT © 2026 Chen (Jarry) Pan

原始 README: https://github.com/chenyinrusi/dsh-repo-health/blob/main/README.md ↗