opencode-skills-doctor 0.6.3 → 0.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -116,6 +116,7 @@ All commands accept `--json`, `--lang en|zh`, `--budget`, `--root` and `--no-glo
116
116
  | **DeepSeek Harness** | `install --client dsh` adds the MCP entry and the `skills-doctor-audit` skill |
117
117
  | **Claude Code / Codex** | MCP server (`npx -y opencode-skills-doctor mcp`) |
118
118
  | **Grok CLI / Cursor** | their skill roots are scanned natively |
119
+ | **Hermes Agent** | MCP entry in `~/.hermes/config.yaml`; `~/.hermes/skills` is scanned |
119
120
 
120
121
  ## Why it is safe
121
122
 
@@ -425,6 +425,19 @@ grok mcp doctor skills-doctor # ✓ server started · handshake OK · 1 tool d
425
425
 
426
426
  Grok 的工具命名是 `<server>__<tool>`,所以调用 `skills_doctor__skills_doctor`;配置写入 `~/.grok/config.toml` 的 `[mcp_servers.skills-doctor]`。
427
427
 
428
+ ### Hermes Agent(Nous Research)
429
+
430
+ Hermes 从 `~/.hermes/config.yaml` 读取 MCP server:
431
+
432
+ ```yaml
433
+ mcp_servers:
434
+ skills_doctor:
435
+ command: "npx"
436
+ args: ["-y", "opencode-skills-doctor", "mcp"]
437
+ ```
438
+
439
+ Hermes 的工具命名是 `mcp_<server>_<tool>`,即 `mcp_skills_doctor_skills_doctor`。它的 skill 在 `~/.hermes/skills`(含导入的 `openclaw-imports/`)和项目 `.hermes/skills`,`check` 都会扫描。
440
+
428
441
  ## 检测规则
429
442
 
430
443
  | 规则 | 级别 | 含义 |
package/docs/REFERENCE.md CHANGED
@@ -10,7 +10,7 @@ Local scanner, linter, fixer, updater and **OpenCode plugin** for agent skills
10
10
  |---|---|
11
11
  | **What it is** | Audit, fix and update the skills your coding agent loads |
12
12
  | **Interfaces** | CLI · OpenCode plugin (1.x / 2.x) · MCP server (Claude Code, Codex, DSH, …) · Grok CLI compatible |
13
- | **Skill sources** | `.opencode/skills`, `.claude/skills`, `.agents/skills`, `.grok/skills`, `.cursor/skills`, `opencode.json(c)` entries, HTTP catalogs |
13
+ | **Skill sources** | `.opencode/skills`, `.claude/skills`, `.agents/skills`, `.grok/skills`, `.cursor/skills`, `.hermes/skills`, `opencode.json(c)` entries, HTTP catalogs |
14
14
  | **What it finds** | shadowed IDs, duplicates, long descriptions, oversized bodies, per-step token budget, broken file references, invalid frontmatter, empty bodies, stale skills |
15
15
  | **What it fixes** | archives shadowed definitions (reversible), hides low-frequency skills, syncs catalogs with drift detection |
16
16
  | **Reports** | terminal, JSON, or a self-contained HTML report (`--html [file] --open`) |
@@ -408,6 +408,19 @@ grok mcp doctor skills-doctor # ✓ server started · handshake OK · 1 tool d
408
408
 
409
409
  Grok namespaces tools as `<server>__<tool>`, so call `skills_doctor__skills_doctor`. The config lands in `~/.grok/config.toml` as `[mcp_servers.skills-doctor]`.
410
410
 
411
+ ### Hermes Agent (Nous Research)
412
+
413
+ Hermes reads MCP servers from `~/.hermes/config.yaml`:
414
+
415
+ ```yaml
416
+ mcp_servers:
417
+ skills_doctor:
418
+ command: "npx"
419
+ args: ["-y", "opencode-skills-doctor", "mcp"]
420
+ ```
421
+
422
+ Hermes names tools `mcp_<server>_<tool>`, so the tool is `mcp_skills_doctor_skills_doctor`. Its skills live in `~/.hermes/skills` (including imported `openclaw-imports/`) and project `.hermes/skills`; `check` scans both.
423
+
411
424
  ## Rules
412
425
 
413
426
  | Rule | Level | Meaning |
@@ -451,9 +464,11 @@ Grok namespaces tools as `<server>__<tool>`, so call `skills_doctor__skills_doct
451
464
  6. project `.cursor/skills`
452
465
  7. `~/.grok/skills`
453
466
  8. project `.grok/skills`
454
- 9. `~/.config/opencode/skills`
455
- 10. project `.opencode/skills`
456
- 11. the `skills` array in `opencode.json(c)` (2.x) or `skills.paths` (1.x); relative paths resolve from the working directory; supports `~/`, absolute paths and HTTP catalogs
467
+ 9. `~/.hermes/skills`
468
+ 10. project `.hermes/skills`
469
+ 11. `~/.config/opencode/skills`
470
+ 12. project `.opencode/skills`
471
+ 13. the `skills` array in `opencode.json(c)` (2.x) or `skills.paths` (1.x); relative paths resolve from the working directory; supports `~/`, absolute paths and HTTP catalogs
457
472
 
458
473
  ## JSON output
459
474
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "opencode-skills-doctor",
3
- "version": "0.6.3",
3
+ "version": "0.7.0",
4
4
  "description": "Audit, fix and update agent skills: token cost, broken references, shadowed duplicates, HTML reports, catalog sync. CLI, OpenCode plugin, MCP server; works with OpenCode, Claude Code, Codex, Grok CLI, Cursor and DeepSeek Harness.",
5
5
  "type": "module",
6
6
  "exports": {
package/src/discover.mjs CHANGED
@@ -120,9 +120,11 @@ function isUnder(parent, child) {
120
120
  * 6. 项目 .cursor/skills
121
121
  * 7. ~/.grok/skills
122
122
  * 8. 项目 .grok/skills
123
- * 9. ~/.config/opencode/skills
124
- * 10. 项目 .opencode/skills(项目根 → cwd)
125
- * 11. opencode.json(c) 里的 skills 数组 / skills.paths
123
+ * 9. ~/.hermes/skills(Hermes Agent)
124
+ * 10. 项目 .hermes/skills
125
+ * 11. ~/.config/opencode/skills
126
+ * 12. 项目 .opencode/skills(项目根 → cwd)
127
+ * 13. opencode.json(c) 里的 skills 数组 / skills.paths
126
128
  */
127
129
  export function discoverSources({ cwd = process.cwd(), home = os.homedir(), includeGlobal = true } = {}) {
128
130
  const projectRoot = findProjectRoot(cwd) ?? path.resolve(cwd)
@@ -151,6 +153,9 @@ export function discoverSources({ cwd = process.cwd(), home = os.homedir(), incl
151
153
  if (includeGlobal) addSource("grok-global", "global", path.join(home, ".grok", "skills"))
152
154
  for (const dir of projectChain) addSource("grok-project", "project", path.join(dir, ".grok", "skills"))
153
155
 
156
+ if (includeGlobal) addSource("hermes-global", "global", path.join(home, ".hermes", "skills"))
157
+ for (const dir of projectChain) addSource("hermes-project", "project", path.join(dir, ".hermes", "skills"))
158
+
154
159
  if (includeGlobal) addSource("opencode-global", "global", path.join(home, ".config", "opencode", "skills"))
155
160
  for (const dir of projectChain) addSource("opencode-project", "project", path.join(dir, ".opencode", "skills"))
156
161