Skill + MCP + Linear 自动化工作流:让 AI 包揽变更日志工作

4 阅读12分钟

很多白领现在所有的工作可以尝试用 AI 去实现。首当其冲是我们这些程序猿。有人说,对于软件开发工程师,如果你还没有把90%以上的代码交给AI,那么你可能已经落后了。

今天要分享的是,我在尝试用AI实现自动化的“需求/BUG 的管理和系统更新记录”过程中遇到的问题和解决思路。其中会有一些 AI 编程的最佳实践,希望对你有所帮助。

首先,要明确几个原则:

  1. 一个上下文窗口尽量只干一件相关的事情,如果你用到 /compact 大概率是你任务拆分不合格
  2. Skill 尽量拆分,一个 Skill 只专注于解决一种相关的流程。想要写一个能解决所有流程问题的 Skill 的思路是错误的
  3. Skill 和 MCP 不是竞争关系,而是协同利用的关系。MCP 更关注于单个工具的调用,而 Skill 更侧重于流程编排;在 Skill 中可以明确指定调用某一个或多个 MCP。

一、期望的场景和使用方法

理想的自动化闭环是这样的:

  1. 前端/后端开发同学在 ChatBox 中对 agent 说 “提交代码”后,ai 将提交代码并自动生成变更日志写入数据库。
  2. 变更日志存在 change_releases 表里,可追溯(remark 里记录 git commit ids、Linear issue ids、仓库 remoteUrl)。
  3. 前端界面直接展示历史变更记录(Markdown 渲染),领导、产品、客户、开发自己都能一眼看懂。

不再需要任何人手动写“更新说明”,也不用担心漏记或前后端版本冲突。

二、找一个支持 MCP 的项目需求管理和问题追踪工具(Linear √)

项目需求管理和问题追踪工具是多人研发团队必备的,可能是禅道、ONES或者飞书等。研发人员需要根据需求来开发功能、根据bug单来一个个处理问题、修复bug之后要标记状态;测试根据bug单来跟踪修复状态;项目经理要根据需求项目管理平台来跟踪研发进度...

但在现在,我们需要尝试用AI跑通这一系列的流程。

2.1 为什么需要 MCP ?

我们习惯用非结构化的自然语言表达需求,工具却需要结构化参数才能执行(Function Calling)。 而 MCP 将工具能力的描述与访问协议标准化了,让 Agent 可以识别和使用工具, 在自然语言与工具系统之间建立桥梁。

在这个场景中,如果有 Linear MCP 我们可以在 ChatBox 中用自然语言决定Linear tools的调用

2.2 为什么不是飞书?(不够垂直,飞书MCP目前只支持云文档)

飞书太重了,不够垂直,且飞书 MCP目前只支持云文档场景

2.3 为什么选择Linear?

Linear是专业的项目管理和问题追踪工具,可以将一个issue标记为 bug、feature、improvement 或者自定义的 labels,同样支持@团队成员等。最重要的是他支持MCP

2.3.1 Linear MCP 支持哪些tools?

Linear MCP 提供了 30+ 个工具,分为以下几类:

类别工具功能
Issueslist_issues, get_issue, save_issue列出/获取/创建更新 Issue
Teamslist_teams, get_team, list_users列出团队、成员
Cycleslist_cycles, get_cycle列出周期(Sprint)
Projectslist_projects, get_project列出项目
Labelslist_issue_labels, create_issue_label管理标签

核心是 list_issuessave_issue

  • list_issues 可以筛选团队、状态、负责人、标签等
  • save_issue 可以创建或更新 Issue(根据是否传入 id 判断)

tips:

如果你想要知道自己接入的 MCP 有哪些 tools,你可以尝试直接在TRAE/cursor等编辑器的设置找到(当然你直接问agent也可以):

image.png

三、写一个 linear-workflow.md 的 Skill

根据文章开头提到的原则,我们应该让一个 skill 只专注于解决一种相关的流程,所以这专门写个关于 linearskill

注意,很多ai编辑器或ai cli现在都已经内置了 skill-creator 这个 skill,你可以直接把场景和流程告诉它,让它生成,以下是我的原话:

请你帮我创建一个专门用于linear工作流的skill。预期是,在一个新的上下文窗口中,我首先问有哪些需求没做?它会调用mcp去获取现有未解决/未处理的bug/feature。我会让它协助我一起解决某个问题(解决问题的过程尽量在一个上下文窗口),当你决定要开始解决某个问题时,它会调用mcp将linear上的状态标记为 in progress。在它识别到问题解决之后会问你是否验证通过,如果已通过则调用mcp将其标记为in review。

