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 重写为单源开发流程。
This commit is contained in:
吴让宇
2026-09-11 00:40:15 +08:00
parent e786742bcb
commit c5905a5b1e
104 changed files with 20744 additions and 10 deletions
+72
View File
@@ -0,0 +1,72 @@
# NW 7.40 兼容性矩阵
> 最后更新:2026-07-09
> 测试系统:support.learningleader.com.cn (NW 7.40)
> 测试方式:真实 SAP 系统端到端 create→info→delete→download→sync
## 背景
sap-cli 封装 SAP ADT REST API,但不同 SAP NetWeaver 版本的 ADT 端点覆盖范围差异显著。本文件记录 v2.2.0 在真实 NW 7.40 系统上的验证结果,供用户和开发者参考。
## 对象类型 × 操作 可用性矩阵
### ✅ 完整可用(全生命周期闭环)
| 类型 | create | info | delete | download | sync | 说明 |
|------|:------:|:----:|:------:|:--------:|:----:|------|
| report | ✅ | ✅ | ✅ | ✅ | ✅ | 报表程序 |
| class | ✅ | ✅ | ✅ | ✅ | ✅ | ABAP 类 |
| interface | ✅ | ✅ | ✅ | ✅ | ✅ | ABAP 接口 |
| function | ✅ | ✅ | ✅ | ✅ | ✅ | 函数模块(含函数组自动创建) |
| functiongroup | ✅ | ✅ | ✅ | — | — | 函数组(容器对象,无源码) |
| include | ✅ | ✅ | ✅ | ✅ | ✅ | Include 程序 |
> **这 6 种类型构成 NW 7.40 上 sap-cli 的核心价值闭环**download → 本地编辑 → sync。
### ⚠️ 部分可用(仅 CRUD,无源码编辑)
| 类型 | create | info | delete | download | sync | 说明 |
|------|:------:|:----:|:------:|:--------:|:----:|------|
| domain | ✅ | ✅ | ✅ | ❌ | ❌ | 源码端点 /source/main 在 NW 7.40 不存在 |
| dataelement | ✅ | ✅ | ✅ | ❌ | ❌ | 同上 |
> DDIC 对象在 NW 7.40 上以 XML 形式存储于对象 URI 本身,没有独立的 source/main 端点。这是 NW 7.50+ 才引入的特性。即便 Eclipse ADT 在 7.40 上也无法编辑 DDIC 源码——这不是 sap-cli 的缺陷。
### ❌ 不可用(NW 7.40 端点缺失)
| 类型 | 失败原因 | HTTP 状态码 | 代码状态 |
|------|----------|:-----------:|----------|
| table | 集合端点 POST Content-Type 不匹配 | 415 | 代码已写,待更正 |
| structure | 集合端点 POST Content-Type 不匹配 | 415 | 代码已写,待更正 |
| tabletype | DDIC tabletypes 集合端点不存在 | 404 | 代码已写,端点缺失 |
| view | 媒体类型不支持 | 415 | 代码已写,端点限制 |
| messageclass | handler 未注册 | 404 | 代码已写,端点缺失 |
| searchhelp | 端点不存在 | 404 | 代码已写,端点缺失 |
| lockobject | 端点不存在 | 404 | 代码已写,端点缺失 |
| cdsview | DDL source 端点不存在 | 404 | 代码已写,端点缺失 |
> **判定原则**:这些类型的 `_build_create_body` XML 结构代码已就位,但 NW 7.40 的 ADT 端点层就不通。验证方式——如果是 XML 结构错误,SAP 会返回 400 校验消息;而这 8 种类型返回的都是 404/415(端点不存在/媒体类型不支持),请求未到达 XML 解析。需在 S/4HANA 或更高 NW 版本上验证。
## 其他命令的版本兼容性
| 命令 | NW 7.40 | 说明 |
|------|:-------:|------|
| list | ✅ | 对象列表 |
| whereused | ✅ | 引用查询 |
| search | ✅ | 源码搜索 |
| check (ATC) | ✅ | 代码检查 |
| format | ✅ | Pretty Printer |
| diff | ✅ | 本地 vs SAP 对比 |
| transport | ✅ | 传输请求管理 |
| package | ✅ | 包管理 |
| show-table | ✅ | 表结构查询(SE11 |
| read-table | ✅ | 表数据查询 |
| run-program | ✅ | 远程执行程序 |
| activate | ✅ | 对象激活 |
## 已知限制
1. **DDIC 对象 sync 不可用** — sync 流程依赖 `/source/main` 端点,NW 7.40 不支持。需 NW 7.50+。
2. **DDIC 对象 lock Accept 头**`delete_object` 已修复(传 `application/vnd.sap.as+xml`),sync 流程未扩展(因 source/main 限制无意义)。
3. **table/structure create** — 返回 415Content-Type 不匹配),需调研 NW 7.40 集合端点的正确 POST 方式。
4. **NW 7.40 激活空响应** — activate 可能返回空响应,已有 double-activate 变通机制,极端情况提示去 SE09 手动激活。