# dsh-plugin-snake A Snake (čīŠåƒč›‡) game panel for the [DeepSeek Harness](https://github.com/deepseek-ai/deepseek-harness) web UI, as an out-of-tree plugin. A floating 🐍 button in the frame's overlay layer opens a self-contained Snake game: arrow keys / WASD to steer, Space to pause, swipe gestures on touch screens. The high score is persisted in `localStorage`. ## Install The plugin is hand-written JavaScript with no build step, so it installs straight from GitHub — nothing to download or compile: ```sh dsh plugin --profile web add github:ghbhiee/dsh-plugin-snake ``` Or from a local clone (a `link:`, so edits are picked up on the next restart): ```sh git clone https://github.com/ghbhiee/dsh-plugin-snake.git dsh plugin --profile web add ./dsh-plugin-snake ``` Restart the web profile afterwards — plugins are assembled at boot, never hot-loaded: ```sh systemctl restart dsh-web # or: launchctl kickstart -k gui/$(id -u)/com.tokencv.dsh-web ``` Sibling plugins install the same way: [dsh-plugin-workbench](https://github.com/ghbhiee/dsh-plugin-workbench), [dsh-plugin-mobile-shell](https://github.com/ghbhiee/dsh-plugin-mobile-shell), [dsh-plugin-cli-session](https://github.com/ghbhiee/dsh-plugin-cli-session). ## How it works Two halves, discovered through `package.json`: | Half | Entry | Runs in | Role | |---|---|---|---| | host | `exports["."]` → `lib/index.js` | Node | An **empty** cordis plugin. It exists so the bundle row resolves and dsh can discover the browser half. | | browser | `exports["./client"]` → `lib/client.js` | the page | Registers into the `shell.overlay` seat and renders the game. | - `cordis.patch.yml` contributes the one bundle row (`id: snake`, `name: dsh-plugin-snake`), which is what makes the package get imported. - The browser half wraps itself in `window.__ModuleLoader__.load({ id, factory })` — `id` must equal the package name — and is served at `/plugins/dsh-plugin-snake/client.js?rev=`, so a code change invalidates the browser cache by itself. - It registers a component rather than touching the page: the host app renders every entry registered into `shell.overlay` as its own React children. The one piece of direct DOM work is injecting a de-duplicated `