Back to home@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
GitHub repo

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 keyboard Client Service to dynamic Cordis packages.

Features

  • Open the search overlay by quickly pressing Shift twice.
  • 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 Esc or 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:

  1. verifies the target checkout;
  2. backs up the original Client runner index.ts and api-catalog.ts under .install-backup/;
  3. installs the lifecycle-safe keyboard Client Service;
  4. 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:

  1. read plugin/manifest.json;
  2. use the complete contents of plugin/host.body.js as code.host;
  3. use the complete contents of plugin/client.body.js as code.client;
  4. call cordis_define with plugin: { kind: "new", idPrefix: "fseek" };
  5. call cordis_run with the returned pluginId and packageId.

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:

  1. inspect the current Plugin and note its exact pluginId;
  2. call cordis_define with plugin: { kind: "existing", pluginId } and the latest complete bodies;
  3. call cordis_run for the returned Package with mode: "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.

License

MIT