{"id":"4bdda9b2-174d-4edf-82a1-a5d31b33467e","shortId":"4yxs6W","kind":"skill","title":"clean-abap","tagline":"Check ABAP code for compliance with Clean ABAP principles. Use this skill when users ask to check, validate, review, or analyze ABAP code for clean code compliance, code quality, best practices, or adherence to Clean ABAP guidelines. Triggers include requests like \"check this ABA","description":"# Clean ABAP\n\nThis skill provides comprehensive checking of ABAP code against Clean ABAP principles, based on the Clean ABAP style guide which adapts Robert C. Martin's Clean Code for ABAP.\n\n## How to Use This Skill\n\nWhen checking ABAP code for Clean ABAP compliance:\n\n1. **Read the code** provided by the user\n2. **Categorize issues** by Clean ABAP sections (Names, Language, Constants, Variables, Tables, Strings, Booleans, Conditions, Ifs, Classes, Methods, Error Handling, Comments, Formatting, Testing)\n3. **Identify violations** with specific line references when available\n4. **Provide actionable recommendations** with code examples showing both the problem and the clean solution\n5. **Prioritize issues** by impact (critical, major, minor)\n\n## Check Categories\n\n### 1. Names\n\n**Key Principles:**\n- Use descriptive names that convey content and meaning\n- Prefer solution domain and problem domain terms\n- Use pronounceable names\n- Use snake_case consistently\n- Avoid abbreviations unless necessary\n- Use nouns for classes, verbs for methods\n- Avoid noise words like \"data\", \"info\", \"object\"\n- Pick one word per concept\n- Avoid encodings (Hungarian notation, prefixes like iv_, rv_, lt_)\n- Avoid obscuring built-in functions\n\n**Check for:**\n- Non-descriptive variable/method/class names (e.g., `data1`, `temp`, `x`)\n- Inconsistent abbreviations across the code\n- Mixed naming conventions (not snake_case)\n- Noise words in names\n- Hungarian notation or unnecessary prefixes (iv_, ev_, rv_, lt_, ls_)\n- Method names that obscure ABAP built-in functions\n\n### 2. Language\n\n**Key Principles:**\n- Prefer object orientation to procedural programming\n- Prefer functional to procedural language constructs\n- Avoid obsolete language elements\n- Use design patterns wisely\n\n**Check for:**\n- Use of obsolete statements (unescaped host variables in SELECT, etc.)\n- Procedural code that should be object-oriented\n- Use of old-style MOVE instead of assignment\n- TRANSLATE instead of to_upper()/to_lower()\n- CREATE OBJECT instead of NEW\n- Old-style READ TABLE instead of table expressions\n\n### 3. Constants\n\n**Key Principles:**\n- Use constants instead of magic numbers\n- Constants need descriptive names\n- Prefer ENUM to constants interfaces\n- Group related constants\n\n**Check for:**\n- Magic numbers or string literals in code\n- Constants with non-descriptive names (c_01, c_x, etc.)\n- Ungrouped constants that should be in BEGIN OF/END OF blocks\n\n### 4. Variables\n\n**Key Principles:**\n- Prefer inline to up-front declarations\n- Don't use variables outside their declaration block\n- Don't chain up-front declarations\n- Don't use field symbols for dynamic data access (modern ABAP)\n- Choose the right loop targets (field symbols vs references vs values)\n\n**Check for:**\n- Up-front DATA declarations when inline would be clearer\n- Variables used outside their declaration block scope\n- Chained DATA declarations\n- Unnecessary field symbols with ASSIGN\n\n### 5. Tables\n\n**Key Principles:**\n- Use the right table type (STANDARD, SORTED, HASHED)\n- Avoid DEFAULT KEY\n- Prefer INSERT INTO TABLE to APPEND TO\n- Prefer LINE_EXISTS to READ TABLE or LOOP AT\n- Prefer READ TABLE to LOOP AT\n- Prefer LOOP AT WHERE to nested IF\n- Avoid unnecessary table reads\n\n**Check for:**\n- Tables with DEFAULT KEY\n- APPEND TO when INSERT INTO TABLE is more appropriate\n- READ TABLE ... TRANSPORTING NO FIELDS when LINE_EXISTS would be clearer\n- LOOP AT ... EXIT when READ TABLE is intended\n- Nested IF inside LOOP AT when WHERE clause would work\n- Double reads (checking existence then reading again)\n\n### 6. Strings\n\n**Key Principles:**\n- Use ` (backticks) to define string literals\n- Use | (pipes) to assemble text\n\n**Check for:**\n- Single quotes for string literals\n- String concatenation with && instead of string templates\n\n### 7. Booleans\n\n**Key Principles:**\n- Use ABAP_BOOL for boolean types\n- Use ABAP_TRUE and ABAP_FALSE for comparisons\n- Use XSDBOOL to set boolean variables\n- Consider if booleans are the right choice (vs enumerations)\n\n**Check for:**\n- Use of CHAR1 or other types instead of ABAP_BOOL\n- Comparisons with 'X' and ' ' instead of ABAP_TRUE/ABAP_FALSE\n- IF-THEN-ELSE to set boolean instead of XSDBOOL\n- Boolean parameters that should be split methods\n\n### 8. Conditions\n\n**Key Principles:**\n- Try to make conditions positive\n- Prefer IS NOT to NOT IS\n- Consider predicative method calls for boolean methods\n- Consider decomposing/extracting complex conditions\n\n**Check for:**\n- Negative conditions that could be positive\n- NOT IS instead of IS NOT\n- Complex nested conditions that should be decomposed\n- Long conditions that should be extracted to methods\n\n### 9. Ifs\n\n**Key Principles:**\n- No empty IF branches\n- Prefer CASE to ELSE IF for multiple alternatives\n- Keep nesting depth low\n\n**Check for:**\n- Empty IF with logic only in ELSE\n- Multiple ELSE IF that should be CASE\n- Deeply nested IF statements (>3 levels)\n\n### 10. Classes\n\n**Key Principles:**\n- Prefer objects to static classes\n- Prefer composition to inheritance\n- Don't mix stateful and stateless in same class\n- Global by default, local only where appropriate\n- FINAL if not designed for inheritance\n- Members PRIVATE by default, PROTECTED only if needed\n- Consider immutable instead of getter\n\n**Check for:**\n- Static classes that should be instance-based\n- Deep inheritance hierarchies\n- Mixed stateful/stateless methods\n- Non-FINAL classes not designed for inheritance\n- PUBLIC members that should be PRIVATE/PROTECTED\n- Unnecessary getter methods for immutable data\n\n### 11. Methods\n\n**Key Principles:**\n- Prefer instance to static methods\n- Public instance methods should implement interfaces\n- Aim for few IMPORTING parameters (<3)\n- Split methods instead of OPTIONAL parameters\n- RETURN, EXPORT, or CHANGE exactly one parameter\n- Prefer RETURNING to EXPORTING\n- Do one thing, do it well, do it only\n- Keep methods small (3-5 statements ideal)\n- Fail fast\n- Omit RECEIVING, EXPORTING keywords when possible\n- Omit self-reference ME when calling instance members\n\n**Check for:**\n- Static methods that should be instance methods\n- Public methods not part of an interface\n- Methods with >3 IMPORTING parameters\n- Multiple OPTIONAL parameters (should be split methods)\n- Multiple output parameters\n- EXPORTING instead of RETURNING\n- Long methods (>20 lines)\n- Methods doing multiple things\n- Unnecessary RECEIVING, EXPORTING keywords\n- Explicit ME-> calls\n\n### 12. Error Handling\n\n**Key Principles:**\n- Prefer exceptions to return codes\n- Use class-based exceptions\n- Throw CX_STATIC_CHECK for manageable exceptions\n- Throw CX_NO_CHECK for unrecoverable situations\n- Prefer RAISE EXCEPTION NEW to RAISE EXCEPTION TYPE\n- Wrap foreign exceptions\n\n**Check for:**\n- Return codes instead of exceptions\n- Use of message classes for error handling\n- Old-style RAISE EXCEPTION TYPE\n- Unwrapped foreign exceptions\n- Catching generic CX_ROOT\n\n### 13. Comments\n\n**Key Principles:**\n- Express yourself in code, not comments\n- Comments are no excuse for bad names\n- Write comments to explain why, not what\n- Comment with \", not *\n- Delete code instead of commenting it\n- Use FIXME, TODO, XXX with your ID\n- ABAP Doc only for public APIs\n\n**Check for:**\n- Obvious comments explaining what code does\n- Comments compensating for bad names\n- Commented-out code\n- * comments instead of \"\n- Comments without TODO/FIXME tags\n- Manual versioning in comments\n- Duplicate message texts in comments\n\n### 14. Formatting\n\n**Key Principles:**\n- Use ABAP Formatter before activating\n- No more than one statement per line\n- Reasonable line length (120 chars)\n- Single blank lines to separate (not more)\n- Close brackets at line end\n- Keep single parameter calls on one line\n- Indent and snap to tab\n\n**Check for:**\n- Multiple statements per line\n- Lines exceeding 120 characters\n- Multiple consecutive blank lines\n- Inconsistent indentation\n- Chained assignments\n\n### 15. Testing\n\n**Key Principles:**\n- Write testable code\n- Test publics, not private internals\n- Use given-when-then structure\n- Few, focused assertions\n- Use the right assert type\n\n**Check for:**\n- Untestable code (tight coupling, no dependency injection)\n- Tests without clear given-when-then structure\n- Multiple unrelated assertions\n- Missing test classes for public methods\n\n## Output Format\n\nStructure your analysis as follows:\n\n```\n# Clean ABAP Check Results\n\n## Summary\n- Total Issues: [count]\n- Critical: [count]\n- Major: [count]\n- Minor: [count]\n\n## Critical Issues\n\n### [Category] - [Issue Title]\n**Location:** Line [X] / Method [name]\n**Problem:** [Description of what violates Clean ABAP]\n**Recommendation:** [How to fix it]\n\n**Anti-pattern:**\n```abap\n[problematic code]\n```\n\n**Clean code:**\n```abap\n[improved code]\n```\n\n## Major Issues\n[Same format as Critical]\n\n## Minor Issues\n[Same format as Critical]\n\n## Positive Observations\n- [Things done well according to Clean ABAP]\n\n## Overall Assessment\n[Brief summary of code quality and main areas for improvement]\n```\n\n## Priority Levels\n\n**Critical:** Issues that significantly impact maintainability, testability, or could cause bugs\n- Magic numbers without constants\n- Deep nesting (>3 levels)\n- Methods with >5 parameters\n- Empty IF branches\n- Static classes without interfaces\n- Return codes instead of exceptions\n\n**Major:** Issues that reduce code clarity and violate Clean ABAP principles\n- Non-descriptive names\n- Hungarian notation/prefixes\n- Long methods (>20 lines)\n- DEFAULT KEY usage\n- Commented-out code\n- Multiple output parameters\n\n**Minor:** Issues that are stylistic improvements\n- Missing inline declarations\n- String quotes instead of backticks\n- Unnecessary ME-> references\n- Formatting inconsistencies\n\n## References\n\nWhen you need detailed explanations or examples for specific Clean ABAP rules, consult these reference files:\n\n1. **Complete Guidelines**: Read `@skills/clean-abap/references/CleanABAP.md` - the full Clean ABAP style guide with in-depth explanations, rationale, and code examples for all principles\n2. **Quick Patterns**: Read `@skills/clean-abap/references/quick-reference.md` - condensed good/bad code examples for common patterns\n3. **Review Checklist**: Read `@skills/clean-abap/references/checklist.md` - a checklist format for systematic code reviews\n\n**When to consult references:**\n- To provide accurate citations when explaining violations\n- To show users the official reasoning behind recommendations\n- To find specific code examples to illustrate points\n- To answer follow-up questions about Clean ABAP principles\n- When encountering edge cases not covered in the summary above\n\n## Examples\n\n### Example 1: Checking a Simple Method\n\n**Input:**\n```abap\nMETHOD calculate.\n  DATA: lv_result TYPE i,\n        lv_temp TYPE i.\n  \n  lv_temp = iv_value1 + iv_value2.\n  IF lv_temp > 100.\n    lv_result = lv_temp * 2.\n  ELSE.\n    lv_result = lv_temp.\n  ENDIF.\n  \n  ev_result = lv_result.\nENDMETHOD.\n```\n\n**Output:**\n```\n# Clean ABAP Check Results\n\n## Summary\n- Total Issues: 4\n- Critical: 0\n- Major: 2\n- Minor: 2\n\n## Major Issues\n\n### Names - Hungarian Notation Used\n**Location:** Method calculate\n**Problem:** Variables use Hungarian notation prefixes (lv_, iv_, ev_) which adds no value and violates Clean ABAP naming guidelines.\n**Recommendation:** Remove prefixes and use descriptive names.\n\n**Anti-pattern:**\n```abap\nDATA: lv_result TYPE i,\n      lv_temp TYPE i.\n```\n\n**Clean code:**\n```abap\nDATA(result) = value1 + value2.\nIF result > 100.\n  result = result * 2.\nENDIF.\n```\n\n### Methods - EXPORTING Instead of RETURNING\n**Location:** Method signature\n**Problem:** Method uses EXPORTING parameter instead of RETURNING, preventing functional call style.\n**Recommendation:** Use RETURNING parameter for single output value.\n\n**Anti-pattern:**\n```abap\nMETHOD calculate\n  IMPORTING iv_value1 TYPE i\n            iv_value2 TYPE i\n  EXPORTING ev_result TYPE i.\n```\n\n**Clean code:**\n```abap\nMETHOD calculate\n  IMPORTING value1 TYPE i\n            value2 TYPE i\n  RETURNING VALUE(result) TYPE i.\n```\n\n## Minor Issues\n\n### Variables - Up-front Declarations\n**Location:** Lines 2-3\n**Problem:** Variables declared up-front instead of inline, increasing distance between declaration and usage.\n**Recommendation:** Use inline declarations with DATA( ).\n\n### Language - Procedural Style\n**Location:** Lines 5-9\n**Problem:** Could use COND for conditional assignment instead of IF-ELSE.\n**Recommendation:** Use functional constructs.\n\n**Clean code:**\n```abap\nMETHOD calculate\n  IMPORTING value1 TYPE i\n            value2 TYPE i\n  RETURNING VALUE(result) TYPE i.\n  \n  DATA(sum) = value1 + value2.\n  result = COND #( WHEN sum > 100 THEN sum * 2 ELSE sum ).\nENDMETHOD.\n```\n\n## Overall Assessment\nThe code is functional but uses outdated ABAP patterns. Main improvements needed: remove Hungarian notation, use RETURNING instead of EXPORTING, prefer inline declarations, and use functional language constructs. After these changes, the code will be significantly cleaner and more maintainable.\n```","tags":["clean","abap","skills","likweitan","agent-skills","sap"],"capabilities":["skill","source-likweitan","skill-clean-abap","topic-abap","topic-agent-skills","topic-sap"],"categories":["abap-skills"],"synonyms":[],"warnings":[],"endpointUrl":"https://skills.sh/likweitan/abap-skills/clean-abap","protocol":"skill","transport":"skills-sh","auth":{"type":"none","details":{"cli":"npx skills add likweitan/abap-skills","source_repo":"https://github.com/likweitan/abap-skills","install_from":"skills.sh"}},"qualityScore":"0.456","qualityRationale":"deterministic score 0.46 from registry signals: · indexed on github topic:agent-skills · 12 github stars · SKILL.md body (12,980 chars)","verified":false,"liveness":"unknown","lastLivenessCheck":null,"agentReviews":{"count":0,"score_avg":null,"cost_usd_avg":null,"success_rate":null,"latency_p50_ms":null,"narrative_summary":null,"summary_updated_at":null},"enrichmentModel":"deterministic:skill-github:v1","enrichmentVersion":1,"enrichedAt":"2026-04-24T01:03:16.702Z","embedding":null,"createdAt":"2026-04-23T13:03:45.275Z","updatedAt":"2026-04-24T01:03:16.702Z","lastSeenAt":"2026-04-24T01:03:16.702Z","tsv":"'-3':1710 '-5':896 '-9':1738 '/to_lower':324 '0':1568 '01':377 '1':92,157,1418,1514 '10':761 '100':1541,1630,1780 '11':845 '12':966 '120':1131,1165 '13':1033 '14':1112 '15':1175 '2':100,266,1441,1546,1570,1572,1633,1709,1783 '20':953,1370 '3':123,339,759,865,895,934,1333,1453 '4':132,391,1566 '5':147,466,1337,1737 '6':565 '7':594 '8':664 '9':719 'aba':47 'abap':3,5,11,25,39,49,56,60,66,78,86,90,105,261,427,599,605,608,637,645,1073,1117,1235,1264,1273,1278,1301,1360,1412,1426,1500,1520,1560,1598,1611,1623,1666,1685,1757,1796 'abbrevi':184,233 'access':425 'accord':1298 'accur':1471 'across':234 'action':134 'activ':1120 'adapt':70 'add':1592 'adher':36 'aim':860 'altern':734 'analysi':1231 'analyz':24 'answer':1493 'anti':1271,1609,1664 'anti-pattern':1270,1608,1663 'api':1078 'append':486,520 'appropri':528,789 'area':1311 'ask':18 'assembl':578 'assert':1195,1199,1220 'assess':1303,1788 'assign':318,465,1174,1745 'avail':131 'avoid':183,194,206,215,282,478,510 'backtick':570,1395 'bad':1048,1090 'base':62,818,979 'begin':387 'behind':1482 'best':33 'blank':1134,1169 'block':390,409,456 'bool':600,638 'boolean':113,595,602,616,620,653,657,684 'bracket':1141 'branch':726,1341 'brief':1304 'bug':1326 'built':218,263 'built-in':217,262 'c':72,376,378 'calcul':1522,1581,1668,1687,1759 'call':682,913,965,1148,1653 'case':181,242,728,754,1505 'catch':1029 'categor':101 'categori':156,1250 'caus':1325 'chain':412,458,1173 'chang':875,1819 'char':1132 'char1':631 'charact':1166 'check':4,20,45,54,85,155,221,290,361,439,514,560,580,627,690,739,809,916,984,991,1006,1079,1157,1201,1236,1515,1561 'checklist':1455,1459 'choic':624 'choos':428 'citat':1472 'clariti':1356 'class':116,190,762,769,782,812,828,978,1016,1223,1343 'class-bas':977 'claus':555 'clean':2,10,28,38,48,59,65,75,89,104,145,1234,1263,1276,1300,1359,1411,1425,1499,1559,1597,1621,1683,1755 'clean-abap':1 'cleaner':1825 'clear':1212 'clearer':450,539 'close':1140 'code':6,26,29,31,57,76,87,95,137,236,303,369,975,1009,1040,1061,1085,1095,1181,1204,1275,1277,1280,1307,1347,1355,1378,1436,1448,1463,1487,1622,1684,1756,1790,1821 'comment':120,1034,1042,1043,1051,1057,1064,1082,1087,1093,1096,1099,1106,1111,1376 'commented-out':1092,1375 'common':1451 'comparison':611,639 'compens':1088 'complet':1419 'complex':688,704 'complianc':8,30,91 'composit':771 'comprehens':53 'concaten':588 'concept':205 'cond':1742,1777 'condens':1446 'condit':114,665,671,689,693,706,712,1744 'consecut':1168 'consid':618,679,686,804 'consist':182 'constant':109,340,344,349,356,360,370,382,1330 'construct':281,1754,1816 'consult':1414,1467 'content':166 'convent':239 'convey':165 'could':695,1324,1740 'count':1241,1243,1245,1247 'coupl':1206 'cover':1507 'creat':325 'critic':152,1242,1248,1286,1292,1316,1567 'cx':982,989,1031 'data':198,424,444,459,844,1523,1612,1624,1731,1772 'data1':229 'declar':401,408,416,445,455,460,1390,1706,1713,1723,1729,1811 'decompos':710 'decomposing/extracting':687 'deep':819,1331 'deepli':755 'default':479,518,785,799,1372 'defin':572 'delet':1060 'depend':1208 'depth':737,1432 'descript':162,225,351,374,1259,1364,1606 'design':287,793,830 'detail':1405 'distanc':1721 'doc':1074 'domain':171,174 'done':1296 'doubl':558 'duplic':1107 'dynam':423 'e.g':228 'edg':1504 'element':285 'els':650,730,747,749,1547,1750,1784 'empti':724,741,1339 'encod':207 'encount':1503 'end':1144 'endif':1552,1634 'endmethod':1557,1786 'enum':354 'enumer':626 'error':118,967,1018 'etc':301,380 'ev':253,1553,1590,1679 'exact':876 'exampl':138,1408,1437,1449,1488,1512,1513 'exceed':1164 'except':972,980,987,997,1001,1005,1012,1024,1028,1350 'excus':1046 'exist':490,536,561 'exit':542 'explain':1053,1083,1474 'explan':1406,1433 'explicit':963 'export':873,882,903,947,961,1636,1646,1678,1808 'express':338,1037 'extract':716 'fail':899 'fals':609 'fast':900 'field':420,433,462,533 'file':1417 'final':790,827 'find':1485 'fix':1268 'fixm':1067 'focus':1194 'follow':1233,1495 'follow-up':1494 'foreign':1004,1027 'format':121,1113,1228,1284,1290,1399,1460 'formatt':1118 'front':400,415,443,1705,1716 'full':1424 'function':220,265,277,1652,1753,1792,1814 'generic':1030 'getter':808,840 'given':1189,1214 'given-when-then':1188,1213 'global':783 'good/bad':1447 'group':358 'guid':68,1428 'guidelin':40,1420,1600 'handl':119,968,1019 'hash':477 'hierarchi':821 'host':297 'hungarian':208,247,1366,1576,1585,1802 'id':1072 'ideal':898 'identifi':124 'if':115,720 'if-els':1748 'if-then-els':647 'illustr':1490 'immut':805,843 'impact':151,1320 'implement':858 'import':863,935,1669,1688,1760 'improv':1279,1313,1387,1799 'in-depth':1430 'includ':42 'inconsist':232,1171,1400 'increas':1720 'indent':1152,1172 'info':199 'inherit':773,795,820,832 'inject':1209 'inlin':396,447,1389,1719,1728,1810 'input':1519 'insert':482,523 'insid':550 'instanc':817,850,855,914,923 'instance-bas':816 'instead':316,320,327,335,345,590,635,643,654,700,806,868,948,1010,1062,1097,1348,1393,1637,1648,1717,1746,1806 'intend':547 'interfac':357,859,931,1345 'intern':1186 'issu':102,149,1240,1249,1251,1282,1288,1317,1352,1383,1565,1574,1701 'iv':212,252,1534,1536,1589,1670,1674 'keep':735,892,1145 'key':159,268,341,393,468,480,519,567,596,666,721,763,847,969,1035,1114,1177,1373 'keyword':904,962 'languag':108,267,280,284,1732,1815 'length':1130 'level':760,1315,1334 'like':44,197,211 'line':128,489,535,954,1127,1129,1135,1143,1151,1162,1163,1170,1254,1371,1708,1736 'liter':367,574,586 'local':786 'locat':1253,1579,1640,1707,1735 'logic':744 'long':711,951,1368 'loop':431,495,501,504,540,551 'low':738 'ls':256 'lt':214,255 'lv':1524,1528,1532,1539,1542,1544,1548,1550,1555,1588,1613,1617 'magic':347,363,1327 'main':1310,1798 'maintain':1321,1828 'major':153,1244,1281,1351,1569,1573 'make':670 'manag':986 'manual':1103 'martin':73 'mean':168 'member':796,834,915 'messag':1015,1108 'method':117,193,257,663,681,685,718,824,841,846,853,856,867,893,919,924,926,932,943,952,955,1226,1256,1335,1369,1518,1521,1580,1635,1641,1644,1667,1686,1758 'minor':154,1246,1287,1382,1571,1700 'miss':1221,1388 'mix':237,776,822 'modern':426 'move':315 'multipl':733,748,937,944,957,1159,1167,1218,1379 'name':107,158,163,178,227,238,246,258,352,375,1049,1091,1257,1365,1575,1599,1607 'necessari':186 'need':350,803,1404,1800 'negat':692 'nest':508,548,705,736,756,1332 'new':329,998 'nois':195,243 'non':224,373,826,1363 'non-descript':223,372,1362 'non-fin':825 'notat':209,248,1577,1586,1803 'notation/prefixes':1367 'noun':188 'number':348,364,1328 'object':200,271,308,326,766 'object-ori':307 'obscur':216,260 'observ':1294 'obsolet':283,294 'obvious':1081 'of/end':388 'offici':1480 'old':313,331,1021 'old-styl':312,330,1020 'omit':901,907 'one':202,877,884,1124,1150 'option':870,938 'orient':272,309 'outdat':1795 'output':945,1227,1380,1558,1661 'outsid':406,453 'overal':1302,1787 'paramet':658,864,871,878,936,939,946,1147,1338,1381,1647,1658 'part':928 'pattern':288,1272,1443,1452,1610,1665,1797 'per':204,1126,1161 'pick':201 'pipe':576 'point':1491 'posit':672,697,1293 'possibl':906 'practic':34 'predic':680 'prefer':169,270,276,353,395,481,488,497,503,673,727,765,770,849,879,971,995,1809 'prefix':210,251,1587,1603 'prevent':1651 'principl':12,61,160,269,342,394,469,568,597,667,722,764,848,970,1036,1115,1178,1361,1440,1501 'priorit':148 'prioriti':1314 'privat':797,1185 'private/protected':838 'problem':142,173,1258,1582,1643,1711,1739 'problemat':1274 'procedur':274,279,302,1733 'program':275 'pronounc':177 'protect':800 'provid':52,96,133,1470 'public':833,854,925,1077,1183,1225 'qualiti':32,1308 'question':1497 'quick':1442 'quot':583,1392 'rais':996,1000,1023 'rational':1434 'read':93,333,492,498,513,529,544,559,563,1421,1444,1456 'reason':1128,1481 'receiv':902,960 'recommend':135,1265,1483,1601,1655,1726,1751 'reduc':1354 'refer':129,436,910,1398,1401,1416,1468 'relat':359 'remov':1602,1801 'request':43 'result':1237,1525,1543,1549,1554,1556,1562,1614,1625,1629,1631,1632,1680,1697,1769,1776 'return':872,880,950,974,1008,1346,1639,1650,1657,1695,1767,1805 'review':22,1454,1464 'right':430,472,623,1198 'robert':71 'root':1032 'rule':1413 'rv':213,254 'scope':457 'section':106 'select':300 'self':909 'self-refer':908 'separ':1137 'set':615,652 'show':139,1477 'signatur':1642 'signific':1319,1824 'simpl':1517 'singl':582,1133,1146,1660 'situat':994 'skill':15,51,83 'skill-clean-abap' 'skills/clean-abap/references/checklist.md':1457 'skills/clean-abap/references/cleanabap.md':1422 'skills/clean-abap/references/quick-reference.md':1445 'small':894 'snake':180,241 'snap':1154 'solut':146,170 'sort':476 'source-likweitan' 'specif':127,1410,1486 'split':662,866,942 'standard':475 'state':777 'stateful/stateless':823 'stateless':779 'statement':295,758,897,1125,1160 'static':768,811,852,918,983,1342 'string':112,366,566,573,585,587,592,1391 'structur':1192,1217,1229 'style':67,314,332,1022,1427,1654,1734 'stylist':1386 'sum':1773,1779,1782,1785 'summari':1238,1305,1510,1563 'symbol':421,434,463 'systemat':1462 'tab':1156 'tabl':111,334,337,467,473,484,493,499,512,516,525,530,545 'tag':1102 'target':432 'temp':230,1529,1533,1540,1545,1551,1618 'templat':593 'term':175 'test':122,1176,1182,1210,1222 'testabl':1180,1322 'text':579,1109 'thing':885,958,1295 'throw':981,988 'tight':1205 'titl':1252 'todo':1068 'todo/fixme':1101 'topic-abap' 'topic-agent-skills' 'topic-sap' 'total':1239,1564 'translat':319 'transport':531 'tri':668 'trigger':41 'true':606 'true/abap_false':646 'type':474,603,634,1002,1025,1200,1526,1530,1615,1619,1672,1676,1681,1690,1693,1698,1762,1765,1770 'unescap':296 'ungroup':381 'unless':185 'unnecessari':250,461,511,839,959,1396 'unrecover':993 'unrel':1219 'untest':1203 'unwrap':1026 'up-front':398,413,441,1703,1714 'upper':323 'usag':1374,1725 'use':13,81,161,176,179,187,286,292,310,343,404,419,452,470,569,575,598,604,612,629,976,1013,1066,1116,1187,1196,1578,1584,1605,1645,1656,1727,1741,1752,1794,1804,1813 'user':17,99,1478 'valid':21 'valu':438,1594,1662,1696,1768 'value1':1535,1626,1671,1689,1761,1774 'value2':1537,1627,1675,1692,1764,1775 'variabl':110,298,392,405,451,617,1583,1702,1712 'variable/method/class':226 'verb':191 'version':1104 'violat':125,1262,1358,1475,1596 'vs':435,437,625 'well':888,1297 'wise':289 'without':1100,1211,1329,1344 'word':196,203,244 'work':557 'would':448,537,556 'wrap':1003 'write':1050,1179 'x':231,379,641,1255 'xsdbool':613,656 'xxx':1069","prices":[{"id":"3b0ca5aa-c3e3-459b-a035-de767fc02091","listingId":"4bdda9b2-174d-4edf-82a1-a5d31b33467e","amountUsd":"0","unit":"free","nativeCurrency":null,"nativeAmount":null,"chain":null,"payTo":null,"paymentMethod":"skill-free","isPrimary":true,"details":{"org":"likweitan","category":"abap-skills","install_from":"skills.sh"},"createdAt":"2026-04-23T13:03:45.275Z"}],"sources":[{"listingId":"4bdda9b2-174d-4edf-82a1-a5d31b33467e","source":"github","sourceId":"likweitan/abap-skills/clean-abap","sourceUrl":"https://github.com/likweitan/abap-skills/tree/main/skills/clean-abap","isPrimary":false,"firstSeenAt":"2026-04-23T13:03:45.275Z","lastSeenAt":"2026-04-24T01:03:16.702Z"}],"details":{"listingId":"4bdda9b2-174d-4edf-82a1-a5d31b33467e","quickStartSnippet":null,"exampleRequest":null,"exampleResponse":null,"schema":null,"openapiUrl":null,"agentsTxtUrl":null,"citations":[],"useCases":[],"bestFor":[],"notFor":[],"kindDetails":{"org":"likweitan","slug":"clean-abap","github":{"repo":"likweitan/abap-skills","stars":12,"topics":["abap","agent-skills","sap"],"license":"mit","html_url":"https://github.com/likweitan/abap-skills","pushed_at":"2026-04-17T13:44:41Z","description":"Advance Agent Skills for ABAP Developers","skill_md_sha":"7a259abee927640993ae2501ee058e154ac1f59b","skill_md_path":"skills/clean-abap/SKILL.md","default_branch":"main","skill_tree_url":"https://github.com/likweitan/abap-skills/tree/main/skills/clean-abap"},"layout":"multi","source":"github","category":"abap-skills","frontmatter":{"name":"clean-abap","description":"Check ABAP code for compliance with Clean ABAP principles. Use this skill when users ask to check, validate, review, or analyze ABAP code for clean code compliance, code quality, best practices, or adherence to Clean ABAP guidelines. Triggers include requests like \"check this ABAP code\", \"is this clean ABAP\", \"review my ABAP for clean code\", \"validate ABAP against clean code principles\", or \"analyze ABAP code quality\"."},"skills_sh_url":"https://skills.sh/likweitan/abap-skills/clean-abap"},"updatedAt":"2026-04-24T01:03:16.702Z"}}