13 KiB
name, description, version, author, license, triggers
| name | description | version | author | license | triggers | ||||||
|---|---|---|---|---|---|---|---|---|---|---|---|
| sap-cli | SAP ABAP ADT CLI for AI agents. Trigger when: operating ABAP objects, syncing code to/from SAP, managing transports, querying DDIC, running ABAP programs, reading SAP tables, or any SAP development task via terminal. | 2.3.0 | WuRangyu | MIT |
|
sap-cli — SAP ABAP Development Object Management
Python CLI wrapping the SAP ADT REST API. Manages the full lifecycle of ABAP development objects from the terminal. Core loop: download → local edit → sync back to SAP.
Quick Start
# 1. Single object: download → edit → sync
python main.py download --name ZMY_CLASS --type class --path ./src
# edit ./src/zmy_class.abap
python main.py sync --name ZMY_CLASS --type class --path ./src/zmy_class.abap --corr_nr DEVK901XXX
# 2. Batch project sync (auto dependency-ordered)
python main.py init --path ./my_project # add objects under src/
python main.py sync --all --path ./my_project --corr_nr DEVK901XXX
# 3. Table query: structure (SE11) + data (SE16N)
python main.py show-table --name ZMY_TABLE
python main.py read-table --name ZMY_TABLE --fields "F1,F2" --where "F1 = 'X'" --max-rows 50
Command Reference
Global params (before command): --profile <name>, --verify-ssl. Optional params in [ ].
| Category | Command | Key Parameters |
|---|---|---|
| CRUD | create |
--name --type [--description --source <.abap> --definition <.json> --package <$TMP> --corr_nr] |
| CRUD | info |
--name --type 1 |
| CRUD | download |
--name --type --path |
| CRUD | sync |
--name --type --path --corr_nr (REQUIRED) |
| CRUD | delete |
--name --type |
| CRUD | activate |
--name --type --corr_nr (built-in NW 7.40 double-activate) |
| CRUD | upload |
--name --type --path --corr_nr (lock→write→unlock only; no check/activate) |
| CRUD | syntax-check |
--name --type (remote object; no upload/activate) |
| Batch | init |
--path |
| Batch | refresh |
--path |
| Batch | sync --all |
--path --corr_nr [--dry-run] |
| Batch | analyze |
--path (dependency analysis) |
| Query | show-table |
--name (SE11 structure) |
| Query | read-table |
--name [--fields --where --max-rows] (SE16N data) |
| Query | list |
--type [--package --prefix] |
| Query | whereused |
--name --type |
| Query | search |
--query |
| Query | diff |
--name --type --path (local vs SAP) |
| Transport | transport list |
— |
| Transport | transport info |
--corr_nr |
| Transport | transport release |
--corr_nr |
| Transport | transport objects |
--corr_nr |
| Config | config show |
— |
| Config | config list-profiles |
— |
| Config | config set |
<key> <val> |
| Config | auth login / auth status |
password stored in keyring |
| Other | run-program |
--name (SA38) |
| Other | check |
--name --type (ATC) |
| Other | format |
--name --type (Pretty Printer) |
| Other | package create |
--name |
| Other | cds download |
--name --path |
| Other | scaffold |
--name --template <t> — alv-report, bapi-wrapper, interface-class, data-model |
Batch sync dependency order: domain(10) → dataelement(20) → table(30) → tabletype(40) → interface(50) → class(60) → function(70) → report(80).
Step-wise sync for lock-heavy automation — split the atomic sync when lock conflicts are frequent; upload now, verify, activate later:
python main.py upload --name ZMY_CLASS --type class --path ./src/zmy_class.abap --corr_nr DEVK901XXX # lock→write→unlock only
python main.py syntax-check --name ZDEPENDENT_REPORT --type report # verify dependents (no upload)
python main.py activate --name ZMY_CLASS --type class --corr_nr DEVK901XXX # activate once clean
Supported Object Types (16)
| Category | Types | Has source |
|---|---|---|
| Programs | report, include |
✅ |
| OOP | class, interface |
✅ |
| Functions | function |
✅ |
| DDIC base | domain, dataelement, table, structure |
✅ |
| DDIC ext | cdsview, view |
✅ |
| DDIC no-source | tabletype, messageclass, searchhelp, lockobject |
❌ |
| Groups | functiongroup |
❌ |
Function naming: must use group/module, e.g. ZMY_FGROUP/Z_MY_FUNC.
⚠️ Constraints (HARD RULES — DO NOT VIOLATE)
Full rules: references/sap-tool-constraints.md. Violations are intercepted by hooks.
质检标准: references/abap-coding-rules.md(28条规则,6大类:安全/性能/可维护性/错误处理/NW740兼容/风格)。质检员在代码审计时以此文档为唯一标准,判定体系:✅合规 / ❌违反(必须修复) / ⚠️建议(推荐修复)。
- Only
python main.py <cmd>touches SAP — norequests/urllib, no curl to ADT/SOAP/RFC, nopython -cinline, no importingADTClientinternals, no hand-built ADT XML. Exceptions:run-programcustom reports, explicit user request, or developing sap-cli itself. - Never modify SAP standard objects (
CL_*,CX_*,IF_*,SAPL*, or any non-user original system) — read-only only: download/info/list/search/whereused/show-table/read-table/diff. When unsure, ask the user. - Never write system tables (TADIR, E071, SEOCLASS, REPOSRC, D010SINF, T000, TDEVC, TSTC) — read-only SELECT is fine; any write needs explicit authorization.
syncmust carry--corr_nr— otherwise it triggers an interactive transport-request prompt.- Non-interactive
deleteneeds piped confirm —echo "yes" | python main.py delete ...(else EOFError). - DDIC
syncfailure on NW 7.40 (HTTP 406) is a system limit — do not retry; report to the user for SE09.
🔄 Standard Workflow(SAP 对象操作标准流程)
所有 SAP 对象修改操作必须按此顺序执行,不得跳过或调整步骤顺序。
步骤1 info — 确认程序存在、已激活、关联请求号
├─ 有请求号 → 记录
└─ 无请求号 → transport list 找老板的请求号推荐
→ 无合适的则帮老板新建(含请求描述)
步骤2 download — 源码下载到本地
步骤3 五角色流水线:研究员 → 创作者 → 质检 → 老板批准
步骤4 建 Gitee 仓库(ADT 层级:src/包/类型/对象/)+ 同步确认请求号
└─ 请求号写入 doc 文档
步骤5 工程师改代码(本地,不 commit)
步骤6 请求号绑定对象(如 SE09 未自动绑定)
步骤7 sync --corr_nr → 语法检查 → 迭代修复 → 激活成功
└─ 全程带请求号,不要到编译阶段才关联
步骤8 激活成功 → git commit + tag → push
└─ git = 细粒度变更追溯 / 请求号 = 系统大版本管理
核心原则:
- info 同时查请求号,不单独处理
- 建 Gitee 仓库同时确认请求号,不滞后
- sync 全程带
--corr_nr,不等编译阶段补 - 只有激活成功才 git commit,不是每次本地改就提交
- git 管变更细节,请求号管系统大版本
📦 Gitee仓库规范
目录结构(ADT 层级)
每个 SAP 项目的 Gitee 仓库按 ADT 层级组织源码:
sap-<project-name>/
├── src/
│ └── <package>/ # SAP 包名(如 $ZIDTR)
│ ├── report/ # 程序类型目录
│ │ └── ZXXX.abap # ABAP 源码(.abap 扩展名)
│ ├── class/
│ │ └── ZCL_XXX.abap
│ ├── interface/
│ │ └── ZIF_XXX.abap
│ ├── function/
│ │ └── ZGROUP_ZFUNC.abap
│ ├── domain/
│ ├── dataelement/
│ ├── table/
│ └── ...
├── doc/ # 文档(请求号记录、设计说明)
│ └── transport-<corr_nr>.md # 每次传输的请求号记录
├── references/ # 参照文档
└── log/ # 错误知识库
请求号同步确认
- 创建仓库时:确认传输请求号(
transport list或transport info --corr_nr DEVK9XXXXX),写入doc/transport-<corr_nr>.md - 每次 sync 前:确认请求号仍有效(未释放、未满),检查
transport objects --corr_nr DEVK9XXXXX确保对象已绑定 - 激活成功后:更新
doc/记录本次变更摘要 - 仓库命名建议:
sap-<package-name>,小写、hyphen 分隔,如sap-zidtradmin
Git 提交时机
- 只有
sync激活成功后才 git commit,不是每次本地修改就提交 - commit message 包含:对象名 + 请求号 + 变更摘要
- tag 使用请求号命名:
DEVK9XXXXX - git 管变更细节追溯,请求号管系统大版本管理
Error Handling (Quick Reference)
错误知识库: log/ 目录(LLM-WIKI 格式),每个错误独立一页。先查 log/,再查 references/error-handling.md。新错误按 log/SCHEMA.md 规范入库。
Full flow: references/error-handling.md.
| Error Pattern | Action |
|---|---|
| HTTP 406 (DDIC Lock) | System limit — report to user → SE09 manual DDIC sync |
| HTTP 403 (Locked) | Residual enqueue lock — try run-program clear-locks report, then SM12 |
| HTTP 400 (SaveFailure) | Class DEFINITION mismatch — diff local vs SAP source |
| HTTP 404 (DDIC download/sync) | NW 7.40 has no /source/main endpoint (7.50+) — DDIC objects only create/info/delete |
| HTTP 423 (Transport lock) | Object bound to transport — report to user → SE09 |
| HTTP 500 (set_source) | Lock 成功但写入 500,传输请求中无对象 → SE09 手动添加对象到请求 → log/adt-set-source-500.md |
| Activate fails, still inactive | double-activate built-in; still fails → report → SE09 |
| Open SQL @ 转义不一致 | 语法检查 2 错误——一处用 @ 则全局必须一致(WHERE field = @lv_var → INTO TABLE @lt_data) → log/adt-nw740-open-sql-consistency.md |
WITH EMPTY KEY dump |
NW 7.40 unsupported — use WITH NON-UNIQUE KEY / WITH DEFAULT KEY |
| Function name error | Missing / separator — use ZGROUP/Z_FUNC |
| EOFError on delete | Non-interactive — prepend echo "yes" | |
| Syntax: "此处不允许逗号" | NW 7.40 逗号陷阱(9种) → log/adt-nw740-comma-traps.md |
General flow: diagnose (params / file / transport / network / object existence) → usage error: fix & retry → sap-cli limit: report, never bypass → SAP limit: exhaust automation below → confirmed un-automatable: request SAP GUI op.
Automation fallbacks — exhaust in order before requesting any SAP GUI action:
- Adjust params — different
--corr_nr, or--dry-runto preview a batch before committing. run-programworkaround — sync + run a helper report (e.g.ZSAPILOT_CLEAR_LOCKS) to clear residual enqueue locks.delete+ recreate — only if the object needs a full rewrite;deletemay fail with HTTP 423 (transport-bound) → then it is SE09.activateretry — double-activate is built in; if it still fails, stop retrying and report — do not chase other activation strategies.
- Never bypass sap-cli (no requests / curl / ADTClient) — report the failure and its cause.
- Give the complete change checklist at once — do the full comparison first (
show-tablevs code field refs); never surface issues incrementally. - System-table writes — 4-step authorization: explain *** → list exact statements → state risks & alternatives → await explicit approval.
NW 7.40 Compatibility (E2E verified — v2.3.0)
Full matrix: docs/NW740-COMPATIBILITY.md.
| Availability | Types |
|---|---|
| Full (download → edit → sync closed loop) | report, class, interface, function, functiongroup, include |
| CRUD only (create/info/delete, no source edit) | domain, dataelement — DDIC stored as XML at object URI, no /source/main endpoint (7.50+ feature) |
| Endpoint missing (404/415) | table, structure, tabletype, view, messageclass, searchhelp, lockobject, cdsview |
NW 7.40 specifics:
- DDIC Lock —
deletefixed (dedicated Accept header);syncstill 406. - Activation false-negative — first activate may report failure but actually succeed; double-activate is built in.
- ABAP syntax limits — no string templates
\|...\|, no inlineDATA(...), noWITH EMPTY KEY. - Open SQL @ 转义一致性 — NW 7.40 要求一处用
@则全 SQL 必须一致(WHERE field = @lv_var→INTO TABLE @lt_data),混用导致语法检查 2 错误。详见log/adt-nw740-open-sql-consistency.md。 - set_source HTTP 500(传输请求无对象) — Lock 成功但写入 500,根因:Lock API 创建锁句柄但未绑定对象到传输请求。NW 7.40 需 SE09 手动添加对象。详见
log/adt-set-source-500.md。 - CSRF token — all writes require it; sap-cli handles automatically.
-
⚠️
info不返回package/packageRef字段。需通过 ADT API 查询:GET /sap/bc/adt/programs/programs/<name>返回 XML 中含<adtcore:packageRef>。也可用list --package <pkg>反向查找。 ↩︎