chore(skills): move niche built-in skills to optional

These stop loading by default and become one
`hermes skills install official/<category>/<name>` away:
notion, airtable, box (hosted connectors cover them for Portal users),
opencode, design-md, gif-search, songsee, llm-wiki,
hermes-agent-skill-authoring, inspecting-hermes-desktop-dom,
node-inspect-debugger and python-debugpy.

Existing installs keep their copies: the skills sync already re-labels
a byte-identical copy of a moved built-in as an official optional
install. Onboarding first tasks drop the two skills that are no longer
bundled (llm-wiki, design-md), claude-design and popular-web-designs
point at design-md as an optional install, and doc examples use
skills that still ship.
This commit is contained in:
Teknium committed 2026-10-28 21:24:43 -07:00
1 parent 9347107cdb
commit 183b5ddd5f
34 files changed
+20 -17

No files matched your search

+1 -1
View File
@@ -601,7 +601,7 @@ Gateway and messaging sessions never collect secrets in-band; they instruct the
- The skill relies on a CLI tool that may not be installed (e.g., `himalaya`, `openhue`, `ddgs`)
- Treat command checks as guidance, not discovery-time hiding
See `skills/gifs/gif-search/` and `skills/email/himalaya/` for examples.
See `optional-skills/media/gif-search/` and `skills/email/himalaya/` for examples.
### Skill authoring standards (HARDLINE)
+2 -2
View File
@@ -171,7 +171,7 @@ FIRST_TASKS: tuple[FirstTask, ...] = (
quality="Real items they asked for. No test items.",
done="The reminder and note exist, and the morning job is set up or declined."),
FirstTask(
"notes", "Turn my notes into a wiki", _always, ("obsidian", "llm-wiki"),
"notes", "Turn my notes into a wiki", _always, ("obsidian",),
goal="turn their notes into a small linked wiki",
steps=(
"Ask which folder holds their notes. Never search the disk for it.",
@@ -223,7 +223,7 @@ FIRST_TASKS: tuple[FirstTask, ...] = (
quality="Every finding has a source link. Nothing invented.",
done="The first report is shown and the daily job is set up or declined."),
FirstTask(
"site", "Design a page for me", _always, ("claude-design", "popular-web-designs", "design-md", "p5js"),
"site", "Design a page for me", _always, ("claude-design", "popular-web-designs", "p5js"),
goal="design one web page for them",
steps=(
"If you do not know what the page is for, ask in one line.",
+3
View File
@@ -0,0 +1,3 @@
---
description: Optional media skills — GIF search and audio visualization.
---
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
+1 -1
View File
@@ -17,7 +17,7 @@ Use this skill when the user asks for design work that would normally fit Claude
The goal is to preserve Claude Design's useful design behavior and taste while removing hosted-tool plumbing that does not exist in normal agent environments.
**Before starting, check for other web-design skills like `popular-web-designs` (ready-to-paste design systems for Stripe, Linear, Vercel, Notion, etc.) and `design-md` (Google's DESIGN.md token spec format).** If the user wants a known brand's look, load `popular-web-designs` alongside this one and let it supply the visual vocabulary. If the deliverable is a token spec file rather than a rendered artifact, use `design-md` instead. Full decision table below.
**Before starting, check for other web-design skills like `popular-web-designs` (ready-to-paste design systems for Stripe, Linear, Vercel, Notion, etc.) and `design-md` (Google's DESIGN.md token spec format; an optional skill, installed with `hermes skills install official/creative/design-md`).** If the user wants a known brand's look, load `popular-web-designs` alongside this one and let it supply the visual vocabulary. If the deliverable is a token spec file rather than a rendered artifact, use `design-md` instead. Full decision table below.
## When To Use This Skill vs `popular-web-designs` vs `design-md`
+2 -2
View File
@@ -31,8 +31,8 @@ system, shadows, responsive behavior, and practical agent prompts with exact CSS
Pair it with this skill when the user wants a thoughtfully-designed page styled
after a known brand: `claude-design` drives the workflow, this skill supplies
the visual vocabulary.
- **`design-md`** — use when the deliverable is a formal DESIGN.md token spec
file, not a rendered artifact.
- **`design-md`** (optional: `hermes skills install official/creative/design-md`) —
use when the deliverable is a formal DESIGN.md token spec file, not a rendered artifact.
## How to Use
+1 -1
View File
@@ -1,3 +1,3 @@
---
description: Skills for working with media content — YouTube transcripts, GIF search, music generation, and audio visualization.
description: Skills for working with media content — YouTube transcripts and summaries.
---
+7 -7
View File
@@ -747,7 +747,7 @@ def test_install_by_name_resolves_to_the_skill_it_names(monkeypatch, tmp_path, i
def test_built_in_restore_survives_leftovers_and_records_every_outcome_as_bundled(monkeypatch, tmp_path):
"""Post-fix telemetry still showed `llm-wiki` failing as source=hub, filesystem_error: the
"""Post-fix telemetry still showed `llm-wiki` (bundled then) failing as source=hub, filesystem_error: the
restore copied with copytree onto a dest dir left behind without its SKILL.md (EEXIST on every
retry), refused a skill already present behind a symlinked category the loader follows, and a
failed restore was labelled a hub install."""
@@ -761,22 +761,22 @@ def test_built_in_restore_survives_leftovers_and_records_every_outcome_as_bundle
rows = []
monkeypatch.setattr("hermes_cli.observability.shared_metrics_events.record_extension_install",
lambda **row: rows.append((row["source"], row["outcome"])))
src = dict(skills_sync._discover_bundled_skills(skills_sync._get_bundled_dir()))["llm-wiki"]
dest = skill_usage._skills_dir() / src.parent.name / "llm-wiki"
src = dict(skills_sync._discover_bundled_skills(skills_sync._get_bundled_dir()))["obsidian"]
dest = skill_usage._skills_dir() / src.parent.name / "obsidian"
console, _sink = _sink_console()
(dest / "wiki").mkdir(parents=True) # stranded: user data kept, SKILL.md gone
(dest / "wiki" / "index.md").write_text("mine\n")
assert cli_hub.do_install("llm-wiki", console=console, skip_confirm=True) is True
assert cli_hub.do_install("obsidian", console=console, skip_confirm=True) is True
assert (dest / "SKILL.md").is_file() and (dest / "wiki" / "index.md").read_text() == "mine\n"
real = tmp_path / "real-category"
dest.parent.rename(real)
dest.parent.symlink_to(real, target_is_directory=True)
assert cli_hub.do_install("llm-wiki", console=console, skip_confirm=True) is None # present, no-op
assert cli_hub.do_install("obsidian", console=console, skip_confirm=True) is None # present, no-op
(real / "llm-wiki" / "SKILL.md").unlink() # missing behind the symlink: refused, and still bundled
assert cli_hub.do_install("llm-wiki", console=console, skip_confirm=True) is False
(real / "obsidian" / "SKILL.md").unlink() # missing behind the symlink: refused, and still bundled
assert cli_hub.do_install("obsidian", console=console, skip_confirm=True) is False
assert rows == [("bundled", "success"), ("bundled", "failed")]
+1 -1
View File
@@ -157,7 +157,7 @@ Type `/` in the CLI to open the autocomplete menu. Built-in commands are case-in
| Command | Description |
|---------|-------------|
| `/<skill-name>` | Load any installed skill as an on-demand command. Example: `/gif-search`, `/github-pr-workflow`, `/excalidraw`. |
| `/<skill-name>` | Load any installed skill as an on-demand command. Example: `/youtube-content`, `/github-pr-workflow`, `/excalidraw`. |
| `/skills ...` | Search, browse, inspect, install, audit, publish, and configure skills from registries and the official optional-skills catalog. |
### Quick Commands
+1 -1
View File
@@ -384,7 +384,7 @@ Each entry is a skill name. The list is resolved once when a session's system pr
Every installed skill in `~/.hermes/skills/` is automatically registered as a slash command. The skill name becomes the command:
```
/gif-search funny cats
/excalidraw sketch the request flow for our API
/axolotl help me fine-tune Llama 3 on my dataset
/github-pr-workflow create a PR for the auth refactor
@@ -176,7 +176,7 @@ platforms:
priority_mode: prepend # prepend | append | replace
priority:
- my_plugin_command
- songsee # skill commands work here too
- excalidraw # skill commands work here too
```
`priority_mode` controls how your list combines with Hermes' built-in priority list: