abapgit-agent 1.14.5 → 1.15.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/abap/CLAUDE.md CHANGED
@@ -96,7 +96,7 @@ Never assume Z/Y prefix without checking.
96
96
  ```
97
97
  ❌ WRONG: Only write the .abap source file
98
98
  ✅ CORRECT: Every object needs both a source file AND an XML metadata file
99
- XML-only objects (TABL, STRU, DTEL, TTYP) need ONLY the XML file
99
+ XML-only objects (TABL, STRU, DTEL, TTYP, DOMA, MSAG) need ONLY the XML file
100
100
  ```
101
101
 
102
102
  Use the object name from `objects.local.md` (or `objects.md` as fallback) in place of `<name>`:
@@ -107,10 +107,14 @@ Use the object name from `objects.local.md` (or `objects.md` as fallback) in pla
107
107
  | Interface (INTF) | `<name>.intf.abap` | `<name>.intf.xml` |
108
108
  | Program (PROG) | `<name>.prog.abap` | `<name>.prog.xml` |
109
109
  | CDS View (DDLS) | `<name>.ddls.asddls` | `<name>.ddls.xml` |
110
+ | CDS Access Control (DCLS) | `<name>.dcls.asdcls` | `<name>.dcls.xml` |
111
+ | Function Group (FUGR) | `<name>.fugr.abap` + includes | `<name>.fugr.xml` |
110
112
  | Table (TABL) | *(none)* | `<name>.tabl.xml` |
111
113
  | Structure (STRU) | *(none)* | `<name>.stru.xml` |
112
114
  | Data Element (DTEL) | *(none)* | `<name>.dtel.xml` |
113
115
  | Table Type (TTYP) | *(none)* | `<name>.ttyp.xml` |
116
+ | Domain (DOMA) | *(none)* | `<name>.doma.xml` |
117
+ | Message Class (MSAG) | *(none)* | `<name>.msag.xml` |
114
118
 
115
119
  **Package assignment — determine the package, then follow the confirmation rule below:**
116
120
 
@@ -155,7 +159,7 @@ Anything else (SAP namespace object, or SAP-delivered package)?
155
159
  > **Tip for project setup**: Add package rules to `objects.local.md` so Claude never
156
160
  > needs to ask. See `guidelines/objects.md` for examples.
157
161
 
158
- → For exact XML templates: `abapgit-agent ref --topic abapgit`
162
+ → For exact XML templates: `abapgit-agent ref --topic abapgit` (CLAS/INTF/PROG/DDLS/DCLS/FUGR) or `abapgit-agent ref --topic abapgit-xml-only` (TABL/STRU/DTEL/TTYP/DOMA/MSAG)
159
163
  → For local helper/test-double class files: `abapgit-agent ref --topic object-creation`
160
164
 
161
165
  ---
@@ -288,6 +292,23 @@ abapgit-agent view --objects ZCL_UNKNOWN_CLASS --full
288
292
  # View FULL source with dual line numbers (for setting breakpoints)
289
293
  # G [N] code — G = global line for debug set, [N] = include-relative
290
294
  abapgit-agent view --objects ZCL_UNKNOWN_CLASS --full --lines
295
+
296
+ # View table/structure fields
297
+ abapgit-agent view --objects SFLIGHT --type TABL
298
+ abapgit-agent view --objects MY_STRUC --type STRU
299
+
300
+ # View data element or domain
301
+ abapgit-agent view --objects S_CARR_ID --type DTEL
302
+ abapgit-agent view --objects XFELD --type DOMA
303
+
304
+ # View message class (all messages)
305
+ abapgit-agent view --objects SY --type MSAG
306
+
307
+ # View function group (function module list)
308
+ abapgit-agent view --objects SUSR --type FUGR
309
+
310
+ # View CDS access control source
311
+ abapgit-agent view --objects SEPM_E_SALESORDER --type DCLS
291
312
  ```
292
313
 
293
314
  **Example workflow for AI:**
@@ -447,6 +468,12 @@ abapgit-agent view --objects ZCL_FOO --full --lines
447
468
  * ---- Method: ZIF_BAR~DO_IT — breakpoint: debug set --objects ZCL_FOO:5 --include locals_imp ----
448
469
  ```
449
470
 
