Files
sap-cli-skill/references/sap-tool-constraints.md
T
吴让宇 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

136 lines
6.0 KiB
Markdown
Raw 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 操作 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)。
## 🚫 规则 4sync 命令必须带 --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
```
## 🚫 规则 5DDIC 对象的 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. ✅ 同一任务只有一个开发者会话在跑吗?