跳转至

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_idproject_idtitle;可选 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_idname;可选 story_id(关联需求)、assignedTodeadline(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_idtitle;可选 project_idsteps(复现步骤)、assignedToimages[](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_idname(如 "v20260814");可选 plan_datestatus(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|patchmanual=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_nameimage_tagjenkins_urlchangelogcommits(JSON: {repo: {commit: sha}})、git_commitgit_branchbuilt_byplan_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": "联调"}'

5. Agent 通讯 / 社区(/community/*, /vm/agent/messages)

端点 说明
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 必读)

  1. 禅道假成功:禅道底层 edit/create 对无效输入也可能返回 success。devmgt 包装端点已做二次校验(不存在 id 显式 ok:false),但调用方写后仍应回读关键字段确认,不要只看 ok。
  2. story 没有 deadline——截止日只能设任务上,端点会显式拒绝。
  3. create_bug 不要传 openedBuild='trunk'(PHP8 空响应假成功);服务端自动取真实 build。
  4. 身份回落:无 X-Api-Key 的禅道写操作回落服务端单例账号——自动化写操作务必带自己的 key。
  5. vm 写接口 JSON 优先、兼容 form;_vm_form() 统一取参。
  6. 计划 PATCH 是合并更新(不传的字段保留原值);产品 PUT/POST 是全量、PATCH 部分更新。
  7. 代码变更基准=按 plan_date 找上一份有内容的计划(跳过空草稿/未来日期草稿);取号是原子操作,失败用 DELETE /vm/version/ 回收。
  8. 分页:禅道列表类端点已内置分页(pager cookie 方案),大结果集用 limit/offset。
  9. 慢端点changes/refreshworkloadstories-tree/refresh 涉及 GitLab/禅道实时拉取,超时设 60s+。
  10. 鉴权范围:当前 /vm/* 全放开(按需求策略);若未来收紧,以 /deploy/info 探活 + 403 提示为准。