abapgit-agent 1.0.0

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.
Files changed (53) hide show
  1. package/.abapGitAgent.example +11 -0
  2. package/API.md +271 -0
  3. package/CLAUDE.md +445 -0
  4. package/CLAUDE_MEM.md +88 -0
  5. package/ERROR_HANDLING.md +30 -0
  6. package/INSTALL.md +160 -0
  7. package/README.md +127 -0
  8. package/abap/CLAUDE.md +492 -0
  9. package/abap/package.devc.xml +10 -0
  10. package/abap/zcl_abgagt_agent.clas.abap +769 -0
  11. package/abap/zcl_abgagt_agent.clas.xml +15 -0
  12. package/abap/zcl_abgagt_cmd_factory.clas.abap +43 -0
  13. package/abap/zcl_abgagt_cmd_factory.clas.xml +15 -0
  14. package/abap/zcl_abgagt_command_inspect.clas.abap +192 -0
  15. package/abap/zcl_abgagt_command_inspect.clas.testclasses.abap +121 -0
  16. package/abap/zcl_abgagt_command_inspect.clas.xml +16 -0
  17. package/abap/zcl_abgagt_command_pull.clas.abap +80 -0
  18. package/abap/zcl_abgagt_command_pull.clas.testclasses.abap +87 -0
  19. package/abap/zcl_abgagt_command_pull.clas.xml +16 -0
  20. package/abap/zcl_abgagt_command_unit.clas.abap +297 -0
  21. package/abap/zcl_abgagt_command_unit.clas.xml +15 -0
  22. package/abap/zcl_abgagt_resource_health.clas.abap +25 -0
  23. package/abap/zcl_abgagt_resource_health.clas.xml +15 -0
  24. package/abap/zcl_abgagt_resource_inspect.clas.abap +62 -0
  25. package/abap/zcl_abgagt_resource_inspect.clas.xml +15 -0
  26. package/abap/zcl_abgagt_resource_pull.clas.abap +71 -0
  27. package/abap/zcl_abgagt_resource_pull.clas.xml +15 -0
  28. package/abap/zcl_abgagt_resource_unit.clas.abap +64 -0
  29. package/abap/zcl_abgagt_resource_unit.clas.xml +15 -0
  30. package/abap/zcl_abgagt_rest_handler.clas.abap +27 -0
  31. package/abap/zcl_abgagt_rest_handler.clas.xml +15 -0
  32. package/abap/zcl_abgagt_util.clas.abap +93 -0
  33. package/abap/zcl_abgagt_util.clas.testclasses.abap +84 -0
  34. package/abap/zcl_abgagt_util.clas.xml +16 -0
  35. package/abap/zif_abgagt_agent.intf.abap +134 -0
  36. package/abap/zif_abgagt_agent.intf.xml +15 -0
  37. package/abap/zif_abgagt_cmd_factory.intf.abap +7 -0
  38. package/abap/zif_abgagt_cmd_factory.intf.xml +15 -0
  39. package/abap/zif_abgagt_command.intf.abap +21 -0
  40. package/abap/zif_abgagt_command.intf.xml +15 -0
  41. package/abap/zif_abgagt_util.intf.abap +28 -0
  42. package/abap/zif_abgagt_util.intf.xml +15 -0
  43. package/bin/abapgit-agent +902 -0
  44. package/img/claude.png +0 -0
  45. package/package.json +31 -0
  46. package/scripts/claude-integration.js +351 -0
  47. package/scripts/test-integration.js +139 -0
  48. package/src/abap-client.js +314 -0
  49. package/src/agent.js +119 -0
  50. package/src/config.js +66 -0
  51. package/src/index.js +48 -0
  52. package/src/logger.js +39 -0
  53. package/src/server.js +116 -0
