Files
吴让宇 c5905a5b1e refactor: 本仓升为唯一源(原 sap-cli 源码仓归档)
方向反转:此前 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 重写为单源开发流程。
2026-09-11 00:40:15 +08:00

531 lines
17 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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 GUISE01/SE09
#### 2.4.2 多系统配置与跨系统同步
```ini
# 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 集成
```bash
# pre-commit hook: sync 前自动语法检查
# post-pull hook: 自动 download 远端最新代码
```
**使用场景**:
- `git commit` 前自动触发 ATC 检查
- `git pull` 后自动拉取 SAP 端最新代码
- `git push` 后自动触发 CI/CD
#### 2.6.2 CI/CD Pipeline 集成
```yaml
# .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 交互式终端 UITUI
```
python main.py tui
```
**功能**:
- 基于 [Textual](https://github.com/Textualize/textual) 或 [Rich](https://github.com/Textualize/rich) 的终端 UI
- 对象树状浏览器(按类型/包/状态分组)
- 源码差异对比视图
- 批量操作进度条
#### 2.7.2 全局配置与 Profile
```bash
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 自动补全
```bash
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](https://github.com/DataZooDE/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](https://github.com/jaraco/keyring) 库
- 支持 Windows Credential Manager / macOS Keychain / Linux Secret Service
- 不再明文存储密码
#### 2.9.2 SSL 证书验证
```ini
[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](https://github.com/marcellourbani/abap-adt-api) | TypeScript | 最全面的 ADT API 封装 | CDS View、AMDP、Where-Used、搜索 |
| [erpl-adt](https://github.com/DataZooDE/erpl-adt) | TypeScript | CLI + MCP 服务器 | MCP 协议、对象浏览、AI 集成 |
| [abapGit](https://github.com/abapGit/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 → 智能化开发
```
这个路径从 **"能用的工具"** 逐步演进到 **"不可替代的开发平台"**,每一步都有明确的用户价值。