INSTALL.agent.md
September 2, 2026 · View on GitHub
You are an agent installing skillsearch — the SkillCorpus Plugins — into the host you are running in. A human asked for this and will read your report. Follow this file top to bottom.
Rules you must follow throughout
- Show before you change. Before writing or editing any config file, show the user the exact diff (or the full new file if it did not exist) and wait for their go-ahead unless they already told you to proceed.
- Back up first. Before editing an existing config file, copy it to
<name>.bak-skillsearchnext to itself. - Merge, never replace. Add keys into existing JSON/TOML/YAML; do not rewrite whole files. If an existing config file fails to parse, stop and tell the user — do not overwrite it.
- Stop on ambiguity. If host detection matches more than one host, ask the user which one to target instead of guessing.
- Finish with the verification section. An install without a passing verification is not done — report exactly which step failed.
Step 0 — detect the host
Run these checks. The first section whose check passes is your target; if several pass, ask the user.
| Host | It is this host if… |
|---|---|
| WorkBuddy | ~/.workbuddy-ai/settings.json exists, or your own hook payloads carry "client": "WorkBuddy" |
| Hermes | $HERMES_HOME is set, or ~/.hermes/ exists |
| OpenClaw | ~/.openclaw/openclaw.json exists, or an openclaw process/CLI is present; run openclaw --version before choosing the 1.x or 2.0 instructions below |
| DeepSeek Harness | the workspace you are in has a cordis.yml and a packages/ tree |
| Raven | ~/.raven/ exists, or raven CLI is present |
Note where this repository is checked out (clone it if the user gave you only
the URL), then change into its skillcorpus_plugin/ directory. Every relative
path and command below starts there.
WorkBuddy
WorkBuddy installs through its standard plugin marketplace. Its own playbook
covers discovery and restart verification: follow plugin-workbuddy/INSTALL.agent.md
step by step — do not improvise a WorkBuddy install from this file. The
same rules apply there, plus two stricter ones it states: report each step
as you finish it, and never route around a failed step.
Hermes
pip install ./engine-python
cp -r plugin-hermes "$HERMES_HOME/plugins/skillsearch"
Then create or merge $HERMES_HOME/skillsearch.json (show the diff first):
{
"skills_dir": "~/.hermes/skills",
"model": ""
}
Tell the user to run hermes memory setup and pick skillsearch — the
provider occupies the memory slot, so mention that it replaces whatever
memory provider currently holds that slot, and let them decide.
A user who would rather not go through the interactive setup selects the
provider by hand, in $HERMES_HOME/config.yaml — a different file from the
skillsearch.json above, which carries only this plugin's own settings:
memory:
provider: skillsearch
OpenClaw 1.x (through 2026.7.x)
npm install --prefix plugin-openclaw
npm run --prefix plugin-openclaw build # produces dist/index.js
Merge two keys into ~/.openclaw/openclaw.json (backup + diff first).
load.paths must be the absolute path of the plugin-openclaw
directory in this checkout:
{
"plugins": {
"load": { "paths": ["/ABS/PATH/TO/plugin-openclaw"] },
"entries": {
"skillsearch": {
"enabled": true,
"config": { "skillsDirs": ["~/.openclaw/skills"] }
}
}
}
}
Works on OpenClaw releases from 2026.3.8 through 2026.7.x. The gateway/app must be restarted to pick up a new plugin — tell the user, or do it if they said to proceed.
OpenClaw 2.0 (2026.8.1 and newer)
Do not install the 1.x package on OpenClaw 2.0. Build the separate context-engine package instead:
npm install --prefix plugin-openclaw2
npm run --prefix plugin-openclaw2 build
For the default on_demand mode, merge the following into
~/.openclaw/openclaw.json. load.paths must be the absolute path of the
plugin-openclaw2 directory:
{
"plugins": {
"load": { "paths": ["/ABS/PATH/TO/plugin-openclaw2"] },
"entries": {
"skillsearch": {
"enabled": true,
"config": {
"mode": "on_demand",
"skillsDirs": ["~/.openclaw/skills"]
}
}
}
}
}
In on_demand, the plugin registers skill_search and does not occupy the
context-engine slot. If the user explicitly chooses mode: auto, also add the
two grants to the skillsearch entry and select its context engine:
{
"plugins": {
"entries": {
"skillsearch": {
"hooks": {
"allowConversationAccess": true,
"allowPromptInjection": true
},
"config": { "mode": "auto" }
}
},
"slots": { "contextEngine": "skillsearch" }
}
}
The grants belong under plugins.entries.skillsearch, not in a top-level
hooks block. Restart the gateway/app after changing the package or config.
DeepSeek Harness
Inside the harness workspace:
cp -r <repo>/engine-typescript packages/skill/skill-search
- Add
{ "path": "./packages/skill/skill-search" }to thereferencesintsconfig.host.json(backup + diff first). - Run
pnpm install. - Add a row to
cordis.yml(diff first):
- id: skill-search
name: '@deepseek-ai/dsh-skill-search'
config:
skillsDirs: ['.dsh/skills']
If dsh-tool-skill is mounted, tell the user the two publish the same
skills twice and ask whether to disable it — do not disable it yourself.
Raven
pip install ./engine-python ./plugin-raven
The default on_demand mode registers skill_search and works today. Be
straight with the user that mode: auto still depends on Raven’s upstream
context_segments slot; until Raven ships it, auto injection cannot claim the
skills stage. Raven’s built-in retrieval keeps working. Configure nothing else
unless the user requests auto; then explain this limitation. Verify the
packages import:
python -c "import skillsearch, skillsearch_raven; print('import ok')"
Network and optional model configuration
- A model for the rewriter and gate: better selection, two small model calls per retrieving turn. Ask the user which model/route to use; leave empty if they don't care.
- Remote sources are enabled by default: EverMind SkillHub
(
https://skillhub.evermind.ai), ClawHub, and skillhub.cn each receive the retrieval query and may download candidate skill content to disk. State this plainly during installation. The user can set any endpoint to an empty string to disable that source, or clear all three for local-only operation.
Verification — definition of done
Do all of these; the install is done only when every box is ticked.
- Plugin discovered: the host's own listing/log shows the plugin loaded (Hermes: provider list; OpenClaw 1.x/2.0: plugin log line; DSH: boot log; Raven: the import check and, when available, its tool list).
- Create a test skill in the configured skills directory:
mkdir -p <skills_dir>/pdf-tables
printf -- '---\nname: pdf-tables\ndescription: Extract tables from PDF documents, scanned or native, into CSV.\n---\nUse camelot for native PDFs.\n' > <skills_dir>/pdf-tables/SKILL.md
-
Positive probe — and which probe depends on the mode, because the two modes deliver skills by different routes. Check the configured mode first; if nothing sets
mode, it ison_demand.on_demand(the default from 0.3.0) — start a fresh session and ask "how do I extract tables from a scanned PDF invoice into CSV?". Confirm the agent calledskill_searchand that the call returnedpdf-tables(the host's tool-call display, or its debug view). There is no# Skillsblock in this mode and its absence is correct, not a failure. If the agent answers well without calling the tool, the probe has not passed — it answered from its own knowledge.auto— same question; confirm a# Skillsblock containingpdf-tablesreached the context (the host's debug view, orSKILLSEARCH_GATE_LOG_PATHon Python hosts). Confirm no tool call happened;skill_searchis not offered in this mode. -
Negative probe: ask "zxqv-7319, reply with this exact string only." — in
auto, confirm nothing was injected; inon_demand, confirmskill_searchwas not called. Do not use a weather question: the public catalogues contain real weather skills, so a hit there is correct behaviour and tells you nothing. -
Report: list every file you created or edited (with the diffs), the mode you verified, the probe results, and how to undo everything (the section below).
If step 3 fails: check the skills directory path in the config matches
where you wrote the test skill; check the host was restarted after config
changes; on Python hosts set SKILLSEARCH_GATE_LOG_PATH=/tmp/gate.jsonl
and re-ask, then read the record to see whether retrieval found nothing or
the gate rejected it. In on_demand, also check the tool is actually on the
agent's tool surface before concluding the model chose not to call it.
Report what you find rather than retrying blindly.
A fuller set of prompts and acceptance conditions — six hosts, both modes,
failure isolation and upgrade — lives in
tests/host-e2e/cases.md.
Uninstall
When the user asks to remove skillsearch:
- Remove what install added — Hermes:
$HERMES_HOME/plugins/skillsearch/and theskillsearch.json; OpenClaw: the two config keys and theplugin-openclawpath entry; DSH: thecordis.ymlrow, the tsconfig reference, andpackages/skill/skill-search/; OpenClaw 2.0: theplugin-openclaw2path plus anycontextEngineslot and hook grants added for auto mode; Raven:pip uninstall skillsearch skillsearch-raven. - Offer to delete the bundle cache (
~/.skillsearch/hub,~/.openclaw/skillsearch-bundles, or~/.dsh/skillsearch-bundles). - Restore or delete the
.bak-skillsearchbackups per the user's call. - Show the diffs, same rule as installing.