Introduction¶
DeepSeek Harness (dsh) allows extending agent behavior through plugins and loading skill manifests in sessions. By default, conversations without a specific selection retain dsh’s default behavior, which is loading everything. If you only want certain skills to be active in a conversation, you need a mechanism to control this per conversation.
dsh-skill-loader is a plugin for dsh. It adds a “Skill Manifest” selector to the start page of a new conversation, allowing you to decide which skill manifest entries to load for this session. Skills that are unchecked are unavailable in this conversation.
What is this¶
The repository for dsh-skill-loader is located at kezboardpj/dsh-skill-loader and is licensed under MIT. It solves the problem of skill visibility in dsh sessions: selecting the skill manifest before starting the conversation instead of excluding them one by one via external configuration after the conversation starts.
Core Features¶
Add “Skill Manifest” chip to Start Page¶
On the start page of a new conversation, a “Skill Manifest” chip appears next to the “Working Directory” and “Agent Preset” chips. It only displays when the current session is in a blank state (before conversation starts); it disappears automatically after the conversation starts.
Implementation-wise, it does not declare a new built-in slot, but appends its own chip node within that row on the start page and renders it using react-dom.
Load Skills Based on Selection¶
After checking a skill, that skill’s manifest entry is loaded into the conversation; the <available_skills> seen by the model only contains the checked skills.
Unchecked skills are unavailable in this conversation. The model directory, /name gesture, and skill tool will all refuse to invoke unchecked skills.
Conversations without selection retain dsh’s default behavior, which is loading all.
Persist Selection State¶
Selection state is written to the skill-loader namespace in dsh settings, in the file $DSH_HOME/settings.yaml. The state remains accurate after refresh or restart.
Commands¶
/skill-select <name1,name2,...>: Sets the conversation’s skill manifest to these skills; comma-separated. Clears selection when no parameters are provided.
/skill-unarchive <sessionId1,...>: Unarchives the specified session, causing it to reappear in the sidebar.
Takeover and Interception¶
The plugin takes over the skill directory via the host’s agent/pre-step hook and intercepts skill invocations for unchecked skills via tools/pre-execute.
Installation and Activation¶
The following uses the web profile as an example. If you are using another profile, replace web in the commands with the corresponding profile name.
Install from GitHub:
dsh plugin --profile web add https://github.com/kezboardpj/dsh-skill-loader.git
Install from local directory:
dsh plugin --profile web add ./dsh-skill-loader
Restart dsh for that profile after installation. Installed plugins are not hot-loaded.
Note: dsh plugin add cannot handle paths containing spaces. If the local path contains spaces, you need to directly edit the profile’s package.json dependencies and dsh.profile.bundles, then run:
pnpm install
Typical Usage¶
-
Create a new dsh conversation.
-
Click the “Skill Manifest” chip on the start page.
-
Check the skills you want to load for this conversation.
-
Start the conversation. At this point, the model can only see the manifest entries of the checked skills.
-
If you want to adjust the manifest during runtime, you can input:
/skill-select <name1,name2>
- If you want to clear the skill selection for the current conversation:
/skill-select
- If you want to make an archived session reappear in the sidebar:
/skill-unarchive <sessionId1>
Upgrade from 0.1 to 0.2¶
If you previously installed version 0.1, it is recommended to stop dsh during the upgrade and follow the steps below.
-
Run
scripts/repair-v01-logs.mjsto fix historical session logs corrupted by version 0.1. -
If you used local directory links during version 0.1, please switch to installing from GitHub. Version 0.2 has dependencies on the host side, so bare directories might not resolve.
-
Enter your profile directory and execute:
pnpm update dsh-skill-loader
- Restart dsh.
After upgrading, selections from version 0.1 in the repaired old sessions will no longer take effect and will revert to the default “Load All”. You need to check them again.
Version 0.2 introduces new dependencies on the host side: @deepseek-ai/dsh-settings and @deepseek-ai/schemastery; package.json also declares client injections for @deepseek-ai/dsh-client-runtime, @deepseek-ai/dsh-client-locale, and @deepseek-ai/dsh-client-connection.
Use Cases and Notes¶
Suitable for the following situations:
- You maintain multiple skills in dsh but only want relevant skills loaded in different conversations.
- You want to quickly select the manifest when creating a new conversation instead of going into global configuration.
- You need to quickly clear or switch skills for the current conversation via
/skill-select. - You need to restore archived sessions that are missing from the sidebar.
Notes before use:
- The plugin runs with the current dsh process permissions, takes over the skill directory, intercepts
skillcalls, and writes to$DSH_HOME/settings.yaml. It is recommended to check the source code, dependencies, and license before installation. - The current version is licensed under MIT.
- You need to restart dsh for the corresponding profile after installation.
- When paths contain spaces, handle them using the manual profile configuration method mentioned above.
Links¶
GitHub Repository:
https://github.com/kezboardpj/dsh-skill-loader
If you only need to control the visible skills in dsh per conversation, this plugin provides the entry point and persistent selection state.