关于 pr
为编码 Agent 和贡献者提供简洁 PR 描述写作指导,涵盖变更说明、证据展示与合并风险评估,并给出多种可视化表达形式。
主要功能
- 01PR 模板与章节指导
- 02伪代码、树形图、差异和 Mermaid
- 03前后对比证据指导
- 04合并风险与影响范围评估
适用场景
- 01撰写简洁的 PR 正文
- 02为代码变更选择可视化形式
- 03记录测试或截图证据
- 04评估回滚风险与影响
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ overextended/ skills --skill pr安装后在 Claude Code 中输入/pr确认已加载。
附带文件agents/openai.yamlCREDITS.md
详细介绍
PR
编写 PR 正文时使用此模板:
## Summary
<diagram, diff-sketch, or tree>
## Evidence
- **Before:** <screenshot/output/failing test run>
**After:** <screenshot/output/passing test run>
## Merge Danger
**Door:** <one-way or two-way>
<optional: description>
**Blast Radius:** <one-word description>
<optional: potential ramifications of merge>
如果仓库中有拉取请求模板(.github/pull_request_template.md 或 .github/PULL_REQUEST_TEMPLATE/),请改用该模板,并在适用的标题下填写以下各节。
各节
跳过所有开场白,尽量简洁地表达。沿用代码中已有的资源、事件、导出项和条目名称。
摘要
选择能清楚说明重点的最简形式。
- 用伪代码展示逻辑或算法:
on(my_shops:buy)
if player is too far from the shop
return false
remove money
add item
return true
- 用调用树展示运行时控制流;在必要时跨越客户端/服务端边界:
client/points.lua nearby
lib.callback.await('my_shops:buy')
server/shops.lua buy
exports.ox_inventory:RemoveItem
exports.ox_inventory:AddItem
- 用组件树展示 NUI 结构,包括重要的状态和模块边界:
<App> (web/src/App.tsx)
useNuiEvent('setVisible')
<ShopWindow>
<ItemGrid> (web/src/components/ItemGrid.tsx)
- 用简洁的文件树展示文件职责或较大范围的重构:
my_shops/
├── client/ # points, target and NUI messages
├── server/ # validates and charges purchases
├── data/ # shop locations and stock
└── web/ # NUI
- 使用 Mermaid 展示组件交互、控制流或数据流:
sequenceDiagram
participant NUI
participant Client
participant Server
NUI->>Client: buy (NUI callback)
Client->>Server: lib.callback.await('my_shops:buy')
Server-->>Client: true
Client-->>NUI: updated stock
- 如果重点在于发生了哪些变化,且周边结构已存在,请使用
diff。根据主题选择合适的 diff 结构。
对于组件变更:
<ShopWindow>
<ItemGrid>
+ <BasketSummary />
<CloseButton>
对于文件布局变更:
my_shops/
├── client/
+│ └── target.lua # only required when ox_target is used
├── server/
-└── config.lua
+└── data/
+ └── shops.lua
对于调用树或调用栈变更:
server/shops.lua buy
+ check distance to shop
exports.ox_inventory:RemoveItem
exports.ox_inventory:AddItem
- TriggerClientEvent('my_shops:refresh', -1)
+ TriggerClientEvent('my_shops:refresh', source)
对于状态或控制流变更:
on(my_shops:buy)
- remove money
+ if count is not a whole number from 1 to 100
+ return false
+ remove money
add item
- 如果大部分内容都是新增的、省略上下文会掩盖归属或顺序,或者用户需要一个可复制的目标结构,请展示完整代码块:
lib.callback.register('my_shops:buy', function(source, shopId, itemName, count)
local shop = type(shopId) == 'string' and shops[shopId]
if not shop then return false end
-- ...
end)
指南
将每个可视化内容放在其支持的简短说明旁边。只保留回答评审者关于此次变更的问题所必需的调用、文件、属性、状态和边界。
你可以使用其中一种,也可以使用多种;不太可能全部用上。请自行判断,避免让评审者应接不暇。
证据
提供变更有效的具体证据。展示变更前后的情况。
截图属于 S 级证据:如果环境已准备就绪且变更涉及视觉效果,应通过浏览器操作 NUI 的开发服务器来截取截图。
基于执行的证据属于 A 级:测试结果、脚本输出、服务端控制台输出。使用伪代码展示现在会失败和通过的确切测试。
合并风险
说明这是单向门还是双向门。双向门可以折返,但单向门不行。容易回滚的 PR 风险较低。涉及破坏性操作或难以撤销的决策的变更属于单向门:例如删除或重命名数据库列、重命名条目(已保存的库存仍保留旧名称)、更改 KVP 键或已保存的 JSON 结构。
影响范围是此 PR 引入的变更可能造成的影响或覆盖范围。请考虑所有可能性。例如,其他资源调用已变更的导出项或监听已重命名的事件、所有玩家的已保存数据、客户端帧耗时、不同分辨率下的 NUI,以及服务端所有者已经设置的 convar。