从in review 到 Done,需要真正发布之后才能执行,所以需要单独写一段,要保证不能太依赖于处理过程中的状态变更,因为有可能mcp不会执行。因此这种情况要验证git变更内容,和未Done状态的issues做核对,如果符合某个issue,则把它标记为Done。

注意,将issue的状态改成Done,支持接收一组issue id,可用其他skill调用。

最终生成的 skill内容:(当然你也可以说他是一个rule,但ruleskill的区别这里就不展开说了)

image.png

四、思考变更记录和Linear中待办项的关系,设计变更日志表结构

变更日志写给谁看?这是最先要想的问题。

  • 领导/产品/老板:想知道这次变更对业务/用户到底有什么影响
  • 客户/用户:想知道新功能、修复了什么、值不值得升级
  • 开发自己:想快速回忆这次变更改了什么、出了问题能定位

现状非常尴尬:

  • 领导催:“这次变更了啥?给个更新说明啊”
  • 开发烦:“我天天写代码还要写散文?”
  • Git commit 又太硬核:fix: handle null in payment service —— 老板看不懂,客户更看不懂
  • Linear Issues 看着美好,但实际一堆问题:
    • 很多小修小补根本没建 issue
    • 紧急 hotfix 经常来不及建
    • 已完成的 issue 容易被归档,批量查很麻烦

所以很快就能得出几个基本结论:

  1. Git 才是唯一的真相源
    所有代码变动最终都会落在 git commit 里,绕不过去,也最可靠。

  2. Linear 是非常有价值的“上下文补充”,但不能当唯一来源

    • 它能提供需求背景、用户影响描述、产品语言
    • 但覆盖不全 + 状态不稳定(归档/删除/重置)
  3. 变更日志必须是给人看的,不是给程序看的
    所以要用自然语言、分级标题、面向用户表达,而不是堆砌 commit message 或 issue 标题。

  4. 技术实现要可追溯,但不能让追溯信息污染用户阅读体验
    → 把 git commit id、linear issue id、仓库地址等放一个单独字段(remark),用户看不到,前端也不渲染。

图 4-1:代码变更 / Git记录、Linear待办项与最终变更日志的关系

graph TD  
A["Git Commit / 代码变更\n(唯一真相源)"] -->|关联| B["Linear Issue / 待办项\n(上下文补充参考)"]  
B -->|关联| C["最终变更日志 content\n(面向用户输出)"]  
A -->|记录到| D["remark字段\n(可追溯信息)"]  
B -->|记录到| D  

基于以上思考,最终决定采用最简单也最灵活的方案:

  • 只用一张表
  • 核心只有一个 Markdown 字段(content)给用户看
  • 后台埋一个 JSON remark 字段专门放所有追溯信息

4.1 变更日志表结构(最终落地方案)

CREATE TABLE change_releases (
  id           BIGINT PRIMARY KEY AUTO_INCREMENT,
  content      TEXT NOT NULL COMMENT '面向用户渲染的 Markdown 内容',
  remark       TEXT COMMENT 'JSON 格式,存放 git remote url、commits、linear issues 等追溯信息',
  publish_time DATETIME NOT NULL COMMENT '发布时间',
  publisher    VARCHAR(100) COMMENT '发布人(或触发者)',
  project      VARCHAR(100) COMMENT '项目标识,用于多项目区分',
  created_at   DATETIME DEFAULT CURRENT_TIMESTAMP,
  updated_at   DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);

核心字段作用一览:

字段作用谁看 / 谁用
content用户真正看到的变更文案(Markdown)老板、产品、客户、前端渲染
remark机器用的追溯信息(仓库地址、git commit ids、linear issue ids 等)排查问题、审计、未来数据分析
publish_time发布时间排序、展示

remark 字段示例(JSON):

{
  "remoteUrl": "https://github.com/team/project.git",
  "gitCommitIds": ["abc1234", "def5678", "ghi9012"],
  "linearIssueIds": ["ENG-123", "ENG-456", "DES-78"],
  "generatedBy": "change-releases-skill",
  "project": "your-project"
}

即使几年后仓库地址迁移、改名、迁移到别的平台,只要 remark 里有 remoteUrl,就能快速定位到正确的仓库去查 commit 历史。

4.2 content 字段推荐的 Markdown 格式(面向用户)

## 本次变更内容

### 功能更新
- 新增了支付方式 - Apple Pay / Google Pay
- 支持自定义发票抬头

### 体验优化
- 大幅缩短订单提交加载时间(平均减少 1.8 秒)
- 优化了商品详情页的图片预加载逻辑

