Communitygithub.com

系统差异

将代码变更对系统产生的影响(组件、流程、状态和故障模式)制作成简短视频,替代传统的行差异对比。适用于系统差异分析,或当用户需要视频或动画来解释拉取请求、分支或提交范围时。

系统差异 是什么?

系统差异技能帮助开发者和AI助手将代码变更的影响可视化,生成一段展示系统结构和行为变化的短视频。它从组件、流程、状态、事实和故障模式五个维度建模变更,并自动渲染成包含前后对比的动画,使代码审查者能直观理解变更的全局影响。该技能支持所有Git仓库,通过GitHub CLI或Git命令获取变更,并利用自定义脚本检查环境配置、验证规格文件有效性。其核心工作流程包括:分析差异、建模系统变更、编写规格、生成视频并校验帧内容。适用于需要向团队展示复杂变更的场景,如添加新服务、修改数据流或引入新的故障模式,能显著提升代码审查的效率和沟通质量。

兼容平台~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/technotopicus/system-diff/tree/HEAD/skills/system-diff

在你喜欢的 AI 中提问

打开一个已预加载此 Agent Skill 的新对话。

文档

系统差异 是做什么的?

系统差异展示变更对运行中系统的影响:添加、移除或修改的组件和流程,事物现在可以经历的状态,变化的事实,以及新增的故障方式。行差异是证据;系统差异是审查者需要的故事。

你将变更建模为规格,脚本将规格渲染成包含多个节拍(标题、每个图的前后对比、故障、结束)的视频。下面,<script> 是此技能文件夹中 scripts/system-diff.mjs 的绝对路径。

1. 检查环境

运行 node <script> doctor。如果机器已正确配置,命令会以 Ready. 结束。

如果输出其他内容,或 node 不存在,则停止运行并让用户执行 /setup-system-diff,该命令会安装此技能所需的一切。

2. 收集变更

变更可以是拉取请求、分支或提交范围。如果没有指定,则使用当前分支与基准分支的差异:如果有拉取请求,则使用其基准分支;否则使用仓库的默认分支。当两者都不明确时询问用户。

在处理变更时,需在位于变更头部(最新提交)的检出目录中工作,因为第4步会检查你引用的证据是否与磁盘上的文件一致。

  • 读取整个差异(gh pr diff <number>,或 git diff <base>...<head>),以及拉取请求描述(如有),否则读取提交信息。
  • 对于每个涉及调用、查询、调度、配置值、模式或权限的差异块,需同时读取基准和头部版本中相关的周围代码,以了解运行时谁调用谁。

完成后,你应该能够说出:在基准和头部版本中,什么在运行,每个组件与谁通信,存储什么内容,以及当依赖的组件宕机时会发生什么。

3. 建模系统变更

将变更列为声明,每条声明附上显示它的文件路径和行号。这些声明将成为第4步的规格,并在第6步展示给用户。

  • 组件:运行或存储数据的事物,例如服务、作业、队列、表或外部API。包括观看者需要理解流程的未变化的组件。
  • 流程:一个组件调用、读取或写入另一个组件。
  • 状态和转换:事物经历的各阶段,例如订单、作业、会话或连接,以及将事物从一个阶段转移到下一个阶段的事件。
  • 事实:系统的一个方面有前后两个值,例如配置值、限制、模式、谁能做什么,或某个操作需要多长时间。
  • 故障模式:最重要的新增故障方式。通常是新组件或新依赖停止工作;也可以是现有依赖现在故障代价更高,或事物卡在某个状态。描述此时发生的情况:其他组件会做什么,或事物最终处于什么状态。

每条声明必须引用显示它的行号。没有行号引用的声明是猜测,不应包含在视频中。

某些变更不会改变系统:重构、格式化、测试、注释、仅代码可见的重命名。对于这些,告诉用户该变更没有系统差异并说明变更类型,之后结束流程,不生成视频。对运行中系统可见事物的重命名(如路由、表、队列或配置键)则属于系统变更。

声明决定视频绘制哪种图:

  • 组件视图,当接线方式发生变化时:添加或移除组件或流程,或流程传输不同的内容。
  • 状态图,当生命周期发生变化时:状态新增或丢失值,出现重试或取消步骤,或事件现在导向其他地方。
  • 当接线和生命周期不变但值发生变化时(例如更长的超时时间),属于事实,在提供上下文的图中展示。
  • 两者兼顾,当两者都发生变化且各自展示对方无法展示的内容时。每个图增加两个节拍,因此一个图就能完整讲述的变更只用一个图。

完成后,差异的每个部分要么被声明覆盖,要么被标记为不影响系统,并且你已选择好图。

4. 编写规格

将声明转化为规格,遵循 SPEC.md,其中包含所有字段、布局规则以及如何编写说明文字和旁白。将规格保存为仓库外临时文件夹中的 system-diff.json。

运行 node <script> check <spec> --repo <repository root>。

完成后,它应打印出 The spec is valid.,且无任何警告。check 命令确认每个引用的行号存在;但行号是否准确反映声明的内容,由你来确认。

5. 构建并查看联系表

运行 node <script> build <spec> --repo <repository root> --out <scratch folder>。它会输出视频路径、警告信息、联系表(一张包含每个节拍一帧的图像)和一个 stills 文件夹,其中包含相同帧的全尺寸图像。

查看联系表以获取整体概览,查看全尺寸图像以获取小字细节,并检查每一帧:

  • 每个标签、值和说明文字完整可读;
  • 每条流程线不与无关的框和标签相交;
  • 每个“之前”帧只显示之前存在的内容,每个“之后”帧显示变更添加的所有内容;
  • 状态图的起始点位于事物开始的状态上;
  • 故障帧标记正确的组件或状态,每条注释位于其所描述对象的底部边缘;
  • 每条说明文字准确描述帧内容。

修复规格并重新构建,直到构建打印 No warnings. 且联系表通过所有检查。大多数帧问题可以通过缩短文字或将框移动到其他单元格来解决。如果仍有问题,则将其记录在手写交接记录中。

6. 交接

将视频路径、一句话说明视频内容、声明及其证据,以及你遗漏或不确定的内容告知用户。在任何地方发布视频由用户决定。

相关技能