方向反转:此前 SKILL.md 是「模板渲染产物」、sap-cli 是源;现 sap-cli 归档, sap-cli-skill 承接开发与分发,SKILL.md 回归手工维护的正本。 迁移(来自 sap-cli,共 104 文件): - tests/ 692 例测试(15 个文件的内联 sys.path 改指 assets/) - openspec/ SDD 规格与归档变更(42 文件) - docs/ 开发文档与 ADT 原理(含 dev/CLAUDE.md、AGENTS.md) - .claude/ rules 副本 + settings.json(供 Claude Code) - .github/ .hermes/ .pre-commit-config.yaml .editorconfig CLAUDE.md - scripts/ 保持仅 setup.py(pack_skill.py 已随旧仓归档,不迁) 修复(迁移暴露的真实缺陷): - assets/pyproject.toml 的 build-backend 写作 `setuptools.backends._legacy:_Backend`, 该模块在 setuptools 中不存在 → `pip install -e` 从来装不上。改为 build_meta。 实测:临时 venv 安装成功,sap-cli --help 正常列出 31 个命令 - pyproject readme 指向不存在的 assets/README.md(editable 安装会失败)→ 改内联文本 - pyproject urls 改指 sap-cli-skill 机制调整: - .github/workflows/ci.yml 适配 assets/ 布局;顶部注明该工作流仅 GitHub 执行, 本仓在 Gitee 不会自动跑 - pre-commit 增本地测试门禁(Gitee 上真正生效的那道) - .gitignore 合并旧仓完整规则(保留 log/ 下 md 知识库入库,只忽略运行日志) - 大文件上限 100KB→1MB(架构图 512KB) 守卫测试 tests/unit/test_repo_guards.py(10 → 18 例): - SKILL.md 须记录 parser 全部 CLI 命令 / 铁律 1-5 须为真实小节标题 / 示例不得违反铁律 5 - references/ 规则齐备;.claude/rules 与 references 必须一致(实测抓到一次真实漂移) - VERSION == sapcli.__version__ == README 版本 - 仓内不得再出现 pack_skill.py / skill-src(防废弃流程回潮) 698 tests OK;editable 安装与 CLI 入口经临时 venv 实测通过。 docs/RELEASING.md 重写为单源开发流程。
17 KiB
sap-cli 功能扩展分析报告
项目: sap-cli — 用你喜欢的编辑器写 ABAP
版本: 当前 (v1.0)
编制日期: 2026-06-09
定位: 基于 SAP ADT REST API 的命令行 ABAP 开发工具
一、现有功能全景
1.1 已实现的 7 个命令
| 命令 | 功能 | 适用对象 |
|---|---|---|
download |
从 SAP 下载源码到本地 .abap 文件 | report / class / interface / function / domain / dataelement / table / structure |
sync |
本地代码 → SAP(锁定→写入→解锁→语法检查→激活) | 同上 |
create |
在 SAP 创建开发对象(支持模板和 JSON 定义) | 10 种类型(含 functiongroup、tabletype) |
info |
查询对象元数据(名称/类型/状态/负责人/修改时间等) | 10 种类型 |
delete |
从 SAP 系统删除对象(需确认) | 10 种类型 |
init |
扫描本地目录 → 查询 SAP → 生成 manifest.json | 批量 |
refresh |
刷新清单中对象的 SAP 状态 | 批量 |
1.2 已支持的对象类型
ABAP 程序对象(5 种):report、class、interface、function、functiongroup
ABAP 字典对象(5 种):domain、dataelement、table、structure、tabletype
1.3 核心能力
- ✅ 单对象 CRUD 全生命周期
- ✅ 批量同步(基于 manifest.json + 拓扑排序)
- ✅ 传输请求管理(list / create / select)
- ✅ DDIC 对象通过 JSON 定义文件创建
- ✅ 锁定-编辑-解锁-激活完整工作流
- ✅ 语法检查集成
二、功能扩展方向
🔵 方向一:对象类型扩展
2.1.1 ADT 已支持但工具未覆盖的对象类型
| 优先级 | 对象类型 | ADT 端点 | 使用场景 | 实现难度 |
|---|---|---|---|---|
| ⭐⭐⭐ | CDS View (DDL) | /sap/bc/adt/ddic/ddlsources |
S/4HANA 核心开发,CDS View 是现代 ABAP 开发的基础 | 中 |
| ⭐⭐⭐ | CDS Access Control (DCL) | /sap/bc/adt/authorization/dclsources |
CDS 角色权限控制,与 CDS View 配套 | 中 |
| ⭐⭐⭐ | Include 程序 | /sap/bc/adt/programs/programs |
大型报表拆分,复用代码片段 | 低 |
| ⭐⭐ | 消息类 (Message Class) | /sap/bc/adt/messageclasses |
MESSAGE 语句依赖,项目必备 | 低 |
| ⭐⭐ | 数据库视图 (View) | /sap/bc/adt/ddic/views |
数据建模,查询优化 | 中 |
| ⭐⭐ | 搜索帮助 (Search Help) | /sap/bc/adt/ddic/searchhelps |
ALV 屏幕、F4 帮助 | 中 |
| ⭐⭐ | 锁对象 (Lock Object) | /sap/bc/adt/ddic/lockobjects |
并发控制,多用户数据一致性 | 中 |
| ⭐ | 类型组 (Type Pool) | /sap/bc/adt/programs/programs |
常量/类型定义集中管理 | 低 |
| ⭐ | AMDP 类 | 复用 class 端点 | HANA 数据库过程调用 | 低 |
| ⭐ | Web Dynpro 组件 | 专用端点 | 传统 Web UI(逐渐淘汰) | 高 |
实现建议:
- 第一批优先:Include 程序(改动最小,复用现有 report 逻辑)+ CDS View(战略价值最高)
- CDS View 需要新增
cdsview类型,源码是 DDL 语法(非 ABAP),激活流程与 DDIC 类似
2.1.2 tabletype 的完整支持
当前 tabletype 使用 VIT 端点,不支持 download/sync/delete。可以探索:
- 通过 DDIC 专用端点(
/sap/bc/adt/ddic/tabletypes)的源码读写接口 - 或使用 VIT 的 PUT 操作实现间接源码写入
🔵 方向二:代码浏览与搜索
2.2.1 对象列表浏览(list 命令)
python main.py list --type class --prefix ZCL_* --package ZFINANCE
ADT API: GET /sap/bc/adt/repository/informationsystem/search
使用场景:
- 浏览某个包下的所有对象
- 按名称前缀模糊搜索
- 按类型/所有者/修改时间筛选
2.2.2 Where-Used 引用查询
python main.py whereused --name ZCL_MY_CLASS --type class
ADT API: GET /sap/bc/adt/whereused
使用场景:
- 修改前评估影响范围
- 自动填充
manifest.json的depends_on字段(替代手动维护) - 批量同步时自动推导依赖关系
2.2.3 源代码全文搜索
python main.py search --query "SELECT * FROM ZMY_TABLE" --type report
ADT API: GET /sap/bc/adt/repository/informationsystem/search (code search)
使用场景: 快速定位引用特定表/函数/变量的代码位置
🔵 方向三:代码质量与检查
2.3.1 ATC 代码检查集成
python main.py check --name ZMY_REPORT --type report --variant SAP_ABA_CHECK
ADT API: POST /sap/bc/adt/qualitymanager/ats/checkruns
使用场景:
- 同步前自动运行 ATC 检查(替代或补充现有语法检查)
- CI/CD 流水线中的质量门禁
- 支持自定义检查变体
2.3.2 代码格式化(ABAP Pretty Printer)
python main.py format --name ZMY_REPORT --type report
ADT API: POST /sap/bc/adt/prettyprinter
使用场景:
- 下载后自动格式化(统一缩进、大小写风格)
- sync 前自动格式化(保持 SAP 端代码风格一致)
2.3.3 代码差异对比
python main.py diff --name ZMY_REPORT --type report --path ./src/zmy_report.abap
使用场景:
- sync 前预览即将上传的改动
- 显示本地文件与 SAP 端源码的差异
- 防止误覆盖他人的修改
🔵 方向四:传输管理与多系统
2.4.1 传输请求高级管理
python main.py transport list --status D # 查看可修改的传输请求
python main.py transport info DEVK901362 # 查看传输请求详情
python main.py transport release DEVK901362 # 释放传输请求
python main.py transport objects DEVK901362 # 列出传输请求中的所有对象
ADT API:
GET /sap/bc/adt/cts/transportrequests/{id}— 详情POST /sap/bc/adt/cts/transportrequests/{id}?method=release— 释放
使用场景:
- 批量同步后一键释放传输请求
- 在命令行中管理传输请求,无需进入 SAP GUI(SE01/SE09)
2.4.2 多系统配置与跨系统同步
# config.ini
[DEV]
host = http://dev-sap:8000
client = 100
[QAS]
host = http://qas-sap:8000
client = 200
[PRD]
host = http://prd-sap:8000
client = 300
python main.py --profile DEV download --name ZMY_REPORT --type report --path ./src
python main.py --profile QAS info --name ZMY_REPORT --type report
使用场景:
- 开发/测试/生产多环境切换
- 跨系统对象对比(DEV vs QAS 代码差异)
- 一键从 DEV 下载 → 修改 → 推送到 QAS
2.4.3 传输导入监控
python main.py transport import DEVK901362 --target QAS
python main.py transport status DEVK901362
使用场景: 跟踪传输请求在目标系统的导入状态
🔵 方向五:包管理与项目结构
2.5.1 ABAP 包(Package)操作
python main.py package create ZFINANCE --description "财务模块" --superpackage ZBUSINESS
python main.py package list --superpackage ZBUSINESS
python main.py package move --name ZMY_REPORT --type report --package ZFINANCE
ADT API: /sap/bc/adt/packages/{name}
使用场景:
- 项目初始化时自动创建包结构
- 将 $TMP 本地对象迁移到正式包中
2.5.2 项目模板(Scaffolding)
python main.py scaffold --name ZSALES_ORDER --template "ALV Report" --package ZSALES
预置模板:
- ALV 报表 — 包含 ALV GRID、字段目录、布局管理
- BAPI 封装 — 函数组 + 函数模块 + 异常处理
- 接口类 — 接口 + 实现类 + 工厂方法
- 数据模型 — domain + dataelement + table + tabletype + CDS View
- 增强实现 — BAdI 定义 + 实现(如果 ADT 支持)
使用场景: 快速创建符合项目规范的标准代码骨架
2.5.3 依赖自动分析
python main.py analyze --path ./project
功能:
- 解析本地 .abap 文件中的
TYPE REF TO、CALL METHOD、PERFORM等语句 - 自动生成
depends_on关系 - 替代当前手动维护 manifest.json 依赖的方式
- 结合 Where-Used API 交叉验证
🔵 方向六:Git 集成与 DevOps
2.6.1 Git Hooks 集成
# pre-commit hook: sync 前自动语法检查
# post-pull hook: 自动 download 远端最新代码
使用场景:
git commit前自动触发 ATC 检查git pull后自动拉取 SAP 端最新代码git push后自动触发 CI/CD
2.6.2 CI/CD Pipeline 集成
# .gitlab-ci.yml 示例
abap-sync:
stage: deploy
script:
- python main.py sync --all --path ./src --corr_nr $TR_NUMBER --fail-fast
- python main.py check --all --path ./src
使用场景:
- Git 提交后自动同步到 SAP 开发系统
- ATC 检查作为质量门禁
- 传输请求自动创建和释放
2.6.3 代码版本对比(SAP 版本管理集成)
python main.py history --name ZMY_REPORT --type report
python main.py version --name ZMY_REPORT --type report --version 1.2
ADT API: /sap/bc/adt/programs/programs/{name}/versions
使用场景:
- 查看 SAP 端的版本历史
- 对比不同版本之间的代码差异
- 回滚到之前的版本
🔵 方向七:交互体验优化
2.7.1 交互式终端 UI(TUI)
python main.py tui
功能:
2.7.2 全局配置与 Profile
sap-cli config set default_host http://dev-sap:8000
sap-cli config set default_client 100
sap-cli config set auto_format true
sap-cli config set atc_variant SAP_ABA_CHECK
sap-cli config set timeout 30
使用场景:
- 替代手动编辑 config.ini
- 按项目/环境保存不同配置
- 设置全局默认参数(超时、格式化、检查变体等)
2.7.3 Shell 自动补全
eval "$(sap-cli completion bash)"
eval "$(sap-cli completion zsh)"
使用场景: Tab 键自动补全命令、对象类型、对象名
🔵 方向八:AI 与智能化
2.8.1 AI 辅助代码生成
python main.py generate --type report --description "根据销售订单号查询交货明细的ALV报表" --output ./src/zdelivery_detail.abap
使用场景:
- 结合 LLM API(如 Claude/GPT)根据自然语言描述生成 ABAP 代码
- 自动识别所需的表、数据元素、函数模块
- 生成的代码自动通过语法检查
2.8.2 MCP 服务器模式
python main.py mcp-server --port 8080
参考: erpl-adt 已实现 MCP 服务器
使用场景:
- 作为 MCP 工具供 AI 助手(如 Claude Desktop)调用
- AI 可以直接浏览 SAP 对象、下载/同步代码
- 实现"用自然语言修改 SAP 系统"的终极目标
2.8.3 智能代码审查
python main.py review --name ZMY_REPORT --type report --rules performance,security
使用场景:
- 基于规则的静态分析(SQL 注入、性能反模式、命名规范)
- 结合 AI 的代码审查建议
- 自动生成改进建议
🔵 方向九:安全与运维
2.9.1 密码安全存储
python main.py auth login # 交互式输入密码,存入系统 keyring
python main.py auth status # 检查登录状态
python main.py auth logout # 清除凭证
实现方案:
- 使用 keyring 库
- 支持 Windows Credential Manager / macOS Keychain / Linux Secret Service
- 不再明文存储密码
2.9.2 SSL 证书验证
[DEV]
host = https://dev-sap:44300
verify_ssl = true
ca_bundle = /path/to/corp-ca.pem
使用场景:
- 生产环境安全要求
- 企业内网 CA 证书支持
- 当前硬编码
verify=False,存在中间人攻击风险
2.9.3 审计日志
python main.py audit --from 2026-06-01 --to 2026-06-09
使用场景:
- 记录所有 create/sync/delete 操作的审计日志
- 支持按时间/用户/操作类型查询
- 满足企业合规要求
三、扩展优先级矩阵
按照 业务价值 × 实现难度 排序:
| 优先级 | 扩展方向 | 业务价值 | 实现难度 | 建议版本 |
|---|---|---|---|---|
| 🔴 P0 | Include 程序支持 | ⭐⭐⭐ | ⭐ | v1.1 |
| 🔴 P0 | 对象列表浏览 (list) | ⭐⭐⭐ | ⭐⭐ | v1.1 |
| 🔴 P0 | 多系统配置 (profile) | ⭐⭐⭐ | ⭐⭐ | v1.2 |
| 🔴 P0 | 密码安全存储 (keyring) | ⭐⭐⭐ | ⭐ | v1.2 |
| 🟠 P1 | CDS View 支持 | ⭐⭐⭐ | ⭐⭐⭐ | v1.3 |
| 🟠 P1 | Where-Used 引用查询 | ⭐⭐⭐ | ⭐⭐ | v1.3 |
| 🟠 P1 | 代码差异对比 (diff) | ⭐⭐⭐ | ⭐⭐ | v1.3 |
| 🟠 P1 | 传输请求高级管理 | ⭐⭐⭐ | ⭐⭐ | v1.4 |
| 🟠 P1 | ABAP 包操作 | ⭐⭐ | ⭐⭐ | v1.4 |
| 🟡 P2 | ATC 代码检查集成 | ⭐⭐ | ⭐⭐⭐ | v2.0 |
| 🟡 P2 | 代码格式化 (Pretty Printer) | ⭐⭐ | ⭐⭐ | v2.0 |
| 🟡 P2 | 依赖自动分析 | ⭐⭐⭐ | ⭐⭐⭐ | v2.0 |
| 🟡 P2 | 项目模板 (Scaffolding) | ⭐⭐ | ⭐⭐ | v2.0 |
| 🟡 P2 | CI/CD Pipeline 集成 | ⭐⭐⭐ | ⭐⭐ | v2.1 |
| 🟢 P3 | 消息类 / 视图 / 搜索帮助 / 锁对象 | ⭐⭐ | ⭐�� | v2.x |
| 🟢 P3 | 源代码全文搜索 | ⭐⭐ | ⭐⭐ | v2.x |
| 🟢 P3 | SAP 版本管理集成 | ⭐⭐ | ⭐⭐⭐ | v2.x |
| 🟢 P3 | Shell 自动补全 | ⭐ | ⭐ | v2.x |
| 🔵 P4 | 交互式终端 UI (TUI) | ⭐⭐ | ⭐⭐⭐ | v3.0 |
| 🔵 P4 | AI 辅助代码生成 | ⭐⭐⭐ | ⭐⭐⭐ | v3.0 |
| 🔵 P4 | MCP 服务器模式 | ⭐⭐⭐ | ⭐⭐ | v3.0 |
| 🔵 P4 | 智能代码审查 | ⭐⭐ | ⭐⭐⭐ | v3.0 |
四、技术架构建议
4.1 近期架构优化(支持 v1.x 扩展)
sapcli/
├── __init__.py
├── main.py # CLI 入口(拆分 argparse 到独立模块)
├── cli/ # 命令注册与解析(新增)
│ ├── parser.py # argparse 定义
│ ├── completions.py # Shell 补全
│ └── output.py # 格式化输出(替代散落各处的 print)
├── client.py # ADT REST 客户端(保持)
├── commands/ # 按功能拆分命令(新增目录)
│ ├── crud.py # download / sync / create / delete / info
│ ├── batch.py # init / refresh / sync-all
│ ├── transport.py # 传输请求管理(新增)
│ ├── search.py # list / whereused / search(新增)
│ └── check.py # syntax-check / atc(新增)
├── types.py # 对象类型注册(保持)
├── ddic.py # DDIC 定义(保持)
├── manifest.py # 清单管理(保持)
├── scanner.py # 目录扫描(保持)
├── sorter.py # 拓扑排序(保持)
├── config.py # 配置管理(增强多 profile)
├── auth.py # 凭证管理(新增:keyring 集成)
├── exceptions.py # 异常定义(保持)
└── utils/ # 工具函数(新增)
├── xml_utils.py # XML 安全转义、解析
├── diff.py # 代码差异对比
└── format.py # ABAP 格式化
4.2 新增对象类型的标准流程
每次新增一个对象类型,需要修改的文件:
| 步骤 | 文件 | 内容 |
|---|---|---|
| 1 | types.py |
注册 ObjectTypeConfig(URI 模板、content-type) |
| 2 | client.py |
_build_create_body() 新增分支(或数据驱动) |
| 3 | scanner.py |
DIRECTORY_TYPE_MAP 新增目录映射 |
| 4 | commands.py |
特殊逻辑处理(如有) |
| 5 | ddic.py |
如有 XML/DDL 定义需求 |
4.3 建议引入的依赖
| 依赖 | 用途 | 时机 |
|---|---|---|
keyring |
安全凭证存储 | v1.2 |
rich |
终端美化输出(进度条、表格、语法高亮) | v1.3 |
textual |
终端 UI 框架 | v3.0(可选) |
pydantic |
JSON 定义文件验证 | v2.0 |
httpx |
替代 requests(支持 async、超时、重试) | v2.0 |
五、竞品参考
| 项目 | 语言 | 特点 | 值得借鉴 |
|---|---|---|---|
| abap-adt-api | TypeScript | 最全面的 ADT API 封装 | CDS View、AMDP、Where-Used、搜索 |
| erpl-adt | TypeScript | CLI + MCP 服务器 | MCP 协议、对象浏览、AI 集成 |
| abapGit | ABAP | SAP 端 Git 客户端 | 版本管理思想、serialize/deserialize |
六、总结
sap-cli 已经建立了一个坚实的核心:
- 10 种对象类型的完整 CRUD
- 批量同步 + 拓扑排序 + 传输请求管理
- manifest.json 状态驱动的项目管理
最自然、最高价值的扩展路径是:
v1.1 Include + list + 消息类 → 补齐日常开发必需类型
v1.2 多系统 + keyring → 企业级安全与多环境
v1.3 CDS View + Where-Used → S/4HANA 现代化开发
v1.4 传输管理 + 包操作 → 运维与管理能力
v2.0 ATC + diff + 依赖分析 → 代码质量保障
v2.x CI/CD + 模板 + 搜索 → DevOps 集成
v3.0 TUI + AI + MCP → 智能化开发
这个路径从 "能用的工具" 逐步演进到 "不可替代的开发平台",每一步都有明确的用户价值。