# dsh-fork-view [English](README.md) | 中文 **DSH web 插件**:把左侧边栏的原生工作区浏览器替换成一棵 [pi-web](https://github.com/agegr/pi-web) (by agegr) 风格的会话树 —— 工作区 → 会话 → fork / subagent。默认扁平:任意深度的 fork-of-fork 拍平成第 2 级兄弟行;调高 `maxDepth` 即可真正嵌套。 | 侧边栏总览 | 悬停操作菜单 | | ------------------------------------------- | --------------------------------------------------- | | ![侧边栏总览](docs/screenshots/sidebar.png) | ![悬停操作菜单](docs/screenshots/hover-actions.png) | ## 特性 - **默认扁平**:`工作区 → 会话`,会话下挂 fork 行与 `> Subagents (N)` 组。默认 `maxDepth: 2` 时,任意深度的 fork-of-fork 都拍平成第 2 级的兄弟行;设 `maxDepth ≥ 3` 则按真实层级嵌到父级下面。 - **Subagent 分组**:每个会话/fork 行下的子代理收进可折叠的 `> Subagents (N)` 组,默认收起。 - **归档友好**:归档的会话整组隐藏;被归档节点的后代自动向上重挂到最近的存活祖先,不留孤儿行。 - **悬停操作菜单**:Rename / Fork / Archive,与原生 dsh 侧边栏同款。菜单自带内联 SVG 与小型 popover,不引入任何额外模块(client `require` 是严格的启动图表查找)。 - **dsh 原生观感**:单条弱化竖直缩进线代替树形 guide line;颜色全部走 dsh CSS 变量,深浅色主题自适应。 ## 安装 > 前置:DSH ≥ 0.0.1 的 web profile,Node ≥ 20。 ### 方式一:从 GitHub 安装(pnpm / dsh) **dsh CLI 一条命令**(安装 + 自动挂载 —— 插件自带 `cordis.patch.yml`,CLI 认到包内的 `dsh.bundle.patch` 声明后会自动把它加进 bundle 栈,无需手改 profile 文件): ```bash dsh plugin --profile web add github:an4nsi/dsh-fork-view # profile 名按需调整 ``` **或 pnpm 手动路线**——在 web profile 目录(含 `package.json` / `cordis.patch.yml` 的那个目录)里: ```bash cd ~/.dsh/profiles/web # 按你的实际 profile 路径调整 pnpm add github:an4nsi/dsh-fork-view#main # pnpm ≥ 10 首次会询问是否放行构建脚本:允许 esbuild 与 dsh-fork-view 的 prepare; # 错过了就 `pnpm approve-builds` 补一次,然后确认 lib/ 已生成 ``` pnpm 路线还需在 profile 的 `cordis.patch.yml` 里手动挂载插件行(dsh CLI 路线已自动完成): ```yaml - insert: - id: dsh-fork-view name: 'dsh-fork-view' # 可选配置(见下文「配置」): # config: # maxDepth: 2 # showSubagents: true # subagentsCollapsedByDefault: true ``` 重启 `dsh web`(host 半变更需要),浏览器硬刷新(Cmd/Ctrl+Shift+R)即可看到新侧边栏。 ### 方式二:手动 / 开发者 ```bash git clone https://github.com/an4nsi/dsh-fork-view.git cd dsh-fork-view pnpm install # 自动触发 prepare 构建 lib/ pnpm test # 跑模型/归档行为测试 pnpm add link:"$PWD" ~/.dsh-profile-path # 或在 profile 里 link:<路径> ``` 激活方式同方式一(patch 行或 bundle 条目)。 ## 配置 | 键 | 默认 | 说明 | |---|---|---| | `maxDepth` | `2` | 渲染层级数。`1` 只显示根会话;`2` 显示根会话 + 直接 fork + subagent 组;`≥3` 时 fork-of-fork 才真正嵌套到父级下面 | | `showSubagents` | `true` | 是否渲染 `> Subagents (N)` 分组 | | `subagentsCollapsedByDefault` | `true` | Subagent 组初始是收起还是展开 | 配置写在插件行上(见上方 YAML 示例),由 host 半 schemastery schema 校验后转发给 client 半。 ## 开发 ``` src/client/index.jsx client 半:侧边栏组件(真实 JSX),esbuild 打成 CJS bundle src/index.js host 半:schemastery Config + no-op apply(纯 client 插件) cordis.patch.yml dsh.bundle.patch 层:insert 插件行 build.mjs esbuild 双入口构建 → lib/client.js + lib/index.js tests/ 对构建产物跑的模型测试(mock react/jsx-runtime 假渲染器) lib/ 构建产物,gitignore;pnpm/npm install 时经 prepare 自动生成 ``` ```bash pnpm run build # 重新生成 lib/ pnpm test # tests/test-model.cjs + tests/test-nested-archive.cjs ``` 改完 `src/client/**` 后重新 build 即可在浏览器热加载看到效果(client 改动无需重启 `dsh web`;host 半改动需要重启)。 ## Credits - [pi-web](https://github.com/agegr/pi-web)(by agegr) —— 本插件在 dsh 侧边栏上重新实现的 fork/subagent 进程树的原型。 - dsh 的 web 插件面(`__ModuleLoader__`、client slots),让整个侧边栏可被替换。 ## License [MIT](LICENSE) © anansi & inogai