VS Code-style local IDE for DeepSeek Harness: Monaco editor, explorer, search, Git, terminal, and language services. With pnpm, run `pnpm approve-builds --all` so the native build of node-pty is allowed.
Install
# from npm (prebuilt)
dsh plugin --profile web add dsh-aide
# from a prebuilt release tarball
dsh plugin --profile web add "https://github.com/PrismScopes/dsh-aide/releases/download/v0.12.0/dsh-aide-0.12.0.tgz"
# from GitHub (first run asks for allowBuilds approval — follow the hint, retry)
dsh plugin --profile web add github:PrismScopes/dsh-aide
Any plugin you install runs third-party code with your own permissions — it can read your files, use your credentials, and reach the network, and tool approvals don’t sandbox it. GitHub-sourced plugins also run build scripts at install time — pnpm blocks those until you allow them, so an install can stop with ERR_PNPM_GIT_DEP_PREPARE_NOT_ALLOWED or ERR_PNPM_IGNORED_BUILDS; dsh prints the exact key to add under allowBuilds in your profile’s pnpm-workspace.yaml, and the install works on the next run. Allowing a build is a trust decision: only install sources you trust, and pin a commit (github:owner/repo#sha).
README
Highlights
- One integrated AIDE: explorer, Monaco editor, search, Git, terminal, and DSH conversation in one VS Code-style interface.
- A denser, more useful shell: the editor top bar is a compact row of file-icon tabs plus layout actions; the explorer header shows the workspace name, offers reveal-current-file / collapse-all / refresh / create actions, a guided empty state, and letter-plus-colour Git badges.
- Complete file experience: open text, Markdown, images, PDF, and Word files directly; the tree supports drag-and-drop uploads and common file operations.
- Reliable and live: atomic saves and revision checks prevent silent overwrites, while WebSocket updates flag external workspace changes.
- Visual Git workflow: status, staging, commits, branches, diffs, commit files, and a swimlane commit graph.
- Persistent workspace context: restore the tree, views, panels, and widths per workspace; terminals support multiple sessions, splits, and rename.
- Language services: a built-in TypeScript/JavaScript language service plus any external LSP server, with diagnostics, hover, go-to-definition, references, rename, symbols, and completion.
- Built for DSH: reuse the DSH conversation surface on the right and follow the DSH theme instead of shipping a second color scheme.
Features
- Files and editor: lazy explorer with create, upload, drag-and-drop, rename, delete, and Git markers; Monaco tabs provide dirty state, atomic saves, and conflict notices.
- Easter egg: clicking the teaser line in the empty editor state opens Chrome's own offline dino as an editor tab called "小恐龙" (not a popup — switching away or closing the tab exits), filling the editor panel and following the DSH theme (dark mode inverts the transparent canvas so the dark sprites render light); it comes from the MIT npm package
react-chrome-dino(sprites and sounds included — no custom game logic and no vendored assets). - Preview: Markdown source, outline, relative links, and images; built-in PDF paging and zoom plus DOCX rendering, with DOC/ODT download support.
- Search and replace:
@vscode/ripgrepsupports case, whole-word, regex, and path filters. Results are grouped by file with every hit highlighted; replace one match, replace all, preserve case, step through hits withF4/Shift+F4, and the last search (including replacement text and options) survives reloads. - Source control: stage, unstage, discard, commit, branches, diffs, and commit files. The panel title
...menu is nested like VS Codes (view & sort / commit / changes / pull-push / branch / remote / stash / tags) and every submenu entry works: pull, push, sync, fetch, clone, bulk stage or discard, checkout / create / rename / delete / merge / rebase branches, add or remove remotes, stash push-apply-pop-drop, create/delete/push tags, and undo the last commit. Branches, stashes and tags are picked through searchable quick picks. The commit graph is its own editor tab (opened from the commit-graph icon in the Source Control title bar — it uses Git Graph's own SVG icon), coloured like the VS Code Git Graph extension. The graph shows uncommitted changes and stashes; clicking a commit opens a detail panel on the right (author, full message, per-file +/− counts, click a file for its diff), Ctrl(⌘)-clicking a second commit compares the two, and the toolbar offers find (Ctrl+F over message/author/hash/refs) and multi-select branch filtering. It also supports check out, create a branch or tag, reset or drop a commit, cherry-pick, and revert; author/date/hash columns can be shown, hidden and resized; commit messages support emoji shortcodes and issue links (GitHub/GitLab/Bitbucket inferred from the remote URL); repository settings let you edit, fetch and prune remotes, configure issue links and the pull-request target branch, and export the view configuration; the...menu opens the provider-specific pull-request creation page (GitHub compare / GitLab merge_requests / Bitbucket pull-requests); the view menu clears code-review marks; files in the commit details can be marked reviewed (opening a diff marks it automatically, persisted for 90 days); show all branches and load more commits are still there. In-tab shortcuts:Ctrl+Ffind,Ctrl+Hjump to HEAD,Ctrl+Rrefresh,↑/↓move between commits,Escclose the details. "Show Git Output" opens a log of the git operations the workbench ran. - Terminal:
node-ptyand xterm with up to eight sessions, rename, a right-side switcher, splits, ANSI output, and Ctrl+C. The host pre-warms the default shell when the panel opens, so a new terminal usually already has its prompt in the replay buffer; collapsing the panel or switching tabs keeps the xterm instances instead of rebuilding and replaying them. Terminal session tabs sit at the top of the terminal view; the left side of the bottom panel title bar holds three separate rounded buttons (Problems / Output / Terminal, not a tab strip), and its⋯menu currently offers a Debug Console panel (an empty state until a debugger is wired in). - Output: mirrors VS Code's Output view with channels — the language-services channel collects LSP server output plus connection/scan events, and the Git channel records every Git command issued by the workbench. Five-level filtering (trace / debug / info / warning / error, hidden rather than deleted), text filtering, scroll lock vs. follow,
path:line:collinks, copy / add to conversation / clear, and virtualized long logs; the active channel is remembered. - Composer context cards: typing
@in the DSH composer now includes an "AIDE context" source that inserts the current file, current-file problems, or workspace problems as structured reference chips. The Problems panel's AI button, the explorer's "Add to conversation", and the editor DSH submenu's "Add as context card" share the same path. Chips store only a kind plus a locator; content is read at send time (diagnostics never use a stale snapshot), with automatic fallback to the old text insertion when no composer service is available. See docs/context-cards.md. - Layout and DSH: the primary view, terminal panel, and DSH conversation sidebar can be shown and resized independently; widths are dragged and double-clicked back to default in place, so they are not duplicated as settings.
- Settings page: the "AIDE" page under DSH settings is one scrolling page grouped into Editor / AI completion / Language services / Command palette and changes / Terminal / Shortcuts / About and diagnostics, using the same type scale as DSH settings (row title 14/20, hint 12/18, controls 14/32px). Editor: font size, line height, tab size and insert-spaces, word wrap (off/on/bounded), minimap, overview ruler, occurrence highlight, whitespace rendering, cursor style, smooth scrolling, sticky scroll, auto save and delay. AI completion: master switch and trigger delay; the model is always DSH's current default model, with no route or fallback — switch models in DSH itself when one fails. Command palette and changes: recent-file count, key hints, and whether the Changes panel auto-refreshes. Language services: master switch, built-in TypeScript switch, hover/completion toggles, discovered-server states, and the settings-file path. Also terminal font size, a shortcut panel (one "view" row on the page that opens a searchable, rebindable panel: click a keycap to record in place, conflict warnings, per-row and reset-all defaults; Monaco's built-in editor keys stay read-only), and reset-to-defaults.
- Occurrence highlight and overview ruler: selecting or double-clicking a word highlights every occurrence in the document the way VS Code does, and a three-lane overview ruler appears on the right (selection, occurrences, and find matches are drawn in the scrollbar strip). Ruler markers use the foreground color (white on dark themes, no longer the blue accent), and the scrollbar slider is translucent so it never hides them.
- Close confirmation and auto save: closing a tab, bulk-closing (others/right/saved/all), or returning to DSH with unsaved edits opens a VS Code-style dialog (single: Save / Don't Save / Cancel; multiple: Save All / Don't Save All / Cancel with the file list). Files that fail to save stay open and report the error, and returning to DSH is blocked while any save failed. An optional delayed auto save is available too.
- Localized context menus: the explorer, tabs, code editor, terminal, and source control all have VS Code-style menus in Chinese — new/upload/cut/copy/paste/rename/delete, copy relative or absolute path, open in terminal, tab close-others/right/saved, editor undo-redo and find-replace, terminal copy/paste and clear, Git stage/unstage/discard/copy commit hash. Monaco's built-in English menu is disabled (
contextmenu:false); menu contents are pure data (unit-tested) over one shared shell. - Richer editor menu: the standard edit items are grouped into submenus (Select / Find / Go To / Lines / Convert / Format), so the top level stays at 12 rows — undo/redo, cut/copy/paste, the six groups, and save — instead of 30 flat items. Inside are the VS Code staples: select all occurrences, go to definition / find references / rename symbol, move-copy-delete lines, indent, transform case, add cursor above/below, line and block comments, format document or selection, fold and unfold. With a text selection, a "DeepSeek Harness" submenu appears at the very top: Add to Conversation, Ask DSH…, Explain / Fix / Refactor this code, Generate Unit Tests, Add Comments, Review this code, Copy as Quote. Everything except "Copy as Quote" only inserts the quote or instruction into the DSH composer — it never sends for you, so you can finish the message and send it yourself. The menu supports two levels (hover or arrow keys to expand, Escape closes one level at a time) and exposes
registerEditorMenuContributionso other plugins can append their own items. The menus are text only (no icons); only expandable submenus carry a small chevron at the end of the row. - Inline completion: ghost-text suggestions at the cursor, served by a real model or a local fallback; cycle through candidates and accept by block, by line, or by word. Context comes from the current file and a local retrieval index that never leaves the workspace directory. See docs/inline-completion.md for implementation and verification status. Note: host-side code loads at process start, so restart the app after changes (a page reload is enough for the client side).
- Command palette and quick open:
Ctrl+Pfuzzy-opens any workspace file (recent files first; type>to switch to commands), whileCtrl+Shift+Pis a full command entry with 71 commands across files/tabs, editor actions, views and panels, search, terminal split/close, source control, AI, DSH, change review and language services, with the current keybinding on the right. The recent-file count and key hints are configurable. Both read the same editable keybinding registry as the settings page. The host caches the workspace file list for five seconds; ranking twenty thousand paths costs about 5–10 ms and runs on a deferred value so typing stays responsive. - Inline AI edit: select code (or put the cursor on a line) and press
Ctrl+K, then describe the change. The result appears as a diff overlay on top of the editor (inline or side-by-side); accepting applies it as one undoable edit to the buffer, and rejecting changes nothing. Generation can be cancelled, and an edit is refused if the file changed while the model was thinking. The editor context menu's "Edit selection with AI" is the same action. - Change review and checkpoints: the bottom "Changes" panel lists files that differ from their baseline (DSH Agent writes
and manual edits both appear), with per-file diffs, confirm and restore. "Create checkpoint" stores the current changes under
the workspace's
.dsh-workbench/checkpoints.json, and rolling back first backs up the current state, so the rollback itself can be undone. Previously opened files compare against an in-memory baseline; tracked files that were never opened fall back togit show HEAD; untracked files have no baseline and can only be confirmed. The status bar shows an "N unreviewed" entry, and the command palette can create checkpoints or confirm all changes. - Language services (LSP / diagnostics / navigation): a built-in TypeScript/JavaScript service reads
tsconfig.jsonand resolves workspacenode_modulestypes, while external LSP servers are discovered onPATH(pyright/pylsp, rust-analyzer, gopls, clangd, yaml-language-server, bash-language-server, lua-language-server, intelephense, solargraph, …) or configured in the settings file.F12/Ctrl+Clickgo to definition,Shift+F12finds references,F2renames across files,Ctrl+Shift+Olists document symbols,Ctrl+Tsearches workspace symbols, andCtrl+.offers quick fixes (including organize imports); hover shows cross-file types and completion/signature help come from the language service. Diagnostics are live (260 ms debounce) and surface in the editor, the activity bar "Problems" badge, the status bar counts, and a grouped, filterable Problems panel where clicking jumps to the location andF8/Shift+F8step through them. "Scan workspace" in the panel type-checks the whole program once (instead of re-checking the program per file) in a dedicated worker, so completion, Git, terminal and save operations stay responsive while it runs. The panel also offers grouped/flat views, a current-file filter, single/multi-line messages, arrow-key navigation, a context menu (copy / quick fix / add to conversation), virtualized rendering for thousands of diagnostics, and an "Add to AI" button. Jumping intonode_modulesor TypeScript'slib.*.d.tsopens a read-only tab that still supports hover and further jumps. Settings expose the master switch, the built-in TS switch, and hover/completion toggles; external servers and custom configuration are documented in docs/language-services.md. - Sync and restore: workspace file changes stream to the UI, while reload restores views, expanded directories, panels, layout, and the file tabs from your previous session (stored locally per workspace root: leaving to the DSH main page, reloading the page, or restarting the app all bring the tab bar back; contents are re-read from disk when you switch to a tab, and unsaved drafts are not restored across sessions. Files that changed on disk while AIDE was hidden are reloaded when you return).
AIDE mounts through DSH's shell.overlay, main, sidebar.panellist, and settings.section extension points
(main and sidebar.panellist are registered as a pair and swap places when the side panel is collapsed). It does not
replace or disable ui-layout.
Performance
- Terminal startup: opening the terminal panel pre-warms the default shell on the host (
TerminalManager.prewarm, reclaimed after 90 seconds if nobody claims it). Creating a terminal then adopts that shell, whose replay buffer already holds the prompt. On this machinepwshneeds about 530 ms from spawn to accepting commands; a pre-warmed create costs about 2 ms on the host. Create/close/rename each issue a single request, and the panel plus every opened xterm instance stay mounted. Deployments that do not want the extra idle shell can disable prewarming withDWV_TERMINAL_PREWARM=0(creation still works). - Rendering and IO: file-change pushes only update tab state when something actually changed; resizer drags move CSS variables and persist the layout once on pointer-up; the Markdown outline and the Git commit graph are memoized; Monaco models are evicted LRU (open/dirty files kept, limit 12); TextMate grammars are installed once per language and files over 3000 lines or 200 KB fall back to the built-in tokenizer.
- Cold-start code splitting: the PDF and Word render stacks are only needed when such a file is opened, so they now live
in DSH client chunks (
lib/client.pdf.js487 KB,lib/client.docx.js243 KB) loaded same-origin on first preview. The main bundle drops from 2.65 MB to 1.75 MB (gzip 584 KB → 375 KB) and V8 compile from 28 ms to 18 ms; neither chunk is downloaded unless you open a PDF or Word document. - Language services: fully lazy — TypeScript is not loaded and no external server is started until a file of that language is opened; diagnostics run 260 ms after typing stops and the client coalesces refreshes for 80 ms, so hundreds of diagnostics do not re-render the Problems panel per message.
- Completion: request bodies carry only the cursor window (about 20 KB for a 1 MB document, with the prompt byte-identical to sending the whole document); response headers no longer wait for the retrieval index; snippets are read by line range and multiple hits in one file share a single scan.
- Git:
gitRootand rev-parse results are cached, bringing a Git panel refresh from fivegit.exeinvocations to two on the warm path; committing reuses the status the host returns and only refetches the log. - Reproducible baseline:
pnpm perfmeasures terminal startup (spawn / first byte / interactive readiness for three shells, plus "warm ready / adopting the warm shell / waiting without prewarm"), client bundle size and compile cost (including the on-demand chunks), and host entry load cost, writingperf-results/baseline.json(gitignored). Measured here: adopting the warm shell takes about 2 ms, while clicking "new terminal" without prewarm needs about 100–160 ms to a prompt (the shell's own startup is absorbed by the time the panel is open or the button is hovered). Current bundle numbers: mainlib/client.js1.75 MB (about 375 KB gzip, about 18 ms V8 compile), host entry import about 37 ms. - No native/Rust addon: the host's hot spots are Windows process creation (about a 44 ms floor per
git.exeor shell) and protocol overhead, not JavaScript computation. Pure JS optimizations capture most of the win, while a native addon would need to cover both the Electron and Node ABIs with per-platform prebuilds, which is not worth the install size and distribution cost.
Demo
Installation
Install from Discover
DSH's Plugins → Discover tab does not scan npm or GitHub automatically; it only reads format-1 index sources that the user adds. Open Discover → Index sources → Add index source and enter:
https://raw.githubusercontent.com/PrismScopes/dsh-aide/main/market/index.json
Refresh, select AIDE, and install. The index uses the prebuilt npm package, so installation does not compile on the user's machine.
Install from npm
dsh plugin --profile web add dsh-aide
Direct install (fallback)
# Prebuilt tarball
dsh plugin --profile web add https://github.com/PrismScopes/dsh-aide/releases/download/v0.14.1/dsh-aide-0.14.1.tgz
# Or a pinned Git commit
dsh plugin --profile web add github:PrismScopes/dsh-aide#29f11c09835a8560f47a6c19679eca43361cd9e6
package.json declares dsh.bundle and engines.dsh (>=0.2.1-rc.2 <0.3.0), both required for market index validation.
First terminal installation
The terminal uses node-pty. On the first install, pnpm 11 may block its build script, so dsh plugin ... add can report Ignored build scripts and end with an error. This is an expected safety check: the dependency has already been written to the profile. Run this on the machine that runs DSH:
cd ~/.dsh/profiles/web
pnpm approve-builds --all
This approves the node-pty build and completes the installation. Restart dsh web afterwards. If the terminal still reports that node-pty cannot load, run:
cd ~/.dsh/profiles/web
pnpm approve-builds --all && pnpm rebuild node-pty
pnpm can also delay versions published less than 24 hours ago. Retry after the waiting period, or use DSH's "Update now" action when it is offered.
Version requirement
PDF and Word previews load their render stacks through DSH client-module on-demand chunks (require.async), which requires DSH
0.2.1-rc.2 or newer (declared in dsh.compatibility). On older hosts those two previews report that on-demand loading is not
supported; every other feature keeps working.
Listings and promotion
- GitHub: PrismScopes/dsh-aide — the repo carries
dsh-plugin/deepseek-harnesstopics, so several plugin directories index it automatically. - DSH Market: listed — dsh.market (dshmarket) scans the
dsh-plugintopic and curated lists daily. - DSH Plugin Hub: listed — dsh-plugin.org community plugin market, auto-indexed from the topic, with a Chinese entry.
- DSH Profile Hub: listed — dshpluginhub.ai, synced from npm hourly; also hosts shareable Profiles.
- npm:
dsh-aide— published; it also feeds the indexes (package.jsondeclares thedsh.bundlemanifest, exact SemVer,engines.dsh, andcordis.patch.yml). - dsh.so market: submission page — paste the repository or package name for schema validation and a security scan.
- awesome-dsh-plugin: community catalog — one
data/plugins/<owner>__<repo>.ymlper plugin.
Submitted listings (under review / sync): awesome-dsh-plugin #8551 · awesome-dsh-plugins #145 · dshopen.org #17.
Clients with custom plugin-index support can add
https://github.com/PrismScopes/dsh-aidedirectly.
Shortcuts
The table lists default bindings: under DSH Settings → AIDE → Shortcuts, click "view" to open the shortcut panel, where you can search by command name or keycaps and click the keycaps to record a new combination in place (conflicts with other commands or with the editor's built-in keys are reported), then restore one row or all of them. The editor's own find/replace/goto-line/comment/format keys come from Monaco and are shown read-only.
| Shortcut | Action |
|---|---|
Ctrl+Shift+E |
Open Explorer |
Ctrl+Shift+F |
Open Search and focus the input |
Ctrl+Shift+H |
Open Search with the replace row expanded |
F4 / Shift+F4 |
Next / previous search result |
Ctrl+Shift+G |
Open Source Control |
Ctrl+P |
Quick open a file (type > for commands) |
Ctrl+Shift+P |
Show all commands |
Ctrl+K |
Edit the selection with AI |
Ctrl+S |
Save the active file |
Ctrl+Alt+B |
Toggle the DSH conversation panel |
| `Ctrl+`` | Show or hide the terminal |
| `Ctrl+Shift+`` | Create a terminal |
Tab |
Accept the whole suggestion |
Ctrl+Right |
Accept the next segment |
Ctrl+Alt+Right |
Accept the next line |
Alt+[ / Alt+] |
Previous or next candidate |
F12 / Ctrl+Click |
Go to definition |
Shift+F12 |
Find all references |
F2 |
Rename symbol |
Ctrl+Shift+O |
Go to symbol in file |
Ctrl+T |
Go to symbol in workspace |
Ctrl+. |
Quick fix / code action |
Ctrl+Shift+M |
Toggle the Problems panel |
F8 / Shift+F8 |
Next / previous problem |
Security
The host accepts only paths relative to the active DSH session workspace and rejects traversal and symlink escape. Saves use revision checks and atomic replacement. Git and ripgrep run with argument arrays rather than shell-concatenated commands. The terminal accepts same-origin loopback requests only, starts in the session workspace, and removes API keys, tokens, secrets, and similar environment variables. Language services only start external servers that were discovered on PATH or explicitly configured by the user (argument arrays, no shell); files outside the workspace can only be read when they are SourceFiles inside the language service's own program (used for read-only navigation tabs), so this cannot be used to read arbitrary disk files.
Development
pnpm install
pnpm typecheck
pnpm test
pnpm build
pnpm perf # performance baseline (terminal startup / client bundle / host entry)
Requires Node.js ^22.19 || >=24, pnpm 11.7, system Git, and the native build prerequisites for node-pty when no prebuild is available.
Contributors
- Author / maintainer: PrismScopes
- Origin: AIDE started from tingfeng347/dsh-vscode-workbench (MIT); thanks to the original author for the foundation. This repository keeps the MIT license and the full commit history.
Issues and pull requests are welcome.
License
Links
More in this category
zhu1090093659/dsh-web#packages/dsh-task-board★ 9925
Task board for the dsh web GUI: a sidebar multi-column kanban whose cards run in real DSH agent sessions and can also be scheduled with cron expressions, executed host-side even with the browser closed.
zhu1090093659/dsh-web#packages/dsh-web-all★ 9925
Plugin and skin collection for the DSH Web UI: task board, Git graph, right-side panel, remote mobile UI, pet, live token stats, and a skin center.
MeteorNOX/DeepSeek-Balance-Whale-Widget★ 6712
A fixed-corner whale widget for the DSH web GUI — balance, today's usage and per-turn cost with peak/off-peak pricing, editable balance-alert and daily-budget bubbles, a module-based custom bubble queue with A/B weighted choices and random lines or images, 30+ vendor templates (OpenAI, OpenRouter, Kimi, SiliconFlow, Ark, Zhipu, MiniMax and more) with per-model balance and subscription quota, plus task-end sound, imported audio, custom roles and a resource manager. Local-only, no telemetry.
ccch1mneyyy/dsh-TUI★ 6538
Claude Code-style full-screen terminal UI: pixel-whale header, live status line, and streaming thought expansion.
omdsh-dev/DSH-better-sidebar★ 4808
Full sidebar workbench with file rendering and editing, terminal, Git, and subagents; third-party plugins can register new tabs.
Devin-AXIS/deepseek-design#deepseek-idesign★ 1672
Visual design studio for websites, app prototypes, posters, cards, reports, and magazines, with templates, direct element editing, selection-aware AI draft handoff, and export.
Community comments
Comments are public GitHub Discussions. Loading them connects to GitHub and Giscus; a GitHub account is required to post.