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

Redmine 工单接入 billbill2012/dsh-superagent-redmine

DeepSeek 客户端
billbill20124 天前有提交已提供中文文档扫描:未发现敏感能力兼容 / 相关生态

把 Redmine 问题转成智能体工单并回写处理结果

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

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

相关生态插件(非 dsh 原生,按其对应运行时安装)
git clone https://github.com/billbill2012/dsh-superagent-redmine.git

状态速览

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

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

验证判据与等级说明 →

可信度证据

安全扫描自动 · 静态分析源码
v2.7.0
🟢 扫描:未发现敏感能力尚无人工评估
展开查看扫描说明与证据 ↓

静态扫描未发现敏感能力:最多只发网络请求、读取自身元数据或只读文件,未发现执行命令、文件写入或敏感信息读取。

发起外部网络请求
查看扫描证据(共 6 处,展示前 6 条)
  • 发起网络请求
    src/redmine/client.ts:102
    return RedmineCurrentUserSchema.parse(await this.request('/users/current.json', undefined, signal)).user
  • 发起网络请求
    src/redmine/client.ts:107
    return RedmineProjectSchema.parse(await this.request(`/projects/${encodeURIComponent(String(value))}.json`, undefined, signal)).project
  • 发起网络请求
    src/redmine/client.ts:118
    return RedmineIssueListSchema.parse(await this.request(`/issues.json?${params}`, undefined, signal))
  • 发起网络请求
    src/redmine/client.ts:123
    return RedmineIssueRecordSchema.parse(await this.request(`/issues/${id}.json${query}`, undefined, signal)).issue
  • 发起网络请求
    src/redmine/client.ts:127
    return RedmineAttachmentRecordSchema.parse(await this.request(`/attachments/${id}.json`, undefined, signal)).attachment
  • 发起网络请求
    src/redmine/client.ts:132
    await this.request(`/issues/${issueId}.json`, { method: 'PUT', body: JSON.stringify({ issue: { notes } }) }, signal)
扫描于 2026/11/7(0 天前) · 范围 全包扫描(包内未声明入口) · 来源 GitHub 仓库

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

社区实装还没有人打卡 · 装过的第一个就是你
依赖的 DSH / Cordis 模块
@deepseek-ai/cordis
给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个

dsh-superagent 的 Redmine 源插件:问题与评论转为工单,图片可读,结果以备注形式写回。

README

由 DeepSeek 最新模型翻译生成
dsh-superagent-redmine 把 Redmine 的 issue 与评论变成 dsh-superagent 的工单(Ticket),由智能体在独立 worktree 里处理,结果以 Redmine 评论(notes)回写;正文/评论里的图片可以被模型读取。 - 不修改、不 fork dsh-superagent:独立 npm 包,通过 cordis 服务 orchestrator 注册一个 redmine Source。 - 图片可用:Redmine 附件会下载并作为「模型可见附件」参与 Eval(GitHub 渠道做不到这一点)。 - 最小权限:专用账号只需要「查看问题 + 添加评论」;插件只会写 notes,绝不改状态/指派人/自定义字段。 - 不丢不重:倒序分页 + 重叠窗口 + 稳定 id 去重 + 隐藏 marker 幂等。 状态:0.1.0,实验阶段。已在 Redmine 6.1(Docker,非管理员 agent 账号)完成真实链路验证; Redmine 2.3.x(内网/自建实例)按兼容性设计实现,需用你的目标实例 API Key 跑一次只读探测确认。 它解决什么问题 1. GitHub 渠道看不到 issue 里的截图;飞书渠道有图片,但团队的问题在 Redmine。
展开完整文档(README 剩余 1 节)
dsh-superagent-redmine

把 Redmine 的 issue 与评论变成 dsh-superagent 的工单(Ticket),由智能体在独立 worktree 里处理,结果以 Redmine 评论(notes)回写;正文/评论里的图片可以被模型读取。

- 不修改、不 fork dsh-superagent:独立 npm 包,通过 cordis 服务 orchestrator 注册一个 redmine Source。
- 图片可用:Redmine 附件会下载并作为「模型可见附件」参与 Eval(GitHub 渠道做不到这一点)。
- 最小权限:专用账号只需要「查看问题 + 添加评论」;插件只会写 notes,绝不改状态/指派人/自定义字段。
- 不丢不重:倒序分页 + 重叠窗口 + 稳定 id 去重 + 隐藏 marker 幂等。

状态:0.1.0,实验阶段。已在 Redmine 6.1(Docker,非管理员 agent 账号)完成真实链路验证; Redmine 2.3.x(内网/自建实例)按兼容性设计实现,需用你的目标实例 API Key 跑一次只读探测确认。

