Introduction¶
In DSH, when using the skill tool for skill management, a common scenario is that skills are not stored in .dsh/skills, but rather in the workspace’s own skills/ directory, organized into subdirectories named after the skills, with a SKILL.md file in each. This directory structure is very natural, but the built-in skill-filesystem in DSH only recognizes a few specific locations: the project root .dsh/skills, .agents/skills, and the user-level ~/.dsh/skills and ~/.agents/skills. It does not include the workspace’s own skills/. The result is that even though a significant amount of skill content has been written, it neither enters the skill directory for each round nor is accessible to the model; users can only manually copy the files into supported directories.
Below is an introduction to feverzhong/dsh-liya-skills. This is a client plugin maintained by feverZHONG (Lia), version 0.2.0, adapted for DSH 0.2.1-rc.2 (Desktop), with zero third-party dependencies. Its function is to register its own SkillProvider to directly scan skillsRoot and integrate the skills in the workspace skills/ into DSH’s native skill system: the skill tool can load them, they are visible in the round’s skill directory, and they can be invoked directly via /SkillName. The second capability, new in v0.2.0, is settings page skill management: it syncs skills from specified GitHub user public repositories to the local skills/. It first generates an “adaptation draft,” and only applies changes after manual confirmation, avoiding blind overwrites.
What It Solves¶
The plugin does not modify the built-in DSH configuration; instead, it registers a SkillProvider to scan the skillsRoot directory specified in the configuration, connecting directly to DSH’s skill service. Consequently, skills placed in the workspace skills/ are no longer ignored by the directory mechanism.
Skill Visibility Strategy¶
The plugin divides skills into two categories, controlling modelInvocable via the curated.json whitelist:
- Skills whitelisted as
modelVisibleincurated.json:modelInvocableis set totrue. They enter the skill directory for every round, and the model can actively invoke them using theskilltool. - Other skills:
modelInvocableis set tofalse. They do not enter the directory and do not occupy context, but the user can still inject the content by typing/SkillName.
This strategy keeps only curated skills in the model’s directory, while other skills remain available for manual invocation, preventing the skill count from expanding and stuffing all context windows. Changes to curated.json take effect immediately: file watching → skills service cache invalidation → next round directory refresh, without needing to restart DSH.
Installation and Activation¶
This involves two steps: first, install the plugin into the profile, and then specify the skills library location in the profile patch. The official installation paths are two: installing the plugin directory or installing the release package tgz:
# 1. Install into profile (pnpm symlink + automatically appended to dsh.profile.bundles)
# Alternatively, you can use the "install_bundle" button in DSH Settings / plugin_manager,
# filling the target with the absolute path to the plugin directory.
dsh plugin --profile <profile> add "<absolute path to plugin directory>"
# Or use the release package (tgz contains the same content as Releases/build artifacts; locally in dist/)
dsh plugin --profile <profile> add "<directory>/dsh-liya-skills-0.2.0.tgz"
Then, edit $DSH_HOME/profiles/<profile>/cordis.patch.yml to specify skillsRoot. Because import.meta.url points to the symlink path when the plugin is linked via node_modules, default relative paths will resolve to the profile directory, so an explicit absolute path is required here:
- id: skill-liya-skills
name: 'dsh-liya-skills'
config:
skillsRoot: '<workspace absolute path>/skills'
In addition to skillsRoot, other configurable options include customSkillDirs, providerName, and rank, all of which have default values (see the apply function in index.js). Note: modifying the plugin source code requires restarting DSH—the host hot-reloads the profile patch config, but does not hot-reload the plugin module.
If you do not have a shell, you can mount it directly using file://:
- insert:
- id: skill-liya-skills
name: 'file:///<absolute path to plugin directory>/index.js'
config:
skillsRoot: '<workspace absolute path>/skills'
The same plugin can only be mounted once: once the bundle is installed, do not leave the insert entry, otherwise you will get an error about duplicate provider names.
Settings Page Skill Management (New in v0.2.0)¶
DSH’s “Settings → Liya Skills” (settings.section, client-side) is used to sync skills from specified GitHub user public repositories to the local skills/. The ironclad rule in the project is never to blindly overwrite: an adaptation draft must be generated first, and changes are only saved after manual confirmation. The process is divided into three steps on the page.
Step 1: Fill in the GitHub user (default feverZHONG) and scan public repositories: list all public repositories of that user, pick those containing SKILL.md, match them to locally named skills based on the name in the frontmatter, and show the status: Up to date / Update available / Only in remote.
Step 2: Generate adaptation draft: remote files are dropped into skills/.incoming/<repository name>/, and an _adapt-report.json is generated. The auto-rewritten content (recorded in the report) includes: python3→python, /opt/data/bin|scripts→workspace bin|scripts, CRLF→LF, and compression of frontmatter line breaks into a single line. The following content is reported but not changed, pending manual confirmation: old Hermes environment residues, POSIX absolute paths/commands, old tool names (credman/apiproxy/settingsScope), local absolute paths, and missing tier.
Step 3: Review report → Apply. Before applying, the host will back up the entire local skill directory to skills/.backup/<skill>-<timestamp>/, then copy the adaptation draft into skills/<skill>/, and write _upstream.json, recording the repository, commit, application time, number of auto-rewritten lines, number of pending confirmations, and the backup path. The local skill directory is not modified until the “Apply Adaptation Draft” step is taken on the page; there is no one-click blind overwrite entry.
Additionally, the data channel uses the gh CLI (gh api): the author’s direct HTTPS connection is blocked by the network (curl/node/PowerShell cannot connect), and only gh works, so it requires that gh is already logged in. It only handles public repositories—private !== false or visibility !== 'public' are always rejected. Filtering is done during the scan phase, and validation is performed again during the generation phase.
The right-side details panel is a markdown preview, implemented by the custom zero-dependency renderer client/src/md.js (supporting headings/paragraphs/lists/tables/code blocks/inline code/bold/italic/links/quotes, and tolerating incomplete code blocks). The top-right “Preview ● / Source” toggle allows switching back to the SKILL.md source text.
Verification Methods¶
After installation, verification can be performed in the following order:
- In the next round of conversation, the
<available_skills>directory appears with the skills whitelisted incurated.json. - Use the
skilltool to load one of them; it should return the body, withresourceBasepointing to<skillsRoot>/<skill name>, andreferences/andscripts/read based on this base. - Call the
skilltool on an uncurated skill; it should report an errornot available for model invocation; however, typing/SkillNameby the user will still inject the content. - In
plugin_manager list_plugins,include:skill-liya-skillsshould showfiberPhase: active.
Usage Limitations¶
There are several clear boundaries in the engineering implementation that are worth knowing before getting started.
Skill content is always read on demand; the plugin only caches “which skills exist,” with a 3-second throttle on the cache. Therefore, changes to the SKILL.md body take effect immediately. Frontmatter uses minimal parsing, extracting only top-level name / description, and does not import the yaml dependency. Nested blocks and line continuations are ignored, so name / description must be written as a single line. The plugin only recognizes one level of depth for skill directories: <skillsRoot>/<name>/SKILL.md or <skillsRoot>/<name>.md, and deeper nesting is not scanned. If the plugin crashes, only that specific entry becomes invalid; it will not take down the entire host. However, the inject function can only write to services that are guaranteed to exist (this plugin only depends on skills).
After modifying the client source code (client/src/*), you must use node client/build.mjs to regenerate client.js, then restart DSH. Modifying index.js / host/* similarly requires a restart.
Use Cases and Notes¶
Suitable Scenarios:
- The workspace is already organized as skills/<name>/SKILL.md and you want these skills to enter the DSH native skill system directly without manually moving directories.
- You want to periodically sync a specific GitHub user’s public skill library to the local machine and require visibility and rollback capability for every change.
Notes:
- The plugin runs with the permissions of the current DSH process. The settings page accesses the local skills/ directory and calls the developer’s local gh CLI.
- Before installation, you should check the plugin source code and the license. The repository code is MIT (LICENSE), and the documentation is CC BY 4.0 (LICENSE-DOCS). The plugin directory category in SkillHub is “Client,” and the community directory is an independent site with no official affiliation to DeepSeek / 幻方.
Conclusion¶
The value of dsh-liya-skills lies in two things: integrating the workspace’s own skills/ into the native skill system, and using a “curated for model directory, rest manual invocation” strategy to control context occupation; the settings page splits the external public skill library sync process into three steps: scan, adaptation draft, and confirm/apply, preserving backups and tracking files.
Repository: https://github.com/feverZHONG/dsh-liya-skills
Directory Page: https://www.skillhub.cn/plugins/feverZHONG/dsh-liya-skills