471
+ **Function module (FUGR) methods:** use `--full --fm <name> --lines` — the hint uses the include name as the object:
472
+ ```bash
473
+ abapgit-agent view --objects SUSR --type FUGR --full --fm AUTHORITY_CHECK --lines
474
+ # Output: * ---- FM: AUTHORITY_CHECK (LSUSRU04) — breakpoint: debug set --objects LSUSRU04:50 ----
475
+ ```
476
+
450
477
  ```bash
451
478
  # Regular method:
452
479
  abapgit-agent debug set --objects ZCL_FOO:90
@@ -454,6 +481,8 @@ abapgit-agent debug set --objects ZCL_FOO:90
454
481
  abapgit-agent debug set --objects ZCL_FOO:12 --include testclasses
455
482
  # Local class method:
456
483
  abapgit-agent debug set --objects ZCL_FOO:5 --include locals_imp
484
+ # Function module (use include name, no --include flag needed):
485
+ abapgit-agent debug set --objects LSUSRU04:50
457
486
  ```
458
487
 
459
488
  Minimal correct sequence:
@@ -677,7 +706,7 @@ Modified ABAP files?
677
706
  │ └─ Dependent files (interface + class, class uses class)?
678
707
  │ └─ ✅ Use: skip syntax → [abaplint] → commit → push → pull --sync-xml
679
708
  └─ Other types (FUGR, TABL, STRU, DTEL, TTYP, etc.)?
680
- ├─ XML-only objects (TABL, STRU, DTEL, TTYP)?
709
+ ├─ XML-only objects (TABL, STRU, DTEL, TTYP, DOMA, MSAG)?
681
710
  │ └─ ✅ Use: skip syntax → [abaplint] → commit → push → pull --files abap/ztable.tabl.xml --sync-xml
682
711
  └─ FUGR and other complex objects?
683
712
  └─ ✅ Use: skip syntax → [abaplint] → commit → push → pull --sync-xml → (if errors: inspect)
@@ -713,7 +742,8 @@ Detailed guidelines are available in the `guidelines/` folder:
713
742
  | `guidelines/objects.md` | Object Naming Conventions (defaults) |
714
743
  | `guidelines/objects.local.md` | **Project** Naming Conventions — overrides `objects.md` (created by `init`, never overwritten) |
715
744
  | `guidelines/json.md` | JSON Handling |
716
- | `guidelines/abapgit.md` | abapGit XML Metadata Templates |
745
+ | `guidelines/abapgit.md` | abapGit XML Metadata Templates — CLAS, INTF, PROG, DDLS, DCLS, FUGR |
746
+ | `guidelines/abapgit-xml-only.md` | abapGit XML Metadata Templates — XML-only objects (TABL, STRU, DTEL, TTYP, DOMA, MSAG) |
717
747
  | `guidelines/unit-testable-code.md` | Unit Testable Code Guidelines (Dependency Injection) |
718
748
  | `guidelines/common-errors.md` | Common ABAP Errors - Quick Fixes |
719
749
  | `guidelines/debug-session.md` | Debug Session Guide |
