# dsh-settings-nav-organizer

> [**English**](README.md) | **中文**

给 DeepSeek Harness 设置面板「减负」：插件装得越多，设置页侧边栏的入口就越乱。本插件把所有插件/扩展的设置入口折叠成一个可展开的 **插件入口** 分组行，支持**书签式自定义分组**与**折叠总开关**。

![Awesome DSH Plugin](https://awesome-dsh-plugin.com/badge.svg)

## 功能

- **分组行放在系统配置正下方** —— 通用设置 / 模型 / 插件 / 预设保持平铺；其余入口（插件、扩展、附加页面）全部折叠进「插件入口 (N) ▾」。
- **折叠总开关** —— 「分组管理」页顶部「折叠第三方插件入口」开关：开启（默认）时插件入口折叠为分组行；关闭时导航完全恢复原生平铺。开关状态持久化。
- **书签式自定义分组** —— 像书签文件夹一样创建命名分组，把任意设置入口归入分组，导航中每个分组独立展开/收起；「分组管理」页可新建、重命名、删除分组，条目移入/移出分组。
- **一键展开/收起** —— 点击分组行，组内条目在其下方展开；再点即收起。未分组的条目保留在「插件入口 (N) ▾」行。
- **持久化** —— 分组配置与开关状态存于 localStorage（键 `dsh.settingsNavFold.v1`），重启不丢。
- **自动更新** —— 计数与折叠位置实时跟随 `settings.section` 台账重算，插件注册/卸载设置页时自动增减，无需任何配置。
- **当前页不消失** —— 正在查看的插件设置页即使处于折叠状态也保持可见。
- **自动分类** —— 提供「AI 自动 / 手动」模式开关：开启后新安装的插件自动归组，三级兜底——**第三方市场分类标签 → 本地名称启发式规则 → 你配置的 AI 模型**，市场查不到且未配置 AI 也能按插件名归类。
- **AI 模型配置易用化** —— 模型下拉带预设（DeepSeek / OpenAI / Qwen / GLM / Kimi / Doubao）：选预设模型自动填入对应供应商 API 地址；填好地址与 Key 自动拉取该账号可用模型；「测试配置」按钮一键验证；配置**输入即自动保存**（无需点保存按钮）。
- **闲置插件自动清理** —— 「分组管理」页新增「闲置插件自动清理」开关：扫描各插件的工具调用记录，识别超过阈值（默认 30 天）未使用的插件，**预览勾选后一键清理**（二次确认）。核心 DSH、本插件与核心 UI Bundle 自动保护，不会进入候选；无工具可检测的插件也可手动勾选。
- **跟随界面语言** —— 中文 / English。

## 安装

```sh
# 方式一：npm 包（推荐，国内网络更稳定）
dsh plugin --profile web add dsh-settings-nav-organizer

# 方式二：GitHub 仓库
dsh plugin --profile web add github:zhengjy01/dsh-settings-nav-organizer
```

安装后**重启 DSH**（宿主端需加载），再刷新浏览器页面，打开设置面板（侧边栏底部齿轮）即可。

## 使用说明

所有功能都在设置面板里：

1. **折叠开关** —— 打开「分组管理」，顶部即是「折叠第三方插件入口」开关。开启（默认）：插件入口折叠为分组行；关闭：导航恢复原生平铺。开关状态重启后保持。

2. **导航中的分组行** —— 开关开启时，导航依次显示核心项、自定义分组行、「插件入口 (N) ▾」行。点击任意行即可展开/收起其下方条目。「分组管理」入口位于导航最底部。

3. **自动分类** —— 在「分组管理」页打开「自动分类」开关（AI 自动 / 手动），再配置 AI 模型：
   - 从下拉选预设模型（供应商 API 地址自动填入）→ 填 API Key → 确认地址 → 点「测试配置」验证；
   - 点「立即分类未分组插件」——市场标签优先、名称规则次之、AI 模型兜底；
   - 配置输入即自动保存，重开设置始终显示。

4. **书签式分组管理** —— 在「分组管理」页：
   - 输入名称后点「新建分组」创建分组；
   - 在「未分组」区域，用每个条目右侧的下拉框把它移入某个分组；
   - 在分组卡片内可「重命名」「删除」「移出」（删除分组时条目自动回到未分组）。

## 原理

设置导航列表由面板内部渲染、并非 Slot，因此插件：

1. 读取 `settings.section` 台账（`ctx.slots.entries`），按与面板完全一致的排序算法计算行序；
2. 把分组行**注入**到导航列表 DOM 中最后一个核心项之后（幂等：位置正确时不改动 DOM）；
3. 用 `data-snav-plugin` / `data-snav-group` 标记插件按钮，通过一小段样式表控制显隐（当前激活的 `aria-current` 行保持可见）；
4. 用针对性 `MutationObserver`（带风暴看门狗）跟随台账变化与面板重渲染，插件增删时分组始终正确；
样式、订阅、观察器与注入行全部挂在插件 fiber 上，停止或卸载插件时自动清理、完全还原。

## 卸载

```sh
dsh plugin --profile web remove dsh-settings-nav-organizer
```

会停止插件、移除 `cordis.patch.yml` 中的行及 profile `package.json` 中的依赖。

## License

[MIT](LICENSE)
