Bundle
dsh-sidebar-stack
Stacks the DSH sidebar footer actions vertically so dsh-cost-meter, dsh-context and other sidebar.footer.action plugins no longer crowd into one row.
- Source
- MosesCharm
- License
- MIT
- Updated
- Updated 3 hours ago
Readme
# dsh-sidebar-stack
> 把 DSH 左侧栏底部的动作按钮**竖排**,让 `dsh-cost-meter`、`dsh-context` 等插件不再挤成一行。
[](https://www.npmjs.com/package/@deepseek-ai/dsh)
[](./LICENSE)
---
## 概述
DSH 左侧栏底部的 `sidebar.footer.action` 是一个**列表槽位**,所有注册到它的插件都渲染在同一个容器里。上游的 `footerActions` 容器只声明了 `display:flex`、**没有声明 `flex-direction`**,于是默认横向排列——装了 2 个以上插件后,按钮就挤成一排。
本插件注入一段样式表,把该容器改为纵向堆叠。
**解决什么问题**:左侧栏底部插件按钮拥挤、文字被压缩、点击区域过小。
**给谁用**:在 DSH Web 端左侧栏底部装了 2 个及以上动作类插件(如 `dsh-cost-meter`、`dsh-context`)的用户。
## 效果
| 之前 | 之后 |
|---|---|
| `[费用] [上下文]` 横向挤在一行 | `[费用]`<br>`[上下文]` 纵向堆叠 |
同时兼容侧边栏折叠成 56px 图标栏的状态:图标同样改为纵向成组排列。
## 兼容性
| 项目 | 值 |
|---|---|
| DSH 版本 | `0.1.5-rc.1` 及以上 |
| 实测版本 | `0.1.5-rc.2`(Windows 11 + Chrome/Edge) |
| 最近验证 | 2026-09-21 |
| 平台 | Web(`dsh.client.platform = web`) |
| 依赖 | 无运行时依赖 |
> **版本漂移提示**:本插件通过**类名后缀**匹配(`[class*="_footerActions"]`),不依赖 CSS-Module 的哈希前缀,因此 DSH 升级重新生成哈希后仍能生效。若上游将来给该容器补上 `flex-direction:column`,本插件的规则会变成无害的重复声明。
## 安装
```sh
dsh plugin --profile web add dsh-sidebar-stack
```
从源码目录安装:
```sh
git clone https://github.com/MosesCharm/dsh-sidebar-stack
dsh plugin --profile web add ./dsh-sidebar-stack
```
安装后**硬刷新浏览器**(`Ctrl/Cmd + Shift + R`)。本插件为纯 client 插件,DSH 对 client 变更支持热加载;若未生效再重启 `dsh web`。
## 卸载
```sh
dsh plugin --profile web remove dsh-sidebar-stack
```
随后硬刷新浏览器。插件卸载时会随插件行一并移除,不会残留样式(样式标签由 DSH 的插件生命周期管理)。
## 快速开始
1. 安装(见上)。
2. 确认左侧栏底部至少有 2 个动作插件(通常是 `dsh-cost-meter` + `dsh-context`)。
3. 硬刷新浏览器 → 两个按钮应变为一上一下。
4. 若侧边栏已折叠为图标栏,图标也应纵向成组。
## 配置
**无需配置**,安装即生效。
如需自行微调间距,编辑 `lib/client.js` 中的 `CSS` 常量:
```js
[class*="_footerActions"] {
flex-direction: column;
gap: 2px; /* ← 调整行间距 */
}
```
因为是 `link:` 安装的开发插件,改完保存后硬刷新浏览器即可看到效果。
## 权限与数据
| 项目 | 说明 |
|---|---|
| 文件访问 | **无**(仅注入样式,不读写任何文件) |
| 网络请求 | **无** |
| 凭证/密钥 | **不涉及** |
| 用户数据 | **不收集、不上传** |
| 宿主侧行为 | 无(host 半侧为空实现,不注册任何服务) |
插件全部代码即 `lib/client.js` 中一段 CSS 字符串 + 一次 `<style>` 注入,可完整审计。
## 工作原理
1. DSH 侧边栏底部的渲染结构为:
```
footArea (flex-direction: column)
├── footerActions (display:flex → 默认 row) ← 所有 sidebar.footer.action 注册者
│ ├── cost-meter
│ └── context-overview
└── settingsArea (Settings 行)
```
2. 本插件的 browser 半侧在加载时向 `document.head` 注入一个带 `data-plugin-css` 标记的 `<style>` 标签,覆盖 `footerActions` 的排列方向。
3. 该注入方式与 DSH 官方 UI 包(`dsh-client-ui-sidebar`)及生态皮肤插件(如 `dsh-dream-skin`)**完全一致**,都是 `style[data-plugin-css=...]` + `createElement("style")` 模式。样式标签带唯一标记,重复注入会被去重。
## 故障排查
| 现象 | 原因 / 处理 |
|---|---|
| 装完没变化 | 未硬刷新浏览器 → `Ctrl/Cmd + Shift + R` |
| 仍然没变化 | host 半侧变更需重启 `dsh web` |
| 升级 DSH 后失效 | 上游可能改了容器类名。检查 `[class*="_footerActions"]` 是否仍匹配,见下方「开发」 |
| 想确认插件已加载 | 浏览器控制台查看 `<head>` 中是否存在 `style[data-plugin-css="dsh-sidebar-stack/footer-stack"]` |
| 想回滚 | `dsh plugin --profile web remove dsh-sidebar-stack`,再硬刷新 |
**日志位置**:浏览器开发者工具 Console;宿主侧 `dsh web` 终端输出。
## 开发
本插件无构建步骤,发布物即源码。
```
dsh-sidebar-stack/
├── package.json # dsh.bundle + dsh.client 声明
├── cordis.patch.yml # bundle 层:一行 insert
└── lib/
├── index.js # host 半侧(空实现)
└── client.js # browser 半侧:注入样式
```
关键约定(`dsh-client-modules` 的解析规则):
- `package.json` 必须声明 `dsh.client.platform = "web"`;
- 必须提供 `exports["./client"]`,否则启动报错 `declares dsh.client but exports no "./client" bundle`;
- browser 半侧产物必须使用 `window.__ModuleLoader__.load({ id, factory })` 包装。
本地验证:
```sh
# 在 profile 目录下安装为 link,源码改动即时生效
dsh plugin --profile web add /abs/path/to/dsh-sidebar-stack
```
**调试上游类名是否变化**:
```sh
node -e "const c=require('fs').readFileSync(require('path').join(process.env.APPDATA,'npm/node_modules/@deepseek-ai/dsh/node_modules/@deepseek-ai/dsh-client-ui-sidebar/lib/client.js'),'utf8'); console.log(c.match(/\.([A-Za-z0-9_-]+)_footerActions\{/)?.[1] ?? 'not found')"
```
## 已知限制
- 仅针对 **DSH Web 端左侧栏**;右侧栏与底部工作台不在范围内。
- 若上游未来将 `footerActions` 改为纵向或重构该槽位,本插件可能变为无效或被自动满足。
- 折叠态(56px 图标栏)的间距为固定值 `6px`,不随主题变化。
## 设计笔记
为什么必须用 CSS 覆盖、哪些方案被否决、市场排查记录、DSH client 插件机制细节:
见 **[NOTES.md](./NOTES.md)**(面向维护者,非使用文档)。
## 许可证与安全
[MIT](./LICENSE)。
发现安全问题请通过 GitHub Security Advisory 私下报告,或开 issue 描述问题(请勿公开未修复的细节)。
Install
dsh plugin --profile web add github:MosesCharm/dsh-sidebar-stack
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-sidebar-stack from the hub
- This source has no pinned commit, so a later push upstream changes what installs. Prefer pinning a commit.