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
+121
View File
@@ -0,0 +1,121 @@
# 错误处理流程
sap-cli 命令失败时的标准处理流程。严格按顺序执行。
## 通用流程
```
命令失败
1. 诊断根因(使用方式错误 or 代码/环境问题?)
2. 使用方式错误 → 修正参数后重试
3. sap-cli 限制 → 报告失败,不绕过
4. SAP 系统限制 → 穷尽自动化方案
5. 确认无法自动化 → 请求用户 SAP GUI 操作
```
## 步骤 1:诊断根因
检查以下项目:
| 检查项 | 方法 |
|--------|------|
| 命令参数是否正确 | 对照 `python main.py --help` 和 SKILL.md 验证参数 |
| 文件是否存在、内容是否为空 | `cat``ls` 检查 |
| 传输请求号是否正确 | `python main.py transport info --corr_nr DEVK901XXX` |
| 网络连接是否正常 | `python main.py config show` 验证配置 |
| 对象是否存在于 SAP | `python main.py info --name XXX --type class` |
## 步骤 2:使用方式错误
修正后重试。常见修正:
- 缺少 `--corr_nr` → 加上传输请求号
- 对象名大小写错误 → sap-cli 会自动处理,但路径要注意
- 文件路径错误 → 检查相对/绝对路径
- 对象类型不匹配 → 用 `python main.py --help` 确认支持的类型
## 步骤 3sap-cli 限制
如果确认不是使用方式问题,**如实报告错误信息**,不要尝试绕过 sap-cli:
```
❌ 错误做法:写 Python requests 脚本绕过
❌ 错误做法:用 curl 直接调 ADT 端点
❌ 错误做法:导入 ADTClient 调内部方法
✅ 正确做法:报告失败,说明原因
```
## 步骤 4:穷尽自动化方案(SAP 系统限制时)
遇到 SAP 系统限制时,按以下顺序穷尽自动化方案:
### 方案 A:调整 sap-cli 参数重试
- 尝试不同的 `--corr_nr`
- 尝试 `--dry-run` 预览后执行
- 检查是否有残留锁(`show-table` 查看 SM12 相关信息)
### 方案 BABAP 报表 workaround
通过 `run-program` 执行辅助报表:
```bash
# 清除残留锁
python main.py sync --type report --name ZSAPILOT_CLEAR_LOCKS --path <file> --corr_nr DEVK901XXX
python main.py run-program --name ZSAPILOT_CLEAR_LOCKS
```
### 方案 Cdelete + recreate
如果对象需要完全重写:
```bash
python main.py delete --name ZMY_CLASS --type class
python main.py sync --name ZMY_CLASS --type class --path <file> --corr_nr DEVK901XXX
```
注意:delete 可能因传输请求绑定而失败(HTTP 423),此时需要用户在 SE09 操作。
### 方案 Dactivate 单独重试
```bash
python main.py activate --name ZMY_CLASS --type class --corr_nr DEVK901XXX
```
NW 7.40 的 double-activate 已内置在 sap-cli 中。如果 activate 仍然失败,**不要再尝试其他激活策略**,直接报告给用户。
## 步骤 5:请求用户 SAP GUI 操作
**只在确认所有自动化方案穷尽后**才请求用户操作。
### 必须一次性给出完整操作清单
当需要用户在 SAP GUI 操作时,**绝不能渐进式发现问题**:
- ❌ 错误:先让用户加字段 A,测试后发现缺字段 B,又让用户加字段 B
- ✅ 正确:先做全面对比分析(`show-table` vs 代码中的字段引用),一次性给出完整变更清单
### 系统表操作的 4 步授权流程
如果需要操作系统表(唯一的例外情况):
1. **解释原因** — 为什么需要操作系统表
2. **列出具体操作** — 表名 + 操作类型(如 `DELETE FROM SEOCLASS WHERE ...`
3. **说明风险和替代方案** — 可能的副作用、有没有不操作系统表的替代方案
4. **等待用户确认** — 得到明确授权后才执行
## 常见失败场景速查
| 错误 | 常见原因 | 处理方式 |
|------|----------|----------|
| HTTP 406 (Lock DDIC) | NW 7.40 不支持 DDIC 对象 ADT Lock | 报告用户,SE09 处理 |
| HTTP 403 (Locked) | 残留 enqueue lock | 先尝试 `run-program` 清锁报表,不行才 SM12 |
| HTTP 400 (SaveFailure) | 类 DEFINITION 与 SAP 不一致 | 检查本地 vs SAP 的 DEFINITION 差异 |
| HTTP 423 (Transport lock) | 对象绑定在传输请求中 | 报告用户,SE09 处理 |
| 激活失败仍 inactive | NW 7.40 ADT 限制 | sap-cli 已内置 double-activate,仍失败则报告用户去 SE09 |
| `WITH EMPTY KEY` 运行 dump | NW 7.40 不支持 | 修改为 `WITH NON-UNIQUE KEY``WITH DEFAULT KEY` |