mcpField
S
sap-transport-review

sap-transport-review

github.com/arc-mcp测试与质量239237 次安装2 天前更新
代码仓库

关于 sap-transport-review

sap-transport-review 为 SAP 传输请求或未激活的工作生成逐对象差异报告,并标记风险,适合开发者、审查者和发布把关流程。它使用服务端统一差异,并明确说明版本覆盖范围及无法比较的元数据对象。

主要功能

  1. 01逐对象生成统一差异
  2. 02标记影响与质量风险
  3. 03区分待处理草稿和已发布版本
  4. 04识别无法进行源码差异比较的对象
  5. 05限制大型审查范围

适用场景

  1. 01激活前审查未激活变更
  2. 02审查同事的传输请求
  3. 03整理发布交接或审计记录
  4. 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、TABLaction="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、语言条目,以及软件包/元数据条目。

生成差异前:

  1. 展开 tasks[].objects[],但保留任务 ID 和原始 CTS 键以供报告使用。
  2. 将受支持的 R3TR 条目(R3TR/CLAS、R3TR/DDLS,……)视为直接的仓库对象,并对完全重复的条目去重。
  3. 绝不要将 pgmid(LIMU、LANG)、CTS 子类型(METH、REPS)或 wbtype(CLAS/OM、 PROG/I,……)传给 SAPRead(type=…)。
  4. 仅当父对象明确无误时,才将子对象归并到直接父对象。如果响应中只包含子对象,应报告为 parent resolution unavailable,不要猜测类/包含文件名。这是覆盖范围的限制,并不表示没有变更。
  5. 同时统计原始 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 仅在传输发布时才截取版本快照。因此,对于未关闭/未发布的传输,对象通常只有活动版本(以及可能存在的非活动草稿)——没有可用于差异比较的“之前”版本。应如实处理:

  1. 对每个已解析对象,在支持的情况下查询 SAPRead(type="VERSIONS", name=…, objectType=…)。
  2. 对于已发布请求,找到标记了该请求的版本及其直接前置版本。若无法确定其中任一项,不要用当前的 active 源代码替代旧传输。
  3. 对于未关闭请求,仅使用 active → inactive 比较待处理部分。将之前发布的版本与 active 进行比较也很有用,但应标注为“自已发布快照以来”,因为其中可能包含其他未关闭请求。
  4. 如果没有非活动差异,也没有可信的快照组合,则报告 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).

评论

支持 Markdown