sap-activate-object
Activates an inactive SAP repository object via SAP GUI Scripting. Routes to the correct transaction by object type: SE38 for reports/programs/function- group…
Diagnose SD condition-technique VOFM routines (pricing requirements + condition base/value formulas) — the notorious trap where a routine is registered but the generated include was never wired in by RV80HGEN, or the include+registry don't travel together in a transport, and you
$ npx -y skills add sapdev-ai/sap-dev --skill sap-vofm --agent claude-codeHow it fires
How this skill gets triggered: by you, by Claude, or both.
/sap-vofmContext preview
The summary Claude sees to decide when to auto-load this skill.
Diagnose SD condition-technique VOFM routines (pricing requirements + condition base/value formulas) — the notorious trap where a routine is registered but the generated include was never wired in by RV80HGEN, or the include+registry don't travel together in a transport, and you
name: sap-vofm description: | Diagnose SD condition-technique VOFM routines (pricing requirements + condition base/value formulas) — the notorious trap where a routine is registered but the generated include was never wired in by RV80HGEN, or the include+registry don't travel together in a transport, and you burn hours on "routine not found at runtime". `list <type>` enumerates a routine group from TFRM joined to PROGDIR existence/active state + frame-include membership; `check <type> <nnn>` proves one routine end-to-end (TFRM row, include exists+active, RV80HGEN wired it into the frame, transport completeness) → findings + GO/NO_GO; `explain <type> <nnn>` reads the routine include source over RFC and narrates it. Every verdict is an authoritative RFC re-read — screen text is never trusted. Read-only. create/update/ regen (GUI writes) are NEEDS_RECORDING (deferred to a /sap-gui-probe session). Prerequisites: /sap-login pinned profile; SAP NCo 3.1 (32-bit). argument-hint: "list <type> [--customer-only] [--max N] | check <type> <nnn> [--tr <TRKORR>] | explain <type> <nnn> (type: pricing-req | cond-base | cond-value)"
VOFM routines are a three-part trap: the body lives in a *generated* include, the routine only runs after **RV80HGEN** rewires the `*NNN` frame include, and the TFRM/TFRMT registry rows + the include don't travel cleanly in a transport without manual E071/E071K additions. This skill proves all three over RFC — no guessing, no trusting screen text.
Task: $ARGUMENTS
**Read-only** (`list`/`check`/`explain`). The write modes (`create`/`update`/`regen`) need a recorded VOFM GUI flow and are **not yet implemented** (see Scope).
---
| File | Token / call | Purpose | |---|---|---| | `<SAP_DEV_CORE_SHARED_DIR>/rules/skill_operating_rules.md` | *(rule)* | Mandatory operating rules | | `<SKILL_DIR>/references/vofm_routine_groups.tsv` | *(read)* | `type_key → GRPZE / frame_include / customer_prefix / standard_prefixes / range / verified` map | | `<SKILL_DIR>/references/sap_vofm_rfc.ps1` | `-Action list\|check\|resolve` | Read backend (TFRM/PROGDIR/DWINACTIV/E071/E071K + frame-membership scan) | | `<SAP_DEV_CORE_SHARED_DIR>/scripts/sap_rfc_read_source.ps1` | `Read-SapAbapSource` | `explain`: read the routine include source over RFC (RPY_PROGRAM_READ) | | `<SAP_DEV_CORE_SHARED_DIR>/scripts/sap_settings_lib.ps1` + `sap_connection_lib.ps1` | *(dot-source)* | `Get-SapWorkDir` | | `<SAP_DEV_CORE_SHARED_DIR>/scripts/sap_log_helper.ps1` | *(invoke)* | Start/step/end JSONL logging | | `<SAP_DEV_CORE_SHARED_DIR>/scripts/sap_artifact_lib.ps1` / `sap_finding_lib.ps1` | `%%ARTIFACT_LIB_PS1%% %%FINDING_LIB_PS1%%` | Register outputs + tri-state findings/verdict |
> The read backend connects to the **pinned** profile (`/sap-login`). Ships no GUI > VBS in v1 (the write modes will).
Resolve `work_dir`/`{RUN_TEMP}` via `Get-SapWorkDir`/`Get-SapRunTemp` (house one-liner), then start logging (`sap_log_helper.ps1 -Action start`, state `{RUN_TEMP}\sap_vofm_run.json`).
Modes: `list` | `check` | `explain` (read-only, implemented); `create` | `update` | `regen` (**NEEDS_RECORDING** — see Scope; refuse with that note). Read `<SKILL_DIR>/references/vofm_routine_groups.tsv` and resolve `<type>` (a friendly `type_key`, or a raw 4-char GRPZE). **Refuse an unknown type, or a `verified=NO` row, loudly** with the valid list — never guess a frame/prefix. From the resolved row take `grpze`, `frame_include`, `customer_prefix`, `standard_prefixes`, `customer_range`.
`<nnn>` for a write must lie inside `customer_range` (600–999) — outside → hard refuse `VOFM_RANGE_VIOLATION` (editing an SAP-numbered routine is a modification, out of scope). Read modes have no range gate (you may inspect any number).
**list** — enumerate the group:
C:\Windows\SysWOW64\WindowsPowerShell\v1.0\powershell.exe -ExecutionPolicy Bypass -File "<SKILL_DIR>\references\sap_vofm_rfc.ps1" -Action list -Grpze <GRPZE> -FrameInclude <FRAME> -CustomerPrefix <PFX> -StandardPrefixes "<p1,p2>" [-CustomerOnly] [-Max <n>] -OutFile "{RUN_TEMP}\vofm_list_<type>.tsv" -WorkDir "<work_dir>"Each `VOFM: grpno=<nnn> active=<Y|N> include=<name> exists=<Y|N> state=<A|I|-> registered=<Y|N|STD> text="…"` + `STATUS: OK total=<n> registered=<r> gaps=<g>`. **`registered=N` on a customer routine (≥600) is the headline finding** — it's in TFRM but RV80HGEN never wired its include into the frame (or it's deactivated): "routine not found at runtime". `registered=STD` = a standard SAP routine (frame membership via the customer frame is N/A).
**check** — prove one routine:
… sap_vofm_rfc.ps1 -Action check -Grpze <GRPZE> -Nnn <nnn> -FrameInclude <FRAME> -CustomerPrefix <PFX> -StandardPrefixes "<p1,p2>" [-Tr <TRKORR>] -WorkDir "<work_dir>"
Emits `VOFM_CHECK … tfrm=<PRESENT|ABSENT> active= include= exists= state= inactive_pending= registered= transport=<COMPLETE|GAP:..|NOT_CHECKED>`, `FINDING …` lines, and `VERDICT: <GO|GO_WITH_WARNINGS|NO_GO|NOT_FOUND>`. With `--tr <TRKORR>` it also checks transport completeness (E071 for the include + E071K for the TFRM/TFRMT keys) — a `GAP:` is a WARN with the manual SE01 "include objects" fix (v1 is detect-only; **never** writes E071/E071K). Map findings via `sap_finding_lib.ps1` (tri-state — a frame-read failure is `registered=?` → `COULD_NOT_CHECK`, never a pass).
**explain** — narrate a routine: 1. `-Action resolve -Grpze <GRPZE> -Nnn <nnn> -CustomerPrefix <PFX> -StandardPrefixes "<..>"` → the include name (`VOFM_RESOLVE nnn= include= exists= state=`). 2. If it exists, `Read-SapAbapSource -Name <include> -Type include` (shared reader) → read the FORM body. 3. Claude narrates purpose / inputs (KOMK/KO
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.
Repo: sapdev-ai/sap-dev
Activates an inactive SAP repository object via SAP GUI Scripting. Routes to the correct transaction by object type: SE38 for reports/programs/function- group…
Natural-language SAP API discovery over RFC (no GUI): turn a goal like "create a sales order" or "post a goods movement" into a ranked, trap-annotated,…
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), creates an ATC Run Series bound to…
Executes BDC (Batch Data Communication) sessions in SAP via RFC. Reads SHDB recording files from the bdc/ folder, connects via SAP NCo 3.1, calls…
Changes the package (TADIR-DEVCLASS) assignment of an SAP repository object via the "Object Directory Entry" dialog (Goto > Object Directory Entry). Routes by…
Validates ABAP source (report / program / FM / class / include) before deployment — one skill, dimension-dispatched: naming (variable conventions), type (DDIC…