Overview
sapcli is a mature, feature-rich Python CLI for SAP ADT that has become a de-facto standard for CI/CD automation with ABAP systems. This issue tracks a detailed plan to reach feature parity with sapcli in adt-cli, organized as actionable subtasks.
This is a tracking issue — each section corresponds to one or more focused implementation subtasks.
Current State Summary
| Area |
sapcli |
adt-cli |
| ABAP object CRUD (class, program, interface, FUGR, DDIC…) |
✅ Full create/write/activate/read/delete/whereused |
⚠️ Partial (source get/put, adk internals; no dedicated per-type CLI commands) |
| AUnit (unit test runner) |
✅ Full (human, junit4, sonar + coverage jacoco) |
⚠️ Partial (human, junit4; no sonar, no coverage) |
| ATC (code quality) |
✅ Full (run, customizing, profiles) |
⚠️ Partial (run only; human, checkstyle, sarif, gitlab-cq) |
| CTS (transports) |
✅ list, create, release, reassign, delete |
⚠️ Partial (list, create, release, delete; no reassign) |
| gCTS (git-enabled CTS) |
✅ Full (~20 subcommands) |
❌ Not implemented |
| Package management |
✅ create, list, delete, activate, check, stat |
⚠️ get only |
| checkout / checkin (abapgit-compatible I/O) |
✅ Full (class, program, interface, fugr, package) |
⚠️ import (put) only; no per-type checkout |
| datapreview (OSQL queries) |
✅ osql |
❌ Not implemented |
| ABAP run (exec snippets) |
✅ abap run |
❌ Not implemented |
| User management |
✅ details, create, change (RFC) |
⚠️ search/get only |
| DDIC (data elements, domains, structures, tables) |
✅ Full CRUD |
❌ Not implemented |
| CDS/RAP (ddl, dcl, bdef, rap) |
✅ Full CRUD |
❌ Not implemented |
| BSP, Fiori (flp), strust, BAdI, authorizations |
✅ Present |
❌ Not implemented |
| Configuration (kubeconfig-style profiles) |
✅ contexts, use-context |
⚠️ Destinations but no context switching |
Subtasks
1. 📦 Package Commands — create, list, delete, activate, stat
sapcli reference: sapcli package
Currently adt-cli only has adt package get. Add the following subcommands:
adt package create <name> <description> [--super-package] [--no-error-existing]
adt package list <name> [--recursive] [--long]
adt package delete <name> [--transport] [--recursive]
adt package activate <name...> [--recursive]
adt package stat <name> (exit code 0 = found, 10 = not found)
adt package check <name> (run ADT checks on all objects)
Relevant packages: adk, adt-cli
2. 🧬 Object CRUD Commands — class, program, interface, include, function group
sapcli reference: class, program, interface, functiongroup, include
The adk package already supports creating/writing/activating objects internally. What's missing is the user-facing CLI layer. Add dedicated commands:
adt class create <name> <desc> <package> / write / activate / read [--type defs|impls|tests] / delete / whereused / attributes / execute
adt program create / write / activate / read / delete / whereused
adt interface create / write / activate / read / delete / whereused
adt functiongroup create / write / activate / read / delete / whereused + include subcommands
adt include create / write / activate / read
All write/activate commands should accept --transport CORRNR, --activate, --ignore-errors, --warning-errors. Write should support - (stdin) as file input.
Relevant packages: adk, adt-cli
3. 🔬 DDIC Object Commands — data element, domain, structure, table
sapcli reference: dataelement, domain, structure, table
DDIC objects are used heavily in automated deployments. Add:
adt dataelement — create, write, activate, read, delete
adt domain — create, write, activate, read, delete
adt structure — create, write, activate, read, delete
adt table — create, write, activate, read, delete
Relevant packages: adk, adt-schemas, adt-cli
4. 🔷 CDS/RAP Object Commands — ddl, dcl, bdef
sapcli reference: ddl, dcl, bdef, rap
Modern ABAP development relies heavily on CDS/RAP. Add:
adt ddl — create, write, activate, read, delete
adt dcl — create, write, activate, read, delete
adt bdef — create, write, activate, read, delete
adt rap — RAP Business Service binding operations
Relevant packages: adk, adt-schemas, adt-cli
5. 🧪 AUnit Enhancements — coverage, sonar output, more object types
sapcli reference: aunit
The existing adt-aunit plugin supports run with human and junit4 output. Missing:
--output sonar — Sonar Generic Execution format (links findings to local checkout files)
--result {unit,coverage,all} — include coverage data in run
--coverage-output {raw,human,jacoco} — coverage result format
--coverage-filepath <path> — write coverage to file
--report-missed-lines — append missed-lines section to human output
- Object type:
program-include (with main program inference from MAIN\INCLUDE notation)
- Object type:
transport — run tests on all objects in a transport (with --as4user)
--compat flag for legacy ADT endpoints
- Non-zero exit code equal to number of failed+errored tests
Relevant packages: adt-aunit
6. 🔍 ATC Enhancements — customizing, profile management
sapcli reference: atc
The existing adt-atc plugin supports run only. Add:
adt atc customizing — fetch and display ATC configuration (active variant, CI mode)
adt atc profile list [--long] [--output json] — list ATC profiles
adt atc profile dump [-p PROFILE...] [--checkman] — dump full profile content as JSON
adt atc run --output html — HTML table format for findings
Relevant packages: adt-atc
7. 🚌 CTS Enhancements — reassign command
sapcli reference: cts
The existing adt cts tr subcommand already covers list/get/create/delete/release. Add:
adt cts tr reassign <number> <new-owner> [--recursive] — change transport/task owner
Relevant packages: adt-cli
8. 🔄 gCTS (git-enabled CTS) — full implementation
sapcli reference: gcts
gCTS enables native git workflows in SAP systems. This is a large feature area not yet in adt-cli. Key subcommands:
adt gcts repolist — list gCTS repositories
adt gcts clone <url> [package] [--wait-for-ready] [--vsid] [--starting-folder] [--vcs-token]
adt gcts checkout <package> <branch> [--wait-for-ready] [--no-import]
adt gcts log <package>
adt gcts pull <package>
adt gcts push <package>
adt gcts commit <package> [transport] [-m message] [--description]
adt gcts delete <package>
adt gcts config <package> [name] [value] [--unset]
adt gcts user get-credentials / set-credentials / delete-credentials
adt gcts repo set-url / property get/set / branch create/delete/list / activities / messages / objects / tasks
adt gcts system config get/list/set/unset
adt gcts task info/list/delete
Relevant packages: new adt-gcts package or extension of adt-cli
9. 📥 checkout Command — abapgit-compatible export to local files
sapcli reference: checkout
adt-cli has adt-export (import/export plugin) but lacks the simple per-object-type checkout that downloads source to abapgit-compatible local files. Add:
adt checkout class <name> — downloads all source parts to <name>.clas.*.abap
adt checkout program <name>
adt checkout interface <name>
adt checkout function_group <name>
adt checkout package <name> [dir] [--recursive] [--starting-folder] — full package checkout with .abapgit.xml
This overlaps with adt-export / adt-plugin-abapgit — evaluate reuse opportunities.
Relevant packages: adt-export, adt-plugin-abapgit, adt-cli
10. 🗄️ datapreview — OSQL queries via ADT SQL console
sapcli reference: datapreview
Extremely useful for ad-hoc queries and CI scripts (e.g., looking up transport user). Add:
adt datapreview osql "<statement>" [--output human|json] [--rows N] [--noheadings] [--noaging]
Relevant packages: adt-client, adt-cli
11. ⚡ abap run — execute ABAP snippets
sapcli reference: abap
Widely used for CI scripts and coding agents. Creates a temporary if_oo_adt_classrun class, runs it, then unconditionally deletes it. Add:
adt abap run <file>|- — run ABAP from file or stdin
--prefix <prefix> — class name prefix (default: zcl_adtcli_run)
--package <package> — package for temp class (default: $tmp)
The adt class execute command (subtask #2) provides the underlying mechanism.
Relevant packages: adk, adt-cli
12. 👤 User Management — create and modify users
sapcli reference: user
Currently adt user only supports search/get. Add (requires RFC or ADT user management endpoints):
adt user create [--type Dialog|Service|System] [--password PASSWORD] <username>
adt user change [--password PASSWORD] <username>
Note: sapcli implements this via RFC. Evaluate whether ADT has equivalent endpoints first.
Relevant packages: adt-client, adt-cli
13. 🔐 Authorization & SSL — strust, authorizations
sapcli reference: strust, authorizations
Infrastructure management commands:
adt strust — SSL certificate management (upload/list/delete certificates)
adt authorizations — authorization fields, objects, transactions, and defaults
Relevant packages: adt-client, adt-cli
14. 🏢 BSP, Fiori Launchpad, Feature Toggles, BAdI
sapcli reference: bsp, flp, featuretoggle, badi
Lower priority but useful for complete coverage:
adt bsp — BSP application management
adt flp — Fiori Launchpad operations
adt featuretoggle — Feature Toggle management
adt badi — New-style BAdI (Enhancement) operations
15. ⚙️ Multi-system Configuration — kubeconfig-style contexts
sapcli reference: configuration docs
sapcli supports a ~/.sapcli/config.yml with named connections, users, and contexts — enabling sapcli --context qa aunit run class zcl_foo. adt-cli has destinations but lacks context switching shorthand. Add:
adt config use-context <name> — set active context
--context <name> / ADTCLI_CONTEXT=<name> global flag for per-invocation override
- Named connection profiles in
~/.adt/config.yml (or equivalent)
Relevant packages: adt-config, adt-cli
Priority Recommendation
| Priority |
Subtasks |
Rationale |
| 🔴 High |
#1 (package), #2 (object CRUD), #5 (aunit enhancements), #6 (atc enhancements), #10 (datapreview), #11 (abap run) |
Core CI/CD automation workflows |
| 🟡 Medium |
#3 (DDIC), #4 (CDS/RAP), #7 (CTS reassign), #8 (gCTS), #9 (checkout), #15 (config contexts) |
Advanced automation and modern ABAP |
| 🟢 Low |
#12 (user mgmt), #13 (strust/auth), #14 (bsp/flp/badi/toggles) |
Infrastructure / niche use cases |
Notes
Overview
sapcli is a mature, feature-rich Python CLI for SAP ADT that has become a de-facto standard for CI/CD automation with ABAP systems. This issue tracks a detailed plan to reach feature parity with sapcli in
adt-cli, organized as actionable subtasks.This is a tracking issue — each section corresponds to one or more focused implementation subtasks.
Current State Summary
Subtasks
1. 📦 Package Commands — create, list, delete, activate, stat
sapcli reference:
sapcli packageCurrently
adt-clionly hasadt package get. Add the following subcommands:adt package create <name> <description> [--super-package] [--no-error-existing]adt package list <name> [--recursive] [--long]adt package delete <name> [--transport] [--recursive]adt package activate <name...> [--recursive]adt package stat <name>(exit code 0 = found, 10 = not found)adt package check <name>(run ADT checks on all objects)Relevant packages:
adk,adt-cli2. 🧬 Object CRUD Commands — class, program, interface, include, function group
sapcli reference:
class,program,interface,functiongroup,includeThe
adkpackage already supports creating/writing/activating objects internally. What's missing is the user-facing CLI layer. Add dedicated commands:adt class create <name> <desc> <package>/write/activate/read [--type defs|impls|tests]/delete/whereused/attributes/executeadt program create/write/activate/read/delete/whereusedadt interface create/write/activate/read/delete/whereusedadt functiongroup create/write/activate/read/delete/whereused+ include subcommandsadt include create/write/activate/readAll write/activate commands should accept
--transport CORRNR,--activate,--ignore-errors,--warning-errors. Write should support-(stdin) as file input.Relevant packages:
adk,adt-cli3. 🔬 DDIC Object Commands — data element, domain, structure, table
sapcli reference:
dataelement,domain,structure,tableDDIC objects are used heavily in automated deployments. Add:
adt dataelement— create, write, activate, read, deleteadt domain— create, write, activate, read, deleteadt structure— create, write, activate, read, deleteadt table— create, write, activate, read, deleteRelevant packages:
adk,adt-schemas,adt-cli4. 🔷 CDS/RAP Object Commands — ddl, dcl, bdef
sapcli reference:
ddl,dcl,bdef,rapModern ABAP development relies heavily on CDS/RAP. Add:
adt ddl— create, write, activate, read, deleteadt dcl— create, write, activate, read, deleteadt bdef— create, write, activate, read, deleteadt rap— RAP Business Service binding operationsRelevant packages:
adk,adt-schemas,adt-cli5. 🧪 AUnit Enhancements — coverage, sonar output, more object types
sapcli reference:
aunitThe existing
adt-aunitplugin supportsrunwith human and junit4 output. Missing:--output sonar— Sonar Generic Execution format (links findings to local checkout files)--result {unit,coverage,all}— include coverage data in run--coverage-output {raw,human,jacoco}— coverage result format--coverage-filepath <path>— write coverage to file--report-missed-lines— append missed-lines section to human outputprogram-include(with main program inference fromMAIN\INCLUDEnotation)transport— run tests on all objects in a transport (with--as4user)--compatflag for legacy ADT endpointsRelevant packages:
adt-aunit6. 🔍 ATC Enhancements — customizing, profile management
sapcli reference:
atcThe existing
adt-atcplugin supportsrunonly. Add:adt atc customizing— fetch and display ATC configuration (active variant, CI mode)adt atc profile list [--long] [--output json]— list ATC profilesadt atc profile dump [-p PROFILE...] [--checkman]— dump full profile content as JSONadt atc run --output html— HTML table format for findingsRelevant packages:
adt-atc7. 🚌 CTS Enhancements — reassign command
sapcli reference:
ctsThe existing
adt cts trsubcommand already covers list/get/create/delete/release. Add:adt cts tr reassign <number> <new-owner> [--recursive]— change transport/task ownerRelevant packages:
adt-cli8. 🔄 gCTS (git-enabled CTS) — full implementation
sapcli reference:
gctsgCTS enables native git workflows in SAP systems. This is a large feature area not yet in
adt-cli. Key subcommands:adt gcts repolist— list gCTS repositoriesadt gcts clone <url> [package] [--wait-for-ready] [--vsid] [--starting-folder] [--vcs-token]adt gcts checkout <package> <branch> [--wait-for-ready] [--no-import]adt gcts log <package>adt gcts pull <package>adt gcts push <package>adt gcts commit <package> [transport] [-m message] [--description]adt gcts delete <package>adt gcts config <package> [name] [value] [--unset]adt gcts user get-credentials/set-credentials/delete-credentialsadt gcts repo set-url/property get/set/branch create/delete/list/activities/messages/objects/tasksadt gcts system config get/list/set/unsetadt gcts task info/list/deleteRelevant packages: new
adt-gctspackage or extension ofadt-cli9. 📥 checkout Command — abapgit-compatible export to local files
sapcli reference:
checkoutadt-clihasadt-export(import/export plugin) but lacks the simple per-object-typecheckoutthat downloads source to abapgit-compatible local files. Add:adt checkout class <name>— downloads all source parts to<name>.clas.*.abapadt checkout program <name>adt checkout interface <name>adt checkout function_group <name>adt checkout package <name> [dir] [--recursive] [--starting-folder]— full package checkout with.abapgit.xmlThis overlaps with
adt-export/adt-plugin-abapgit— evaluate reuse opportunities.Relevant packages:
adt-export,adt-plugin-abapgit,adt-cli10. 🗄️ datapreview — OSQL queries via ADT SQL console
sapcli reference:
datapreviewExtremely useful for ad-hoc queries and CI scripts (e.g., looking up transport user). Add:
adt datapreview osql "<statement>" [--output human|json] [--rows N] [--noheadings] [--noaging]Relevant packages:
adt-client,adt-cli11. ⚡ abap run — execute ABAP snippets
sapcli reference:
abapWidely used for CI scripts and coding agents. Creates a temporary
if_oo_adt_classrunclass, runs it, then unconditionally deletes it. Add:adt abap run <file>|-— run ABAP from file or stdin--prefix <prefix>— class name prefix (default:zcl_adtcli_run)--package <package>— package for temp class (default:$tmp)The
adt class executecommand (subtask #2) provides the underlying mechanism.Relevant packages:
adk,adt-cli12. 👤 User Management — create and modify users
sapcli reference:
userCurrently
adt useronly supports search/get. Add (requires RFC or ADT user management endpoints):adt user create [--type Dialog|Service|System] [--password PASSWORD] <username>adt user change [--password PASSWORD] <username>Note: sapcli implements this via RFC. Evaluate whether ADT has equivalent endpoints first.
Relevant packages:
adt-client,adt-cli13. 🔐 Authorization & SSL — strust, authorizations
sapcli reference:
strust,authorizationsInfrastructure management commands:
adt strust— SSL certificate management (upload/list/delete certificates)adt authorizations— authorization fields, objects, transactions, and defaultsRelevant packages:
adt-client,adt-cli14. 🏢 BSP, Fiori Launchpad, Feature Toggles, BAdI
sapcli reference:
bsp,flp,featuretoggle,badiLower priority but useful for complete coverage:
adt bsp— BSP application managementadt flp— Fiori Launchpad operationsadt featuretoggle— Feature Toggle managementadt badi— New-style BAdI (Enhancement) operations15. ⚙️ Multi-system Configuration — kubeconfig-style contexts
sapcli reference: configuration docs
sapcli supports a
~/.sapcli/config.ymlwith named connections, users, and contexts — enablingsapcli --context qa aunit run class zcl_foo.adt-clihas destinations but lacks context switching shorthand. Add:adt config use-context <name>— set active context--context <name>/ADTCLI_CONTEXT=<name>global flag for per-invocation override~/.adt/config.yml(or equivalent)Relevant packages:
adt-config,adt-cliPriority Recommendation
Notes
adkpackage already contains internal logic for many object types (create, lock, write, activate, delete). The primary work for subtasks feat(nx-cloud): set up nx workspace #1–[FEATURE] Quality Check Stage - ATC Integration with Multi-Platform Output #4 is adding the CLI layer on top of existingadkfunctionality.adt-exportandadt-plugin-abapgitpackages already provide checkout/checkin-like behavior — evaluate overlap before implementing Feature/abapgit serialization #9.startrfc, someusercommands) may not be feasible over ADT-only; document limitations where applicable.