Files
sap-cli-skill/openspec/specs/object-lifecycle/spec.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

187 lines
7.9 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.
# Object Lifecycle Specification
## Purpose
定义 sap-cli 对 SAP 开发对象的创建、读取(下载源码和信息查询)、更新(同步)、删除操作行为。
涵盖所有支持的对象类型:report、class、interface、function、functiongroup、domain、dataelement、table、structure、tabletype、messageclass、view、searchhelp、lockobject、cdsview、include。
## Requirements
### Requirement: Object Creation
系统 SHALL 在 SAP 系统中创建开发对象,支持 16 种对象类型。
#### Scenario: Create with default template
- **WHEN** 用户执行 create 命令,指定对象名称和类型,未提供自定义源码
- **THEN** 系统使用内置模板生成源码并在 SAP 中创建对象
#### Scenario: Create with custom source file
- **WHEN** 用户通过 --source 参数指定本地 .abap 文件
- **THEN** 系统读取文件内容作为源码并在 SAP 中创建对象
#### Scenario: Create DDIC object with definition
- **WHEN** 用户通过 --definition 参数指定 .json 文件创建 DDIC 对象(domain、dataelement、table、structure、tabletype
- **THEN** 系统将 JSON 定义转换为 SAP 所需格式并创建对象
#### Scenario: Create message class
- **WHEN** 用户执行 create 命令,指定类型为 messageclass,并提供名称和描述
- **THEN** 系统在 SAP 中创建消息类对象
#### Scenario: Create database view
- **WHEN** 用户执行 create 命令,指定类型为 view,并提供 JSON 定义文件
- **THEN** 系统将 JSON 转换为 DDIC XML 并在 SAP 中创建数据库视图
#### Scenario: Create search help
- **WHEN** 用户执行 create 命令,指定类型为 searchhelp,并提供 JSON 定义文件
- **THEN** 系统将 JSON 转换为 DDIC XML 并在 SAP 中创建搜索帮助
#### Scenario: Create lock object
- **WHEN** 用户执行 create 命令,指定类型为 lockobject,并提供 JSON 定义文件
- **THEN** 系统将 JSON 转换为 DDIC XML 并在 SAP 中创建锁对象
#### Scenario: Create already existing object
- **WHEN** SAP 系统中已存在同名同类型对象
- **THEN** 系统报告对象已存在的错误
#### Scenario: Create with transport request
- **WHEN** 用户通过 --corr_nr 指定传输请求号
- **THEN** 创建的对象绑定到指定的传输请求
### Requirement: Source Code Download
系统 SHALL 从 SAP 系统下载对象源代码并保存到本地文件。
#### Scenario: Download existing object
- **WHEN** 用户执行 download 命令,SAP 系统存在该对象
- **THEN** 系统下载源码并保存到指定目录,文件名为小写对象名+.abap
#### Scenario: Download non-existent object
- **WHEN** 用户执行 download 命令,SAP 系统不存在该对象
- **THEN** 系统报告对象不存在的错误
#### Scenario: Download function type
- **WHEN** 用户下载 function 类型对象,名称格式为 "组名/模块名"
- **THEN** 系统正确下载函数模块源码
#### Scenario: Download type without source
- **WHEN** 用户尝试下载不支持源码的类型(如 functiongroup、messageclass、lockobject
- **THEN** 系统报告该类型不支持下载操作
#### Scenario: Download database view source
- **WHEN** 用户下载 view 类型对象
- **THEN** 系统下载视图的 DDL 定义源码
### Requirement: Source Code Sync
系统 SHALL 将本地源代码同步到 SAP 系统,执行完整的锁定→写入→解锁→检查→激活流程。
#### Scenario: Full sync success
- **WHEN** 用户执行 sync 命令,本地文件和 SAP 对象均有效
- **THEN** 系统依次执行锁定、写入、解锁、语法检查、激活,每步报告进度
#### Scenario: Auto-create on sync
- **WHEN** 用户同步一个 SAP 中不存在的对象
- **THEN** 系统自动创建空对象后继续同步流程
#### Scenario: Syntax check failure
- **WHEN** 源码包含语法错误
- **THEN** 系统报告语法错误详情(行号和描述)
#### Scenario: Activation failure
- **WHEN** 语法检查通过但激活失败
- **THEN** 系统报告激活错误详情
#### Scenario: Sync with specified transport request
- **WHEN** 用户通过 --corr_nr 指定传输请求号
- **THEN** 系统在整个同步流程中使用该传输请求
### Requirement: Object Information Query
系统 SHALL 查询 SAP 系统中所有支持类型的开发对象元数据。
#### Scenario: Query existing object
- **WHEN** 用户执行 info 命令,SAP 系统存在该对象
- **THEN** 系统显示对象的名称、类型、描述、激活状态、负责人等元数据
#### Scenario: Query non-existent object
- **WHEN** 用户执行 info 命令,SAP 系统不存在该对象
- **THEN** 系统报告对象不存在的错误
#### Scenario: Query message class info
- **WHEN** 用户执行 info 命令查询消息类
- **THEN** 系统显示消息类的名称、描述、消息数量等元数据
#### Scenario: Query view info
- **WHEN** 用户执行 info 命令查询数据库视图
- **THEN** 系统显示视图的名称、描述、关联表等元数据
### Requirement: Object Deletion
系统 SHALL 从 SAP 系统中删除所有支持类型的开发对象。
#### Scenario: Delete with confirmation
- **WHEN** 用户执行 delete 命令并确认删除操作
- **THEN** 系统锁定、删除对象并报告成功
#### Scenario: Delete cancelled
- **WHEN** 用户执行 delete 命令但未确认删除
- **THEN** 系统取消操作,不执行删除
#### Scenario: Delete non-existent object
- **WHEN** 用户尝试删除 SAP 中不存在的对象
- **THEN** 系统报告对象不存在的错误
#### Scenario: Delete message class
- **WHEN** 用户执行 delete 命令删除消息类并确认
- **THEN** 系统删除该消息类
#### Scenario: Delete lock object
- **WHEN** 用户执行 delete 命令删除锁对象并确认
- **THEN** 系统删除该锁对象及其自动生成的函数模块
### Requirement: Source Code Upload
系统 SHALL 上传本地源代码到 SAP 系统,执行锁定→写入→解锁流程,不执行语法检查和激活。
upload 不会自动创建对象——上传前对象必须已存在于 SAP 系统中。
#### Scenario: Upload success
- **WHEN** 用户执行 upload 命令,对象已存在于 SAP,本地文件有效
- **THEN** 系统执行锁定、写入源码、解锁,报告写入的字符数和行数,不执行语法检查和激活
#### Scenario: Upload non-existent object
- **WHEN** 用户上传一个 SAP 中不存在的对象
- **THEN** 系统报告对象不存在的错误(不自动创建,区别于 sync)
#### Scenario: Upload with transport request
- **WHEN** 用户通过 --corr_nr 指定传输请求号
- **THEN** 系统使用该传输请求号进行锁定和写入
#### Scenario: Upload type without source
- **WHEN** 用户尝试上传不支持源码的类型(如 functiongroup、tabletype、messageclass、searchhelp、lockobject
- **THEN** 系统报告该类型不支持上传操作
#### Scenario: Upload local file not found
- **WHEN** 用户指定的本地源码文件路径不存在
- **THEN** 系统报告文件不存在的错误
### Requirement: Syntax Check
系统 SHALL 对 SAP 远程对象的源代码执行语法检查,不上传代码、不激活。
syntax-check 检查 SAP 上现有对象的源码(通常是 active 状态),用于验证结构变更后的依赖影响。
#### Scenario: Syntax check passed
- **WHEN** 用户执行 syntax-check 命令,对象的源码无语法错误
- **THEN** 系统报告语法检查通过
#### Scenario: Syntax check failed
- **WHEN** 对象源码包含语法错误
- **THEN** 系统报告语法检查未通过,显示每个错误的行号和描述
#### Scenario: Syntax check non-existent object
- **WHEN** 用户对 SAP 中不存在的对象执行语法检查
- **THEN** 系统报告对象不存在的错误
#### Scenario: Syntax check type without source
- **WHEN** 用户对不支持源码的类型(如 functiongroup、tabletype)执行语法检查
- **THEN** 系统报告该类型不支持语法检查操作