@@ -0,0 +1,93 @@
1
+ "* Use this source text module for the class definition
2
+ CLASS zcl_abgagt_util DEFINITION PUBLIC FINAL CREATE PUBLIC.
3
+ PUBLIC SECTION.
4
+ INTERFACES zif_abgagt_util.
5
+ CLASS-METHODS get_instance
6
+ RETURNING VALUE(ro_util) TYPE REF TO zcl_abgagt_util.
7
+ PRIVATE SECTION.
8
+ DATA mv_log TYPE string.
9
+ DATA mv_has_error TYPE abap_bool.
10
+ ENDCLASS.
11
+
12
+ CLASS zcl_abgagt_util IMPLEMENTATION.
13
+ METHOD get_instance.
14
+ DATA lo_util TYPE REF TO zcl_abgagt_util.
15
+ CREATE OBJECT lo_util.
16
+ ro_util = lo_util.
17
+ ENDMETHOD.
18
+
19
+ METHOD zif_abgagt_util~parse_file_to_object.
20
+ " Parse file path to extract obj_type and obj_name
21
+ " Example: "zcl_my_class.clas.abap" -> CLAS, ZCL_MY_CLASS
22
+ " Example: "src/zcl_my_class.clas.abap" -> CLAS, ZCL_MY_CLASS
23
+
24
+ DATA lv_upper TYPE string.
25
+ lv_upper = iv_file.
26
+ TRANSLATE lv_upper TO UPPER CASE.
27
+
28
+ " Split filename by '.' to get parts
29
+ DATA lt_parts TYPE TABLE OF string.
30
+ SPLIT lv_upper AT '.' INTO TABLE lt_parts.
31
+ DATA lv_part_count TYPE i.
32
+ lv_part_count = lines( lt_parts ).
33
+
34
+ IF lv_part_count < 3.
35
+ RETURN.
36
+ ENDIF.
37
+
38
+ " Last part should be 'ABAP' for verification
39
+ READ TABLE lt_parts INDEX lv_part_count INTO DATA(lv_last).
40
+ IF lv_last <> 'ABAP'.
41
+ RETURN.
42
+ ENDIF.
43
+
44
+ " First part is obj_name (may contain path), second part is obj_type
45
+ DATA lv_obj_name TYPE string.
46
+ DATA lv_obj_type_raw TYPE string.
47
+ READ TABLE lt_parts INDEX 1 INTO lv_obj_name.
48
+ READ TABLE lt_parts INDEX 2 INTO lv_obj_type_raw.
49
+
50
+ " Convert file extension to object type
51
+ CASE lv_obj_type_raw.
52
+ WHEN 'CLAS' OR 'CLASS'.
53
+ ev_obj_type = 'CLAS'.
54
+ WHEN 'INTF' OR 'INTERFACE'.
55
+ ev_obj_type = 'INTF'.
56
+ WHEN 'PROG' OR 'PROGRAM'.
57
+ ev_obj_type = 'PROG'.
58
+ WHEN 'FUGR' OR 'FUGROUP'.
59
+ ev_obj_type = 'FUGR'.
60
+ WHEN 'TABL' OR 'TABLE'.
61
+ ev_obj_type = 'TABL'.
62
+ WHEN 'DDLS'.
63
+ ev_obj_type = 'DDLS'.
64
+ WHEN OTHERS.
65
+ ev_obj_type = lv_obj_type_raw.
66
+ ENDCASE.
67
+
68
+ " Extract file name from obj_name (remove path prefix)
69
+ DATA lv_len TYPE i.
70
+ lv_len = strlen( lv_obj_name ).
71
+ DATA lv_offs TYPE i.
72
+ lv_offs = find( val = reverse( lv_obj_name ) sub = '/' ).
73
+ IF lv_offs > 0.
74
+ lv_offs = lv_len - lv_offs - 1.
75
+ lv_obj_name = lv_obj_name+lv_offs.
76
+ ENDIF.
77
+
78
+ " Remove leading '/' if present
79
+ IF lv_obj_name(1) = '/'.
80
+ lv_obj_name = lv_obj_name+1.
81
+ ENDIF.
82
+
83
+ ev_obj_name = lv_obj_name.
84
+ ENDMETHOD.
85
+
86
+ METHOD zif_abgagt_util~check_log_for_errors.
87
+ rv_has_error = mv_has_error.
88
+ ENDMETHOD.
89
+
90
+ METHOD zif_abgagt_util~get_log_detail.
91
+ rv_detail = mv_log.
92
+ ENDMETHOD.
93
+ ENDCLASS.
@@ -0,0 +1,84 @@
1
+ *"* use this source file for your test class implementation
2
+ *"* local test class
3
+ CLASS ltcl_zcl_abgagt_util DEFINITION FOR TESTING DURATION SHORT RISK LEVEL HARMLESS.
4
+ PRIVATE SECTION.
5
+ DATA mo_util TYPE REF TO zcl_abgagt_util.
6
+
7
+ METHODS setup.
8
+ METHODS test_parse_clas FOR TESTING.
9
+ METHODS test_parse_intf FOR TESTING.
10
+ METHODS test_parse_with_path FOR TESTING.
11
+ METHODS test_parse_invalid FOR TESTING.
12
+ ENDCLASS.
13
+
14
+ CLASS ltcl_zcl_abgagt_util IMPLEMENTATION.
15
+
16
+ METHOD setup.
17
+ mo_util = zcl_abgagt_util=>get_instance( ).
18
+ ENDMETHOD.
19
+
20
+ METHOD test_parse_clas.
21
+ " Test parsing CLAS file
22
+ DATA lv_obj_type TYPE string.
23
+ DATA lv_obj_name TYPE string.
24
+
25
+ mo_util->zif_abgagt_util~parse_file_to_object(
26
+ EXPORTING iv_file = 'zcl_my_class.clas.abap'
27
+ IMPORTING ev_obj_type = lv_obj_type
28
+ ev_obj_name = lv_obj_name ).
29
+
30
+ cl_abap_unit_assert=>assert_equals(
31
+ act = lv_obj_type exp = 'CLAS' msg = 'Object type should be CLAS' ).
32
+ cl_abap_unit_assert=>assert_equals(
33
+ act = lv_obj_name exp = 'ZCL_MY_CLASS' msg = 'Object name mismatch' ).
34
+ ENDMETHOD.
35
+
36
+ METHOD test_parse_intf.
37
+ " Test parsing INTF file
38
+ DATA lv_obj_type TYPE string.
39
+ DATA lv_obj_name TYPE string.
40
+
41
+ mo_util->zif_abgagt_util~parse_file_to_object(
42
+ EXPORTING iv_file = 'zif_my_intf.intf.abap'
43
+ IMPORTING ev_obj_type = lv_obj_type
44
+ ev_obj_name = lv_obj_name ).
45
+
46
+ cl_abap_unit_assert=>assert_equals(
47
+ act = lv_obj_type exp = 'INTF' msg = 'Object type should be INTF' ).
48
+ cl_abap_unit_assert=>assert_equals(
49
+ act = lv_obj_name exp = 'ZIF_MY_INTF' msg = 'Object name mismatch' ).
50
+ ENDMETHOD.
51
+
52
+ METHOD test_parse_with_path.
53
+ " Test parsing file with path
54
+ DATA lv_obj_type TYPE string.
55
+ DATA lv_obj_name TYPE string.
56
+
57
+ mo_util->zif_abgagt_util~parse_file_to_object(
58
+ EXPORTING iv_file = 'src/zcl_my_class.clas.abap'
59
+ IMPORTING ev_obj_type = lv_obj_type
60
+ ev_obj_name = lv_obj_name ).
61
+
62
+ cl_abap_unit_assert=>assert_equals(
63
+ act = lv_obj_type exp = 'CLAS' msg = 'Object type should be CLAS' ).
64
+ cl_abap_unit_assert=>assert_equals(
65
+ act = lv_obj_name exp = 'ZCL_MY_CLASS' msg = 'Path should be stripped' ).
66
+ ENDMETHOD.
67
+
68
+ METHOD test_parse_invalid.
69
+ " Test parsing invalid file (should return empty)
70
+ DATA lv_obj_type TYPE string.
71
+ DATA lv_obj_name TYPE string.
72
+
73
+ mo_util->zif_abgagt_util~parse_file_to_object(
74
+ EXPORTING iv_file = 'invalid_file.txt'
75
+ IMPORTING ev_obj_type = lv_obj_type
76
+ ev_obj_name = lv_obj_name ).
77
+
78
+ cl_abap_unit_assert=>assert_initial(
79
+ act = lv_obj_type msg = 'Invalid file should return empty type' ).
80
+ cl_abap_unit_assert=>assert_initial(
81
+ act = lv_obj_name msg = 'Invalid file should return empty name' ).
82
+ ENDMETHOD.
83
+
84
+ ENDCLASS.
@@ -0,0 +1,16 @@
1
+ <?xml version="1.0" encoding="utf-8"?>
2
+ <abapGit version="v1.0.0" serializer="LCL_OBJECT_CLAS" serializer_version="v1.0.0">
3
+ <asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">
4
+ <asx:values>
5
+ <VSEOCLASS>
6
+ <CLSNAME>ZCL_ABGAGT_UTIL</CLSNAME>
7
+ <LANGU>E</LANGU>
8
+ <DESCRIPT>Utility Class for ABAP Git Agent</DESCRIPT>
9
+ <EXPOSURE>2</EXPOSURE>
10
+ <STATE>1</STATE>
11
+ <UNICODE>X</UNICODE>
12
+ <WITH_UNIT_TESTS>X</WITH_UNIT_TESTS>
13
+ </VSEOCLASS>
14
+ </asx:values>
15
+ </asx:abap>
16
+ </abapGit>
@@ -0,0 +1,134 @@
1
+ " TODO: Implement detailed syntax error parsing
2
+ " When a syntax error occurs, the log shows the affected object name
3
+ " but not the specific line/column. For better error reporting:
4
+ " - Parse the error message to extract object info
5
+ " - For syntax errors, query SEPSA or TRINT_OBJECT_LOG for details
6
+ " - Return structured error with line numbers and fix suggestions
7
+
8
+ INTERFACE zif_abgagt_agent PUBLIC.
9
+
10
+ TYPES: BEGIN OF ty_object,
11
+ type TYPE string,
12
+ id TYPE string,
13
+ number TYPE string,
14
+ text TYPE string,
15
+ obj_type TYPE string,
16
+ obj_name TYPE string,
17
+ exception TYPE string,
18
+ END OF ty_object.
19
+
20
+ TYPES: ty_object_list TYPE STANDARD TABLE OF ty_object WITH NON-UNIQUE DEFAULT KEY.
21
+
22
+ TYPES: BEGIN OF ty_result,
23
+ success TYPE abap_bool,
24
+ job_id TYPE string,
25
+ message TYPE string,
26
+ error_detail TYPE string,
27
+ transport_request TYPE string,
28
+ activated_count TYPE i,
29
+ failed_count TYPE i,
30
+ log_messages TYPE ty_object_list,
31
+ activated_objects TYPE ty_object_list,
32
+ failed_objects TYPE ty_object_list,
33
+ started_at TYPE timestampl,
34
+ finished_at TYPE timestampl,
35
+ END OF ty_result.
36
+
37
+ TYPES: BEGIN OF ty_pull_params,
38
+ url TYPE string,
39
+ branch TYPE string,
40
+ username TYPE string,
41
+ password TYPE string,
42
+ package TYPE devclass,
43
+ folder_logic TYPE string,
44
+ create_new TYPE abap_bool,
45
+ END OF ty_pull_params.
46
+
47
+ " Types for inspect (syntax check)
48
+ TYPES: BEGIN OF ty_error,
49
+ line TYPE string,
50
+ column TYPE string,
51
+ text TYPE string,
52
+ word TYPE string,
53
+ END OF ty_error.
54
+
55
+ TYPES ty_errors TYPE STANDARD TABLE OF ty_error WITH NON-UNIQUE DEFAULT KEY.
56
+
57
+ TYPES: BEGIN OF ty_inspect_result,
58
+ success TYPE abap_bool,
59
+ object_type TYPE string,
60
+ object_name TYPE string,
61
+ error_count TYPE i,
62
+ errors TYPE ty_errors,
63
+ END OF ty_inspect_result.
64
+
65
+ " Types for unit tests
66
+ TYPES: BEGIN OF ty_test_result,
67
+ object_type TYPE string,
68
+ object_name TYPE string,
69
+ test_method TYPE string,
70
+ status TYPE string,
71
+ message TYPE string,
72
+ line TYPE string,
73
+ END OF ty_test_result.
74
+
75
+ TYPES ty_test_results TYPE STANDARD TABLE OF ty_test_result WITH NON-UNIQUE DEFAULT KEY.
76
+
77
+ TYPES: BEGIN OF ty_unit_result,
78
+ success TYPE abap_bool,
79
+ message TYPE string,
80
+ test_count TYPE i,
81
+ passed_count TYPE i,
82
+ failed_count TYPE i,
83
+ results TYPE ty_test_results,
84
+ END OF ty_unit_result.
85
+
86
+ TYPES: BEGIN OF ty_object_key,
87
+ object_type TYPE string,
88
+ object_name TYPE string,
89
+ END OF ty_object_key.
90
+
91
+ TYPES ty_object_keys TYPE STANDARD TABLE OF ty_object_key WITH NON-UNIQUE DEFAULT KEY.
92
+
93
+ TYPES: ty_log_table TYPE TABLE OF string.
94
+ TYPES: ty_job_status TYPE string.
95
+
96
+ CONSTANTS:
97
+ gc_status_pending TYPE ty_job_status VALUE 'PENDING',
98
+ gc_status_running TYPE ty_job_status VALUE 'RUNNING',
99
+ gc_status_completed TYPE ty_job_status VALUE 'COMPLETED',
100
+ gc_status_failed TYPE ty_job_status VALUE 'FAILED'.
101
+
102
+ METHODS pull
103
+ IMPORTING
104
+ iv_url TYPE string
105
+ iv_branch TYPE string DEFAULT 'main'
106
+ iv_username TYPE string OPTIONAL
107
+ iv_password TYPE string OPTIONAL
108
+ iv_transport_request TYPE string OPTIONAL
109
+ it_files TYPE string_table OPTIONAL
110
+ RETURNING
111
+ VALUE(rs_result) TYPE ty_result
112
+ RAISING
113
+ zcx_abapgit_exception.
114
+
115
+ METHODS get_repo_status
116
+ IMPORTING
117
+ iv_url TYPE string
118
+ RETURNING
119
+ VALUE(rv_status) TYPE string.
120
+
121
+ METHODS inspect
122
+ IMPORTING
123
+ iv_file TYPE string
124
+ RETURNING
125
+ VALUE(rs_result) TYPE ty_inspect_result.
126
+
127
+ METHODS run_tests
128
+ IMPORTING
129
+ iv_package TYPE devclass OPTIONAL
130
+ it_objects TYPE ty_object_keys OPTIONAL
131
+ RETURNING
132
+ VALUE(rs_result) TYPE ty_unit_result.
133
+
134
+ ENDINTERFACE.
@@ -0,0 +1,15 @@
1
+ <?xml version="1.0" encoding="utf-8"?>
2
+ <abapGit version="v1.0.0" serializer="LCL_OBJECT_INTF" serializer_version="v1.0.0">
3
+ <asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">
4
+ <asx:values>
5
+ <VSEOINTERF>
6
+ <CLSNAME>ZIF_ABGAGT_AGENT</CLSNAME>
7
+ <LANGU>E</LANGU>
8
+ <DESCRIPT>Interface for ABAP Git Agent</DESCRIPT>
9
+ <EXPOSURE>2</EXPOSURE>
10
+ <STATE>1</STATE>
11
+ <UNICODE>X</UNICODE>
12
+ </VSEOINTERF>
13
+ </asx:values>
14
+ </asx:abap>
15
+ </abapGit>
@@ -0,0 +1,7 @@
1
+ "* Use this source text module for the interface definition
2
+ "! <p class="shorttext synchronized">Command Factory Interface for ABAP Git Agent</p>
3
+ INTERFACE zif_abgagt_cmd_factory PUBLIC.
4
+ METHODS get_command
5
+ IMPORTING iv_command TYPE string
6
+ RETURNING VALUE(ro_command) TYPE REF TO zif_abgagt_command.
7
+ ENDINTERFACE.
@@ -0,0 +1,15 @@
1
+ <?xml version="1.0" encoding="utf-8"?>
2
+ <abapGit version="v1.0.0" serializer="LCL_OBJECT_INTF" serializer_version="v1.0.0">
3
+ <asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">
4
+ <asx:values>
5
+ <VSEOINTERF>
6
+ <CLSNAME>ZIF_ABGAGT_CMD_FACTORY</CLSNAME>
7
+ <LANGU>E</LANGU>
8
+ <DESCRIPT>Command Factory Interface for ABAP Git Agent</DESCRIPT>
9
+ <EXPOSURE>2</EXPOSURE>
10
+ <STATE>1</STATE>
11
+ <UNICODE>X</UNICODE>
12
+ </VSEOINTERF>
13
+ </asx:values>
14
+ </asx:abap>
15
+ </abapGit>
@@ -0,0 +1,21 @@
1
+ "* Use this source text module for the interface definition
2
+ "! <p class="shorttext synchronized">Command Interface for ABAP Git Agent</p>
3
+ INTERFACE zif_abgagt_command PUBLIC.
4
+
5
+ CONSTANTS:
6
+ gc_pull TYPE string VALUE 'PULL',
7
+ gc_inspect TYPE string VALUE 'INSPECT',
8
+ gc_unit TYPE string VALUE 'UNIT'.
9
+
10
+ " Get command name
11
+ METHODS get_name
12
+ RETURNING VALUE(rv_name) TYPE string.
13
+
14
+ " Execute command with optional parameters
15
+ " @parameter is_param | Generic parameters (structure varies by command)
16
+ " @parameter rv_result | JSON result string
17
+ METHODS execute
18
+ IMPORTING is_param TYPE data OPTIONAL
19
+ RETURNING VALUE(rv_result) TYPE string.
20
+
21
+ ENDINTERFACE.
@@ -0,0 +1,15 @@
1
+ <?xml version="1.0" encoding="utf-8"?>
2
+ <abapGit version="v1.0.0" serializer="LCL_OBJECT_INTF" serializer_version="v1.0.0">
3
+ <asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">
4
+ <asx:values>
5
+ <VSEOINTERF>
6
+ <CLSNAME>ZIF_ABGAGT_COMMAND</CLSNAME>
7
+ <LANGU>E</LANGU>
8
+ <DESCRIPT>Command Interface for ABAP Git Agent</DESCRIPT>
9
+ <EXPOSURE>2</EXPOSURE>
10
+ <STATE>1</STATE>
11
+ <UNICODE>X</UNICODE>
12
+ </VSEOINTERF>
13
+ </asx:values>
14
+ </asx:abap>
15
+ </abapGit>
@@ -0,0 +1,28 @@
1
+ "* Use this source text module for the interface definition
2
+ "! <p class="shorttext synchronized">Utility Interface for ABAP Git Agent</p>
3
+ INTERFACE zif_abgagt_util PUBLIC.
4
+
5
+ "! Parse file name to extract object type and name
6
+ "! @parameter iv_file | File name (e.g., 'zcl_my_class.clas.abap')
7
+ "! @parameter ev_obj_type | Object type (e.g., 'CLAS')
8
+ "! @parameter ev_obj_name | Object name (e.g., 'ZCL_MY_CLASS')
9
+ METHODS parse_file_to_object
10
+ IMPORTING
11
+ iv_file TYPE string
12
+ EXPORTING
13
+ ev_obj_type TYPE string
14
+ ev_obj_name TYPE string.
15
+
16
+ "! Check activation log for errors
17
+ "! @return rv_has_error | ABAP_TRUE if errors found
18
+ METHODS check_log_for_errors
19
+ RETURNING
20
+ VALUE(rv_has_error) TYPE abap_bool.
21
+
22
+ "! Get detailed log information
23
+ "! @return rv_detail | Detailed log message
24
+ METHODS get_log_detail
25
+ RETURNING
26
+ VALUE(rv_detail) TYPE string.
27
+
28
+ ENDINTERFACE.
@@ -0,0 +1,15 @@
1
+ <?xml version="1.0" encoding="utf-8"?>
2
+ <abapGit version="v1.0.0" serializer="LCL_OBJECT_INTF" serializer_version="v1.0.0">
3
+ <asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">
4
+ <asx:values>
5
+ <VSEOINTERF>
6
+ <CLSNAME>ZIF_ABGAGT_UTIL</CLSNAME>
7
+ <LANGU>E</LANGU>
8
+ <DESCRIPT>Utility Interface for ABAP Git Agent</DESCRIPT>
9
+ <EXPOSURE>2</EXPOSURE>
10
+ <STATE>1</STATE>
11
+ <UNICODE>X</UNICODE>
12
+ </VSEOINTERF>
13
+ </asx:values>
14
+ </asx:abap>
15
+ </abapGit>