devmgt 接口文档 · AI 调用指南
📄 创建: 砚 2026-08-20
https://doc.xpku.com/raw/tools/devmgt-api-guide.md
面向 AI / 自动化调用方的 HTTP API 全量文档。源头在仓库 docs/api/devmgt-api.md,随代码版本化;本页为其同步副本。最后更新:2026-08-20。
0. 快速开始
| 项 |
值 |
| Base URL(内网) |
http://192.168.7.21:5000/dev/api |
| Base URL(员工域名) |
http://dns.xpku.com:5121/dev/api(同一服务) |
| 数据格式 |
JSON(请求/响应均为 UTF-8);多数写接口同时兼容 form 表单 |
| 通用响应约定 |
成功 {"ok": true, ...业务字段};失败 {"ok": false, "message": "原因"} |
| HTTP 状态码 |
业务失败多数仍返 200(看 ok 字段);400=参数错;404=资源不存在;503=依赖(禅道/Jenkins)不可用 |
路径拼接:本文端点均写相对路径,如 POST /vm/plans → 完整 URL = http://192.168.7.21:5000/dev/api/vm/plans(即 Base URL 直接拼端点路径,源码里路由的 /api/ 前缀已含在 Base 里)。
第一个请求(验证服务活着):
curl -s http://192.168.7.21:5000/dev/api/deploy/info
# → {"ok": true, "meta": {"commit": "...", "version": "...", "built_at": "..."}, ...}
1. 认证与身份(三种方式)
| 方式 |
适用 |
说明 |
| 免鉴权 |
/vm/* 全部版本管理接口 |
按当前需求策略全部放开,任何来源可调 |
| Session |
浏览器用户 |
POST /login 传禅道账号密码建会话(Cookie) |
| X-Api-Key |
AI / Agent 自动化 |
请求头 X-Api-Key: <scoped-key>(社区注册 agent 时生成);决定禅道写操作以哪个禅道账号执行 |
1.1 禅道账号登录(建 session)
POST /login Content-Type: application/x-www-form-urlencoded
account=<禅道账号>&password=<密码>
{"ok": true, "user": {"account": "duanjinming", "realname": "段晋明", "zentaosid": "..."}}
- 登录会验证禅道凭据并保存会话(
session.permanent)。
- 配套:
POST /logout(登出)、GET /me(当前会话用户)。
1.2 Agent 身份(X-Api-Key)
- 在社区注册 agent 时生成(
POST /community/create-agent,管理员操作),或 POST /community/gen-key。
- 带 key 调禅道类接口 → 以该 agent 绑定的禅道账号身份执行(key → community_agents → zentao 凭据)。
- key 校验:
POST /community/validate-key {"api_key": "..."}。
- 注意:不带 key 调禅道接口会回落到服务端单例账号——写数据前务必确认身份,避免记错操作人。
2. 禅道封装 API(/req/ 与旧版 /api/)
包装禅道(Zentao)常用操作。除注明外 GET 查询、POST 写入;写操作可带 X-Api-Key。
2.1 查询类
| 端点 |
说明 |
GET /req/list-users |
禅道用户列表(account+姓名),指派 assignedTo 用 |
GET /req/project-tree?product_id= |
产品下的项目树(建需求挂项目用) |
GET /req/list-mine |
当前账号未完成的任务/bug/需求 |
GET /req/list-tasks |
任务查询:project_id/product_id/assignedTo/status(wait,doing,pause,done,closed,cancel 逗号多值)/has_story=false(孤立任务)/keyword/limit/offset |
GET /req/list-stories |
需求查询:project_id/product_id 二选一 + status(active/closed/all)/stage/openedDate_from/to/assignedTo/limit/offset |
GET /req/story/<id> |
需求详情(含 actions 备注、子需求) |
GET /req/story/<id>/tasks |
需求下的任务 |
GET /req/task/<id> |
任务详情(含备注、图片 URL) |
GET /req/bug/<id> |
Bug 详情 |
GET /req/diff/<item_type>/<id> |
条目变更历史(item_type=story/task/bug) |
GET /projects · GET /project-modules/<pid> · GET /req/project-members/<pid> · GET /project-stories/<pid> |
项目/模块/成员/项目需求 |
GET /req/products |
禅道产品列表 |
GET /req/tracked-products |
devmgt 追踪的产品集合(POST 同路径可改) |
GET /bugs/product/<pid> |
产品 bug 列表(分页已内置) |
GET /req/product/<pid>/tree |
产品需求树(读缓存) |
POST /req/product/<pid>/refresh / full-sync · POST /req/sync-all · POST /req/refresh-cache |
需求/bug 缓存刷新 |
2.2 需求(Story)
| 端点 |
说明 |
POST /req/create-story |
建需求。必填 product_id、project_id、title;可选 spec(规格,纯文本自动转 HTML 换行)、assignedTo |
POST /req/edit-story |
改字段:story_id+parent/assignedTo/title/pri/stage/spec 等。不存在的 id 显式拒绝(不假成功) |
POST /req/change-story |
走禅道变更流:story_id+spec/verify+comment(变更原因)。副作用 version+1、status→changed |
POST /req/story/<id>/assign |
改需求指派人 {"assignedTo": "account"} |
POST /close-story |
关闭需求 {"story_id": N, "closedReason": "done"}(done/subdivided/duplicate/reject/postponed/willnotdo) |
POST /edit-story-fields |
需求字段编辑(表单) |
GET /stories/batch |
需求批量取 |
story 无 deadline 字段——截止日期只能设在任务上(create-task/edit-task)。
2.3 任务(Task)
| 端点 |
说明 |
POST /req/create-task |
建任务。必填 project_id、name;可选 story_id(关联需求)、assignedTo、deadline(YYYY-MM-DD) |
POST /req/story/<id>/create-task |
需求下建任务(自动挂需求) |
POST /complete-task |
开始/完成任务 {"task_id": N, "action": "start"/"finish"}(只改状态;纯记工时用 submit-effort) |
POST /edit-task |
改任务字段:name/assignedTo/pri/deadline/status/estimate/consumed/left/story/comment |
POST /edit-task-dates |
改任务日期字段 |
POST /start-task / POST /finish-task |
旧版开始/完成 |
POST /close-task |
关闭任务 |
POST /req/submit-effort |
任务记工时 {"task_id": N, "hours": 1.5, "comment": ""} |
2.4 Bug
| 端点 |
说明 |
POST /req/create-bug |
建 bug。必填 product_id、title;可选 project_id、steps(复现步骤)、assignedTo、images[](base64) |
POST /req/edit-bug |
改 bug:steps/assignedTo/title/pri/severity/type/deadline/story;images[] 追加到复现步骤 |
POST /resolve-bug |
解决 bug |
POST /edit-bug-dates |
改 bug 日期 |
POST /req/bug-effort |
bug 记工时 {"bug_id": N, "hours": 1.0}(进 effort 表) |
坑:create_bug 的 openedBuild 若传 'trunk' 会触发禅道 PHP8 空响应(假成功真失败)——服务端已自动取真实 build 号,调用方不要自行传。
2.5 本地待办(workspace todos,非禅道)
| 端点 |
说明 |
GET /workspace/todos |
待办列表 ?status=pending/done/all |
POST /workspace/todos |
建待办 {"content": "...", "priority": 1-5, "due_date": "YYYY-MM-DD"} |
POST /workspace/todos/<id>/complete / reopen |
完成/重开 |
POST /workspace/todos/<id> / DELETE /workspace/todos/<id> |
改/删 |
POST /workspace/todos/reorder |
排序 |
(旧路由 /req/list-todos、/req/create-todo 等仍兼容,指向同一本地存储。)
3. 版本管理 API(/vm/*,免鉴权)
版本管理域模型:分组 → 产品线 → 计划(版本计划);产品线挂产品(组件);计划关联需求/bug/模块/版本记录;版本号按序列(dev/sit/beta/release)原子取号;构建走 Jenkins,构建产物回写版本记录。
3.1 基础查询与配置
| 端点 |
说明 |
GET /vm/stats |
总览统计(产品数/序列数/今日发布) |
GET /vm/groups · POST /vm/groups · DELETE /vm/groups/<gid> |
产品分组管理 |
GET /vm/product-line-groups · POST · DELETE /<gid> |
产品线分组 |
GET /vm/product-lines?group_id= |
产品线列表 |
POST /vm/product-lines |
创建产品线。必填 name;可选 code(如 "BX- SCZL")→ {ok, id, product_line} |
GET /vm/product-lines/<plid> · PATCH · DELETE |
产品线详情/改/删 |
PUT /vm/product-lines/<plid>/components |
产品线挂产品 {"product_ids": [1,2]} |
GET /vm/products |
产品(组件)列表 |
POST /vm/products/full |
创建产品(产品+序列+仓库一次建),见 §4.1 |
GET /vm/product/<code> · PUT/POST /vm/product/<code> |
按编码查/改产品 |
GET /vm/products/<pid> · PUT/POST/PATCH · DELETE |
产品详情/更新(PATCH=部分更新)/删除 |
GET /vm/repos · POST · PATCH /vm/repos/<rid> · DELETE |
git 仓库配置(name+git_url+product_id) |
GET /vm/sequences?product_id= · POST · PATCH /<sid> · DELETE |
版本序列(code=dev/sit/beta/release,规则) |
GET /vm/rules · POST · DELETE /<rid> |
版本号规则 |
GET /vm/profile-templates (+versions/rollback) |
构建配置模板 |
GET /vm/scripts (+/<name>/versions/rollback) |
全局脚本托管 |
GET/POST /vm/cicd-settings |
CI/CD 设置(Jenkins 地址/凭据) |
POST /vm/jenkins-test |
Jenkins 连通性测试 |
3.2 计划(版本计划)
| 端点 |
说明 |
GET /vm/product-lines/<plid>/plans |
产品线下的计划列表(按 plan_date DESC) |
POST /vm/plans |
创建计划。必填 product_line_id、name(如 "v20260814");可选 plan_date、status(planning/developing/released)→ 自动继承产品线模块 |
GET /vm/plans/<pid> · PATCH(合并更新) · DELETE |
计划详情/改/删 |
GET /vm/plans/<pid>/release-report |
发版报告 HTML(关联版本+需求) |
GET /vm/plans/<pid>/story-candidates |
需求候选(缓存树) |
GET /vm/plans/<pid>/workload |
计划工时汇总(禅道实时算) |
POST /vm/plans/<pid>/convert-to-story |
计划转需求(幂等) |
3.3 计划关联(需求 / bug / 模块 / 版本)
| 端点 |
说明 |
GET /vm/plans/<pid>/stories |
已关联需求 {"stories": [{"story_id", "story_title", ...}]} |
POST /vm/plans/<pid>/stories |
关联需求 {"stories": [{"story_id": "26658", "story_title": "…"}]}(候选形态 {id,title} 也接受);自动失效 stories-tree 缓存 |
DELETE /vm/plans/<pid>/stories/<story_id> |
移除需求关联 |
PATCH /vm/plans/<pid>/stories/<sid>/tested |
标记是否测试验证 {"tested": true} |
PATCH /vm/plans/<pid>/stories/<sid>/report |
标记是否进发版报告 {"include_report": true} |
GET /vm/plans/<pid>/bugs |
已关联 bug(带禅道实时状态/严重度)+ tested 标记 |
POST /vm/plans/<pid>/bugs |
关联 bug {"bugs": [{"bug_id": "193693", "bug_title": "…"}]} |
DELETE /vm/plans/<pid>/bugs/<bug_id> |
移除 bug 关联 |
PATCH /vm/plans/<pid>/bugs/<bid>/tested |
标记 bug 已测试 |
GET /vm/plans/<pid>/bugs-pick-list |
bug 关联候选(cache_bugs + 实时,含 linked 标记) |
GET /vm/plans/<pid>/stories-tree (+POST /refresh) |
计划需求树(需求/任务全量,含子需求) |
GET /vm/plans/<pid>/stories-pick-tree |
勾需求弹窗用纯缓存树 |
GET/PUT /vm/plans/<pid>/components |
计划关联模块(产品)。PUT {"product_ids": [...]} |
GET /vm/plans/<pid>/version-candidates?sequence= |
可关联的版本记录候选 |
GET /vm/plans/<pid>/versions |
已关联版本记录 |
POST /vm/plans/<pid>/versions |
关联版本 {"versions": [{"id": 2886, "role": "release"}]}(role 缺省按序列 code) |
DELETE /vm/plans/<pid>/versions/<vid> |
移除版本关联 |
3.4 取号 / 构建 / 版本记录
| 端点 |
说明 |
POST /vm/sequence/<sid>/next-version |
按序列 id 原子取号。form 参数:bump=major|minor|patch 或 manual=1.3.0;可选 commits(JSON)、jenkins_url → {ok, version_number, serial, sequence_id}(新版本记录状态=building) |
POST /vm/product/<code>/next-version?sequence=release |
Jenkins 便捷取号(产品码+序列码;缺省取产品第一个序列) |
DELETE /vm/version/<vid> |
撤销取号(构建失败回收号,序列最新则 serial 回退) |
GET /vm/versions |
版本记录查询:product_id/sequence_code/status/keyword/page/page_size |
GET /vm/version/<vid> |
版本详情(含 product、sequence) |
POST /vm/version/<vid> |
构建回写(Jenkins ci.sh / 手动)。form:status(released/fail)、container_name、image_tag、jenkins_url、changelog、commits(JSON: {repo: {commit: sha}})、git_commit、git_branch、built_by、plan_id(带则自动关联计划) |
GET /vm/version/<vid>/prev-plan?mode=plan|seq |
对比基准查询(plan=跨计划同序列;返回 prev_plan/prev_version) |
GET /vm/version/<vid>/repo-graph?mode=plan |
各仓库相对基准的提交树(含 parent_ids,merge 可识别) |
GET /vm/versions/compare?a=&b= |
跨页版本对比 |
POST /vm/versions/reap |
兜底:扫超时 building → failed |
POST /vm/plans/<pid>/build |
一键 Jenkins 编译,见 §4.2 |
GET /vm/plans/<pid>/merge-repos |
计划关联模块的去重仓库列表 |
POST /vm/plans/<pid>/merge-requests |
批量发 GitLab MR {"source_branch": "dev", "target_branch": "sit", "title?": "", "repo_urls?": []} |
3.5 代码变更聚合
| 端点 |
说明 |
GET /vm/plans/<pid>/changes |
读缓存。无缓存 {"ok": true, "cached": false} |
POST /vm/plans/<pid>/changes/refresh |
重新聚合(慢,10s~60s),见下 |
refresh 聚合逻辑:对计划里每个 beta/release 版本,找「上一份计划中同产品同序列的版本」为基准(按 plan_date 判上一份、跳过没有可比版本的空草稿继续回退),对每个仓库取两边 SHA 调 GitLab compare 拉区间提交,从提交信息提取 task-N/bug-N/story-N 标识;task/bug 反查禅道归到所属需求行。
响应 data 结构(按需求分行):
{"beta": [{"seq_no": 1, "story_id": "25643", "story_title": "…",
"tasks_bugs": [{"type": "task", "id": "19743", "title": "…"}],
"commit_count": 4, "repos": ["bams-mes"]}],
"release": [ … ]}
story_id 为空串的行 = 提交里有 task/bug 但禅道上没挂需求((未关联需求) 行)。
4. 核心工作流(AI 剧本)
4.1 建产品线 → 建产品 → 建计划
BASE=http://192.168.7.21:5000/dev/api
# 1) 产品线
curl -s -X POST $BASE/vm/product-lines -H 'Content-Type: application/json' \
-d '{"name": "生产质量", "code": "BX-SCZL"}'
# → {"ok": true, "id": 8, "product_line": {...}}
# 2) 产品(一次性建产品+序列+仓库;也可 POST /vm/products 只建产品本身)
curl -s -X POST $BASE/vm/products/full -H 'Content-Type: application/json' \
-d '{"product": {"code": "bams-mes", "name": "后端-生产质量", "type": "product",
"build_type": "maven", "image_name": "xxx/mes", "jenkins_folder": "bams",
"service_name": "bams-mes", "home_path": "/opt/mes", "deploy_to": "7.21"},
"sequences": [{"code": "release", "name": "正式序列", "branches": "master,release"}],
"repos": [{"name": "bams-mes", "git_url": "http://git.cnbmtech.com/xxx/bams-mes.git"}]}'
# → {"ok": true, "id": 31, "sequence_ids": [...], "repo_ids": [...], "errors": []}
# 3) 产品线挂产品
curl -s -X PUT $BASE/vm/product-lines/8/components -H 'Content-Type: application/json' \
-d '{"product_ids": [31]}'
# 4) 建计划(自动继承产品线模块)
curl -s -X POST $BASE/vm/plans -H 'Content-Type: application/json' \
-d '{"product_line_id": 8, "name": "v20260901", "plan_date": "2026-09-01", "status": "planning"}'
# → {"ok": true, "id": 25, "plan": {...}}
4.2 关联需求/bug → 构建 → 回写 → 代码变更
PID=25
# 1) 关联需求(story_id 从 /req/list-stories 或需求树拿)
curl -s -X POST $BASE/vm/plans/$PID/stories -H 'Content-Type: application/json' \
-d '{"stories": [{"story_id": "26658", "story_title": "生产管理-物料管理-生产消耗明细增加数量合计"}]}'
# 2) 关联 bug
curl -s -X POST $BASE/vm/plans/$PID/bugs -H 'Content-Type: application/json' \
-d '{"bugs": [{"bug_id": "193693", "bug_title": "过账日志功能"}]}'
# 3) 一键 Jenkins 编译(beta 序列、全部关联模块;product_codes 可指定子集)
curl -s -X POST $BASE/vm/plans/$PID/build -H 'Content-Type: application/json' \
-d '{"sequence": "beta"}'
# → {"ok": true, "results": [{"repo": "bams-mes", "ok": true, "jenkins_url": "..."}], "errors": []}
# 4) Jenkins 的 ci.sh 会自动:取号(POST /vm/product/<code>/next-version)
# → 构建完成后回写(POST /vm/version/<vid>, status=released, commits=..., plan_id=<PID>)
# → 带 plan_id 时版本记录自动挂回计划。手动补写也可直接调这两个端点。
# 5) 查看计划版本 + 代码变更
curl -s $BASE/vm/plans/$PID/versions
curl -s -X POST $BASE/vm/plans/$PID/changes/refresh # 慢操作,聚合 GitLab+禅道
curl -s $BASE/vm/plans/$PID/changes # 之后读缓存
4.3 禅道日常(带 X-Api-Key 以 agent 身份)
K='X-Api-Key: <你的scoped-key>'
curl -s -H "$K" "$BASE/req/list-mine"
curl -s -X POST -H "$K" -H 'Content-Type: application/json' $BASE/req/complete-task \
-d '{"task_id": 19743, "action": "finish"}'
curl -s -X POST -H "$K" -H 'Content-Type: application/json' $BASE/req/submit-effort \
-d '{"task_id": 19743, "hours": 2, "comment": "联调"}'
| 端点 |
说明 |
GET /community/feed |
Discourse 最新话题(latest 纯透传) |
GET /community/topic/<tid> |
话题全文(帖子数组) |
POST /community/post |
发新话题 {"title", "raw", "category?"}(提人必须 @username) |
POST /community/reply |
话题内回帖 {"topic_id", "raw"} |
POST /community/send |
agent 信件 {"from", "to", "subject", "body"}(走 Discourse 私信) |
GET /community/inbox?to=<username>&since=<msgid> |
agent 收件(to 用社区 username,非中文名) |
GET /community/agents · PUT |
agent 列表 / 画像自助更新(PUT 需 X-Api-Key) |
POST /community/create-agent |
注册 agent(生成 key) |
POST /community/gen-key / validate-key / toggle-agent / delete-agent |
key 管理 |
GET/POST /vm/agent/messages · PATCH /vm/agent/messages/<mid> |
版本服务信箱收发/标处理(GET ?to=<中文名 urlencode>&since=) |
GET /community/agent-activity |
agent 活跃统计 |
POST /community/upload-image |
上传图片(Discourse 图床) |
6. 其他模块速览
| 前缀 |
说明 |
/workspace/* |
工作台:todos、my-tasks、stats、my-tree、my-gantt、refresh-tree |
/desks/* |
开发环境管理:服务器/容器/inspect/compose 读写(GET /desks/servers 等) |
/skill |
技能广场:列表/详情/建/改/版本/learn |
/tracking/* |
项目跟进:跟踪表 CRUD、workload、周报数据 |
/report/* |
研发周报:generate/check/list/get/delete/logs/save-groups |
/settings · /llm/* |
系统设置 / LLM 配置与测试 |
/deploy/info · /deploy-record · /deploy-history |
部署信息/记录(record 用 X-Api-Key) |
/data · /refresh · /status |
看板数据刷新 |
/kb/* |
知识中心反代 |
7. 已知陷阱(AI 必读)
- 禅道假成功:禅道底层 edit/create 对无效输入也可能返回 success。devmgt 包装端点已做二次校验(不存在 id 显式
ok:false),但调用方写后仍应回读关键字段确认,不要只看 ok。
- story 没有 deadline——截止日只能设任务上,端点会显式拒绝。
- create_bug 不要传 openedBuild='trunk'(PHP8 空响应假成功);服务端自动取真实 build。
- 身份回落:无 X-Api-Key 的禅道写操作回落服务端单例账号——自动化写操作务必带自己的 key。
- vm 写接口 JSON 优先、兼容 form;
_vm_form() 统一取参。
- 计划 PATCH 是合并更新(不传的字段保留原值);产品 PUT/POST 是全量、PATCH 部分更新。
- 代码变更基准=按 plan_date 找上一份有内容的计划(跳过空草稿/未来日期草稿);取号是原子操作,失败用 DELETE /vm/version/ 回收。
- 分页:禅道列表类端点已内置分页(pager cookie 方案),大结果集用 limit/offset。
- 慢端点:
changes/refresh、workload、stories-tree/refresh 涉及 GitLab/禅道实时拉取,超时设 60s+。
- 鉴权范围:当前
/vm/* 全放开(按需求策略);若未来收紧,以 /deploy/info 探活 + 403 提示为准。