# 🧠 dynamic-schulte-dsh [![](https://img.shields.io/badge/powered_by-dsh-4D6BFE?style=flat-square&logo=deepseek&logoColor=white)](https://github.com/deepseek-ai/deepseek-harness) [![License: MIT](https://img.shields.io/badge/license-MIT-yellow.svg?style=flat-square)](LICENSE) [δΈ­ζ–‡](README.md) | English > Dynamic Schulte Table Β· a waiting-room mini-game plugin for DeepSeek Harness. The model does not play this game β€” it exists for **you to play while the model is replying**. The plugin registers a "Schulte" entry at the bottom of the dsh Web UI sidebar. While the current session's model is thinking, the entry shows a breathing green dot. ## Features - 🎯 **Static grid**: classic nΓ—n Schulte Table (3Γ—3 ~ 7Γ—7), tap 1..N in order - 🎑 **Dynamic roulette**: numbers laid out on concentric rings, the wheel spins at an adjustable speed to train hand-eye coordination and anti-distraction - πŸ’š **Waiting indicator**: the sidebar entry and the panel header both show a hint while the model is thinking - πŸ’Ύ **Local persistence**: history and settings live in browser localStorage β€” no backend needed - Optional: target highlight / random color noise ## Screenshot Dynamic roulette gameplay screenshot ## Installation The plugin declares a `dsh.bundle` manifest, so it installs via `dsh plugin add`: ```sh # 1. Build (or use a published artifact) pnpm install pnpm build # 2. Install into a profile dsh plugin --profile add -w /path/to/dynamic-schulte-dsh # 3. Start the Web UI dsh --profile ``` Open the Web UI and click "Schulte" at the bottom of the sidebar to play. To uninstall: ```sh dsh plugin --profile remove dynamic-schulte-dsh ``` ## Development ```sh pnpm install # devDeps: typescript / tsdown / react types pnpm typecheck # tsc --noEmit (framework types resolve via tsconfig paths to a local deepseek-harness checkout) pnpm build # tsdown β†’ lib/index.js (host stub) + lib/client.js (browser bundle) pnpm verify:host # smoke-test the build artifacts ``` ## Architecture - **Host half** (`src/index.ts`): a stub plugin. The game is browser-only; the host half exists so the Cordis Loader row resolves and the `dsh.client` client package is discovered by the web shell. - **Client half** (`src/client/`): the browser bundle, registering the `sidebar.footer.action` slot. The panel is a complete game β€” `engine.ts` is a pure-TS state machine (no React), while `GridBoard`/`RouletteBoard` render the static grid and the dynamic roulette. - **Build**: `tsdown.config.ts` mirrors the harness repo's client-bundle conventions β€” platform modules stay external, everything else inlines, and the output is a `window.__ModuleLoader__.load({id, factory})` closure factory served by the web shell at `/plugins/dynamic-schulte-dsh/client.js`. ## Compatibility - Runtime: dsh Web UI (`@deepseek-ai/dsh-web-app` bundle) - Depends on: React 18 (a platform module) β€” no backend, no model involvement - Requires browser localStorage support ## License MIT