sap-activate-object
Activates an inactive SAP repository object via SAP GUI Scripting. Routes to the correct transaction by object type: SE38 for…
Keyed, row-level RFC diff of ONE customizing table or view across two saved connection profiles (or two clients of one system) — the shareable answer to "it works in QAS but not in DEV/PRD". Resolves the object on both sides, computes the compared-field set (drops the technical
Claude Code
$ npx -y skills add sapdev-ai/sap-dev --skill sap-config-compare --agent claude-code
Codex
$ npx skills add sapdev-ai/sap-dev --skill sap-config-compare -a codex -y
Cursor
$ npx skills add sapdev-ai/sap-dev --skill sap-config-compare -a cursor -y
Gemini CLI
$ npx skills add sapdev-ai/sap-dev --skill sap-config-compare -a gemini-cli -y
GitHub Copilot
$ npx skills add sapdev-ai/sap-dev --skill sap-config-compare -a github-copilot -y
OpenCode
$ npx skills add sapdev-ai/sap-dev --skill sap-config-compare -a opencode -y
Windsurf
$ npx skills add sapdev-ai/sap-dev --skill sap-config-compare -a windsurf -y
name: sap-config-compare description: | Keyed, row-level RFC diff of ONE customizing table or view across two saved connection profiles (or two clients of one system) — the shareable answer to "it works in QAS but not in DEV/PRD". Resolves the object on both sides, computes the compared-field set (drops the technical client key for client-dependent tables, excludes unreadable/too-wide columns honestly), guards against an unbounded read, does a chunked offset-based read of each side, and runs the ONE shared keyed-diff engine to classify every key LEFT_ONLY / RIGHT_ONLY / CHANGED. Claude then translates the raw deltas into functional meaning using DDIC texts. Output is a diffable diff.tsv + summary, registered for /sap-evidence-pack. Read-only. Prerequisites: two profiles via /sap-login (pinned LEFT + --against RIGHT); SAP NCo 3.1 (32-bit). No GUI, no Z-object, no dev-init. argument-hint: "<TABLE|VIEW> --against <profile-hint> [--where \"F=V,F=A..B\"] [--fields F1,F2] [--keys-only] [--max-rows N]"
You answer **"why does this work there but not here?"** with a keyed, row-level diff of one customizing table/view between two systems (or two clients), read-only over RFC. SCU0/SCMP are GUI-bound and unshareable; two SE16 windows miss rows. This does the join deterministically and narrates the deltas in functional language.
Task: $ARGUMENTS
**You are read-only against BOTH systems.** No confirm gates, no TR, no GUI. All output stays local under `{work_dir}`.
---
| File | Token / call | Purpose | |---|---|---| | `<SAP_DEV_CORE_SHARED_DIR>/rules/skill_operating_rules.md` | *(rule)* | Mandatory operating rules — read-only here | | `<SKILL_DIR>/references/sap_config_compare_read.ps1` | `-Object -Against [-Where -Options -Fields -KeysOnly -MaxRows] -OutDir` | Dual-connect, object resolution, metadata, unbounded guard, chunked offset read | | `<SKILL_DIR>/references/sap_config_compare_diff.ps1` | `-LeftTsv -RightTsv -MetaJson -OutDir` | Offline keyed diff (dot-sources the shared engine) | | `<SAP_DEV_CORE_SHARED_DIR>/scripts/sap_keyed_diff_lib.ps1` | `%%KEYED_DIFF_LIB_PS1%%` | The ONE keyed row-diff engine (shared with /sap-se16n snapshot diff, /sap-compare) | | `<SAP_DEV_CORE_SHARED_DIR>/scripts/sap_connection_lib.ps1` / `sap_rfc_lib.ps1` / `sap_dpapi.ps1` | dot-sourced / subprocess | Profile resolution, RFC connect, RIGHT-password decrypt | | `<SAP_DEV_CORE_SHARED_DIR>/scripts/sap_artifact_lib.ps1` | Step 9 | Artifact index for /sap-evidence-pack |
---
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))"Set `{RUN_TEMP}` via `Get-SapRunTemp`. `{OUT}` = `Get-SapArtifactDir -ScopeKey CFG_<OBJECT> -Skill sap-config-compare` (manual scope key — the compared object is a TABL/VIEW).
powershell -ExecutionPolicy Bypass -File "<SAP_DEV_CORE_SHARED_DIR>\scripts\sap_log_helper.ps1" -Action start -StateFile "{RUN_TEMP}\sap_config_compare_run.json" -Skill sap-config-compare -ParamsJson "{}"---
Positional `<OBJECT>` (table or view, uppercased). Required `--against <hint>` (a /sap-login profile hint — `<SID>`, `<SID>/<CLIENT>`, description substring). Flags: `--where "F=V,F2=A..B"` (F=V → EQ, F=A..B → BETWEEN, comma = AND), `--options "<raw OPTIONS>"` (escape hatch; read-only predicate only — the engine refuses write keywords), `--fields F1,F2` (restrict compared columns; keys always included), `--keys-only` (diff key existence only; cap ×5), `--max-rows N` (default 10000, ceiling 100000). `--client NNN` (cross-client sugar — resolves `<LEFT_SID>/NNN`) and `preset <name>` are **v1.5/v2 (not implemented)** → say so and STOP.
LEFT = pinned profile; RIGHT = `--against`. The engine self-connects LEFT and resolves+connects RIGHT (DPAPI decrypt in-process). Identity per side is read LIVE (RFC_SYSTEM_INFO → SID, USR02 MANDT → logon client) — the profile store can be stale.
C:\Windows\SysWOW64\WindowsPowerShell\v1.0\powershell.exe -ExecutionPolicy Bypass -File "<SKILL_DIR>\references\sap_config_compare_read.ps1" -Object "<OBJECT>" -Against "<hint>" -SharedDir "<SAP_DEV_CORE_SHARED_DIR>" -OutDir "{OUT}"Add `-Where`, `-Options`, `-Fields`, `-KeysOnly`, `-MaxRows` as parsed. Parse:
IDENT: side=<L|R> sid=.. client=.. release=.. OBJECT: kind=<TABLE|VIEW_DB|VIEW_MAINT_BASE> read_target=<tbl> note="<..>" FIELDS: keys=.. compared=.. excluded=.. only_left=.. only_right=.. READ: side=<L|R> rows=.. capped=<Y|N> groups=.. STATUS: OK | CFG_OBJECT_NOT_FOUND | CFG_NO_COMMON_KEY | CFG_UNBOUNDED_READ | CFG_SAME_IDENTITY | RFC_LOGON_FAILED | RFC_ERROR
**Refusals (fail loud, STOP, log the class):**
re-run with `--where <field>=..` (echo the suggestion). Never a partial read.
The engine writes `left.tsv`, `right.tsv`, `meta.json`, `texts.tsv` into `{OUT}`. `kind=VIEW_MAINT_BASE` means a maintenance view was decomposed to its **primary base table** (RFC_READ_TABLE cannot read a maintenance view) — the `note`/`scope_notes` list the base tables NOT diffed; carry that caveat into the summary.
C:\Windows\SysWOW64\WindowsPowerShell\v1.0\powershell.exe -ExecutionPolicy Bypass -File "<SKILL_DIR>\references\sap_config_compa
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.