方向反转:此前 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 重写为单源开发流程。
121 lines
6.0 KiB
Markdown
121 lines
6.0 KiB
Markdown
# 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 随时增删规则,更新后通知小迅同步到质检员的审查标准。
|