# Spec: 修复 include 类型的 ADT URI 端点 ## 问题描述 `download --type include` 在 NW 7.40 上失败,返回"对象不存在"。 ## 根因分析 `types.py` 中 INCLUDE 的 URI 模板复用了 REPORT 的端点: - 当前(错误):`/sap/bc/adt/programs/programs/{name}` - 正确端点:`/sap/bc/adt/programs/includes/{name}` NW 7.40 ADT 对 include 和 report 使用不同的 REST 端点: - report → `/sap/bc/adt/programs/programs/{name}` - include → `/sap/bc/adt/programs/includes/{name}` ## 已验证的正确端点 | 用途 | URI | |------|-----| | metadata (object_exists) | `GET /sap/bc/adt/programs/includes/{name}` Accept: `application/vnd.sap.adt.programs.includes.v2+xml` | | source (get_source) | `GET /sap/bc/adt/programs/includes/{name}/source/main` Accept: `text/plain` | ## 修改范围 ### 文件 1: `sapcli/types.py` (第 130-137 行) 修改前: ```python INCLUDE = _register(ObjectTypeConfig( key="include", label="Include程序(INCLUDE)", obj_uri_template="/sap/bc/adt/programs/programs/{name}", src_uri_template="/sap/bc/adt/programs/programs/{name}/source/main", collection_uri="/sap/bc/adt/programs/programs", create_content_type="application/vnd.sap.adt.programs.v2+xml", )) ``` 修改后: ```python INCLUDE = _register(ObjectTypeConfig( key="include", label="Include程序(INCLUDE)", obj_uri_template="/sap/bc/adt/programs/includes/{name}", src_uri_template="/sap/bc/adt/programs/includes/{name}/source/main", collection_uri="/sap/bc/adt/programs/includes", create_content_type="application/vnd.sap.adt.programs.includes.v2+xml", )) ``` ### 文件 2: `sapcli/client/_base.py` (object_exists 方法) 当前 `object_exists` 使用 `Accept: */*`,对于 include 端点可能需要特定的 Accept header。但根据测试,`*/*` 也能返回 200,所以这个方法可能不需要修改。如果 object_exists 对 include 返回 406,需要改为使用 `application/vnd.sap.adt.programs.includes.v2+xml`。 ### 文件 3: `sapcli/commands/crud.py` `cmd_download` 和 `cmd_sync` 中有硬编码检查: ```python if parsed.src_uri is None: print(f"\n ✗ {type_label}没有源代码,不支持 download 操作") print(f" functiongroup 是函数模块的容器,不包含可编辑的源代码文件") ``` 第二行错误提示只适用于 functiongroup,include 走不到这个分支(因为 src_uri 不是 None),所以不需要修改。 ## 验证标准 修改后,以下命令必须能正常工作: ```bash # 1. 下载 include 源代码 python main.py download --name LZIDT_MCP_TOOLU04 --type include --path /tmp/test # 2. 下载各种 include python main.py download --name LZIDT_MCP_TOOLTOP --type include --path /tmp/test python main.py download --name LZIDT_MCP_TOOLF01 --type include --path /tmp/test # 3. 确认原有 report 类型不受影响 python main.py download --name ZIDT_MCP_LOG --type report --path /tmp/test ``` ## 测试 运行现有测试确保无回归: ```bash python -m pytest tests/ -v ``` ## 约束 - 只修改 `sapcli/types.py` 中的 INCLUDE 配置(4 个 URI 字段) - 不修改 `_base.py`、`_source.py` 或其他文件的通用逻辑 - 不引入新的依赖