🎁 福利专区全网大模型免费应用 + 新用户福利 + 注册活动入口,低成本玩转 AI

GitLab 侧栏面板 caimc21069065-prog/dsh-gitlab-panel

DeepSeek Harness
caimc21069065-prog3 天前有提交已提供中文文档扫描:含敏感能力

在侧栏查看分支、合并请求与流水线并审批

29.9/100
综合分
0
GitHub 星标
—
npm 周下载
—/5
用户评分

数据截至 2026/11/3 · 周下载取自 npm 全网(含 CI / 镜像),非本站安装数;综合分由星标、活跃度与兼容性检查合成。

安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add caimc21069065-prog/dsh-gitlab-panel
该包不可直接 npm 安装,改从 GitHub 源安装(明细见下方安装检查)

状态速览

判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态
信任档位:仅索引
是什么[目录]—
dsh 原生插件 · dev
暂无时间戳·判据 →
装得上吗[实装验证]—
本站尚未做安装检查
暂无时间戳·判据 →
安全吗[自动扫描]—
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
数据截至 2026/11/04·判据 →
还在维护吗[仓库]✓
活跃:最近一次提交在 3 天前
暂无时间戳·判据 →
图例:✓ 通过! 需注意— 未判定 / 无数据· 「未判定」= 本站尚无数据,不代表插件有问题
档位由哪些信号合成

本站实装验证(真实安装 L4 覆盖全站;L5 为运行时冒烟或实机截图,覆盖范围小于 L4) · 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。 下方各区块是它的证据明细。

验证判据与等级说明 →
社区实装还没有人打卡 · 装过的第一个就是你
安全扫描自动 · 静态分析源码
v2.7.0
🔵 扫描:含敏感能力尚无人工评估
展开查看扫描说明与证据 ↓

静态扫描发现插件具备触达本地系统的能力:执行外部命令、读写/删除本地文件、读取剪贴板或密钥类环境变量(至少其一)。这是能力清单,不是危险判定——具体能力项与证据见下方,安装前请自行判断是否需要。

