方向反转:此前 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 重写为单源开发流程。
136 lines
6.0 KiB
Markdown
136 lines
6.0 KiB
Markdown
# sap-cli 使用约束
|
||
|
||
本文件定义使用 sap-cli 操作 SAP 系统时的 **硬性约束**。违反任何一条都会被 Hooks 拦截。
|
||
|
||
## 🚫 规则 1:只使用 sap-cli 命令操作 SAP 系统
|
||
|
||
操作 SAP 系统时,**必须且只能**使用 `python main.py <命令>` 的形式。
|
||
|
||
**严禁以下行为**:
|
||
|
||
| 禁止操作 | 原因 |
|
||
|----------|------|
|
||
| 用 Python `requests` / `urllib` 直接调 ADT REST 端点 | 必须通过 sap-cli 命令 |
|
||
| 用 curl 直接调 ADT 端点(`/sap/bc/adt/*`) | 必须通过 sap-cli 命令 |
|
||
| 用 curl 调 SOAP RFC(`/sap/bc/soap/rfc`) | 必须通过 sap-cli 的 `read-table` 命令 |
|
||
| 编写 Python 脚本导入 `sapcli.client.ADTClient` 后直接调内部方法 | sap-cli 的内部 API 不是公开接口 |
|
||
| 在 Python 脚本中手动构造 ADT XML body | 必须通过 sap-cli 命令处理 |
|
||
| 用 `python -c` 内联调用 requests 访问 SAP | 同上 |
|
||
|
||
**唯一合法的 SAP 交互方式**:
|
||
|
||
```bash
|
||
cd D:/Gitee/sap-cli-skill/assets && python main.py <command> [options]
|
||
```
|
||
|
||
> 本机唯一源目录为 `D:/Gitee/sap-cli-skill`,工具在其 `assets/` 下(原 `D:/Gitee/sap-cli` 已归档,勿再用)。通过 `--profile <名>` 切换目标系统,连接配置在 `assets/config.ini`。
|
||
|
||
### 例外(仅在以下情况下允许)
|
||
|
||
- `run-program` 执行自定义 ABAP 报表 — 这是 sap-cli 的内置功能
|
||
- 用户**明确要求**使用其他方式(如"请用 curl 测试这个端点")
|
||
- **开发 sap-cli 本身**(作为项目开发而非使用工具时)
|
||
|
||
## 🚫 规则 2:禁止修改 SAP 标准开发对象
|
||
|
||
SAP 系统中的标准交付对象(`CL_*`、`CX_*`、`IF_*`、`SAPL*` 等)**严禁修改**。
|
||
|
||
| 禁止 | 说明 |
|
||
|------|------|
|
||
| `download` 标准对象后修改再 `sync` 回去 | 破坏 SAP 系统一致性 |
|
||
| 对标准对象执行 `delete` | 不可逆操作 |
|
||
| `run-program` 修改标准对象源码 | 同上 |
|
||
|
||
**允许**(只读):
|
||
|
||
- ✅ `download` / `info` / `list` / `search` / `whereused`
|
||
- ✅ `show-table` / `read-table` — 查看结构和数据
|
||
- ✅ `diff` — 对比分析
|
||
|
||
**判定标准**:对象 original system 不是用户自己的开发系统,或对象名以 SAP 标准命名空间开头。**不确定时先问用户**。
|
||
|
||
## 🚫 规则 3:禁止操作系统表数据
|
||
|
||
SAP 系统表(存储元数据、运行时状态、内部配置的表)**严禁直接操作**。
|
||
|
||
| 禁止 | 典型表 |
|
||
|------|--------|
|
||
| INSERT / UPDATE / DELETE / MODIFY 系统表 | TADIR, E071, SEOCLASS, REPOSRC, D010SINF, T000, TDEVC, TSTC |
|
||
|
||
**允许**(只读):
|
||
|
||
- ✅ `read-table` / `show-table` 查看(SELECT)系统表数据用于诊断
|
||
- ✅ `run-program` 报表中 SELECT 读取系统表
|
||
|
||
**唯一例外**:用户**明确授权**后才能操作系统表,且必须遵循 4 步授权流程(见 error-handling.md)。
|
||
|
||
## 🚫 规则 4:sync 命令必须带 --corr_nr
|
||
|
||
```bash
|
||
# ✅ 正确
|
||
python main.py sync --name ZMY_CLASS --type class --path ./src/zmy.abap --corr_nr DEVK901362
|
||
|
||
# ❌ 错误(缺少 --corr_nr,会触发交互式传输请求选择)
|
||
python main.py sync --name ZMY_CLASS --type class --path ./src/zmy.abap
|
||
```
|
||
|
||
## 🚫 规则 5:DDIC 对象的 NW 7.40 限制
|
||
|
||
在 NW 7.40 上,DDIC 对象(domain、dataelement、table)的 ADT Lock 返回 HTTP 406。
|
||
|
||
- 这是 **SAP 系统限制**,不是 sap-cli 的 bug
|
||
- sync DDIC 失败时,不要反复重试 — 报告给用户,让用户通过 SAP GUI SE09 处理
|
||
- 新建的 DDIC 对象(不存在于 SAP)可通过 `create --definition` 创建
|
||
|
||
## 🚫 规则 6:查表数据用 read-table,查表结构用 show-table
|
||
|
||
sap-cli 已内置这些命令,不要自己写 HTTP 调用。
|
||
|
||
```bash
|
||
# 查看表结构
|
||
python main.py show-table --name ZSAPILOT_OBJ
|
||
|
||
# 查看表数据
|
||
python main.py read-table --name ZSAPILOT_OBJ --max-rows 50
|
||
```
|
||
|
||
## 🚫 规则 7:DDIC 未完成禁止开发引用它的代码(依赖顺序)
|
||
|
||
代码引用的每个 DDIC 对象(域/数据元素/表/结构/表类型)必须先完成「上传 → 语法检查通过 → 激活成功」三关,才能开始写引用它的代码。
|
||
|
||
- 落地顺序:`domain → dataelement → table/structure → tabletype → interface → class → function → report`
|
||
- 是否完成**以实测为准**:结构查 `DD02L`(`AS4LOCAL = 'A'`)、表类型查 `DD40L`、其余查 `info` / `TADIR`;**不采信会话自述**
|
||
- 违反后果:后续每个引用对象语法检查报「类型/结构 XXX 未知」,整批返工
|
||
|
||
## 🚫 规则 8:强制开发闭环(不得跳步)
|
||
|
||
```
|
||
1. 本地编写/修改源码 → 2. 同步 SAP(upload/sync) → 3. 语法检查(syntax-check)
|
||
↑ │
|
||
└──────────────── 有错则回到第 1 步 ←───────────────────┘
|
||
4. 语法检查 0 错误 → 激活(activate) → 5. 激活成功后才允许执行测试(run-program/unit-test)
|
||
└── 测试不过 → 回到第 1 步
|
||
```
|
||
|
||
禁止:
|
||
|
||
- ❌ 跳过语法检查直接 activate
|
||
- ❌ 未激活就 run-program / unit-test(跑旧版本或报对象不存在)
|
||
- ❌ 把「语法检查通过」当「功能正常」—— syntax-check 不校验被调对象存在性与签名(见 `abap-coding-rules.md` E04/E05)
|
||
- ❌ 把「S4T 演示机通过」表述为「CEM/生产验证通过」
|
||
- ❌ 多会话并发操作同一批对象(派下一会话前先确认前一个已退出)
|
||
|
||
## 自检清单
|
||
|
||
每次执行 SAP 操作前,确认:
|
||
|
||
1. ✅ 我在用 `python main.py <命令>` 吗?
|
||
2. ✅ 我没有直接调 ADT/SOAP/RFC 端点吗?
|
||
3. ✅ 我操作的是 Z* 开头的自定义对象吗?
|
||
4. ✅ 我没有 INSERT/UPDATE/DELETE 系统表吗?
|
||
5. ✅ sync 命令带了 `--corr_nr` 吗?
|
||
6. ✅ 我引用的 DDIC 对象都已激活(实测确认)了吗?
|
||
7. ✅ 我按「本地改 → 同步 → 语法检查 → 循环至 0 错误 → 激活 → 测试」执行了吗?
|
||
8. ✅ 我核实过被调函数/结构的存在性与签名了吗(E04/E05)?
|
||
9. ✅ 同一任务只有一个开发者会话在跑吗?
|