### Bug 修复
- 修复了 iOS 端部分用户重复扣款的问题
- 修复了优惠券在特定场景下无法抵扣的异常

4.3 需要的两个后端接口

前端展示 + AI 发布共需 2 个接口:

接口方法路径用途
新增变更日志POST/api/admin/change-releasesAI 生成日志后写入数据库
查询变更日志GET/api/admin/change-releases前端分页展示历史记录

五、写一个changereleases 的skill

现在需要写一个专门针对于生成系统变更日志的skill,还是借助于skill-creator这个skill,直接和agent说明这个流程触发的场景,以及具体的流程步骤等:

请你帮我生成一个skill,要求当我说明提交代码时,或者指定要生成某段commits的版本日志时触发。

如果是提交代码,你需要拿到本次变更文件的大致内容,并调用linear mcp和远程未完成的issue做比对,话术概括尽量贴近于issue的描述,也可以在issue描述上做扩展,但不需要交代过于细节的技术实现。因为版本日志是需要给用户看的,也需要让领导一眼看出哪些功能是他提的(提在了linear上)已经实现了。

如果是明确指定要生成某段commits的版本日志,你需要拿到这段commits的大致内容,再和未完成issue做比对,比对首先要比对commits message如果不确定再去看更改的文件名,最后如果找不到linear上的匹配项也无法通过commit message获取清晰的更改描述时(因为有可能commit message写的模糊,可能只写了fix,但没写fix了什么),你才需要看具体的更改内容。 明确了更改内容之后,你需要生成面向用户的markdown格式的版本日志描述。

同时你需要在这个skill目录下创建 /scripts/releases的脚本文件,脚本会首先通过账号密码登录系统拿到token,然后会拿token调用 /api/admin/change-releases.py 接口(具体接口信息你可以现在通过接口的apifox mcp查看接口具体细节),固定的参数比如publisher、project你可以放在skill目录的 /assets/config.json下,其他的需要在上述流程走完后作为/change-releases.py的动态输入。发布成功后你需要调用接口来 /releases 接口来查看是否生效。

最后你需要告诉我你的结果。

最终生成的skill目录结构如下:

.cursor/skills/change-releases/
├── SKILL.md
├── assets/
│   └── config.json
└── scripts/
    └── releases.py

生成结果如果和预期有偏差需要微调,最终内容因篇幅原因这里就不展示了。

六、如何完善你的skill

在最开始 rules 出现时就有一个最佳实践是,要 在项目开发中 持续完善rules,一次性写出完美的 rules 是不切实际的。

skill 也一样,我们使用 skill-creator 快速创建一个 skill 之后很可能是和我们预想的有所偏差,偏差原因可能是因为你最开始的 prompt 不够明确,也可能是你描述触发时机不够准确,又或是会存在你预期之外的流程分叉。但无关紧要,我们可以自己 观察触发 skill 时,agent 的思维链,要敏锐捕捉到 agent 在执行skill 流程中和预想中不一样或者是出错的情况,然后去完善

举个例子:

image.png

以上是我第一次执行这个skillagent 的思维链,其中当它发现 Linear MCP 工具不可用时,它无视了这个情况,它会直接根据变更内容生成版本日志。但我认为这会导致功能发布了,但是 issue 没有自动关闭。这里我需要它向我主动确认是否继续执行。后面省略一些调试、优化过程...直接看下面效果。

六、效果

6.1 列出计划

image.png

6.2 调用Linear MCP 获取待办事项

image.png

6.3 调用接口发布变更记录、提交git

image.png

6.4 调用 Linear MCP 标记已完成

image.png

6.5 Linear 界面验证

image.png

6.6 系统更新记录页面验证

image.png

七、总结

1. 用 AI 解决流程问题,而不是用 AI 写代码
代码只是执行,流程自动化才是更高维度的效率提升。

2. 技术平权,但工程化思维不可替代
会描述流程本身就是一种稀缺能力。

3. 自然语言描述力 = 生产力
能不能把事情说清楚,决定了 AI 能不能帮你把它实现出来。

4. 发现问题的慧眼比解决问题的能力更稀缺
大多数人只是抱怨重复性工作,而不是去自动化它。

5. 持续迭代的方法论意识
建立"执行 → 观察偏差 → 修正 → 再执行"的闭环。

写在最后

AI 编程的本质不是让 AI 替代你写代码,而是让你从重复性工作中抽身,把精力放在真正需要思考的地方。时刻保持对身边重复性工作的敏感度,发现它,然后解决它。