@zhaoyang10/dsh-web-ide
v0.1.2
Published
IDE tab for the dsh web client: a VSCode-style read-only code viewer with the Dark Modern theme, registered into the conversation view ring.
Maintainers
Readme
DSH Web IDE
DSH Web IDE 插件 —— 基于 Monaco Editor,在 DSH 会话页中内置一个 VSCode 风格的开发工作台:资源管理器、代码编辑与保存、Git 全流程管理、交互式终端、全局搜索,以及会话与 IDE 的双向联动。
| 资源管理器与编辑器 | Git 源代码管理 |
| :---: | :---: |
|
|
|
安装
# 安装到 DSH web profile(推荐)
dsh plugin --profile web add @zhaoyang10/dsh-web-ide
# 或仅安装 npm 包本体
npm install @zhaoyang10/dsh-web-ide安装后还需把
@zhaoyang10/dsh-web-ide加入 profile 的dsh.profile.bundles并重启dsh web,详见 安装到 DSH。
目录
功能特性
资源管理器
- 无限层级目录树,按扩展名自动匹配文件图标
- 新建文件 / 文件夹、重命名、删除,全部经 host 侧工作区路径校验,杜绝越界访问
- 文件条目带 Git 状态标记(未跟踪 / 修改 / 已暂存 / 已删除 / 冲突)
- 超过 2MB 的大文件自动分页截断展示,避免界面卡顿
代码编辑器
- Monaco Editor(VS Code 同款内核)+ Dark Modern 暗色主题
- 常用编程语言语法高亮、行号、代码折叠,多 Tab 页签管理与快捷切换
- 直接编辑并保存(
Ctrl/Cmd+S或状态栏按钮),关闭未保存 Tab 时询问保存 / 放弃 - 保存冲突检测:磁盘文件被其他工具(或 AI)改动时,可选择覆盖磁盘或放弃修改并重新加载
- Markdown 文件一键切换 编辑 / 预览 双视图
- 内嵌真实 Monaco Editor Worker(Blob 实例化),diff 增删高亮离线可用,无 CDN 依赖
源代码管理(Git)
- 更改列表:逐文件或全部 暂存 / 取消暂存 / 丢弃变更
- 提交:常规 / 修正(amend)/ 签名(signoff)/ 提交并推送 / 提交并同步
- AI 生成提交信息:复用当前会话模型自动撰写提交语
- 分支管理:检出 / 新建 / 删除分支,领先 / 落后计数,一键发布分支(
git push -u origin) - 图形化提交历史(Graph 视图)与提交详情浏览
- 双栏 Diff 对比编辑器,增删行高亮
- Fetch / Sync(拉取并推送)
终端
- node-pty 驱动的真实交互式终端,支持多实例与分屏
Ctrl+C中断、终止终端、最大化 / 展开 / 还原- 关闭面板不终止进程,重新打开自动回放历史输出(scrollback 回放)
全局搜索
- 基于 ripgrep 的全工作区检索
- 支持正则表达式、区分大小写、include glob 过滤(如
*.ts) - 匹配计数与截断提示,点击结果直达目标文件与行
平台集成
- 注册为会话页第三个 Tab(会话 → 轨迹 → IDE),随插件卸载自动移除
- 侧边栏联动:会话侧打开的文件自动落入 IDE,IDE 浏览时同步高亮
- 中 / 英双语界面,跟随 DSH 客户端语言设置
安装到 DSH
本插件以 DSH bundle 形式分发。安装分两步:把插件包装入 profile 依赖,再把包名加入 profile 清单的 dsh.profile.bundles 数组。DSH 启动时会自动套用插件自带的 cordis.patch.yml,把 ui-ide 客户端插件注册进 web 客户端 roster,无需手动改 roster。除 DSH 本体外没有其他前置包:IDE 的保存 / 新建等文件操作由本插件自己的 host 服务实现。
前置条件
- 已安装 DSH CLI(
dsh命令可用,建议 0.1.6+) - 已有 web profile,且
dsh web可正常启动(profile 目录默认在~/.dsh/profiles/web)
方式一:从 npm 安装(推荐)
把插件装入 web profile:
dsh plugin --profile web add @zhaoyang10/dsh-web-ide编辑
~/.dsh/profiles/web/package.json,在dsh.profile.bundles数组末尾追加本插件包名:"dsh": { "profile": { "bundles": [ "...其他 bundle...", "@zhaoyang10/dsh-web-ide" ] } }重启 DSH web:
dsh web
方式二:本地目录安装(开发调试用)
构建插件(在本仓库检出目录执行,产出
lib/):pnpm install pnpm bundle把插件以本地 link 方式装入 web profile(
dsh plugin会把命令转发到 profile 目录执行pnpm add,link:后接绝对路径):dsh plugin --profile web add link:/absolute/path/to/dsh-web-ide同方式一第 2 步,把
@zhaoyang10/dsh-web-ide加入dsh.profile.bundles并重启dsh web。
link:始终引用源目录,改动后重新构建并重启即可生效;若希望安装时拷贝一份快照,可改用dsh plugin --profile web add file:/absolute/path/to/dsh-web-ide。
方式三:手动注册 roster(不启用 bundle patch)
若不想把插件列为 bundle(例如仅在某个 profile 临时启用),可以只完成依赖安装,然后在 profile 用户层 ~/.dsh/profiles/web/cordis.patch.yml 中手动插入 roster 条目:
- insert:
- id: ui-ide
name: '@zhaoyang10/dsh-web-ide'验证安装
- 重启 DSH web(
dsh web) - 打开浏览器右侧工具栏,确认 "IDE" 入口可见
- 点击进入 IDE 界面,检查文件树、编辑器、终端、Git 面板等功能是否正常
卸载
- 从
~/.dsh/profiles/web/package.json的dsh.profile.bundles中移除@zhaoyang10/dsh-web-ide - 移除依赖:
dsh plugin --profile web remove @zhaoyang10/dsh-web-ide - 重启
dsh web
使用指南
界面入口
在会话页顶部 Tab 栏切换:会话 → 轨迹 → IDE。IDE 视图与当前 session 绑定,工作区即该会话的 cwd。
文件操作
- 打开文件:点击文件树中的文件,或使用搜索结果直达
- 新建文件 / 文件夹:使用资源管理器顶部操作栏或右键菜单
- 重命名 / 删除:右键文件选择对应操作(删除带二次确认)
代码编辑与保存
- 编辑器可直接修改内容,改动后 Tab 与状态栏出现未保存标记
Ctrl/Cmd+S或点击状态栏未保存指示保存- 关闭未保存的 Tab 会弹出 保存 / 不保存 / 取消 确认
- 磁盘文件被外部(其他工具或 AI)修改后再保存会提示冲突:覆盖磁盘,或放弃修改并重新加载
Git 操作
- 打开 Source Control 面板查看更改,逐文件或全部暂存 / 取消暂存 / 丢弃
- 点击文件查看 Diff;编写提交信息后
Ctrl/Cmd+Enter提交 - 点击「AI 生成提交信息」按钮,让会话模型代写提交语
- 「更多提交操作」菜单:修正提交、签名提交、提交并推送、提交并同步
- 分支视图检出 / 新建 / 删除分支;Graph 视图浏览提交历史
终端
- 终端面板新建终端,支持分屏与最大化
Ctrl+C中断当前进程;关闭面板终端保持后台运行,重新打开自动回放输出
全局搜索
- 支持正则、区分大小写与 include glob(如
*.ts)过滤 - 输入关键词回车搜索,点击结果跳转到对应文件与行
Markdown 预览
打开 .md 文件后,点击编辑器工具栏的预览按钮,即可在 编辑 / 预览 之间切换。
会话联动
在会话中打开文件(如让模型把文件打开到侧边栏),文件会自动在 IDE 中打开;在 IDE 侧边栏浏览文件时,会话侧同步跟随高亮。
工作原理
会话页 Tab: [ 会话 ] [ 轨迹 ] [ IDE ]
│
浏览器 bundle:lib/client.js
注册 ide Tab · 文件树 · Monaco · Git · 终端 · 搜索
│
│ typert 远程调用
│ workspaceFiles(读) / ideTools(写 · git · 终端)
▼
Host 服务:lib/index.js
ripgrep 搜索 · node-pty 终端 · git 全流程 · 文件写(+ 工作区校验 + sandbox 围栏)- 双入口:
lib/index.js为 host 侧入口,挂载ideTools远程命名空间;lib/client.js为浏览器 bundle,注册ide会话 Tab。 - 自动注册:DSH 启动时套用包内
cordis.patch.yml,把ui-ide写入浏览器 roster。 - 依赖注入:
package.json的dsh.client.inject声明所需浏览器服务(slots / sessions / locale / remote 等),由启动内核先行解析。 - 保存链路自持:编辑器保存走
ideTools.writeFile(本包 host 服务,非独立包):先按会话工作区做路径校验,再交给宿主fsseam 的writeText—— 由 sandbox 策略围栏目标、按文件真实版本做原子并发校验(过期保存报冲突而非静默覆盖),成功后fs/observed回灌会话的文件变更流,会话侧与 agent 都能看到这次改动。
开发指南
环境要求
- Node.js 20.19+(tsdown / rolldown 要求)
- pnpm 8+
- TypeScript 5.6+
本地开发
# 安装依赖
pnpm install
# 生产构建(产出 lib/)
pnpm bundle
# 开发模式(监听重建,配合 HMR 热更新)
pnpm watch
# 远程契约测试
pnpm test:contract
@deepseek-ai/*系列依赖已发布在公共 npm 上,devDependencies中以版本范围声明(与peerDependencies保持一致),pnpm install即可直接装好,无需任何本机路径或link:。tsdown 会把它们保持为 external,运行时由宿主 DSH 从自己的node_modules解析,因此这些依赖只参与本地类型检查,不影响发布产物。
目录结构
dsh-web-ide/
├── src/
│ ├── index.ts # Host 入口:ideTools 远程服务(搜索/终端/Git/文件操作)
│ ├── typert.host.ts # 远程方法 zod 协议定义
│ ├── typert.remote-client.ts # 浏览器侧远程客户端
│ └── client/
│ ├── index.ts # 客户端入口:注册 ide Tab + 字典 + 侧边栏桥
│ ├── IdeView.tsx # IDE 主视图(Tab / 编辑器 / 面板编排)
│ ├── ContextMenu.tsx # 右键菜单
│ ├── sidebarBridge.ts # 会话 ↔ IDE 联动
│ ├── theme.ts # Dark Modern 主题定义
│ ├── locales.ts # zh / en 字典
│ ├── language.ts # 扩展名 → 语言映射
│ ├── icons.tsx / icons/ # SVG 图标(含生成脚本)
│ ├── monaco-worker.ts # Monaco Worker 打包入口
│ ├── monacoWorkerBootstrap.ts # Blob URL Worker 引导
│ ├── editor/ # TabBar / StatusBar / MarkdownPreview
│ ├── explorer/ # FileTree
│ ├── git/ # SourceControlPanel / DiffEditor / GraphView / BranchesView
│ ├── search/ # SearchPanel
│ └── terminal/ # TerminalPanel
├── scripts/
│ ├── build-monaco-worker.mjs # 把 Monaco Worker 源码内嵌进客户端产物
│ ├── tsdown.worker.config.ts # Worker 构建配置
│ └── test-remote-contract.mjs # 远程契约测试
├── cordis.patch.yml # bundle patch:自动注册 ui-ide 到浏览器 roster
└── tsdown.config.ts # 主构建配置定制扩展
- 主题:
src/client/theme.ts定义 Dark Modern 配色,可调整 IDE CSS 变量与 Monaco 主题色 - 文件类型:编辑
src/client/language.ts的EXT_MAP/NAME_MAP扩展图标与语言映射 - 多语言:
src/client/locales.ts维护 zh / en 字典
热更新调试(可选)
在 profile 用户层 cordis.patch.yml 中启用 hmr 行并指向本仓库,host 侧服务即可在 pnpm watch 重建后自动热载(浏览器侧仍需刷新页面):
- id: hmr
disabled: false
config:
base: /absolute/path/to/dsh-web-ide
root:
- lib在本仓库执行 pnpm watch,并重启一次 dsh web 使配置生效。
发布到 npm(维护者)
# 1. 版本号(会自动打 git tag)
npm version patch # 或 minor / major
# 2. 发布(prepublishOnly 钩子自动执行 pnpm run bundle)
npm publish --registry=https://registry.npmjs.org/
# 3. 验证
npm view @zhaoyang10/dsh-web-ide version --registry=https://registry.npmjs.org/npm 已强制发布需 2FA:请在 npmjs.com 账号设置中绑定安全密钥 / 通行密钥(WebAuthn,macOS 可用 Touch ID),发布时按提示在浏览器中确认;新增 TOTP 验证器已不被支持。
浏览器兼容性
| 浏览器 | 最低版本 | | --- | --- | | Chrome | 90+ | | Firefox | 88+ | | Safari | 14+ | | Edge | 90+ |
版本历史
| 版本 | 说明 | | --- | --- | | 0.1.1 | 源代码管理差异右栏可编辑(Cmd/Ctrl+S 保存)、文件外部变化实时刷新(变化流 + 原地重载)、git 状态局部静默更新不闪烁 | | 0.1.0 | 首次发布:文件树、Monaco 编辑器、Git 面板、终端、全局搜索,已上架 npm |
贡献指南
欢迎提交 Issue 和 Pull Request 共建项目。
- Fork 本仓库
- 创建功能分支(
git checkout -b feature/xxx) - 提交更改(
git commit -am 'Add xxx feature') - 推送到分支(
git push origin feature/xxx) - 创建 Pull Request
许可证
本项目基于 MIT 许可证开源。
致谢
- Monaco Editor — 代码编辑器内核
- xterm.js — 终端前端组件
- Cordis — 插件化上下文框架
- React — UI 组件库
维护者:fengzhaoy · 仓库:gitee.com/fengzhaoy/dsh-web-ide · 问题反馈:Issues · npm:@zhaoyang10/dsh-web-ide