它解决什么问题

1. GitHub 渠道看不到 issue 里的截图;飞书渠道有图片,但团队的问题在 Redmine。
2. 让团队迁到 GitHub 不现实;智能体应该到 Redmine 里接单、在 Redmine 里回帖。
3. dsh-superagent 是 research prototype,fork 后无法跟进上游修复——所以做成独立插件。

工作原理

Redmine 项目(issues + journals + attachments) │ 轮询 GET /issues.json?project_id=…&status_id=&sort=updated_on:desc,id:desc │(不发送服务端时间过滤:Redmine 2.3 会 422) ▼ dsh-superagent-redmine(本插件) │ ① issue / journal → Trigger(Thread = redmine:<issueId>) │ ② 授权:allowed 数字用户 id 名单 + 准入表 │ ③ 图片:附件下载 → 模型可见附件 ▼
ctx.orchestrator.sources.register(redmineKind)
▼
dsh-superagent:Eval → Ticket → 独立 worktree 干活 ▼ 回写 PUT /issues/:id.json {"issue":{"notes":…}} ← Channel(带隐藏 marker)

环境要求

| 依赖 | 要求 |
| DSH | dsh --version 与 engines.dsh(^0.2.1-rc.3)匹配 |
| dsh-superagent | 已装进配置档,且它自己的 setup 必须先完成(当前要求 GitHub 仓库 + agent CLI)。否则所有 Source 都是 paused |
| Node.js | ≥ 22.19 或 ≥ 24(插件用内置 fetch) |
| Redmine | 2.3 及以上(2.3 / 6.x 已覆盖;2.6–3.3 的私有备注有已知限制,见「兼容性」) |
| Redmine 账号 | 专用 API 账号:目标项目内「查看问题 + 添加评论」 |

一个插件实例 = 一个 Redmine 项目(宿主 SourceRegistry 以 kind id 作为实例 id)。
工单仍然在 dsh-superagent 配置的 GitHub 仓库里执行,本插件只换「入口 + 回写渠道」。

安装

1. 构建

cd <插件仓库目录> # 克隆后的目录(本地叫什么都可以);已在该目录时跳过
pnpm install
pnpm check # typecheck + 测试 + 构建;产出 lib/index.js 与 lib/index.d.ts

2. 装进 superagent 配置档

目前推荐从本地构建安装(未发布到 npm;维护者发布清单见 monorepo 本地 docs/dsh-superagent-redmine/PUBLISHING.md,不随包公开)。

dsh plugin --profile superagent add "link:$PWD"

然后编辑 ~/.dsh/profiles/superagent/cordis.patch.yml,在末尾追加(profile patch 是叠加,新增插件必须用 insert):

- insert:
- id: dsh-superagent-redmine
name: dsh-superagent-redmine

3. 提供 API Key

export REDMINE_API_KEY=<你的 Key>

Key 必须对 DSH 启动的那个进程可见:tmux 会让新会话继承启动 tmux 的 shell 环境;launchd/Finder 启动的进程不继承终端里的 export,需要写进 launchd plist 或启动脚本。不要把 Key 写进设置数据库或仓库。

4. 重启并确认

sh
cd ~/src/dsh-superagent && scripts/dsh-superagent restart
scripts/dsh-superagent status; echo "status=$?" # 期望 0

- Settings → Sources 出现 Redmine 卡片;
- 点开卡片(默认空配置)不报错;
- 「执行环境」里出现 DSH_SUPERAGENT_REDMINE_URL / _PROJECT / _ISSUE。

获取 Redmine API Key

Redmine 我的账号 → API 访问键(截图已打码)

1. 用专用账号登录 Redmine,点右上角 「我的账号」;
2. 右侧找到 「API 访问键」,点 「显示」(没有就点「重置」生成);点右侧复制图标复制这串 40 位字符。
如果 Key 曾经泄露,在同一位置点 「重置」,旧 Key 会立即失效;
3. 把它放到 DSH 启动环境里:

sh
export REDMINE_API_KEY=<粘贴到这里>

4. 确认账号权限:在目标项目里至少拥有「查看问题」与「添加评论」;建议只给这两个权限。
5. 旧版本(2.3 等):如果 API 返回 404/401,请管理员在 管理 → 配置 → API 勾选「启用 REST API」;「我的账号」页面布局与新版不同,但同样是 API 访问键 → 显示/重置。
6. 验证 Key 可用:

sh
curl -sS -H "X-Redmine-API-Key: $REDMINE_API_KEY" \
-H 'Accept: application/json' \
"$REDMINE_URL/users/current.json" | jq '.user | {id, login}'

