Bundle
dsh-plugin-snake
A Snake game panel for the DeepSeek Harness web UI
- Source
- ghbhiee
- stars
- 1 stars
- License
- MIT
- Updated
- Updated 14 days ago
Readme
# 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=<content-hash>`, 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 `<style>` tag.
- `react` comes from the loader's shared externals (`require("react")`), never
bundled — two React copies would break hooks.
## Editing
There is no build: `lib/*.js` **is** the source, hand-written CJS for the
browser half and ESM for the host half. Edit it, then restart the web profile.
```sh
npm run check # node --check on both entry points
```
Because the browser half is plain JavaScript, it uses `React.createElement(...)`
directly instead of JSX.
Install
dsh plugin --profile web add github:ghbhiee/dsh-plugin-snake
Profile: web
With the hub plugin installed, ask your agent to install it by name — it resolves the same plan shown here.
dsh plugin --profile web add github:stvlynn/dsh.fish#path:packages/dsh-plugin-hub
install dsh-plugin-snake from the hub
- This source has no pinned commit, so a later push upstream changes what installs. Prefer pinning a commit.