可执行外部命令读写/删除本地文件写入剪贴板(不计风险)读取剪贴板或密钥环境变量发起外部网络请求
查看扫描证据(共 40 处,展示前 26 条)
  • 执行外部命令来自配置/变量
    lib/index.js:1922
    const child = spawn(command, args, {
  • 执行外部命令固定命令
    lib/index.js:1971
    spawn("taskkill", ["/pid", String(child.pid), "/T", "/F"], { stdio: "ignore", windowsHide: true }).on("error", () => child.kill());
  • 读取本地文件
    lib/index.js:1981
    if (error.code === "ENOENT" && !existsSync(cwd)) return `The directory ${cwd} does not exist.`;
  • 读取本地文件
    lib/index.js:2055
    if (existsSync2(join2(gitDir, "rebase-apply", "applying"))) return "am";
  • 读取本地文件
    lib/index.js:2056
    if (existsSync2(join2(gitDir, "rebase-merge")) || existsSync2(join2(gitDir, "rebase-apply"))) return "rebase";
  • 读取本地文件
    lib/index.js:2057
    if (existsSync2(join2(gitDir, "MERGE_HEAD"))) return "merge";
  • 读取本地文件
    lib/index.js:2058
    if (existsSync2(join2(gitDir, "CHERRY_PICK_HEAD"))) return "cherry-pick";
  • 读取本地文件
    lib/index.js:2059
    if (existsSync2(join2(gitDir, "REVERT_HEAD"))) return "revert";
  • 读取密钥环境变量
    lib/index.js:2406
    const direct = deps.config.token || (deps.config.tokenEnv ? process.env[deps.config.tokenEnv] : void 0) || process.env.GITLAB_TOKEN || process.env.GIT
  • 发起网络请求
    lib/index.js:2418
    const response = await fetch(url, {
  • 发起网络请求
    lib/index.js:3068
    const response = await fetch(`${apiBaseOf(remote)}/projects/${projectId(remote)}/jobs/${job}/trace`, { headers: headersFor(token) });
  • 写入本地文件
    lib/index.js:3466
    await mkdir(dirname2(file), { recursive: true });
  • 写入本地文件
    lib/index.js:3468
    await writeFile(temporary, JSON.stringify(state, null, 0), { encoding: "utf8", mode: 384 });
  • 写入本地文件
    lib/index.js:3469
    await rename(temporary, file);
  • 发起网络请求
    lib/client.js:1418
    async fetch(options, fetchOptions) {
  • 发起网络请求
    lib/client.js:1830
    return this.fetch({ ...options });
  • 发起网络请求
    lib/client.js:1864
    return Promise.race([query.fetch(defaultedOptions).then(() => {
  • 发起网络请求
    lib/client.js:1878
    fetch(fetchOptions) {
  • 发起网络请求
    lib/client.js:1889
    let promise = this.#currentQuery.fetch(this.options, fetchOptions);
  • 发起网络请求
    lib/client.js:2143
    return this.fetch({
  • 写入剪贴板
    lib/client.js:6265
    void navigator.clipboard?.writeText(text).catch(() => void 0);
  • 写入剪贴板
    lib/client.js:7207
    await navigator.clipboard?.writeText(prompt).catch(() => void 0);
  • 写入剪贴板
    lib/client.js:7650
    navigator.clipboard?.writeText(log.data);
  • 写入剪贴板
    lib/client.js:8044
    navigator.clipboard?.writeText(`${props.repo}${item.kind === "mr" ? "!" : "#"}${item.number}`);
  • 写入剪贴板
    lib/client.js:8053
    navigator.clipboard?.writeText(item.url);
  • 写入剪贴板
    lib/client.js:8661
    navigator.clipboard?.writeText(data.url);
扫描于 2026/11/4(0 天前) · 范围 入口闭包 + 发布文件清单 · 来源 GitHub 仓库

静态扫描只反映源码中出现的调用,不构成安全背书;人工评估与自动扫描相互独立、互不覆盖。

给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个

README

由 DeepSeek 最新模型翻译生成
dsh-gitlab-panel DeepSeek Harness(DSH)的 Git 与 GitLab 右侧面板插件。它是 opencode-github-panel 的 GitLab 版本,按原项目的功能逐项复刻:分支、变更、提交图、合并请求、议题、流水线、评审、分诊,以及带审批队列的 Agent 工具。 依赖 DSH 0.2.x(插件 API apply(ctx)、ctx.slots、ctx.sidebarRightTabs、 ctx.webServer、ctx.tools)与 git。GitLab 数据需要 Personal Access Token (api scope),或宿主机上已执行 glab auth login。
展开完整文档(README 剩余 1 节)
dsh-gitlab-panel

DeepSeek Harness(DSH)的 Git 与 GitLab 右侧面板插件。它是 opencode-github-panel 的 GitLab 版本,按原项目的功能逐项复刻:分支、变更、提交图、合并请求、议题、流水线、评审、分诊,以及带审批队列的 Agent 工具。

依赖 DSH 0.2.x(插件 API apply(ctx)、ctx.slots、ctx.sidebarRightTabs、 ctx.webServer、ctx.tools)与 git。GitLab 数据需要 Personal Access Token (api scope),或宿主机上已执行 glab auth login。

安装

从本地源码(链接安装)

cd /path/to/dsh-gitlab-panel
npm install
npm run build # 生成 lib/index.js 与 lib/client.js
dsh plugin --profile <profile> add /path/to/dsh-gitlab-panel
dsh --profile <profile> --dump-config # 应出现 "# == dsh-gitlab-panel" 层
dsh --profile <profile>

如果 profile 还没有 Web 应用层,先用官方 Web 模板创建:

dsh --profile demo --from-default-profile web --dump-config
dsh plugin --profile demo add /path/to/dsh-gitlab-panel
dsh --profile demo --no-open

临时 overlay(不安装到 profile)

cordis.patch.yml
- insert:
- id: gitlab-panel
name: 'dsh-gitlab-panel' # 或包的绝对路径

dsh web --patch /absolute/path/to/dsh-gitlab-panel/cordis.patch.yml

安装要求

- Node.js 22+(DSH 自身要求)
- git 在宿主机的 PATH 中
- GitLab:GITLAB_TOKEN(推荐)或 glab 已登录。自托管 GitLab 用 GITLAB_API_BASE/GITLAB_URL 指定地址。

配置

所有配置都可以通过环境变量或插件行 config 提供。Token 只留在宿主机,不会发到浏览器。

| 配置 | 环境变量 | 说明 |
| host | GITLAB_HOST | GitLab 主机名,例如 gitlab.com、gitlab.example.com |
| apiBase | GITLAB_API_BASE / GITLAB_URL | API 根地址,例如 https://gitlab.example.com;已含 /api/v4 也可 |
| project | GITLAB_PROJECT | 项目路径 group/subgroup/project;默认从 origin 等 remote 解析 |
| token | GITLAB_TOKEN / GITLAB_PRIVATE_TOKEN / GLAB_TOKEN | Personal Access Token(api scope) |
| tokenEnv | — | 存放 Token 的环境变量名 |
| defaultBranch | — | 当无法读取 refs/remotes/<remote>/HEAD 时的默认分支 |

Token 解析顺序:插件 config → tokenEnv → GITLAB_TOKEN → GITLAB_PRIVATE_TOKEN → GLAB_TOKEN → glab-cli/config.yml。没有 Token 时会尝试调用 glab api(需要 glab 已登录),两者都没有时面板仍可显示本地 git 数据,并在顶部提示缺少 GitLab 凭据。

cordis.patch.yml 示例
- insert:
- id: gitlab-panel
name: 'dsh-gitlab-panel'
config:
host: gitlab.example.com
apiBase: https://gitlab.example.com
defaultBranch: main

使用

打开方式:

- 右侧边栏 + → 指南页中的 GitLab;
- 会话标题栏的分支 chip(可在面板菜单里关闭);
- 桌面端快捷键 ⌘⇧G / Ctrl+Shift+G;
- 输入框 /gitlab 斜杠命令。

顶栏与仓库

顶栏显示项目、四个页签(变更、历史、MRs、议题)、Agent 活动角标、收件箱角标和菜单: Fetch、刷新、流水线、收件箱、Agent 活动、在 GitLab 打开、新建议题、常用回复、会话头 chip 开关、设置。

分支栏

- 分支选择器:搜索、最近分支、有 MR 的分支、本地/远程分支,带 ahead/behind、MR、最后一次提交;可检出、合并到当前、变基、推送、删除、打开工作树会话。
- 拉取 ↓ / 推送 ↑ / 发布 / Fetch;菜单含新建分支、创建 MR、强制推送(--force-with-lease)、 stash/pop、清理分支。
- 合并、rebase、git am、cherry-pick、revert 进行中时显示 Continue / Abort。
- 当前分支 MR strip:状态、流水线、评审、下一步;没有 MR 时显示 ahead 数和“创建合并请求”。
下一步按当前状态给出:未推送 → Push;草稿 → 标记为就绪;可合并 → 合并;已合并 → 收尾(切回默认分支、拉取、删除已合并分支;若本会话在关联工作树中,则移除该工作树再删分支,并清除“开始工作”记下的议题关联)。
分支若关联议题(123-...、fix/123 或「开始工作」记录),显示议题链接与标题;合并把它关闭后,显示「已由本次合并关闭」。

变更

- 冲突 / 已暂存 / 未暂存 / 未跟踪文件,按文件展开内联 diff;逐个或全部 stage/unstage/discard。
- 提交框:Commit、Commit all、Commit & push、Amend(⌘⏎);修补已推送提交前先确认。
- 未推送提交列表:Push、撤销上次提交(不会重写已发布历史)。
- 支持 stash 数量与 pop。

历史

- 提交图(泳道、合并曲线、分支/远程/标签徽章),范围:当前分支 / 本地分支 / 全部。
- 点击提交查看正文、文件列表与 diff;操作:检出、从此处新建分支、cherry-pick、revert、复制哈希、在 GitLab 打开。

MRs / 议题

- 预设搜索:分配给我、待我评审、我创建的、全部未打开、草稿、最近合并(议题:未分配、最近关闭)。
- 搜索语法支持 is:open/closed/merged、label:、author:@me、assignee:@me、 reviewer:@me、milestone:、no:assignee、sort:created-desc 等;输入 / 显示限定符、标签/成员/里程碑自动补全;筛选与排序菜单、可移除的条件 chips、已保存搜索。
- 每页 30 条、滚动加载;舒适/紧凑行;已读状态标记。(列表未做虚拟化,翻很多页后 DOM 会持续增长。)
- 键盘:↑↓/j k 移动、Enter 打开、/ 搜索、x 选择、⌘A 全选、Esc 清空。
- 多选批量:关闭(原因 + 可选评论)、Label、Assign、Comment、Reopen、询问 Agent、 Agent 分诊;批量写入走 Agent 队列,速率受限、显示进度、可撤销。
- 行菜单:打开、引用到对话、询问 Agent、复制链接/引用、在 GitLab 打开、关闭/重开、开始工作、检出、Agent 预评审。

议题 / MR 详情

- 独立侧栏标签(刷新后仍能恢复目标),状态、标签、负责人、里程碑、描述、评论与评论框。
- 关闭/重开、编辑(标题、正文、标签、负责人、评审人、里程碑、草稿)、复制链接、在 GitLab 打开、引用到对话。评论框支持 ⌘⏎ 发布。
- 未合并的 MR 在评论框旁提供「提交评审」菜单:批准 / 请求修改 / 仅评论。GitLab 不会记录 MR 作者本人的结论,此时两个结论项被禁用并给出说明。
- MR 额外有:
- 文件:变更列表、全部折叠、Viewed、内联 diff、行号点击创建评审评论。
- 检查:失败作业优先,作业日志(ANSI 清理)、重试/取消流水线与作业、跳转 GitLab。
- 评审线程:内联代码片段、回复、解决/取消解决。
- 评审草稿:Agent 或用户创建,可编辑/删除评论、修改摘要与结论,提交或丢弃; head 有新提交时会提示,可强制提交并把失效行评论并入摘要。
- 合并对话框:Squash、删除源分支。
- 签出 MR、Agent 预评审、开始工作。

CI 流水线

- 按当前分支或全部列出流水线;点击打开独立流水线标签,按阶段显示作业、失败优先、日志与重试/取消。

收件箱

- GitLab Todos,按项目分组;点击条目打开对应议题/MR 并标记 todo 完成;全部标为已读。
- 另外聚合「待我评审」「分配给我」「我创建的」。

Agent 活动

- 按会话展示提议/已批准/运行中/完成/失败/跳过/撤销的操作,按批次分组。
- 批准、编辑、跳过、取回、撤销、重试、自动执行;支持键盘 j/k y n e u o a。
- Triage 会话显示进度条、已审核/已批准/已跳过/等待中。
- 用户自己的批量操作与 Agent 在 shell 中执行的 glab issue|mr ... 写入也会记录在这里。

Agent 工具

宿主侧注册以下工具(无需手工启用):

| 工具 | 作用 |
| gitlab_panel_search | 搜索议题与 MR,返回紧凑列表与总数 |
| gitlab_panel_view | 读取单个议题/MR,含最新评论与流水线 |
| gitlab_panel_comment | 提议评论(可批量) |
| gitlab_panel_close | 提议关闭(completed / not_planned / duplicate) |
| gitlab_panel_reopen | 提议重新打开 |
| gitlab_panel_label | 提议增删标签 |
| gitlab_panel_assign | 提议分配/取消分配 |
| gitlab_panel_actions | 查看本会话操作;wait: true 等待用户决定 |
| gitlab_panel_diff | 读取 MR diff,带 LEFT/RIGHT 行号与可评论范围 |
| gitlab_panel_review | 起草评审(摘要、结论、内联评论),不直接发布 |

写入默认进入按会话的审批队列,用户在面板中批准、编辑或跳过;可在活动页开启 自动执行。批准后逐条执行(约 1 秒一条,遇 429 退避重试),并记录撤销信息。

GitLab 的议题用 #N、合并请求用 !N,编号空间独立。写工具接受 kind: "issue" | "mr",批量操作与 triage 提示词会自动带上它,避免同号误操作。

开始工作 / Triage / 预评审

- 开始工作:为议题创建分支(默认 123-slug,从最新默认分支或当前 HEAD),选择「新工作树」或「当前检出」;然后在新会话中带上议题上下文启动 Agent。
- Triage with agent:输入规则、选择常用回复与批大小;新会话按批处理,Agent 只提议,用户在活动页按批批准/跳过,Agent 会读到用户的修改与跳过偏好。
- 预评审:为 MR 启动会话,Agent 用 gitlab_panel_diff 读 diff、gitlab_panel_review 写草稿;用户在文件页编辑并提交。

会话中的引用

- 会话里的 #123、!123、group/project#123、group/project!123 会显示可点击下划线,悬停显示状态卡,点击在侧栏打开;⌘/Ctrl 点击保持原链接行为。
- GitLab URL(issue/MR/commit/pipeline)点击也会转到面板内标签。
- 会话头 chip 显示分支、未提交标记和 MR;输入框下方的「GitLab · N」pill 显示审批数量,点击打开 Agent 活动。

设置

- 面板菜单 → 设置:Token/连接状态、会话头 chip、紧凑行、折叠长内容、语言(自动/EN/中文)。
- DSH 设置页也注册了 GitLab 卡片,可直接打开面板与查看凭据说明。

开发

npm install
npm run dev # esbuild watch:lib/index.js + lib/client.js
npm run typecheck
npm test # 共享解析、diff、引用、搜索、图布局、清理逻辑
npm run mock # 本地 GitLab API mock(127.0.0.1:4199)

用 mock 做端到端开发:

node scripts/mock-gitlab.mjs
让一个 git 仓库的 origin 指向 https://gitlab.example.com/test/project.git
GITLAB_API_BASE=http://127.0.0.1:4199 GITLAB_PROJECT=test/project GITLAB_TOKEN=mock \
dsh --profile <profile>

客户端 bundle 由 esbuild 生成 lib/client.js,遵循 DSH 的 CJS 工厂包装:

window.__ModuleLoader__.load({ id: "dsh-gitlab-panel", factory: (require) => { ... } })

React 与 react-dom/client 来自 DSH 模块表(external),@tanstack/react-query 与业务代码打进 bundle;样式以 注入,不依赖构建期 CSS 处理。插件卸载时路由、监听、样式、事件流与工具都会清理。

结构

src/shared/ 类型、Git 解析、diff、引用、图布局、清理候选、搜索语法 src/host/ 宿主插件:git 进程、GitLab REST、SSE/HTTP 路由、存储、Agent 队列与工具 src/client/ 浏览器插件:侧栏标签、面板、搜索、详情、CI、收件箱、活动、评审、样式 scripts/ 构建与 GitLab mock tests/ 共享逻辑单测

宿主 API:POST /gitlab-panel/api(JSON {method, params})与 GET /gitlab-panel/events(SSE)。路由走 DSH webServer,并调用 connection.requestRejection 做来源/会话校验。队列、关闭原因、评审草稿持久化在 $DSH_HOME/gitlab-panel/state.json。

与 GitHub 原项目的映射

| opencode-github-panel | 本插件 |
| GitHub PR | GitLab Merge Request (!N) |
| Issue | GitLab Issue (#N) |
| gh CLI | GitLab REST v4 + glab 配置/CLI 兜底 |
| GitHub Actions | GitLab Pipelines / Jobs |
| review decision | GitLab approvals |
| notifications | GitLab Todos |
| gh shell 记录 | glab shell 记录 |
| GitHub search 语法 | 兼容子集,映射到 GitLab 列表参数 |
| OpenCode 主进程/服务端 RPC | DSH 宿主 HTTP + SSE |
| Solid 面板 | React 侧栏标签 |
| GitHub 提及 | # / ! 引用 + GitLab 链接 |

GitLab 没有关闭原因、review decision 的完全等价字段:关闭原因会保存在本地状态中, duplicate 会以评论链接到保留的议题;approvals 用批准/取消批准与评论表达「请求修改」。

已知限制

- 同一时间面板面向一个项目的检出;收件箱中同一 GitLab 主机的其他项目可以打开,跨主机项目需在对应主机配置后再打开。
- GitLab 的 issue/MR 编号独立,Agent 工具需要时可传 kind;未传时先查 MR 再查 issue。
- 不包含 GitHub 专属能力(workflow rerun failed only、GraphQL review threads 等)。
- 会话头 chip 与输入框 pill 依赖 DSH 的会话已进入对话界面(空白会话的 Hero 页不渲染这些 slot)。

致谢

- 功能设计与行为参考 neriousy/opencode-github-panel(MIT)。
- 插件框架与 Web Client:deepseek-ai/deepseek-harness。
预览分享卡片长什么样 ↓caimc21069065-prog/dsh-gitlab-panel
分享 · DeepSeek Harness Hub
caimc21069065-prog/dsh-gitlab-panel

在侧栏查看分支、合并请求与流水线并审批

这个插件是你维护的吗?
作者本人可认领并核对本条目;认领通过后,详情页会显示「作者已认领」标记。
认领条目 →
回到顶部