Files
sap-cli-skill/.claude/rules/abap-coding-rules.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

121 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.
# ABAP 编码规则(质检标准)
> 维护者:Rangyu | 版本:v1.0 | 2026-08-05
>
> 本规则文档由 **Rangyu(老板)维护**,质检员在代码审计时以此文档为唯一标准。
> 质检结果分为:✅合规 / ❌违规(必须修复) / ⚠️建议(推荐修复)
---
## 1. 安全规则(Security
| ID | 规则 | 判定 | 示例 |
|----|------|------|------|
| S01 | 生产代码中**禁止硬断点**BREAK-POINT | ❌违反 | `BREAK-POINT.` → 删除 |
| S02 | 关键数据访问前**必须 AUTHORITY-CHECK** | ❌违反 | 聊天记录读取、配置维护、表维护 |
| S03 | SQL 注入防护:**所有变量必须用 @ 转义** | ✅合规 | `WHERE field = @lv_var` |
| S04 | 敏感数据(聊天内容、用户信息)需脱敏或审计 | ⚠️建议 | `zidt_chatlog` message_body 字段 |
| S05 | | | |
| S06 | | | |
| S07 | | | |
*(Rangyu 补充更多安全规则...*
---
## 2. 性能规则(Performance
| ID | 规则 | 判定 | 示例 |
|----|------|------|------|
| P01 | 禁止 `SELECT *`,仅查询所需字段 | ⚠️建议 | `SELECT field1, field2 FROM ...` |
| P02 | 禁止无 WHERE 条件的全表扫描(小配置表除外) | ⚠️建议 | `SELECT ... FROM ztable WHERE ...` |
| P03 | 大表查询必须有索引支撑 | ⚠️建议 | SE11 检查索引 |
| P04 | 循环内禁止 SQL 查询 | ❌违反 | LOOP 内 SELECT |
| P05 | 循环字符串拼接用 `CONCATENATE` 单次操作 | ⚠️建议 | 避免 LOOP 内 `&&` |
| P06 | | | |
| P07 | | | |
*(Rangyu 补充更多性能规则...*
---
## 3. 可维护性规则(Maintainability
| ID | 规则 | 判定 | 示例 |
|----|------|------|------|
| M01 | 重复代码超过 80% 相似 → 提取公共方法/FORM | ❌违反 | 3处 AI 调用重复约 90% |
| M02 | 每个 FORM/方法不超过 200 行 | ⚠️建议 | |
| M03 | 禁止**裸硬编码字符串**(模型名、GUI状态、事务码) | ⚠️建议 | 用常量 `CONSTANTS c_model TYPE ... VALUE 'qwq-32b'` |
| M04 | 关键逻辑必须有注释 | ⚠️建议 | |
| M05 | 无用变量/死代码必须清理 | ⚠️建议 | `gs_tool-END` 赋值未消费 |
| M06 | | | |
| M07 | | | |
*(Rangyu 补充更多可维护性规则...)*
---
## 4. 错误处理规则(Error Handling
| ID | 规则 | 判定 | 示例 |
|----|------|------|------|
| E01 | `sy-subrc <> 0` 后**不能静默处理** | ❌违反 | `IF sy-subrc <> 0. " 错误处理 ENDIF.` → 必须 MESSAGE/EXIT |
| E02 | API 调用必须有异常保护(CATCH) | ⚠️建议 | HTTP 调用、RFC 调用 |
| E03 | 数据库操作必须有错误处理 | ⚠️建议 | COMMIT/ROLLBACK |
| E04 | **CALL FUNCTION 前必须核实被调对象真实存在**:ADT 通道无法校验被调函数与引用结构是否存在(syntax-check 只覆盖当前对象自身),凡调用 `CALL FUNCTION 'Z...'` 或引用 `Z...` 结构/表类型,必须先用 sap-cli(`info`/`download`/`read-table DD02L` 任一)确认对象存在且名称逐字符一致,再落代码 | ❌违反 | 凭记忆写 `CALL FUNCTION 'ZMM_BIP_CREATE'`(实际对象是 `ZMM_BIP_VENDOR_CREATE`)→ 编译期不报错、运行期 CALL_FUNCTION_NOT_FOUND 转储。正确:先 `sap-cli info --name 组名/函数名 --type function` 查实,再写调用 |
| E05 | **CALL FUNCTION 的参数结构必须与被调函数真实签名一致**IMPORTING/EXPORTING/CHANGING/TABLES 各参数名、类型、顺序以核实到的函数签名为准(info 输出或 download 函数源码的 Interface 节),不得按猜测拼参数;引用的 DDIC 结构(如 `TYPE zmm_bip_001_in`)须同批核实结构存在且组件名/类型一致 | ❌违反 | `CALL FUNCTION 'X' EXPORTING iv_a = lv` 但实际签名参数是 `IS_IMPORT` → 运行期 PARAMETER_NOT_FOUND/类型不匹配转储。正确:以 `download` 拿到函数头 `"*" Local Interface: 注释节为准逐参数比对,结构组件以 DD02L/DD03L 实查为准 |
*(Rangyu 补充更多错误处理规则...)*
> **E04/E05 背景(2026-09-10 老板指令)**:远程语法检查不校验被调函数的存在性与签名匹配——本地语法全绿 ≠ 运行期不转储。开发报表/程序中所有 `CALL FUNCTION`(尤其调用本组外/客户化 Z 对象)一律先核实后调用,核实记录(对象存在性 + 签名比对)纳入交付物。
---
## 5. NW 7.40 兼容规则(7.40 Compatibility
| ID | 规则 | 判定 | 示例 |
|----|------|------|------|
| C01 | **禁止 `DATA(...)` inline 声明** | ❌违反 | `DATA(lv_x) = ...` → `DATA lv_x TYPE ...` |
| C02 | Open SQL `@` 转义**全局一致** | ❌违反 | 不能混用 `@lv` 和 `lv` |
| C03 | 禁止字符串模板 `\|...\|` | ❌违反 | 用 `CONCATENATE` 代替 |
| C04 | 禁止 `WITH EMPTY KEY` | ❌违反 | 用 `WITH DEFAULT KEY` |
| C05 | LOOP AT SCREEN 逻辑避免重复 | ⚠️建议 | 提取公共 FORM |
| C06 | | | |
| C07 | | | |
*Rangyu 补充更多 7.40 兼容规则...*
---
## 6. 代码风格规则(Style
| ID | 规则 | 判定 | 示例 |
|----|------|------|------|
| T01 | 命名遵循 SAP 规范(Z开头自定义) | ✅合规 | `ZIDTR_AI_ASSISTANT` |
| T02 | 变量命名语义化 | ⚠️建议 | `lv_date` 优于 `lv_d` |
| T03 | 注释语言统一(中/英) | ⚠️建议 | |
| T04 | | | |
| T05 | | | |
*(Rangyu 补充更多风格规则...*
---
## 附录:今天质检发现的典型违规
| 程序 | 问题 | 规则ID | 行号 |
|------|------|--------|------|
| ZIDTR_AI_ASSISTANT | 生产代码 BREAK-POINT | S01 | L44 |
| ZIDTR_AI_ASSISTANT | 权限检查缺失 | S02 | 全文 |
| ZIDTR_AI_ASSISTANT | 3处代码重复~90% | M01 | L464-667 |
| ZIDTR_AI_ASSISTANT | 硬编码模型名 | M03 | L207 |
| ZIDTR_AI_ASSISTANT | F4错误静默处理 | E01 | L170-172 |
| ZIDTR_AI_ASSISTANT | DATA(...) inline | C01 | L152等6处 |
| ZIDTR_AI_ASSISTANT | @转义混用 | C02 | L154/259 |
---
> **使用方式**:质检员读取本文件 → 逐条对照代码 → 输出 `✅/❌/⚠️` 审计报告。
>
> **维护方式**:Rangyu 随时增删规则,更新后通知小迅同步到质检员的审查标准。