--- name: setup-abap-mirror description: Create a local abapGit-style mirror of an SAP package or object set so you can git-diff and search locally without round-tripping every read. Use when asked to "mirror this package locally", "set up local ABAP files", "create an abapGit-style mirror", or "pull these objects to disk for offline review". --- # Setup ABAP Mirror Create a local abapGit-style mirror of an SAP package or object set. Reads are authoritative from the SAP system; local files give you IDE context, `git diff`, and fast searching without round-tripping every time. This skill works today with ARC-1's existing `SAPRead` + `DEVC` primitives. When dedicated abapGit export tooling lands in ARC-1, the skill can be simplified — the file layout it produces is the target format either way. ## Smart Defaults (apply silently, do NOT ask) | Setting | Default | Rationale | |---|---|---| | Mirror root | `./mirror//src//` | Groups by system to support multi-system work | | File naming | abapGit conventions | Standard; future-proof | | Recurse sub-packages | Yes | Matches abapGit behaviour | | Include test classes | Yes | Tests belong with the class | | Include metadata XML | Skip for now | ARC-1 does not yet emit abapGit-format XML; source-only is useful and safe | ## Input One of the following scopes: - **Single object** — `name` + `type` (e.g., `ZCL_TRAVEL_HANDLER`, `CLAS`) - **Object list** — array of `{ type, name }` pairs - **Package** — `package` name; pulls everything inside Optionally: - **Mirror root** (default: `./mirror//src//`) - **Skip test classes** (default: include them) ## Prerequisites Before running, ensure `system-info.md` exists. If it doesn't: ``` → Run the bootstrap-system-context skill first ``` The mirror header references SID, system type, and release from `system-info.md`. ## Step 1: Resolve Scope Into An Object List ### 1a. For a package scope ``` SAPRead(type="DEVC", name="") ``` Returns `[{ type, name, description, uri }, ...]` where `type` is slash-form (`CLAS/OC`, `DDLS/DF`, `PROG/P`, `DEVC/K`, etc.). For each `DEVC/K` entry (sub-package): recurse — call `SAPRead(type="DEVC", name=)` and append its contents. Normalize slash-form types to the ARC-1 `SAPRead` short codes: | Slash form | SAPRead type | abapGit extension | |---|---|---| | `CLAS/OC` | `CLAS` | `.clas.abap` (+ `.clas.testclasses.abap`) | | `INTF/OI` | `INTF` | `.intf.abap` | | `PROG/P` | `PROG` | `.prog.abap` | | `FUGR/F` | `FUGR` | `.fugr.abap` (expanded includes) | | `FUNC/FF` | `FUNC` | `.func.abap` | | `DDLS/DF` | `DDLS` | `.ddls.asddls` | | `DCLS/DL` | `DCLS` | `.dcls.asdcls` | | `DDLX/EX` | `DDLX` | `.ddlx.asddlxs` | | `BDEF/BO` | `BDEF` | `.bdef.asbdef` | | `SRVD/SRV` | `SRVD` | `.srvd.asrvd` | | `SRVB/SVB` | `SRVB` | `.srvb.xml` | | `TABL/DT` | `TABL` | `.tabl.xml` | | `STRU/DS` | `STRU` | `.stru.xml` | | `DOMA/DD` | `DOMA` | `.doma.xml` | | `DTEL/DE` | `DTEL` | `.dtel.xml` | | `MSAG/N` | `MSAG` | `.msag.xml` | | `ENHO/EO` | `ENHO` | `.enho.xml` | Skip types not in this table; log them in a `skipped.md` in the mirror root. ### 1b. For a single object or object list Skip enumeration; proceed directly with the provided list. ## Step 2: Read Each Object For every resolved `{ type, name }`: ``` SAPRead(type="", name="") ``` For classes, also fetch test classes (unless skipped): ``` SAPRead(type="CLAS", name="", include="testclasses") ``` For function groups (on-prem only), expand includes: ``` SAPRead(type="FUGR", name="", expand_includes=true) ``` For DDLS, CLAS (structured), DCLS, DDLX — the plain source form is sufficient for mirroring; richer structured forms are for reading, not storage. Catch and continue on per-object errors — log failures in `skipped.md` with the error class (not-found / forbidden / not-released / connectivity) and move on. ## Step 3: Write Files In abapGit Layout Directory structure: ``` mirror// README.md ← written in Step 4 system-info.md ← copied or symlinked from bootstrap-system-context src/ / zcl_foo.clas.abap zcl_foo.clas.testclasses.abap zif_foo.intf.abap z_report.prog.abap zi_view.ddls.asddls zi_view_dcl.dcls.asdcls zc_view.ddlx.asddlxs zi_travel.bdef.asbdef ztable.tabl.xml zdomain.doma.xml zdtel.dtel.xml / ... skipped.md ← per-object errors and unsupported types ``` Rules: - Object names in filenames are **lowercased**. - Package names in path segments are lowercased. - Source files are written verbatim from SAP — do not reformat. - Overwrite existing files without prompting (SAP is the source of truth). ## Step 4: Write mirror//README.md ```markdown # Mirror: _Generated: _ · _Source: ARC-1_ This directory is a **read-only mirror** of selected ABAP objects from ****. The SAP system is the source of truth — edits here will NOT be pushed back automatically. To deploy local changes, use `SAPWrite` or a dedicated abapGit export/deploy tool. See [system-info.md](./system-info.md) for system identity and feature availability. ## Scope - Mode: - - - Objects mirrored: - Objects skipped: see [skipped.md](./skipped.md) ## Layout - `src//` — abapGit-style object files - `skipped.md` — objects that failed to read or aren't supported yet ## Refreshing Re-run the `setup-abap-mirror` skill with the same scope. Files are overwritten. ``` ## Step 5: Summarize To The User Report in 4-6 lines: - SID mirrored, scope (single/list/package) - Object counts by type (e.g., `5 CLAS, 12 DDLS, 3 BDEF`) - Skipped/failed count with pointer to `skipped.md` - Mirror root path ## Error Handling | Error | Cause | Fix | |---|---|---| | DEVC read returns 404 | Package does not exist | Ask user to verify the package name via `SAPSearch` | | Per-object read fails | Auth / not-released / not-found | Log in `skipped.md`, continue with the rest | | Sub-package recursion loops | Circular reference (rare) | Track visited package names; skip duplicates | | FUGR `expand_includes` fails | On-prem feature, endpoint unavailable | Fall back to `expand_includes=false`; log as partial | | Source body empty | Generated proxy or inactive object | Write empty file with a comment header; log in `skipped.md` | | `system-info.md` missing | Skill dependency | Run `bootstrap-system-context` first, then retry | ## Notes ### What This Skill Does NOT Do - **No deploy** — local edits are not pushed back. Use `SAPWrite` or a future abapGit deploy action. - **No metadata XML in abapGit format** — ARC-1 currently returns source text; XML-based object metadata (TABL definitions, DOMA fixed values, class attributes) is emitted as JSON or XML from SAP's native form, not the abapGit `object.xml` convention. That's enough for reading and `git diff`, not enough for a full abapGit pull-push round trip. - **No concurrency** — object reads are sequential to stay within SAP work-process budgets. ### When To Use This Skill - Onboarding a new team member to an existing codebase - Preparing for a migration where you need to grep locally across many objects - Snapshotting a system before a support package upgrade - Feeding local context into an AI assistant that cannot call MCP tools for every read ### When NOT To Use This Skill - For single ad-hoc reads — just call `SAPRead` directly - When you need a full abapGit round-trip (mirror + deploy back) — wait for native abapGit support - On production systems where SAP read load is a concern — large package mirrors issue hundreds of requests ### BTP vs On-Premise - **BTP**: fewer object types will appear in DEVC listings (no PROG, INCL, FUGR). The normalization table above handles this — unsupported types are just absent. - **On-prem**: the full type range applies; legacy types not in the table are logged in `skipped.md` and can be added to ARC-1 over time. ### Future-Proofing This skill produces abapGit-compatible layout today using existing primitives. When ARC-1 gains a dedicated abapGit export action, the internals change but the output directory remains recognizable to any abapGit-aware tool.