@@ -0,0 +1,159 @@
1
+ ---
2
+ layout: default
3
+ title: abapGit XML Metadata — Function Group (FUGR)
4
+ nav_order: 11
5
+ parent: ABAP Coding Guidelines
6
+ grand_parent: ABAP Development
7
+ ---
8
+
9
+ # abapGit XML Metadata — Function Group (FUGR)
10
+
11
+ **Searchable keywords**: function group xml, fugr, function module, fm, abapgit, sapl, lzmy
12
+
13
+ > **CRITICAL: Always write XML files with a UTF-8 BOM (`\ufeff`) as the very first character**, before `<?xml ...`.
14
+ > Without the BOM, abapGit shows the object as **"M" (modified)** after every pull.
15
+
16
+ ---
17
+
18
+ A FUGR with group name `ZMY_FUGR` and one FM `ZMY_MY_FUNCTION` requires these files:
19
+
20
+ | File | Purpose |
21
+ |---|---|
22
+ | `zmy_fugr.fugr.xml` | Main XML: group description, includes list, FM interfaces |
23
+ | `zmy_fugr.fugr.lzmy_fugrtop.abap` | TOP include source |
24
+ | `zmy_fugr.fugr.lzmy_fugrtop.xml` | TOP include metadata (`SUBC=I`) |
25
+ | `zmy_fugr.fugr.saplzmy_fugr.abap` | Main include source |
26
+ | `zmy_fugr.fugr.saplzmy_fugr.xml` | Main include metadata (`SUBC=F`) |
27
+ | `zmy_fugr.fugr.zmy_my_function.abap` | FM source (one file per FM, named after FM in lowercase) |
28
+
29
+ ---
30
+
31
+ ### `zmy_fugr.fugr.xml`
32
+
33
+ ```xml
34
+ <?xml version="1.0" encoding="utf-8"?>
35
+ <abapGit version="v1.0.0" serializer="LCL_OBJECT_FUGR" serializer_version="v1.0.0">
36
+ <asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">
37
+ <asx:values>
38
+ <AREAT>My function group description</AREAT>
39
+ <INCLUDES>
40
+ <SOBJ_NAME>LZMY_FUGRTOP</SOBJ_NAME>
41
+ <SOBJ_NAME>SAPLZMY_FUGR</SOBJ_NAME>
42
+ </INCLUDES>
43
+ <FUNCTIONS>
44
+ <item>
45
+ <FUNCNAME>ZMY_MY_FUNCTION</FUNCNAME>
46
+ <SHORT_TEXT>Short description of the FM</SHORT_TEXT>
47
+ <IMPORT>
48
+ <RSIMP>
49
+ <PARAMETER>IV_INPUT</PARAMETER>
50
+ <TYP>STRING</TYP>
51
+ </RSIMP>
52
+ <RSIMP>
53
+ <PARAMETER>IV_OPTIONAL</PARAMETER>
54
+ <DEFAULT>&apos;&apos;</DEFAULT>
55
+ <OPTIONAL>X</OPTIONAL>
56
+ <TYP>FLAG</TYP>
57
+ </RSIMP>
58
+ </IMPORT>
59
+ <EXPORT>
60
+ <RSEXP>
61
+ <PARAMETER>EV_RESULT</PARAMETER>
62
+ <TYP>STRING</TYP>
63
+ </RSEXP>
64
+ </EXPORT>
65
+ <EXCEPTION>
66
+ <RSEXC>
67
+ <EXCEPTION>ERROR</EXCEPTION>
68
+ </RSEXC>
69
+ </EXCEPTION>
70
+ </item>
71
+ </FUNCTIONS>
72
+ </asx:values>
73
+ </asx:abap>
74
+ </abapGit>
75
+ ```
76
+
77
+ ### `zmy_fugr.fugr.lzmy_fugrtop.abap`
78
+
79
+ ```abap
80
+ FUNCTION-POOL zmy_fugr. "MESSAGE-ID ..
81
+ ```
82
+
83
+ ### `zmy_fugr.fugr.lzmy_fugrtop.xml`
84
+
85
+ ```xml
86
+ <?xml version="1.0" encoding="utf-8"?>
87
+ <abapGit version="v1.0.0">
88
+ <asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">
89
+ <asx:values>
90
+ <PROGDIR>
91
+ <NAME>LZMY_FUGRTOP</NAME>
92
+ <SUBC>I</SUBC>
93
+ <FIXPT>X</FIXPT>
94
+ <UCCHECK>X</UCCHECK>
95
+ </PROGDIR>
96
+ </asx:values>
97
+ </asx:abap>
98
+ </abapGit>
99
+ ```
100
+
101
+ ### `zmy_fugr.fugr.saplzmy_fugr.abap`
102
+
103
+ ```abap
104
+ INCLUDE LZMY_FUGRTOP.
105
+ INCLUDE LZMY_FUGRU01.
106
+ ```
107
+
108
+ One `INCLUDE` line per FM (`U01`, `U02`, …), plus `LZMY_FUGRTOP` at the top.
109
+
110
+ ### `zmy_fugr.fugr.saplzmy_fugr.xml`
111
+
112
+ ```xml
113
+ <?xml version="1.0" encoding="utf-8"?>
114
+ <abapGit version="v1.0.0">
115
+ <asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">
116
+ <asx:values>
117
+ <PROGDIR>
118
+ <NAME>SAPLZMY_FUGR</NAME>
119
+ <SUBC>F</SUBC>
120
+ <RLOAD>E</RLOAD>
121
+ <FIXPT>X</FIXPT>
122
+ <UCCHECK>X</UCCHECK>
123
+ </PROGDIR>
124
+ </asx:values>
125
+ </asx:abap>
126
+ </abapGit>
127
+ ```
128
+
129
+ ### `zmy_fugr.fugr.zmy_my_function.abap`
130
+
131
+ ```abap
132
+ FUNCTION zmy_my_function.
133
+ *"----------------------------------------------------------------------
134
+ *"*"Local Interface:
135
+ *" IMPORTING
136
+ *" VALUE(IV_INPUT) TYPE STRING
137
+ *" EXPORTING
138
+ *" VALUE(EV_RESULT) TYPE STRING
139
+ *" EXCEPTIONS
140
+ *" ERROR
141
+ *"----------------------------------------------------------------------
142
+
143
+ " implementation
144
+
145
+ ENDFUNCTION.
146
+ ```
147
+
148
+ ---
149
+
150
+ ## Key Rules
151
+
152
+ - **Include naming**: TOP = `L<GROUP>TOP`, main = `SAPL<GROUP>` — uppercase in XML and filenames
153
+ - **FM source file**: named after the FM in **lowercase** (`zmy_my_function.abap`, not `ZMY_MY_FUNCTION.abap`)
154
+ - **`INCLUDES` list** in the main XML: only lists TOP and SAPL includes — FM source includes are implicit
155
+ - **`REMOTE_CALL>R`**: add only for RFC-enabled FMs; omit for local FMs
156
+ - **Optional parameters**: include both `<OPTIONAL>X</OPTIONAL>` and `<DEFAULT>...</DEFAULT>`
157
+ - **`DOCUMENTATION` section**: omit entirely if no parameter descriptions needed — missing docs cause no diff
158
+ - **Screens/CUA**: omit `DYNPROS`/`CUA` sections for screenless function groups
159
+ - **Multiple FMs**: add one `<item>` per FM in `FUNCTIONS`; add one `INCLUDE` line per FM in the SAPL source
@@ -0,0 +1,397 @@
1
+ ---
2
+ layout: default
3
+ title: abapGit XML Metadata — XML-Only Objects
4
+ nav_order: 10
5
+ parent: ABAP Coding Guidelines
6
+ grand_parent: ABAP Development
7
+ ---
8
+
9
+ # abapGit XML Metadata — XML-Only Objects (TABL, STRU, DTEL, TTYP, DOMA, MSAG)
10
+
11
+ XML templates for ABAP Dictionary objects that have no `.abap` source file — TABL, STRU, DTEL, TTYP, DOMA, and message classes (MSAG).
12
+
13
+ > **CRITICAL: Always write XML files with a UTF-8 BOM (`\ufeff`) as the very first character**, before `<?xml ...`.
14
+ > Without the BOM, abapGit shows the object as **"M" (modified)** after every pull.
15
+
16
+ > **CRITICAL: Only include fields that abapGit's serializer actually writes. Never add fields with
17
+ > default values.** Extra fields cause a permanent "M" (modified) diff.
18
+
19
+ > **For CLAS, INTF, PROG, DDLS, DCLS, FUGR** (have source files): see `abapgit-agent ref --topic abapgit`
20
+ > **For DDLS, DCLS** (CDS — have source files): also see `abapgit-agent ref --topic abapgit`
21
+
22
+ **Searchable keywords**: table xml, structure xml, data element xml, table type xml, domain xml, message class xml, tabl, stru, dtel, ttyp, doma, msag, dictionary
23
+
24
+ ---
25
+
26
+ ### Table (TABL)
27
+
28
+ **Filename**: `src/zmy_table.tabl.xml`
29
+
30
+ > Pull with: `pull --files src/zmy_table.tabl.xml`
31
+
32
+ ```xml
33
+ <?xml version="1.0" encoding="utf-8"?>
34
+ <abapGit version="v1.0.0" serializer="LCL_OBJECT_TABL" serializer_version="v1.0.0">
35
+ <asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">
36
+ <asx:values>
37
+ <DD02V>
38
+ <TABNAME>ZMY_TABLE</TABNAME>
39
+ <DDLANGUAGE>E</DDLANGUAGE>
40
+ <TABCLASS>TRANSP</TABCLASS>
41
+ <DDTEXT>Description of the table</DDTEXT>
42
+ <CONTFLAG>A</CONTFLAG>
43
+ </DD02V>
44
+ </asx:values>
45
+ </asx:abap>
46
+ </abapGit>
47
+ ```
48
+
49
+ **Key Fields**:
50
+ - `TABNAME`: Table name
51
+ - `DDTEXT`: Description (**not** `DESCRIPT`)
52
+ - `TABCLASS`: `TRANSP`=Transparent (most common), `POOL`, `CLUSTER`
53
+ - `CONTFLAG`: Delivery class — `A`=Application, `C`=Customizing, `S`=System, `G`=Customizing protected
54
+
55
+ **Note**: When abapGit serializes a table it also writes `<DD09L>` (technical settings) and `<DD03P_TABLE>` (field definitions). You only need the `<DD02V>` header when creating a new table; the rest is generated on pull.
56
+
57
+ **`DD03P` field-level rules** (apply when editing an existing table XML that includes `<DD03P_TABLE>`): include `<SHLPORIGIN>D</SHLPORIGIN>` on fields where the Dictionary provides value help (domain with fixed values or search help); omit otherwise. For raw-type fields (no `ROLLNAME`, e.g. `CHAR`, `NUMC`), the serializer writes `<MASK>` **before** `<DDTEXT>`. For fields with a `ROLLNAME`, only `ROLLNAME` appears. Wrong order or missing `SHLPORIGIN` causes a permanent diff.
58
+
59
+ #### Text Tables and Foreign Keys
60
+
61
+ A **text table** stores translatable texts for another table (the "main table"). It shares the same key fields plus a language field (`SPRAS`/`LANGU`).
62
+
63
+ **Recognition markers:** `<DD09L><UEBERSETZ>X</UEBERSETZ>` (text table) and `<DD08V><FRKART>TEXT</FRKART>` (text-table FK). Three required sections: `DD03P_TABLE` (fields), `DD05M_TABLE` (FK field mappings — one per main-table key, all anchored to `MANDT`), `DD08V_TABLE` (FK relationship).
64
+
65
+ **Example — text table `ZMY_TABLE_T` for main table `ZMY_TABLE` (keys: MANDT, ID1, ID2):**
66
+
67
+ ```xml
68
+ <?xml version="1.0" encoding="utf-8"?>
69
+ <abapGit version="v1.0.0" serializer="LCL_OBJECT_TABL" serializer_version="v1.0.0">
70
+ <asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">
71
+ <asx:values>
72
+ <DD02V>
73
+ <TABNAME>ZMY_TABLE_T</TABNAME>
74
+ <DDLANGUAGE>E</DDLANGUAGE>
75
+ <TABCLASS>TRANSP</TABCLASS>
76
+ <CLIDEP>X</CLIDEP>
77
+ <DDTEXT>My Table: Texts</DDTEXT>
78
+ <CONTFLAG>C</CONTFLAG>
79
+ </DD02V>
80
+ <DD09L>
81
+ <TABNAME>ZMY_TABLE_T</TABNAME>
82
+ <AS4LOCAL>A</AS4LOCAL>
83
+ <TABKAT>0</TABKAT>
84
+ <TABART>APPL0</TABART>
85
+ <UEBERSETZ>X</UEBERSETZ>
86
+ <BUFALLOW>N</BUFALLOW>
87
+ </DD09L>
88
+ <DD03P_TABLE>
89
+ <DD03P>
90
+ <FIELDNAME>MANDT</FIELDNAME>
91
+ <KEYFLAG>X</KEYFLAG>
92
+ <ROLLNAME>MANDT</ROLLNAME>
93
+ <CHECKTABLE>ZMY_TABLE</CHECKTABLE>
94
+ <ADMINFIELD>0</ADMINFIELD>
95
+ <NOTNULL>X</NOTNULL>
96
+ <SHLPORIGIN>P</SHLPORIGIN>
97
+ <COMPTYPE>E</COMPTYPE>
98
+ </DD03P>
99
+ <DD03P>
100
+ <FIELDNAME>ID1</FIELDNAME>
101
+ <KEYFLAG>X</KEYFLAG>
102
+ <ROLLNAME>ZMY_ID1</ROLLNAME>
103
+ <ADMINFIELD>0</ADMINFIELD>
104
+ <NOTNULL>X</NOTNULL>
105
+ <COMPTYPE>E</COMPTYPE>
106
+ </DD03P>
107
+ <DD03P>
108
+ <FIELDNAME>SPRAS</FIELDNAME>
109
+ <KEYFLAG>X</KEYFLAG>
110
+ <ROLLNAME>SPRAS</ROLLNAME>
111
+ <ADMINFIELD>0</ADMINFIELD>
112
+ <NOTNULL>X</NOTNULL>
113
+ <COMPTYPE>E</COMPTYPE>
114
+ </DD03P>
115
+ <DD03P>
116
+ <FIELDNAME>DESCRIPTION</FIELDNAME>
117
+ <ROLLNAME>ZMY_DESCRIPTION</ROLLNAME>
118
+ <ADMINFIELD>0</ADMINFIELD>
119
+ <COMPTYPE>E</COMPTYPE>
120
+ </DD03P>
121
+ </DD03P_TABLE>
122
+ <DD05M_TABLE>
123
+ <DD05M>
124
+ <FIELDNAME>MANDT</FIELDNAME>
125
+ <FORTABLE>ZMY_TABLE_T</FORTABLE>
126
+ <FORKEY>MANDT</FORKEY>
127
+ <CHECKTABLE>ZMY_TABLE</CHECKTABLE>
128
+ <CHECKFIELD>MANDT</CHECKFIELD>
129
+ <PRIMPOS>0001</PRIMPOS>
130
+ <DOMNAME>MANDT</DOMNAME>
131
+ <DATATYPE>CLNT</DATATYPE>
132
+ </DD05M>
133
+ <DD05M>
134
+ <FIELDNAME>MANDT</FIELDNAME>
135
+ <FORTABLE>ZMY_TABLE_T</FORTABLE>
136
+ <FORKEY>ID1</FORKEY>
137
+ <CHECKTABLE>ZMY_TABLE</CHECKTABLE>
138
+ <CHECKFIELD>ID1</CHECKFIELD>
139
+ <PRIMPOS>0002</PRIMPOS>
140
+ <DATATYPE>CHAR</DATATYPE>
141
+ </DD05M>
142
+ <!-- repeat for each remaining key field (ID2, etc.) -->
143
+ </DD05M_TABLE>
144
+ <DD08V_TABLE>
145
+ <DD08V>
146
+ <FIELDNAME>MANDT</FIELDNAME>
147
+ <CHECKTABLE>ZMY_TABLE</CHECKTABLE>
148
+ <FRKART>TEXT</FRKART>
149
+ <CARD>CN</CARD>
150
+ <CARDLEFT>1</CARDLEFT>
151
+ </DD08V>
152
+ </DD08V_TABLE>
153
+ </asx:values>
154
+ </asx:abap>
155
+ </abapGit>
156
+ ```
157
+
158
+ **Key rules:**
159
+ - Always activate the main table **before** the text table — foreign key check requires the main table to exist
160
+ - Language field can be `SPRAS` (data element `SPRAS`) or `LANGU` (data element `LANGU`)
161
+ - For an **ordinary foreign key**: same structure, but omit `<FRKART>TEXT</FRKART>` from `DD08V`
162
+
163
+ ---
164
+
165
+ ---
166
+
167
+ ### Data Element (DTEL)
168
+
169
+ **Filename**: `src/zmy_dtel.dtel.xml`
170
+
171
+ > Pull with: `pull --files src/zmy_dtel.dtel.xml`
172
+
173
+ ```xml
174
+ <?xml version="1.0" encoding="utf-8"?>
175
+ <abapGit version="v1.0.0" serializer="LCL_OBJECT_DTEL" serializer_version="v1.0.0">
176
+ <asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">
177
+ <asx:values>
178
+ <DD04V>
179
+ <ROLLNAME>ZMY_DTEL</ROLLNAME>
180
+ <DDLANGUAGE>E</DDLANGUAGE>
181
+ <DDTEXT>Description of data element</DDTEXT>
182
+ <REPTEXT>Description</REPTEXT>
183
+ <SCRTEXT_S>Short text</SCRTEXT_S>
184
+ <SCRTEXT_M>Medium text</SCRTEXT_M>
185
+ <SCRTEXT_L>Long description text</SCRTEXT_L>
186
+ <DTELMASTER>E</DTELMASTER>
187
+ <DATATYPE>CHAR</DATATYPE>
188
+ <LENG>000010</LENG>
189
+ </DD04V>
190
+ </asx:values>
191
+ </asx:abap>
192
+ </abapGit>
193
+ ```
194
+
195
+ **Key Fields**:
196
+ - `ROLLNAME`: Data element name
197
+ - `DDTEXT`: Description (**not** `DESCRIPT`)
198
+ - `REPTEXT` / `SCRTEXT_S` / `SCRTEXT_M` / `SCRTEXT_L`: Field labels (report heading, short, medium, long)
199
+ - `DTELMASTER`: Language key for label master (`E` for English)
200
+ - `DATATYPE`: Data type (`CHAR`, `NUMC`, `DATS`, `TIMS`, `INT4`, etc.)
201
+ - `LENG`: Length padded to 6 digits (e.g. `000010` for 10 characters)
202
+
203
+ **Omit `<PARAMID>`** unless you specifically need a SET/GET parameter ID — the serializer omits it when empty.
204
+
205
+ ---
206
+
207
+ ### Structure (STRU)
208
+
209
+ **Filename**: `src/zmy_struct.stru.xml`
210
+
211
+ > abapGit uses the same TABL serializer for STRU.
212
+ > Pull with: `pull --files src/zmy_struct.stru.xml`
213
+
214
+ ```xml
215
+ <?xml version="1.0" encoding="utf-8"?>
216
+ <abapGit version="v1.0.0" serializer="LCL_OBJECT_TABL" serializer_version="v1.0.0">
217
+ <asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">
218
+ <asx:values>
219
+ <DD02V>
220
+ <TABNAME>ZMY_STRUCT</TABNAME>
221
+ <DDLANGUAGE>E</DDLANGUAGE>
222
+ <TABCLASS>INTTAB</TABCLASS>
223
+ <DDTEXT>Description of the structure</DDTEXT>
224
+ <CONTFLAG>A</CONTFLAG>
225
+ </DD02V>
226
+ </asx:values>
227
+ </asx:abap>
228
+ </abapGit>
229
+ ```
230
+
231
+ **Key difference from TABL**: `TABCLASS` is `INTTAB` (internal table / structure) instead of `TRANSP`.
232
+
233
+ **Note**: Like TABL, after the first pull abapGit expands the XML with `<DD03P_TABLE>` field definitions.
234
+
235
+ ---
236
+
237
+ ### Table Type (TTYP)
238
+
239
+ **Filename**: `src/zmy_ttyp.ttyp.xml`
240
+
241
+ > Pull with: `pull --files src/zmy_ttyp.ttyp.xml`
242
+
243
+ ```xml
244
+ <?xml version="1.0" encoding="utf-8"?>
245
+ <abapGit version="v1.0.0" serializer="LCL_OBJECT_TTYP" serializer_version="v1.0.0">
246
+ <asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">
247
+ <asx:values>
248
+ <DD40V>
249
+ <TYPENAME>ZMY_TTYP</TYPENAME>
250
+ <DDLANGUAGE>E</DDLANGUAGE>
251
+ <DDTEXT>Description of table type</DDTEXT>
252
+ <ROWTYPE>ZMY_STRUCT</ROWTYPE>
253
+ <ROWKIND>S</ROWKIND>
254
+ <DATATYPE>TABLE_T</DATATYPE>
255
+ <ACCESSMODE>T</ACCESSMODE>
256
+ <KEYDEF>D</KEYDEF>
257
+ <KEYKIND>N</KEYKIND>
258
+ </DD40V>
259
+ </asx:values>
260
+ </asx:abap>
261
+ </abapGit>
262
+ ```
263
+
264
+ **Key Fields**:
265
+ - `TYPENAME`: Table type name
266
+ - `ROWTYPE`: Row type (a structure or data element name)
267
+ - `ROWKIND`: Row kind — `S`=Structure/Type, `D`=Data element, `R`=Reference
268
+ - `DATATYPE`: Always `TABLE_T` for table types
269
+ - `ACCESSMODE`: Table kind — `T`=Standard, `S`=Sorted, `H`=Hashed
270
+ - `KEYDEF`: Key definition — `D`=Default (standard key), `K`=User-defined
271
+ - `KEYKIND`: Key uniqueness — `N`=Non-unique, `U`=Unique
272
+
273
+ **Note**: After the first pull abapGit may expand the XML with `<DD42V>` (key field definitions).
274
+
275
+ ---
276
+
277
+ ### Domain (DOMA)
278
+
279
+ **Filename**: `src/zmy_domain.doma.xml`
280
+
281
+ > Pull with: `pull --files src/zmy_domain.doma.xml`
282
+
283
+ abapGit uses the view `DD01V` as the root element (not `DD01L`). The serializer reads from the system view.
284
+
285
+ **Simple domain (no fixed values):**
286
+
287
+ ```xml
288
+ <?xml version="1.0" encoding="utf-8"?>
289
+ <abapGit version="v1.0.0" serializer="LCL_OBJECT_DOMA" serializer_version="v1.0.0">
290
+ <asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">
291
+ <asx:values>
292
+ <DD01V>
293
+ <DOMNAME>ZMY_DOMAIN</DOMNAME>
294
+ <DDLANGUAGE>E</DDLANGUAGE>
295
+ <DATATYPE>CHAR</DATATYPE>
296
+ <LENG>000030</LENG>
297
+ <OUTPUTLEN>000030</OUTPUTLEN>
298
+ <DDTEXT>My domain description</DDTEXT>
299
+ </DD01V>
300
+ </asx:values>
301
+ </asx:abap>
302
+ </abapGit>
303
+ ```
304
+
305
+ **Domain with fixed values** (add `<VALEXI>X</VALEXI>` and `<DD07V_TAB>`):
306
+
307
+ ```xml
308
+ <?xml version="1.0" encoding="utf-8"?>
309
+ <abapGit version="v1.0.0" serializer="LCL_OBJECT_DOMA" serializer_version="v1.0.0">
310
+ <asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">
311
+ <asx:values>
312
+ <DD01V>
313
+ <DOMNAME>ZMY_STATUS</DOMNAME>
314
+ <DDLANGUAGE>E</DDLANGUAGE>
315
+ <DATATYPE>CHAR</DATATYPE>
316
+ <LENG>000001</LENG>
317
+ <OUTPUTLEN>000001</OUTPUTLEN>
318
+ <VALEXI>X</VALEXI>
319
+ <DDTEXT>Status</DDTEXT>
320
+ </DD01V>
321
+ <DD07V_TAB>
322
+ <DD07V>
323
+ <VALPOS>0001</VALPOS>
324
+ <DDLANGUAGE>E</DDLANGUAGE>
325
+ <DOMVALUE_L>A</DOMVALUE_L>
326
+ <DDTEXT>Active</DDTEXT>
327
+ </DD07V>
328
+ <DD07V>
329
+ <VALPOS>0002</VALPOS>
330
+ <DDLANGUAGE>E</DDLANGUAGE>
331
+ <DOMVALUE_L>I</DOMVALUE_L>
332
+ <DDTEXT>Inactive</DDTEXT>
333
+ </DD07V>
334
+ </DD07V_TAB>
335
+ </asx:values>
336
+ </asx:abap>
337
+ </abapGit>
338
+ ```
339
+
340
+ **Key Fields**:
341
+ - `DOMNAME`: Domain name
342
+ - `DDTEXT`: Description (**not** `DESCRIPT`)
343
+ - `DATATYPE`: ABAP data type (`CHAR`, `NUMC`, `DATS`, `TIMS`, `INT4`, `STRG`, etc.)
344
+ - `LENG`: Length padded to 6 digits (omit for `STRG`/`INT4` — no fixed length)
345
+ - `OUTPUTLEN`: Output length (usually same as `LENG`; omit for `STRG`)
346
+ - `LOWERCASE`: `X` if lowercase input is allowed (omit if not)
347
+ - `VALEXI`: `X` if the domain has fixed values — required when `DD07V_TAB` is present
348
+ - `ENTITYTAB`: Value table name (check table for valid values — omit if none)
349
+
350
+ **Note**: After pull the serializer may add `<I18N_LANGS>`, `<DD01_TEXTS>`, `<DD07_TEXTS>` for translations — do not write these manually.
351
+
352
+ ---
353
+
354
+ ### Message Class (MSAG)
355
+
356
+ **Filename**: `src/zmy_msgs.msag.xml`
357
+
358
+ > Pull with: `pull --files src/zmy_msgs.msag.xml`
359
+
360
+ ```xml
361
+ <?xml version="1.0" encoding="utf-8"?>
362
+ <abapGit version="v1.0.0" serializer="LCL_OBJECT_MSAG" serializer_version="v1.0.0">
363
+ <asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">
364
+ <asx:values>
365
+ <T100A>
366
+ <ARBGB>ZMY_MSGS</ARBGB>
367
+ <MASTERLANG>E</MASTERLANG>
368
+ <STEXT>My message class description</STEXT>
369
+ </T100A>
370
+ <T100>
371
+ <T100>
372
+ <SPRSL>E</SPRSL>
373
+ <ARBGB>ZMY_MSGS</ARBGB>
374
+ <MSGNR>000</MSGNR>
375
+ <TEXT>Object &1 not found</TEXT>
376
+ </T100>
377
+ <T100>
378
+ <SPRSL>E</SPRSL>
379
+ <ARBGB>ZMY_MSGS</ARBGB>
380
+ <MSGNR>001</MSGNR>
381
+ <TEXT>Operation completed successfully</TEXT>
382
+ </T100>
383
+ </T100>
384
+ </asx:values>
385
+ </asx:abap>
386
+ </abapGit>
387
+ ```
388
+
389
+ **Key Fields**:
390
+ - `T100A/ARBGB`: Message class name (same as filename stem)
391
+ - `T100A/MASTERLANG`: Master language (`E` for English)
392
+ - `T100A/STEXT`: Short description of the message class
393
+ - `T100/SPRSL`: Language key
394
+ - `T100/MSGNR`: 3-digit message number (`000`–`999`)
395
+ - `T100/TEXT`: Message text — use `&1`–`&4` for placeholders (serialized as `&amp;1`–`&amp;4` in XML)
396
+
397
+ **Note**: The `<T100>` wrapper contains repeated `<T100>` child elements — one per message.