deCOLE118
dsh-sitemap
No description
- Stars
- 3
- Language
- TypeScript
- Created
- Aug 15, 2026
- Updated
- Aug 15, 2026
Introduction
dsh-sitemap
DeepSeek Harness(DSH)站点地图插件 · 把 Yakit 的站点地图交互搬进 DSH
在 DSH 侧边栏一键打开「站点地图」:按主机树形组织工作区侦察到的接口,支持搜索、接口详情(方法 / 参数 / 出现次数)、一键复制 curl,数据实时同步。
设计来源
Yakit 里的「站点地图」我觉得做得很好,就借鉴了它的交互:把发现的所有接口按主机自动归类,形成一棵可展开、可搜索的树:
hosts
└── account.example.com
└── /user/webrest/v1/login.do
└── /user/webrest/v1/initData.do
做资产梳理和接口测试时,这棵树比零散的请求记录直观得多。本插件把同样的体验带到 DeepSeek Harness:不用另开工具,在 DSH 侧边栏点一下「🗺 站点地图」,应用内直接弹出树形接口地图。
特性
- 🗺 侧边栏入口:点击「站点地图」打开应用内全屏地图(中 / 英双语)
- 🌲 主机树:主机 → 接口路径两级树,可折叠、显示统计
- 🔍 实时搜索:按主机名 / 接口路径过滤
- 📋 接口详情:方法、参数、出现次数;一键复制 curl、新窗口打开
- ⚡ 数据实时同步:每次打开 / 刷新都从宿主路由读取最新数据,无缓存
使用方法
- 把插件放入 DSH 插件目录并重启(见「安装」)
- 侧边栏底部点击「🗺 站点地图」打开地图
- 弹窗打开时会自动从宿主路由拉取最新数据;点「刷新」可随时重新拉取
数据从哪来? 插件只负责展示,不负责扫描——数据源是工作区里的 sitemap_data.json(格式见下节),由你自己的侦察工作流生成,例如 JS / 接口挖掘脚本把结果按主机汇总成该格式即可。
什么时候触发? 按钮在插件加载后常驻侧边栏;每次打开弹窗或点「刷新」才触发一次数据拉取(无缓存,拿最新内容)。文件不存在时弹窗显示错误 / 空状态;文件更新后重新打开或点「刷新」即见新数据,无需重启 DSH。
实现原理
整体架构:双半区
DSH 插件分两个半区运行,本插件亦是如此:
| 半区 | 文件 | 运行环境 | 职责 |
|---|---|---|---|
| 宿主半区 | src/index.ts | Node 侧(cordis 插件) | 注册 webServer 路由,读取工作区数据文件 |
| 浏览器半区 | src/client/index.tsx | 浏览器侧(React) | 侧边栏入口 + 树形地图弹窗,fetch 拉取数据 |
宿主半区:只做数据中转
宿主半区是一个 cordis 插件,通过 ctx.inject(['webServer']) 拿到宿主 webServer 能力后注册两条路由:
GET /dsh-sitemap/data→ 读取<workspace>/<dataDir>/sitemap_data.json,以 JSON 信封{ ok, data }返回;文件不存在时返回 404POST /dsh-sitemap/regen→ 同样重新读取并返回(预留"重新生成后取数"的语义)
文件访问被严格限制在工作区数据目录内(join(workspace, dataDir)),不触碰工作区其他文件。
浏览器半区:零文件权限
浏览器半区不读文件系统,数据全部经宿主路由中转:
- 通过
ctx.locale.register()注册sitemap命名空间的zh/en两套文案 - 通过
ctx.slots.inject('sidebar.footer.action', ...)向侧边栏底部动作槽注入「站点地图」按钮(order: 40,位于设置按钮旁) - 点击后打开全屏弹窗:左侧按主机渲染可折叠树,右侧渲染选中接口的详情
- 弹窗加载 / 点「刷新」时
fetch('/dsh-sitemap/data', { cache: 'no-store' })拉取最新数据
数据流
flowchart LR
A["sitemap_data.json<br/>(工作区 dataDir 目录)"] --> B["宿主半区<br/>webServer 路由<br/>/dsh-sitemap/data"]
B -->|"GET · no-store"| C["浏览器半区<br/>fetch"]
C --> D["树形地图弹窗"]
D -->|"刷新 / 重新打开"| C
构建与分发
scripts/build.mjs用 esbuild 打两套产物:lib/index.js:宿主 ESM 包,@deepseek-ai/cordis设为 external(宿主提供)lib/client.js:浏览器包,用window.__ModuleLoader__.load({ id, factory })包装成 DSH 模块加载器格式;@deepseek-ai/*与react全部 external
package.json声明dsh.bundle.patch(cordis.patch.yml),宿主半区以 bundle patch 挂载,符合社区装法规范dsh.plugin.json声明宿主内置插件清单(id / version / client 注入依赖),lib/产物随仓库提交,clone 即用
数据格式
数据文件默认位于工作区根目录下(<workspace>/sitemap_data.json,也可用 dataDir 配置子目录),结构为「主机 → 接口路径 → 元信息」:
{
"api.example.com": {
"endpoints": {
"/v1/login": { "methods": ["POST"], "count": 3, "params": ["account", "password"] },
"/v1/user/profile": { "methods": ["GET"], "count": 1 }
}
}
}
可运行示例见 examples/sample-data.json。示例使用占位域名,仓库内不包含任何真实站点数据。
安装
-
将本仓库复制到 DSH 的插件目录:
git clone https://github.com/deCOLE118/dsh-sitemap.git <DSH插件目录>/dsh-sitemap -
lib/构建产物已随仓库提交,可直接使用;如需重新构建:npm install npm run build -
重启 DSH,侧边栏底部即可看到「🗺 站点地图」入口。
本插件是标准的 bundle 类型插件:package.json 声明了 dsh.bundle.patch(cordis.patch.yml),社区安装器(如 find-plugins)可直接识别装法并挂载宿主半区。
配置
插件接受以下配置(宿主加载插件时传入):
| 配置项 | 类型 | 默认值 | 说明 |
|---|---|---|---|
workspace | string | $DSH_WORKSPACE 或当前工作目录 | 工作区根目录(绝对路径) |
dataDir | string | 工作区根目录 | 存放 sitemap_data.json 的子目录名;不配置则直接读工作区根目录下的文件 |
开发
npm install # 安装依赖(仅 esbuild / typescript / react)
npm run build # 构建 lib/(宿主 + 浏览器两套产物)
类型说明:
@deepseek-ai/dsh-client-*类型包由 DSH 宿主提供,未随本仓库安装;在 DSH 源码目录(monorepo)下开发可获得完整类型提示,单独构建本仓库不受影响(类型导入会被 esbuild 擦除)。
目录结构:
dsh-sitemap/
├── dsh.plugin.json # 宿主内置插件清单(id / version / client inject)
├── cordis.patch.yml # bundle 声明(宿主半区挂载)
├── src/
│ ├── index.ts # 宿主半区:webServer 路由
│ └── client/index.tsx # 浏览器半区:侧边栏入口 + 树形地图弹窗
├── scripts/build.mjs # esbuild 构建脚本
├── lib/ # 构建产物(随仓库提交)
└── examples/ # 示例数据(占位域名)
免责声明
本插件仅用于已获授权的安全测试与资产梳理。请遵守目标系统的授权范围与当地法律法规,使用者需对自身行为负责。
许可证
BSD-3-Clause © 2026 deCOLE118