返回你的账号即成功;401 表示 Key 无效,404 多为 REST API 未启用或地址不对。

截图只用于说明位置,Key 已打码。不要把真实 Key 贴到 issue、日志或截图里。

配置

Settings → Sources → Redmine:

| 字段 | 默认 | 说明 |
| baseUrl | 空 | Redmine 根地址(http:// 或 https://)。空 = 未配置,轮询写 paused 健康 |
| projectId | 空 | 项目 identifier(推荐)或数字 id;首轮解析成数字 id 并缓存(Redmine 的列表过滤只接受数字) |
| apiKeyEnv | REDMINE_API_KEY | 存放 API Key 的环境变量名;密钥不落库 |
| mention | @dsh | 点名关键字;构造正则前转义,整词匹配、不区分大小写 |
| pollSeconds | 60 | 轮询间隔(30–3600) |
| failuresBeforeError | 3 | 连续失败几次后把健康标成 error |
| overlapSeconds | 120 | 重叠窗口;每轮重读游标前这段时间,重复项按稳定 id 去重 |
| writeBack | notes | notes 回评论 / off 只读(零写请求) |
| timezone | 空 | 解析不带时区的 Redmine 时间用的 IANA 时区(如 Asia/Shanghai);空 = 进程时区 |
| observeIssues | 关 | 未点名的新 issue 也进入接收范围(交给策略准入表) |
| observeNotes | 关 | 未点名的评论也进入接收范围(交给策略准入表) |
| assigned | 开 | 指派给 agent 账号也算明确请求 |

Policy:谁可以派活

Policy 里填 数字用户 id——Redmine 的 issue/journal 只序列化 { id, name },没有 login:

- 打开 Redmine 个人资料页,地址 …/users/<id> 里的数字就是 id;
- 名单为空时,只有「名单外但点名」一格可编辑(默认 ignore),不会接任何单;
- 名字只用于显示,可留空;
- 准入表两行:新 Issue / 评论。未点名的消息只有在对应 observe 开关打开时才会进入门禁。

使用

1. 在 Redmine 里新建 issue 或发评论,正文包含 @dsh(或把 issue 指派给 agent 账号);
2. 插件在 ≤ 2 个轮询周期内生成 Trigger → Eval 决定是否接单 → 建 Ticket;
3. agent 在 dsh-superagent 配置的仓库/worktree 里执行;
4. 完成后回写一条评论到原 issue;重试不会产生重复评论。

健康与事实:Overview 的 redmine 条目显示轮询状态、连续失败次数与本轮读到的数量;卡片上显示 Connected as <login> 与项目名(首次轮询成功之后)。

被丢弃的请求:白名单外、未点名、私有备注等不会建单,原因可在 Source 页查看(与 GitHub 渠道一致)。

只读观察:把 writeBack 设为 off 先跑一段时间,确认 Trigger 与图片都正常,再打开回写。

图片识别

正文和评论里的图片会被抽取、下载,并在 Eval 阶段作为模型可见附件参与判断。

| 写法 | 解析为 | 说明 |
| | att:456 | 也支持 thumbnail / thumbnails 与缩略图尺寸路径 |
| !shot.png! / !>shot.png! / !{width:300px}shot.png! | file:shot.png | 按 issue 附件名匹配,同名取最新 |
| attachment:shot.png | file:shot.png | 同上,支持中文文件名与后接标点 |

- 支持 PNG / JPEG / WebP / GIF;SVG、BMP、PDF 不会被当作图片提供;
- 模型必须支持图片输入,否则会明确报错(模型不支持图片输入),不会静默忽略;
- 受部署的附件字节上限约束,超限明确报错;
- 只认 Redmine 附件,不下载任意外链图片;API 账号必须能读取该附件;
- private_notes 的评论,其文字和图片不会进入上下文。

边界:图片对 Eval 可见(决定是否接单、理解需求);执行工单的 worker 在独立 worktree 里,不会自动获得图片字节。需要 worker「看见」图时,应由 Eval 在工单描述/回执里写出图片内容,或由上游扩展。

兼容性

| 能力 | 2.3 | 2.6–3.3 | 3.4–5.x | 6.x |
| /users/current.json、项目解析 | ✅ | ✅ | ✅ | ✅ |
| 倒序分页 / status_id=* / limit=100 | ✅ | ✅ | ✅ | ✅ |
| 服务端 updated_on 时间戳过滤 | ❌ 422(插件不使用) | 未验证 | ✅ | ✅ |
| include=journals,attachments | ✅ | ✅ | ✅ | ✅ |
| issue/journal 用户只有 id+name | ✅ | ✅ | ✅ | ✅ |
| journal.private_notes | 无此功能 | ⚠️ 有功能但 API 不返回 | ✅ | ✅ |
| 附件 /attachments/:id.json + API Key | ✅ | ✅ | ✅ | ✅ |
| PUT /issues/:id.json 写 notes | ✅ | ✅ | ✅ | ✅ |

- 2.6–3.3 的私有备注:Redmine 有该功能,但 API 不返回 private_notes,客户端无法识别;建议升级到 3.4+,或约定不把私有备注当请求。
- 时间格式:不同版本/部署会返回带 +08:00、Z、+0800 或不带时区的时间。不带时区的时间按 timezone 配置解析,游标统一存 UTC。
- 插件只使用各版本一致的字段(id / name / notes / created_on / details / attachments),不依赖 status.is_closed / journal.updated_on。

排错

| 现象 | 处理 |
| 卡片一直 paused("Waiting for the deployment check") | dsh-superagent 自身 setup 未完成;先完成它的 GitHub/agent CLI setup |
| error:REDMINE_API_KEY is empty or unset | Key 对 DSH 进程不可见;见「提供 API Key」 |
| error:Redmine responded 401 | Key 无效/已重置;重新生成并更新环境 |
| error:项目 404 | identifier 写错,或账号对该项目不可见 |
| ready 但 0 条 issue | 账号角色可能缺「查看问题」权限(2.3 对带 project_id 的请求不会返回 403) |
| 图片读不出来 | 账号无权下载该附件,或格式不在 PNG/JPEG/WebP/GIF 内;插件会如实报「图片不可读」 |
| 只看到旧评论 | 首次运行不回填历史;新评论需在 启动时刻 之后 |
| Invalid time zone | timezone 填了不存在的 IANA 时区 |
| 反向代理剥掉 X-Redmine-API-Key | 插件在 401 后自动改用 ?key= 并缓存 |

更完整的部署与排错见 SETUP.md;上线前建议先跑其中的只读探测(scripts/probe-redmine.sh),确认账号权限、时间格式与附件可用性。

开发 sh
pnpm typecheck
pnpm test # 112 个用例:契约 / 单元 / mock HTTP 集成
pnpm build
pnpm check # 三者合一

目录:

src/
├── index.ts 插件入口:name / inject / apply;注册 kind 并启动轮询 ├── kind.ts createRedmine():schema + fields + policy + scope + channel + threadContext + environment + facts ├── config.ts zod 配置(每个字段都有默认值) ├── contract.ts 宿主契约的本地结构声明 + cordis Context 增强 ├── key.ts 稳定 id(sha256 截 32 位) └── redmine/ ├── client.ts fetch 封装:API Key(header → ?key=)、超时、错误映射、流式下载限额 ├── time.ts 四种时间写法统一成 UTC ISO ├── types.ts API 响应的 zod schema ├── trigger.ts issue/journal → Trigger;mention/指派;图片 key ├── poll.ts 首轮校验、倒序分页、窗口游标、健康上报 ├── channel.ts 回写:writeBack 门禁、marker 幂等、只写 notes ├── read.ts thread/root/parent 上下文 └── images.ts 附件 → 模型可见图片 scripts/probe-redmine.sh 上线前只读探测 assets/ README 用截图(API Key 已打码)

针对真实实例的联调(不提交到仓库): sh

本机 Docker:docker run -p 3000:3000 redmine:6.1

export REDMINE_URL=http://127.0.0.1:3000
export REDMINE_API_KEY=<测试账号 Key>
export REDMINE_PROJECT=<项目 identifier>
./scripts/probe-redmine.sh

贡献

见 CONTRIBUTING.md。提交前请确认 pnpm check 通过、新增行为带测试、没有提交任何 Key。

安全

见 SECURITY.md。核心约定:Key 只从环境变量读取;只写 notes;writeBack=off 零写请求; HTTP 只用于内网/VPN。

许可与致谢

本项目使用 MIT。

- 插件契约(SourceKind / SourceContext 等)参考 dsh-superagent(MIT),本项目只做结构声明,不 import 其运行时模块。
- 运行时依赖 zod(MIT)。
- 需求/方案/测试计划等设计文档仅保留在 monorepo 本地 docs/dsh-superagent-redmine/,不随本包发布。
预览分享卡片长什么样 ↓billbill2012/dsh-superagent-redmine
分享 · DeepSeek Harness Hub
billbill2012/dsh-superagent-redmine

把 Redmine 问题转成智能体工单并回写处理结果

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