codezha
dsh-double-shift-file-search
Double-Shift file search plugin for DeepSeek Harness — search filenames and contents in the active workspace, preview with syntax highlighting, and open files with their default app.
- Stars
- 0
- Language
- JavaScript
- Created
- Aug 17, 2026
- Updated
- Aug 17, 2026
Introduction
DSH Double-Shift File Search
English | 中文
A project-scoped file search plugin for the DeepSeek Harness Web GUI, inspired by PhpStorm's Search Everywhere.
[!IMPORTANT] DeepSeek Harness is currently a developer preview and may introduce compatibility-breaking changes. This plugin currently installs a small source patch that exposes a lifecycle-safe
keyboardClient Service to dynamic Cordis packages.
Features
- Open the search overlay by quickly pressing
Shifttwice. - Search file names and text content only inside the workspace project that owns the currently selected Session.
- Preview any result in a scrollable pane with lightweight extension-based syntax highlighting.
- Open the selected file with the operating system's default application.
- Close with
Escor by clicking the backdrop. - Re-check workspace boundaries on the Host before searching or previewing files.
Requirements
- A local checkout of DeepSeek Harness.
- Node.js and pnpm/Corepack as required by DeepSeek Harness.
- A DSH composition that includes the dynamic Cordis Host/Client runners and Cordis tools.
Install the keyboard capability
Clone this repository, then pass your DeepSeek Harness checkout to the installer:
git clone https://github.com/codezha/dsh-double-shift-file-search.git
cd dsh-double-shift-file-search
node scripts/install.mjs /path/to/deepseek-harness
Alternatively, use an environment variable:
DSH_CHECKOUT=/path/to/deepseek-harness npm run install:dsh
The installer:
- verifies the target checkout;
- backs up the original Client runner
index.tsandapi-catalog.tsunder.install-backup/; - installs the lifecycle-safe
keyboardClient Service; - updates the Client Service catalog.
Running the installer repeatedly against the same compatible checkout is idempotent.
Rebuild the existing DSH Web GUI
Run these commands in the DeepSeek Harness checkout:
corepack pnpm --filter @deepseek-ai/dsh-cordis-client-runner run bundle
corepack pnpm --filter @deepseek-ai/dsh-web-frontend run build
Then refresh the existing DSH GUI, normally at http://127.0.0.1:3080. Do not start a separate Vite server as a replacement for the running DSH GUI.
If pnpm run dev:web is already running from that same checkout, it may rebuild the Client plugin bundle automatically; otherwise use the explicit build commands above.
Define and run the dynamic Cordis plugin
The files under plugin/ are plain JavaScript function bodies accepted by cordis_define; they are not importable JavaScript modules.
From a DSH Session using the Cordis/creation preset, ask the agent to:
- read
plugin/manifest.json; - use the complete contents of
plugin/host.body.jsascode.host; - use the complete contents of
plugin/client.body.jsascode.client; - call
cordis_definewithplugin: { kind: "new", idPrefix: "fseek" }; - call
cordis_runwith the returnedpluginIdandpackageId.
Example prompt:
Read plugin/manifest.json, plugin/host.body.js, and plugin/client.body.js from this repository.
Define a new dynamic Cordis plugin using idPrefix "fseek", the manifest name/purpose,
and the complete Host/Client bodies. Then run the returned Package.
A Client package may require approval in the DSH GUI before it runs. Dynamic definitions live only in the current DSH process and must be defined again after that process restarts. Never hard-code generated IDs such as fseek-1 or pkg-1.
Updating a running plugin
To update an existing runtime instance, define a new immutable Package for the same Plugin:
- inspect the current Plugin and note its exact
pluginId; - call
cordis_definewithplugin: { kind: "existing", pluginId }and the latest complete bodies; - call
cordis_runfor the returned Package withmode: "update".
Limits and security boundaries
- Skips
.git,node_modules,vendor,dist,build,coverage,.next,.idea, and.cache. - Visits at most about 4,000 entries and collects at most 1,200 candidate text files per search.
- Returns at most 80 results.
- Does not search or preview files larger than 1 MB.
- Returns at most the first 350 KB for preview.
- Requires the selected project path to remain inside the current DSH Session's accessible workspace root.
- Validates the preview target again before reading it.
- Keyboard listeners, styles, Slot registrations, and Host handlers are owned by the Cordis Fiber and are cleaned up when the package stops or updates.
Uninstall
Use the same checkout path used during installation:
node scripts/uninstall.mjs /path/to/deepseek-harness
Or:
DSH_CHECKOUT=/path/to/deepseek-harness npm run uninstall:dsh
The uninstaller restores only the backups created by this repository. If those backups are missing, it refuses to guess how to modify the DSH checkout. Rebuild the Client runner and Web shell afterward, then refresh the existing GUI.
A running dynamic plugin can be stopped with cordis_stop or removed from the current process with cordis_undefine.
Repository layout
plugin/host.body.js— secure project search and preview Host half.plugin/client.body.js— Double-Shift shortcut, overlay, results, highlighting, preview, and native open action.plugin/manifest.json— plugin metadata and service requirements.dsh-patch/keyboard.ts— lifecycle-safe page-wide keyboard Client Service.scripts/install.mjs— installs the keyboard capability into a DSH checkout.scripts/uninstall.mjs— restores the install-time backups.scripts/check-plugin-bodies.mjs— syntax-checks the dynamic function bodies.
Development
Run focused syntax checks with:
npm run check
Discoverability
This repository uses the dsh-plugin GitHub topic recommended by DeepSeek Harness. Repository topics are metadata configured on GitHub; they are not npm keywords or Git tags.