关于 sap-transport-review
sap-transport-review 为 SAP 传输请求或未激活的工作生成逐对象差异报告,并标记风险,适合开发者、审查者和发布把关流程。它使用服务端统一差异,并明确说明版本覆盖范围及无法比较的元数据对象。
主要功能
- 01逐对象生成统一差异
- 02标记影响与质量风险
- 03区分待处理草稿和已发布版本
- 04识别无法进行源码差异比较的对象
- 05限制大型审查范围
适用场景
- 01激活前审查未激活变更
- 02审查同事的传输请求
- 03整理发布交接或审计记录
- 04查看上次发布后的代码变化
MCP 相关
技能通过 ARC-1 的 SAPTransport 获取传输清单,并用 SAPRead 的差异操作读取对象源码差异。可选使用 SAPContext、SAPDiagnose 和 SAPLint 补充影响及质量检查。
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ arc-mcp/ arc-1 --skill sap-transport-review安装后在 Claude Code 中输入/sap-transport-review确认已加载。
详细介绍
SAP 传输请求 / 变更审查
以可审查报告的形式回答传输请求或你尚未激活的进行中工作“实际改了什么”:逐对象统一差异加风险标记,而不是铺满完整源代码。
它依托两个节省 token 的 ARC-1 基础功能,让审查一个包含 30 个对象的传输请求只需查看少量精简差异,而不必读取 60 份完整源代码:
SAPTransport(action="list", summary=true)— 低成本扫描多个未关闭的传输请求(省略对象列表,保留objectCount),然后再深入查看其中一个请求。SAPRead(action="diff", from=…, to=…)— 服务端逐对象生成统一差异;响应仅包含差异块。
可与 explain-abap-code(深入理解单个对象)和 sap-object-documenter(为软件包编写文档)配合使用。本技能关注差异——两个时间点之间发生了哪些变更——适用于代码审查、工作交接或发布前检查。
选择模式(由谁发起)
| 你是…… | 范围 | 本技能的作用 |
|---|---|---|
| 审查传输请求(资深开发者 / 审批者) | 一个传输请求 ID | 对所有可安全解析的源代码对象进行差异比较,标注版本覆盖范围,并仅在用户提出要求或触发风险时添加影响 / 质量检查。这相当于 Eclipse ADT 3.6 中的“对象变更”选项卡的聊天 / 整个传输请求版本(源代码差异覆盖范围相同)。 |
| 检查近期自己的工作(开发者) | 你可修改的传输请求 | “自上次发布以来我改了什么?”——逐对象比较上次发布版本与当前版本。轻量模式:除非另有要求,否则跳过影响分析 / ATC。 |
如果要盘点系统范围内所有未关闭的传输请求(基础信息:谁有未关闭请求、请求规模、冲突——不包含差异),那是另一项任务 → sap-transport-overview。
智能默认值(静默应用,不要询问)
| 设置 | 默认值 | 理由 |
|---|---|---|
| 传输请求范围 | 当前用户、可修改(status="D") | 关注进行中的工作,而非已发布的历史记录 |
| 先看概览 | 列表查询使用 summary=true | 先低成本扫描,再获取完整对象列表 |
| 差异方向(进行中) | from="active"、to="inactive" | 仅对待处理且尚未激活的源代码有效;无法还原已在未关闭请求中激活的变更 |
| 可比较差异的类型 | PROG、CLAS、INTF、FUNC、FUGR、INCL、DDLS、DCLS、BDEF、SRVD、DDLX、TABL | action="diff" 支持的纯文本源代码类型 |
| 对象差异上限 | 约 40 个 | 超出时汇总数量,并询问要展开哪些对象 |
| 影响分析 | 风险导向审查中,对已变更的 CDS/RAP 对象启用;其他情况需明确选择 | 将额外读取集中在存在依赖风险的对象上 |
| ATC | 需明确选择(+atc)或由明显风险触发;仅限已变更对象 | ATC 会产生工作负载,不得在大型请求中静默扩散 |
输入
用户提供以下其中一项:
- 传输请求 ID(例如
A4HK900123)——审查该请求中的所有内容。 - “我的待处理变更” / “激活前检查”——审查尚未激活的草稿(active → inactive)。
- 对象列表或软件包——审查这些对象的待处理变更。
- 没有具体信息(“改了什么”)——列出用户可修改的传输请求(摘要),并询问要检查哪一个;或者默认检查待处理草稿。
可选项:+impact(哪些对象使用了已变更的 CDS/RAP)、+atc(新的质量检查结果)、Markdown 文件的输出路径。
**范围保护:**如果所选对象中可比较差异的对象超过约 40 个,只显示带 +/- 数量的对象表,并询问要展开哪些对象(或哪项任务)的完整差异。没人会看的审查,不如不做。
第 1 步:确定范围
- 已提供传输 ID →
SAPTransport(action="get", id="<id>")→tasks[].objects[]列表。 - “有哪些变更”/选择一个传输 →
SAPTransport(action="list", summary=true)→ 一份简明表格 (包含id、description、owner、status、objectCount)。展示表格,让用户选择,然后对选中的传输调用get。 - 待处理变更/软件包 → 列出用户操作过的对象(传输的对象列表,或指定软件包中的对象)。仅生成差异本身不需要传输 ID。
第 2 步:规范化 CTS 条目,然后分类
SAPTransport get 返回的是 CTS 标识,不保证能直接作为 SAPRead 的输入。每个条目都包含
pgmid、CTS type、name 和 wbtype;实际传输中还可能包含子对象,例如
LIMU/METH、LIMU/REPS、语言条目,以及软件包/元数据条目。
生成差异前:
- 展开
tasks[].objects[],但保留任务 ID 和原始 CTS 键以供报告使用。 - 将受支持的
R3TR条目(R3TR/CLAS、R3TR/DDLS,……)视为直接的仓库对象,并对完全重复的条目去重。 - 绝不要将
pgmid(LIMU、LANG)、CTS 子类型(METH、REPS)或wbtype(CLAS/OM、PROG/I,……)传给SAPRead(type=…)。 - 仅当父对象明确无误时,才将子对象归并到直接父对象。如果响应中只包含子对象,应报告为
parent resolution unavailable,不要猜测类/包含文件名。这是覆盖范围的限制,并不表示没有变更。 - 同时统计原始 CTS 条目数和去重后解析出的仓库对象数;不要将条目数当作唯一对象数报告。
然后将解析出的仓库对象分为:
- 可生成差异的对象(上述源代码类型)→ 在第 3 步为这些对象生成真实差异。
- 仅含元数据的对象(SRVB、G4BA、SUSH、DOMA、DTEL、MSAG、VIEW、ENHO、AUTH、DEVC、由服务端驱动的类型,……)→
action="diff"会返回“not supported”(其读取结果是解析后的元数据/XML,而不是纯文本源代码)。 这正是 SAP 自带的 Eclipse ADT 3.6“Object Changes”功能的适用范围——对于这些相同的类型(例如 SRVB),它会显示 "Feature not supported for object …"。不要尝试为它们生成差异。 如需进行全面审查,仍应读取对象的元数据(例如SAPRead(type="SRVB", name=…)),以便在报告中说明对象的类型以及它包含在变更集中的事实——但不提供源代码差异。
第 3 步:对每个对象进行差异比较——按意图选择 from/to
并行运行以下操作(每项仅返回代码块):
SAPRead(type="<type>", name="<name>", action="diff", from="<from>", to="<to>")
根据用户正在审查的内容选择两侧:
| 意图 | from → to | 备注 |
|---|---|---|
| 待处理草稿(“我即将激活的内容”) | active → inactive | 精确的待处理源代码差异。没有草稿表示“没有待处理源代码”,而不是“打开的传输没有做任何更改”。 |
| 自最新已发布快照以来 | <latest released revision id> → active(如果仍是草稿,则为 inactive) | 捕获自该版本发布以来的所有更改;可能合并多个未关闭请求,必须明确标注。应确认版本顺序/时间戳,不要仅凭信息流顺序推断。 |
| 已发布传输(“此 TR 做了哪些更改”) | <revision immediately before TR> → <revision tagged with TR> | 比较该传输自身发布的快照,而不是今天的 active 源代码。如果匹配的快照/前置版本不明确或不存在,应报告基线缺失。 |
| 指定版本 | <id|uri> → <id|uri|active> | 从 VERSIONS 响应中获取。 |
快照稀疏性的现实情况(重要): ABAP 仅在传输发布时才截取版本快照。因此,对于未关闭/未发布的传输,对象通常只有活动版本(以及可能存在的非活动草稿)——没有可用于差异比较的“之前”版本。应如实处理:
- 对每个已解析对象,在支持的情况下查询
SAPRead(type="VERSIONS", name=…, objectType=…)。 - 对于已发布请求,找到标记了该请求的版本及其直接前置版本。若无法确定其中任一项,不要用当前的
active源代码替代旧传输。 - 对于未关闭请求,仅使用
active→inactive比较待处理部分。将之前发布的版本与active进行比较也很有用,但应标注为“自已发布快照以来”,因为其中可能包含其他未关闭请求。 - 如果没有非活动差异,也没有可信的快照组合,则报告
baseline unavailable。除非独立对象元数据证明该对象是在此请求中创建的,否则不要将其称为新增对象。
报告必须说明其覆盖范围:pending draft、released snapshot、since released snapshot (may span requests) 或 baseline unavailable。
第 4 步(可选):影响分析 + 质量检查——仅在用户要求或更改存在风险时执行
- 影响分析(更改
DDLS/BDEF/SRVD可能会影响使用方):SAPContext(action="impact", type="DDLS", name="<view>")→ 投影视图、BDEF、服务定义/绑定,以及依赖它的 ABAP 使用方。 - 质量检查:用户要求
+atc,或风险情况需要时,仅针对范围明确的更改集运行SAPDiagnose(action="atc", ...)。使用SAPLint(action="lint", name=…)进行成本较低的本地检查。 - 发布前有效性检查:对未激活的工作使用只读的
SAPDiagnose action="syntax"检查。SAPActivate会修改系统状态;仅在用户明确要求激活时运行。
第 5 步:撰写报告
# Change review — <transport id or "pending drafts"> on <SID>
_<owner> · <status> · <description>_
_Coverage: <pending draft | released snapshot | since released snapshot | baseline unavailable>_
## Summary
| Object | Type | Change | +/− | Flags |
|---|---|---|---|---|
| ZCL_ORDER | CLAS | changed | +12 −3 | |
| ZI_ORDER | DDLS | changed | +4 −0 | impacts 3 consumers |
| ZNEW_REPORT | PROG | unknown | — | baseline unavailable |
| ZSTATUS | DOMA | changed | — | metadata — no source diff |
| <CTS subobject> | LIMU/METH | unresolved | — | parent resolution unavailable |
## Diffs
### ZCL_ORDER (CLAS) active → inactive (+12 −3)
```diff
<the unified-diff hunks from SAPRead action="diff">
…每个可进行差异比较的对象单独成块…
风险标记
- ⚠ ZI_ORDER(DDLS)有 3 个下游使用方——重新激活顺序很重要(参见影响分析)。
- ⚠ ZCL_BP 出现在两个明确展开的请求清单中;当前锁持有者为 A4HK900123。
- ⚠ A4HK900123 没有目标——这是本地请求,无法继续导入。
结论
<用 2–3 行说明这组更改的作用、应优先审查的内容,以及风险或尚未激活的内容。>
Write to disk (default `docs/reviews/transport-<id>-<date>.md`) only if asked; otherwise return inline.
## Error Handling
| Error | Cause | Fix |
|---|---|---|
| `action="diff"` → "not supported for type X" | Metadata type (DOMA/DTEL/MSAG/SRVB/VIEW/…) | Expected — list it as "metadata — no source diff", don't diff |
| "No differences between active and inactive" | No unactivated draft for that object | Report "no pending source"; do not infer that the open request made no activated changes |
| "Revision-id diff is not available for type X" | FUGR/DDLX have no revisions feed | Use `active`/`inactive` or a full `/sap/bc/adt/` URI instead of a bare id |
| VERSIONS returns 1 revision | Snapshot only cut on release (sparsity) | Use active→inactive only for a real pending draft; otherwise report `baseline unavailable` |
| Transport entry is `LIMU/*`, `LANG/*`, or only has a slash `wbtype` | CTS identity is not a `SAPRead` type | Fold into an unambiguous parent entry or report `parent resolution unavailable`; never guess |
| Transport `get` 404 | Wrong id / already deleted | Re-list with `summary=true` and confirm the id |
| >40 objects in scope | Review too large to read | Show the `+/-` table, ask which task/objects to expand |
## When to use this skill
- Pre-release / pre-activation gate — "show me everything I'm about to ship."
- Code review of a colleague's transport without leaving the chat — the headless / pasteable / whole-transport-at-once counterpart to Eclipse ADT 3.6's "Object Changes" tab (same per-object diffs, same coverage boundary).
- Hand-off / audit — a written delta of a change set.
- "What changed after my last request / since my last release?" (since-last-release mode).
- "I've been editing for an hour — what have I actually changed?" (pending-drafts mode).
## When NOT to use this skill
- **System-wide inventory of every open transport** (basis: who has what open, sizes, conflicts — no diffs) → [sap-transport-overview](../sap-transport-overview/SKILL.md). This skill is depth-on-one-transport; that one is breadth-across-the-system.
- **Understanding one object deeply** → [explain-abap-code](../explain-abap-code/SKILL.md).
- **Documenting a whole package** (not a delta) → [sap-object-documenter](../sap-object-documenter/SKILL.md).
- **Across multiple systems** (DEV vs QAS source compare) → out of scope here: ARC-1 binds to one system
per instance. Do a cross-system review by running the ARC-1 CLI against each system (`arc1-cli call
SAPRead … --url <sys>`) and diffing the two outputs — a separate orchestration, not this skill.
## Follow-up Options
- "Activate / release this once it looks right?" → `SAPActivate`, then `SAPTransport(action="release")`.
- "Who breaks if I change this CDS?" → `SAPContext(action="impact")` (or re-run with `+impact`).
- "Document these objects properly?" → [sap-object-documenter](../sap-object-documenter/SKILL.md).
- "Clean-core readiness of the changed objects?" → [sap-clean-core-atc](../sap-clean-core-atc/SKILL.md).