sap-activate-object
Activates an inactive SAP repository object via SAP GUI Scripting. Routes to the correct transaction by object type: SE38 for…
Runs SAP's Where-Used List (Verwendungsnachweis, Ctrl+Shift+F3) for any ABAP repository object across SE11, SE38, SE37, SE24, and SE91 — i.e. before deleting an object, find every program / class / FM / DDIC reference. Routes to the right initial screen by OBJECT_TYPE, fills the
Claude Code
$ npx -y skills add sapdev-ai/sap-dev --skill sap-where-used-list --agent claude-code
Codex
$ npx skills add sapdev-ai/sap-dev --skill sap-where-used-list -a codex -y
Cursor
$ npx skills add sapdev-ai/sap-dev --skill sap-where-used-list -a cursor -y
Gemini CLI
$ npx skills add sapdev-ai/sap-dev --skill sap-where-used-list -a gemini-cli -y
GitHub Copilot
$ npx skills add sapdev-ai/sap-dev --skill sap-where-used-list -a github-copilot -y
OpenCode
$ npx skills add sapdev-ai/sap-dev --skill sap-where-used-list -a opencode -y
Windsurf
$ npx skills add sapdev-ai/sap-dev --skill sap-where-used-list -a windsurf -y
name: sap-where-used-list description: | Runs SAP's Where-Used List (Verwendungsnachweis, Ctrl+Shift+F3) for any ABAP repository object across SE11, SE38, SE37, SE24, and SE91 — i.e. before deleting an object, find every program / class / FM / DDIC reference. Routes to the right initial screen by OBJECT_TYPE, fills the name, sends Ctrl+Shift+F3, ticks every scope on the popup, then branches: NOT_FOUND when SAP says no usages, FOUND_LIST when a list is rendered and the status bar is clean, SPOOL_CREATED:<num> when called with TO_SPOOL=X (so the operator can chain into /sap-sp02 to download the list), or INCONCLUSIVE when SAP answers with a message instead of a list — which is never reported as a usage verdict in either direction. Pure read-only — never modifies the SAP system. Prerequisites: Active SAP GUI session (use /sap-login first). argument-hint: "<OBJECT_TYPE> <OBJECT_NAME> [--to-spool]"
You run a Where-Used List against an ABAP repository object so the operator can see every reference before deleting / refactoring it. The skill is a thin GUI driver: it picks the right transaction by OBJECT_TYPE, fills the name field, sends `Ctrl+Shift+F3`, ticks "Select all" on the scope popup, and reports NOT_FOUND, FOUND_LIST, SPOOL_CREATED:<num>, or INCONCLUSIVE.
**A rendered screen is not evidence of usages.** Both verdicts this skill can get wrong are expensive: a false NOT_FOUND gets a referenced object deleted, a false FOUND_LIST tells a developer an object is still in use when it is not. So the reader only claims a usage list when the status bar is silent or `S`; every other MessageType is reported as INCONCLUSIVE with SAP's own message attached.
Task: $ARGUMENTS
---
| File | Token | Purpose | |---|---|---| | `<SAP_DEV_CORE_SHARED_DIR>/rules/skill_operating_rules.md` | *(rule)* | Mandatory operating rules | | `<SAP_DEV_CORE_SHARED_DIR>/rules/language_independence_rules.md` | *(rule)* | GUI-scripting language independence — identify by component ID + DDIC field name, status-bar checks via `MessageType` codes (S/W/E/I/A), VKey instead of menu-text, no branching on `.Text`/`.Tooltip`/window titles | | `<SKILL_DIR>/references/sap_where_used_list.vbs` | many | Multi-txn router + scope popup + optional Print-to-spool branch |
---
**Resolve `work_dir` via the env-aware helper** — do NOT take `work_dir` from a direct `settings.json` read (that ignores the `SAPDEV_AI_WORK_DIR` env var and `userconfig.json`). Use the `WORK_DIR=` value printed by:
powershell -NoProfile -ExecutionPolicy Bypass -Command ". '<SAP_DEV_CORE_SHARED_DIR>\scripts\sap_settings_lib.ps1'; . '<SAP_DEV_CORE_SHARED_DIR>\scripts\sap_connection_lib.ps1'; Write-Output ('WORK_DIR=' + (Get-SapWorkDir))"The settings note below still applies to the OTHER keys.
**Settings reads/writes follow `shared/rules/settings_lookup.md`** — merge per-key on the `.value` field (env var → `settings.local.json` → `userconfig.json` → `settings.json`); non-per-connection writes go to `userconfig.json`. | Setting | Default if blank | |---|---| | `work_dir` | `C:\sap_dev_work` |
Set `{WORK_TEMP}` = `{work_dir}\temp`. Ensure it exists:
cmd /c if not exist "{WORK_TEMP}" mkdir "{WORK_TEMP}"Set `{RUN_TEMP}` = the per-run scratch dir (`Get-SapRunTemp` mints + creates `{work_dir}\temp\run_<id>`):
powershell -NoProfile -ExecutionPolicy Bypass -Command ". '<SAP_DEV_CORE_SHARED_DIR>\scripts\sap_connection_lib.ps1'; Write-Output ('RUN_TEMP=' + (Get-SapRunTemp))"Per the CLAUDE.md "Two-bucket temp model" write this skill's generated scratch (`*_run.ps1` / `*_run.vbs` and the `_run.json` state) under `{RUN_TEMP}`; keep `{WORK_TEMP}` (base) only for `Get-SapCurrentSessionPath -WorkTemp`.
---
powershell -ExecutionPolicy Bypass -File "<SAP_DEV_CORE_SHARED_DIR>\scripts\sap_log_helper.ps1" -Action start -StateFile "{RUN_TEMP}\sap_where_used_list_run.json" -Skill sap-where-used-list -ParamsJson "{\"object_type\":\"<TYPE>\",\"object_name\":\"<NAME>\"}"Best-effort.
---
| Arg | Required | Notes | |---|---|---| | `OBJECT_TYPE` | yes | One of: `TABLE`, `VIEW`, `DATAELEMENT`, `STRUCTURE`, `TABLETYPE`, `TYPEGROUP`, `DOMAIN`, `SEARCHHELP`, `LOCKOBJECT` (→ SE11), `PROGRAM` (→ SE38), `FM` (→ SE37), `CLASS` / `INTERFACE` (→ SE24), `MESSAGE_CLASS` (→ SE91). | | `OBJECT_NAME` | yes | UPPERCASE repository name. | | `--to-spool` | no | Send the rendered list to a SAP spool so a follow-up `/sap-sp02` can download it. Default: leave the list on screen and just count usages. |
**Map OBJECT_TYPE → TXN.** This determines which initial screen the VBS opens and which name field it fills.
| OBJECT_TYPE | TXN | Name field | |---|---|---| | `TABLE` / `VIEW` / `DATAELEMENT` / `STRUCTURE` / `TABLETYPE` / `TYPEGROUP` / `DOMAIN` / `SEARCHHELP` / `LOCKOBJECT` | `SE11` | `ctxtRSRD1-<radio>_VAL` (radio + name field per type — same map as `/sap-se11` Step 6c) | | `PROGRAM` | `SE38` | `ctxtRS38M-PROGRAMM` | | `FM` | `SE37` | `ctxtRS38L-NAME` | | `CLASS` / `INTERFACE` | `SE24` | `ctxtSEOCLASS-CLSNAME` | | `MESSAGE_CLASS` | `SE91` | `ctxtRSDAG-ARBGB` |
**Trigger phrases:**
---
Run `/sap-login` if no session is active.
---
Map the operator's OBJECT_TYPE to the `TXN` token (see table above). For SE11 also set `OBJECT_TYPE` so the VBS picks the right radio. For all other transactions set `OBJECT_TYPE` empty.
Set `TO_SPOOL` to `X` if `--to-spool`, else leave empty.
Write `{RUN_TEMP}\sap_where_used_list_run.ps1`:
$skillDir = '<SKILL_DIR
SAP development automation skills for AI coding assistants. Windows-only — the skills drive SAP GUI for Windows via GUI Scripting (plus optional RFC via SAP NCo); there is no macOS/Linux path.
Activates an inactive SAP repository object via SAP GUI Scripting. Routes to the correct transaction by object type: SE38 for…
Natural-language SAP API discovery over RFC (no GUI): turn a goal like "create a sales order" or "post a goods movement" into a…
Runs the SAP ABAP Test Cockpit (ATC) end-to-end as a quality gate: builds an SCI Object Set scoped to the target object(s),…
Executes BDC (Batch Data Communication) sessions in SAP via RFC. Reads SHDB recording files from the bdc/ folder, connects via…
Changes the package (TADIR-DEVCLASS) assignment of an SAP repository object via the "Object Directory Entry" dialog (Goto >…
Validates ABAP source (report / program / FM / class / include) before deployment — one skill, dimension-dispatched: naming…
You MUST use this before any creative work - creating features, building components, adding functionality, modifying behavior, or…
Ask which skill or flow fits your situation. A router over the skills in this repo.