关于 sap-migration-dossier
此技能将 ARC-1 迁移分析能力整合为 SAP 迁移规划档案,面向需要评估代码与集成范围的团队。默认提供简明报告,并可按需扩展为文件、图表或人工审核材料。
主要功能
- 01按包、命名空间或对象确定范围
- 02汇总对象清单与迁移信号
- 03分析 ATC 与 Clean Core 风险
- 04按需评估集成技术等级
- 05标注证据缺口并建议后续步骤
适用场景
- 01为 SAP 包或命名空间制定迁移规划
- 02识别高风险对象与可能退役的代码
- 03评估 RFC、IDoc 或 OData 集成状况
MCP 相关
该技能使用 ARC-1 检查 SAP 对象并收集证据;可用时使用 SAP Docs MCP 补充 API 状态、替代 API 与迁移指导。
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ arc-mcp/ arc-1 --skill sap-migration-dossier安装后在 Claude Code 中输入/sap-migration-dossier确认已加载。
附带文件agents/openai.yamlreferences/auditor-patterns.md
详细介绍
SAP 迁移档案
构建迁移规划产物,而不是针对单个对象的修复工作流。使用此技能将现有 ARC-1 迁移技能整合为一份范围明确的档案,便于快速启动,并且只有在用户提出要求时才进一步正式化。
默认提供简洁的聊天报告。可将文件、审查卡片、HTML、CSV/JSON 和图表作为后续可选项;不要一开始就让用户设计报告系统。
仅当用户要求持久化产物、人工审查、导入的提取数据、深入提取 ECC 增强项、完整性哈希、HTML 仪表板或图形输出时,才阅读 references/auditor-patterns.md。
如有可用的 SAP Docs MCP,请使用,尤其是针对 Clean Core/API 状态、后继 API、特定版本的语法和迁移指南。如果未连接 SAP Docs MCP,仍使用 ARC-1 证据运行档案,并将 "SAP Docs MCP unavailable" 列为证据缺口。
默认流程
如果范围明确,立即开始:
- 确定范围。
- 包:
SAPRead(type="DEVC", name="<package>") - 前缀/命名空间:针对相关类型调用
SAPSearch(PROG、CLAS、FUGR、FUNC、DDLS、BDEF、SRVD、TABL) - 对象列表:使用
SAPSearch消除名称歧义 - 本地提取数据:解析文件,并说明证据是导入的,而非来自实时 ARC-1
- 包:
- 构建精简清单:对象、类型、包、描述、可用时的代码行数,以及可用时的最后更改时间/版本。
- 添加迁移信号:
- ATC:
SAPDiagnose(action="atc", type="<type>", name="<name>") - Clean Core/API 风险:复用
sap-clean-core-atc逻辑 - SAP Docs MCP:使用
sap_get_object_details补充 SAP API 参考;使用search/fetch查询最主要的 ATC 主题或替换指南 - 使用情况/退役:仅当 SCMON/SUSG 数据可用时,复用
sap-unused-code - 依赖项/使用位置:使用
SAPContext或SAPNavigate(action="references")
- ATC:
- 返回简洁报告,包含:
- 统计摘要
- 风险最高的对象
- 可能退役的候选对象
- 标准修改/增强热点
- 主要 ATC/Clean Core 主题
- 明确的证据缺口
- 建议的后续操作
仅在必要时提问:
- 如果未提供范围,请询问包、命名空间/前缀或对象列表。
- 如果范围过大,请询问是否缩小范围或保存为基于文件的档案。
- 如果用户需要面向客户的决策,请询问是否采用人工审查流程。
集成接口(Clean Core 集成)
当用户询问接口、集成、RFC/IDoc/OData、“clean core integration”或哪些接口会阻碍迁移到云端时,运行本节。否则跳过——默认流程仍聚焦于自定义代码。
这与 sap-clean-core-atc 衡量的是不同维度。该技能评估可扩展性(SAP Note
3578329,即代码调用了哪些 API)。本节评估集成技术(SAP Note 3690029,即系统如何与此系统通信)。两者使用相同的 A–D 字母,但维度不同——SAP 的原文表述是,集成说明“补充了可扩展性指南,但与之并不重叠”。
先确定范围
复用默认流程中确定的范围——不要硬编码 Z%。根据用户实际提出的范围构建名称筛选条件:其前缀(Z*、Y*)、已注册的命名空间(/NS/*)、对象列表,或包对应的 TADIR.DEVCLASS。仅使用 Z% 的筛选条件会悄然排除 Y* 和所有命名空间对象。
EDIPO* 表(IDoc 端口)、EDP13(伙伴配置文件)和 RFCDES(目标)属于系统范围的配置——它们没有包或命名空间可供限定范围。读取这些表之前先征求用户同意,并将其作为系统全景背景信息报告,而非限定范围内的清单内容;如果用户拒绝提供深入证据,则完全跳过这些表。
证据(只读)
默认使用 SAPRead(type="TABLE_QUERY")——采用 data 范围和结构化的 where,不使用用户编写的 SQL。
始终传入 columns:省略该参数会执行 SELECT *,从配置表中提取档案没有必要读取的字段。
| 查询内容 | 调用 | columns |
|---|---|---|
| 范围内的接口对象 | TADIR,使用 where 条件 PGMID = R3TR + OBJECT IN (…) + 范围筛选 | OBJECT, OBJ_NAME, DEVCLASS |
| 启用 RFC 的自定义 FM | TFDIR,使用 where 条件 FMODE = 'R' + 范围筛选(见下文) | FUNCNAME, PNAME |
| 自定义 IDoc 基本类型 | EDBAS,按 IDOCTYP 筛选范围 | IDOCTYP, RELEASED |
| IDoc → 端口绑定 | EDP13(出站合作伙伴配置文件) | MESTYP, IDOCTYP, RCVPOR |
| 每个端口的端口类型 | EDIPORT — 包含所有端口类型的汇总表;PORTTYP 是域 EDI_PORTYP | PORT, PORTTYP |
| XML-HTTP 端口对应的目标 | EDIPOXH(LOGDES 指定目标) | PORT, LOGDES |
| 出站目标 | RFCDES — 参见下方的 RFCTYPE 代码 | 仅 RFCDEST, RFCTYPE |
| 发布契约状态 | SAPRead(type="API_STATE", name="<obj>", objectType="<type>") | — |
切勿选择 RFCDES.RFCOPTIONS 或 RFCOPTION1…RFCOPTIONV。这些字段存放包含登录数据的打包连接字符串;档案只需要目标名称和类型,别无其他。
OBJECT IN (…) 列表为 IWPR IWSV IWSG IWMO SRVD SRVB EVTB EVTO IDOC SICF HTTP。
代码表(从系统自身的域中读取,而非使用硬编码假设):
EDIPORT.PORTTYP(域 EDI_PORTYP) | RFCDES.RFCTYPE |
|---|---|
0 CPI-C · 1 transactional RFC · 2 SAPcomm | 3 RFC to ABAP system (TCP/IP) · W RFC via WebSockets |
3 File · 6 XML File | H HTTP to ABAP system · G HTTP to external server |
4 Internet · 5 ABAP programming interface · 7 XML HTTP | T external program · I same-database · L reference · A application |
不要将 H 视为唯一的 HTTP 目标 — 与非 SAP 端点集成的出站连接类型为 G,这正是这里最重要的情况。
每个前缀执行一次查询。 TABLE_QUERY 会对每个 where 条目执行 AND 逻辑,因此,同一字段上的两个 LIKE 条件不会匹配任何内容 — 分别运行 Z%、Y% 和每个命名空间的查询,然后在客户端合并。结果上限为 10,000 行:如果某个分区恰好返回 10,000 行,必须报告为已截断,而不能视为完整。类型统计是对已获取行数的计数。
TFDIR 的范围限定。 函数模块名称不包含其包信息,因此 FUNCNAME LIKE 仅适用于名称前缀范围。对于包档案,应先解析该包的 FUGR 对象,再根据这些对象匹配 TFDIR.PNAME,然后检查 FMODE。正确构造程序名称:命名空间必须放在最前面,因此函数组 /NS/FOO 的主程序是 /NS/SAPLFOO — 而不是 SAPL/NS/FOO。只有非命名空间函数组 ZFOO 对应 SAPLZFOO。若顺序弄反,所有命名空间函数组都会静默返回零行。
只有当用户选择了深度证据且启用了自由 SQL 时,SAPQuery 才能通过一条分组语句完成统计:SELECT object, COUNT( * ) AS cnt FROM tadir WHERE pgmid = 'R3TR' AND obj_name LIKE 'Z%' GROUP BY object ORDER BY cnt DESCENDING — 将 'Z%' 替换为解析出的范围。这只是优化,并非必要条件。
这两个开关相互独立,彼此都不代表对方 — SAPQuery 需要 sql 范围和 SAP_ALLOW_FREE_SQL(未启用时甚至不会注册该工具);TABLE_QUERY 需要 data 范围和 SAP_ALLOW_DATA_PREVIEW。有些实例启用了自由 SQL 但未启用数据预览,反之亦然。
如果两者都不可用,则没有基于表的替代方案:tadir_lookup 无济于事,因为 source="db"/"both" 本身会提升至 sql 范围,而且它解析的是确切名称,而非按类型发现对象。应改为:对范围内的每个包调用 SAPRead(type="DEVC"),并按类型执行普通的 SAPSearch 对象搜索;两者均尽力而为 — 然后将 TADIR 统计、旧版 SEGW 类型以及所有 RFC/IDoc/目标覆盖标记为不可用。不要猜测。
有一个容易踩坑的地方:SAPRead(type="DEVC") 不包含旧版 SEGW 类型,因此这些类型要用 TADIR(或 tadir_lookup,它需要 sql 范围和精确名称)。此外,支持的合约因对象类型而异(SRVD 仅公开 C0),所以绝不能报告一个适用于整个系统的“C2 共享等级”。
等级(SAP Note 3690029)
以下内容精简至 ABAP 系统可公开的信息。该说明还涵盖 BW 提取器、SLT、Delta Share 和数据产品——这些超出 ARC-1 的能力范围,因此应将其列为证据缺口,而不是省略。
| 技术 | 等级 | ARC-1 证据 |
|---|---|---|
| 通过 RAP 实现的事件传输(AMQP/MQTT) | A | TADIR EVTB / EVTO;SAPRead(type="EVTB") |
| 通过 RAP 服务绑定实现的 OData;通过服务绑定实现的 CDS | A | TADIR SRVB + SRVD |
| HTTP(S) | A | TADIR SICF / HTTP(自定义 ICF 节点) |
| 通过 SOA Manager 实现的 Web 服务 | A | ADT 不可见 — 在 SOAMANAGER 中确认 |
| 通过 SAP Gateway Service Builder(SEGW)实现的 OData | B | TADIR IWPR IWSV IWSG IWMO |
| 通过 RFC 实现的 BAPI;RFC(CPI-C);WebSocket RFC | B | TFDIR.FMODE = 'R';RFCDES.RFCTYPE = '3' |
| 通过 HTTPS 实现的 IDoc | B | EDP13 → EDIPORT.PORTTYP = 7 且确认其目标上的 TLS |
| 通过 RFC 实现的 IDoc | C | EDP13 → EDIPORT.PORTTYP = 1 |
| 通过 XI 实现的 ABAP 代理 | C | 此处未涵盖 — 没有 ADT 证据;检查 SPROXY / SXMB 配置 |
| 平面文件 | D | 使用 SAPSearch(searchType="source_code") 搜索 OPEN DATASET |
| FTP | D | 使用 source_code 搜索 FTP_CONNECT / FTP_COMMAND |
| SFTP、JDBC/ODBC | D | 无法通过 ABAP 检测 — 需要外部工具;应询问,不要推断 |
| RFC(ODP) | 禁止 | API 策略禁止(SAP Note 3255746)— 发现时应标记 |
IDoc 等级取决于端口,而端口又取决于伙伴配置文件。 EDBAS 列出基本类型,EDIPORT 列出端口,但两者之间没有关联 — 出站伙伴配置文件(EDP13)包含将消息/基本类型绑定到接收方端口的 RCVPOR。应从 EDIPORT.PORTTYP 读取类型,而不是从 EDIPO.PORTTYP 读取(在一个具有正常工作端口的实时系统中,该字段经验证为空),也不要猜测存储该行的是哪个 EDIPO* 表 — EDIPOF 是 ABAP 编程接口,不是文件端口。若没有完整的 EDP13 → EDIPORT 连接查询,应将 IDoc 报告为 B/C 未确定;绝不能将其计入某个等级。
PORTTYP = 7 能证明 XML-over-HTTP,不能证明 HTTPS。该端口只指定一个目标(EDIPOXH.LOGDES);TLS 在该目标上配置 — 通常是 RFCTYPE = 'G' 条目 — 其 SSL 设置存储在此技能拒绝读取的 RFCDES 连接数据块中。因此,应将 XML-HTTP 端口视为 候选 Level B,并请用户在 SM59 中确认该目标的 SSL。不要从端口推断 TLS,也不要解析 RFCOPTIONS 来查明。
source_code 搜索需要 SAP_BASIS 7.51+。在较旧的 ECC 系统上,该功能不可用,因此在那里得到干净的 Level-D 结果意味着“未搜索”,而不是“未发现” — 应将其记录为证据缺口。
该说明对技术评级,并指出具体场景的等级取决于用例。报告的等级应是 SAP 对该技术给出的默认等级,而不是对接口的判定。
输出
统计接口,而不是制品。 一个集成通常由多个对象组成:RAP 服务是一个
SRVD 和 一个 SRVB;IDoc 场景是一个基本类型 和 一个伙伴配置文件 和 一个端口;RFC
接口是一个函数模块 以及 可能还包含一个目标。将每个集成归并为一条接口记录 — { id, technology, level, evidence[] } — 并按这些记录统计各级别的分布。原始制品数量应单独报告并明确标注;切勿将二者相加。
然后补充:集成技术级别分布(每个级别的接口记录数量)、按 B→A 和 C→B 排序的现代化候选项,以及任何 Forbidden 命中项。不要将该分布称为升级稳定性指标 — Note 3690029 特意将升级稳定性排除在级别模型之外,因为它取决于底层 ABAP 对象的发布状态。请根据 API_STATE 和 Business Accelerator Hub 单独报告该状态。常见发现是并存的 SEGW/Gateway V2(B)与 RAP V4(A)— 将这些交给 migrate-segw-to-rap。另一个标准迁移方向是 IDoc via RFC(C)→ RAP 业务事件(A)。
何时升级处理
仅在用户提出要求,或范围大到不适合在聊天中输出时,才使用可选模式。
| 用户要求 | 执行操作 |
|---|---|
| “保存”、“分享”、“档案”、“客户报告” | 在 docs/migration-dossiers/<scope>/<date>/ 中创建 report.md,并可选创建 inventory.csv |
| “HTML”、“PDF”、“仪表板” | 生成独立的 report.html;说明可以将其打印为 PDF |
| “已审核”、“顾问验证”、“非纯 AI” | 创建草稿卡片,并且仅在最终报告中纳入已验证或已更正的卡片 |
| “图表”、“可视化”、“依赖关系图” | 为高风险或高扇出对象生成范围受限的 Mermaid 图 |
| “深度 ECC”、“用户出口”、“BAdI”、“标准修改” | 使用 references/auditor-patterns.md 中的深度证据;仅在允许时使用 SAPQuery |
| “接口”、“集成”、“RFC/IDoc/OData 清单”、“clean core 集成” | 运行“集成接口”部分 |
| “后继 API”、“已发布 API”、“有什么替代方案” | 使用 SAP Docs MCP sap_get_object_details,然后视需要使用 search/fetch 查找指导 |
| “此语法能在版本 X 上运行吗” | 使用 SAP Docs MCP abap_feature_matrix,并结合正确的 ABAP 风格进行 search |
| “修复这个” | 对选定发现切换到 migrate-custom-code;此技能不应批量修复 |
输出形式
聊天输出应保持简短:
Migration Dossier - <scope>
Scope: <n> objects, <types>, <packages>
Evidence: ATC=<variant/default>, docs=<SAP Docs MCP/unavailable>, usage=<SCMON/SUSG/unavailable>, clean-core=<source>, dependencies=<source>
Summary:
- <1-3 lines>
Priority objects:
| Object | Why it matters | Suggested action |
Retirement candidates:
| Object | Evidence | Caveat |
Main risks:
- <ATC/Clean Core/standard modification themes>
Evidence gaps:
- <missing usage data, skipped objects, dynamic calls, unavailable variants>
Next step:
- <one recommendation>
文件输出应尽量使用精简的默认制品集:
docs/migration-dossiers/<scope>/<date>/
report.md
inventory.csv
methodology.md
仅在用户要求时添加 report.html、cards.jsonl、reviews.jsonl、graph.mmd 或 dashboard.html。
审核规则
仅对面向客户或可作为决策依据的报告设置人工审核关卡。
状态:
ai_draft | validated | corrected | skipped | ai_error
分类:
REMOVE | KEEP | ADAPT | COVERED_BY_STANDARD | UNDETERMINED
以下内容应与决策分开:
extensibilityLevel: A | B | C | D | unknown # Note 3578329 — which SAP APIs the code calls
integrationLevel: A | B | C | D | FORBIDDEN | indeterminate # Note 3690029 — interface technology
usageStatus: USED | LIKELY_UNUSED | UNUSED | INDETERMINATE
这两个级别是独立的维度,绝不能合并为单一的 cleanCoreLevel。大多数卡片只包含其中一个:代码对象使用 extensibilityLevel,接口记录使用 integrationLevel。如果无法解析 IDoc 的端口,正确的值是 indeterminate — 不要将其四舍五入为 B 或 C。
最终审核报告必须排除 ai_draft 卡片,除非明确标注为草稿。
安全
- 不要运行无范围限制的系统级提取。
- 除非已启用自由 SQL 且用户选择了深度证据,否则不要使用
SAPQuery。 - 如果对象位于
$TMP中或 ATC 跳过了它,不要因 ATC 结果为零就判定其干净。 - 不要通过此技能删除、更新、激活或传输对象。
- 除非明确标注为草稿,否则不要将纯 AI 评估作为最终决策发布。
- 明确说明证据缺口,不要用假设填补。