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:
@@ -0,0 +1,4 @@
|
||||
schema: spec-driven
|
||||
change: add-dictionary-objects
|
||||
status: archived
|
||||
archived_at: "2026-06-09"
|
||||
@@ -0,0 +1,32 @@
|
||||
## Context
|
||||
|
||||
sap-cli 当前支持 10 种 ABAP 开发对象类型的 CRUD 操作。本变更扩展至 14 种类型,新增消息类、数据库视图、搜索帮助和锁对象。这 4 种类型都属于 ABAP Dictionary (DDIC) 类别,创建时需要 XML body 而非纯文本源码。
|
||||
|
||||
## Goals
|
||||
|
||||
- 注册 4 种新的 DDIC 对象类型到类型注册表
|
||||
- 实现 4 种类型的 create/info/delete 操作
|
||||
- 对有源码的类型(view)支持 download/sync
|
||||
- 对无源码的类型(messageclass、lockobject)明确提示不支持
|
||||
- 支持 JSON 定义文件创建 DDIC 对象
|
||||
|
||||
## Non-Goals
|
||||
|
||||
- 不实现搜索帮助的测试数据生成
|
||||
- 不实现锁对象的自动函数模块调用
|
||||
- 不涉及 CDS Access Control (DCL) 类型(P4 级别)
|
||||
|
||||
## Decisions
|
||||
|
||||
1. **消息类使用专用端点**:`/sap/bc/adt/messageclasses`,消息内容通过 XML 维护
|
||||
2. **视图使用 DDIC 端点**:`/sap/bc/adt/ddic/views`,与 table/structure 类似的 XML schema
|
||||
3. **搜索帮助使用 DDIC 端点**:`/sap/bc/adt/ddic/searchhelps`
|
||||
4. **锁对象使用 DDIC 端点**:`/sap/bc/adt/ddic/lockobjects`
|
||||
5. **文件扩展名统一 .abap**:有源码类型(view)的源码文件保持 .abap 扩展名
|
||||
6. **目录命名约定**:`messageclasses/`、`views/`、`searchhelps/`、`lockobjects/`
|
||||
|
||||
## Risks / Trade-offs
|
||||
|
||||
- **ADT 端点兼容性**:不同 SAP 版本(ECC vs S/4HANA)的端点可能有差异,需要实际验证
|
||||
- **消息类 XML schema 复杂**:消息内容可能需要额外的 XML 处理逻辑
|
||||
- **锁对象自动生成物**:SAP 会在锁对象创建时自动生成 enqueue/dequeue 函数模块,删除锁对象时这些也会被删除
|
||||
@@ -0,0 +1,30 @@
|
||||
# Proposal: 新增 ABAP 字典对象类型支持
|
||||
|
||||
## Why
|
||||
|
||||
当前 sap-cli 支持的 10 种对象类型覆盖了日常开发的基础需求,但 SAP 实际项目中还频繁使用消息类(Message Class)、数据库视图(Database View)、搜索帮助(Search Help)和锁对象(Lock Object)。缺少这些类型意味着开发者仍需回到 SAP GUI 处理这些对象,破坏了 CLI 工具的连贯工作流。
|
||||
|
||||
## What Changes
|
||||
|
||||
- **消息类 (Message Class)**:MESSAGE 语句的核心依赖,几乎每个项目都需要。ADT 端点 `/sap/bc/adt/messageclasses`
|
||||
- **数据库视图 (Database View)**:数据建模和查询优化的基础工具。ADT 端点 `/sap/bc/adt/ddic/views`
|
||||
- **搜索帮助 (Search Help)**:ALV 屏幕 F4 帮助和数据输入辅助。ADT 端点 `/sap/bc/adt/ddic/searchhelps`
|
||||
- **锁对象 (Lock Object)**:多用户并发控制,数据一致性保障。ADT 端点 `/sap/bc/adt/ddic/lockobjects`
|
||||
|
||||
这 4 种类型均为 DDIC 类别,创建时需要 XML 定义(非纯文本源码),与现有的 domain/dataelement/table 类型处理方式类似。
|
||||
|
||||
## Capabilities
|
||||
|
||||
### New Capabilities
|
||||
(无新领域)
|
||||
|
||||
### Modified Capabilities
|
||||
- `object-lifecycle`: 扩展支持消息类、数据库视图、搜索帮助、锁对象的 CRUD 操作
|
||||
|
||||
## Impact
|
||||
|
||||
- types.py:注册 4 个新 ObjectTypeConfig
|
||||
- client.py:新增 4 种类型的创建模板和 ADT 交互逻辑
|
||||
- ddic.py:扩展 DDIC XML 生成以支持新类型
|
||||
- scanner.py:新增目录映射(messageclasses/、views/、searchhelps/、lockobjects/)
|
||||
- 约定文件扩展名保持 .abap(消息类和锁对象无源码端点,仅支持 create/info/delete)
|
||||
+61
@@ -0,0 +1,61 @@
|
||||
## MODIFIED Requirements
|
||||
|
||||
### Requirement: Object Creation
|
||||
|
||||
系统 SHALL 在 SAP 系统中创建开发对象,支持 14 种对象类型。
|
||||
|
||||
#### 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 中创建锁对象
|
||||
|
||||
### Requirement: Source Code Download
|
||||
|
||||
系统 SHALL 从 SAP 系统下载对象源代码,支持所有有源码端点的对象类型。
|
||||
|
||||
#### Scenario: Download database view source
|
||||
- **WHEN** 用户下载 view 类型对象
|
||||
- **THEN** 系统下载视图的 DDL 定义源码
|
||||
|
||||
#### Scenario: Message class has no source
|
||||
- **WHEN** 用户尝试下载 messageclass 类型
|
||||
- **THEN** 系统报告该类型不支持下载操作
|
||||
|
||||
#### Scenario: Lock object has no source
|
||||
- **WHEN** 用户尝试下载 lockobject 类型
|
||||
- **THEN** 系统报告该类型不支持下载操作
|
||||
|
||||
### Requirement: Object Information Query
|
||||
|
||||
系统 SHALL 查询 SAP 系统中所有支持类型的开发对象元数据。
|
||||
|
||||
#### Scenario: Query message class info
|
||||
- **WHEN** 用户执行 info 命令查询消息类
|
||||
- **THEN** 系统显示消息类的名称、描述、消息数量等元数据
|
||||
|
||||
#### Scenario: Query view info
|
||||
- **WHEN** 用户执行 info 命令查询数据库视图
|
||||
- **THEN** 系统显示视图的名称、描述、关联表等元数据
|
||||
|
||||
### Requirement: Object Deletion
|
||||
|
||||
系统 SHALL 从 SAP 系统中删除所有支持类型的开发对象。
|
||||
|
||||
#### Scenario: Delete message class
|
||||
- **WHEN** 用户执行 delete 命令删除消息类并确认
|
||||
- **THEN** 系统删除该消息类
|
||||
|
||||
#### Scenario: Delete lock object
|
||||
- **WHEN** 用户执行 delete 命令删除锁对象并确认
|
||||
- **THEN** 系统删除该锁对象及其自动生成的函数模块
|
||||
@@ -0,0 +1,34 @@
|
||||
## 1. Type Registration
|
||||
|
||||
- [x] 1.1 Register messageclass in types.py with ADT URI template
|
||||
- [x] 1.2 Register view in types.py with ADT URI template
|
||||
- [x] 1.3 Register searchhelp in types.py with ADT URI template
|
||||
- [x] 1.4 Register lockobject in types.py with ADT URI template
|
||||
- [x] 1.5 Verify all_type_keys() returns 16 types
|
||||
|
||||
## 2. DDIC XML Generation
|
||||
|
||||
- [x] 2.1 Add messageclass XML template to ddic.py
|
||||
- [x] 2.2 Add view XML template to ddic.py
|
||||
- [x] 2.3 Add searchhelp XML template to ddic.py
|
||||
- [x] 2.4 Add lockobject XML template to ddic.py
|
||||
|
||||
## 3. Client API Extension
|
||||
|
||||
- [x] 3.1 Add messageclass create body to _build_create_body
|
||||
- [x] 3.2 Add view create body to _build_create_body
|
||||
- [x] 3.3 Add searchhelp create body to _build_create_body
|
||||
- [x] 3.4 Add lockobject create body to _build_create_body
|
||||
|
||||
## 4. Scanner Update
|
||||
|
||||
- [x] 4.1 Add messageclasses/ directory mapping to scanner.py
|
||||
- [x] 4.2 Add views/ directory mapping to scanner.py
|
||||
- [x] 4.3 Add searchhelps/ directory mapping to scanner.py
|
||||
- [x] 4.4 Add lockobjects/ directory mapping to scanner.py
|
||||
|
||||
## 5. Verification
|
||||
|
||||
- [x] 5.1 Run existing test suite (66/68 baseline preserved)
|
||||
- [x] 5.2 Updated test_openspec_specs_exist for new 7-domain structure
|
||||
- [x] 5.3 Verified --help and all imports work
|
||||
Reference in New Issue
Block a user