Install any skill in seconds. Free to start, no credit card required.
Get Started Free →This skill should be used when developing SAP UI5 applications, including creating freestyle apps, Fiori Elements apps, custom controls, testing, data binding, OData integration, routing, and troubleshooting. Use when building enterprise web applications with SAP UI5 framework, implementing MVC patterns, configuring manifest.json, creating XML views, writing controllers, setting up data models (JSON, OData v2/v4), implementing responsive UI with sap.m controls, building Fiori Elements apps, writ
.claude/skills/secondsky-sapui5/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-08 | ✗→✓ | ▲ Improved | 260% | 0% |
| case-13 | ✗→✓ | ▲ Improved | 308% | 0% |
| case-18 | ✗→✓ | ▲ Improved | 127% | 0% |
| case-19 | ✗→✓ | ▲ Improved | 160% | 0% |
| case-20 | ✗→✓ | ▲ Improved | 298% | 0% |
Use this skill when building SAPUI5/OpenUI5 applications, XML views, controllers, custom controls, routing, OData v2/v4 model binding, Fiori Elements integrations, QUnit/OPA5 tests, accessibility/security/performance improvements, or UI5 MCP-assisted scaffolding and API lookup.
Comprehensive skill for building enterprise applications with SAP UI5 framework.
This skill integrates with the official @ui5/mcp-server for live development tools:
ui5-app-scaffolder agent or /ui5-scaffold commandui5-api-explorer agent or /ui5-api commandui5-code-quality-advisor agent or /ui5-lint commandui5-migration-specialist agent/ui5-version command/ui5-mcp-tools commandFor setup and troubleshooting, see references/mcp-integration.md. MCP package pins are governed by sap-dependency-security and validated by npm run validate:mcp-security.
Graceful Fallback: All features work without MCP by using reference files and built-in templates.
Use UI5 Tooling (recommended) or SAP Business Application Studio:
bash# Install UI5 CLI npm install -g @ui5/cli # Create new project mkdir my-sapui5-app && cd my-sapui5-app npm init -y # Initialize UI5 project ui5 init # Add UI5 dependencies npm install --save-dev @ui5/cli # Start development server ui5 serve
Project Structure:
my-sapui5-app/
├── webapp/
│ ├── Component.js
│ ├── manifest.json
│ ├── index.html
│ ├── controller/
│ │ └── Main.controller.js
│ ├── view/
│ │ └── Main.view.xml
│ ├── model/
│ │ └── formatter.js
│ ├── i18n/
│ │ └── i18n.properties
│ ├── css/
│ │ └── style.css
│ └── test/
│ ├── unit/
│ └── integration/
├── ui5.yaml
└── package.jsonTemplates Available:
templates/basic-component.js: Component templatetemplates/manifest.json: Application descriptor templatetemplates/xml-view.xml: XML view with common patternstemplates/controller.js: Controller with best practicestemplates/formatter.js: Common formatter functionsUse templates by copying to your project and replacing placeholders ({{namespace}}, {{ControllerName}}, etc.).
Reference: references/core-architecture.md for detailed architecture concepts.
Key manifest sections:
sap.app: Application metadata and data sourcessap.ui: UI technology and device typessap.ui5: UI5-specific configuration (models, routing, dependencies)JSON Model (client-side):
javascriptvar oModel = new JSONModel({ products: [...] }); this.getView().setModel(oModel);
OData V2 Model (server-side):
javascript"": { "dataSource": "mainService", "settings": { "defaultBindingMode": "TwoWay", "useBatch": true } }
Resource Model (i18n):
javascript"i18n": { "type": "sap.ui.model.resource.ResourceModel", "settings": { "bundleName": "my.app.i18n.i18n" } }
Reference: references/data-binding-models.md for comprehensive guide.
XML View (recommended):
xml<mvc:View controllerName="my.app.controller.Main" xmlns="sap.m" xmlns:mvc="sap.ui.core.mvc"> <Page title="{i18n>title}"> <List items="{/products}"> <StandardListItem title="{name}" description="{price}"/> </List> </Page> </mvc:View>
Navigate programmatically:
javascriptthis.getOwnerComponent().getRouter().navTo("detail", { objectId: sId });
Reference: references/routing-navigation.md for routing patterns.
Build applications without JavaScript UI code using OData annotations.
manifest.json for List Report + Object Page:
json{ "sap.ui5": { "dependencies": { "libs": { "sap.fe.templates": {} } }, "routing": { "targets": { "ProductsList": { "type": "Component", "name": "sap.fe.templates.ListReport", "options": { "settings": { "contextPath": "/Products", "variantManagement": "Page" } } } } } } }
Key Annotations:
@UI.LineItem: Table columns@UI.SelectionFields: Filter bar fields@UI.HeaderInfo: Object page header@UI.Facets: Object page sectionsReference: references/fiori-elements.md for comprehensive guide.
The sap.ui.mdc library provides metadata-driven controls for building dynamic UIs at runtime.
xml<mdc:Table id="mdcTable" delegate='{name: "my/app/delegate/TableDelegate", payload: {}}' p13nMode="Sort,Filter,Column" type="ResponsiveTable"> <mdc:columns> <mdcTable:Column propertyKey="name" header="Name"> <Text text="{name}"/> </mdcTable:Column> </mdc:columns> </mdc:Table>
Reference: references/mdc-typescript-advanced.md for comprehensive MDC guide with TypeScript.
Test individual functions and modules:
javascriptQUnit.module("Formatter Tests"); QUnit.test("Should format price correctly", function(assert) { var fPrice = 123.456; var sResult = formatter.formatPrice(fPrice); assert.strictEqual(sResult, "123.46 EUR", "Price formatted"); });
Test user interactions and flows:
javascriptopaTest("Should navigate to detail page", function(Given, When, Then) { Given.iStartMyApp(); When.onTheWorklistPage.iPressOnTheFirstListItem(); Then.onTheObjectPage.iShouldSeeTheObjectPage(); Then.iTeardownMyApp(); });
Simulate OData backend:
javascriptvar oMockServer = new MockServer({ rootUri: "/sap/opu/odata/sap/SERVICE_SRV/" }); oMockServer.simulate("localService/metadata.xml", { sMockdataBaseUrl: "localService/mockdata" }); oMockServer.start();
Reference: references/testing.md for comprehensive testing guide.
javascript// Create oModel.create("/Products", oData, {success: function() {MessageToast.show("Created");}}); // Read oModel.read("/Products", {filters: [new Filter("Price", FilterOperator.GT, 100)]}); // Update oModel.update("/Products(1)", {Price: 200}, {success: function() {MessageToast.show("Updated");}}); // Delete oModel.remove("/Products(1)", {success: function() {MessageToast.show("Deleted");}});
javascriptvar oBinding = this.byId("table").getBinding("items"); oBinding.filter([new Filter("price", FilterOperator.GT, 100)]); oBinding.sort([new Sorter("name", false)]);
javascriptif (!this.pDialog) { this.pDialog = this.loadFragment({ name: "my.app.view.fragments.MyDialog" }); } this.pDialog.then(function(oDialog) {oDialog.open();});
console.log(this.getView().getModel().getData())bashui5 serve # Development server ui5 build # Build for production npm test # Run tests
Ctrl+Alt+Shift+SThis skill includes comprehensive reference documentation (15 files):
Access these files for detailed information on specific topics while keeping the main skill concise.
Ready-to-use templates in templates/ directory:
When using this skill:
references/accessibility.md - Accessibility best practicesreferences/core-architecture.md - Framework architecture and component patternsreferences/data-binding-models.md - Data binding and model usagereferences/fiori-elements.md - Fiori Elements templates and annotationsreferences/mdc-typescript-advanced.md - MDC and TypeScript guidancereferences/mcp-integration.md - MCP setup and troubleshootingreferences/migration-patterns.md - Migration from older versionsreferences/performance-optimization.md - Performance optimization techniquesreferences/testing.md - Testing strategies and frameworksreferences/security.md - XSS, CSP, authentication, and CSRF guidancetemplates/basic-component.js - Component development templatetemplates/controller.js - Controller templatetemplates/xml-view.xml - XML view templatetemplates/formatter.js - Formatter helper templatetemplates/manifest.json - Application manifest templateLicense: GPL-3.0 Next Review: 2026-02-27 (Quarterly)
| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-03 | pass→pass | 8,161 | 6,353 | -22% | 1 | 1 | 0% | 1,460 | 5,064 | +247% | 0 | 0 | — |
case-01 | pass→pass | 11,629 | 9,446 | -19% | 1 | 1 | 0% | 2,058 | 5,690 | +176% | 0 | 0 | — |
case-02 | pass→pass | 7,648 | 6,044 | -21% | 1 | 1 | 0% | 1,514 | 5,129 | +239% | 0 | 0 | — |
case-04 | pass→pass | 9,493 | 10,207 | +8% | 1 | 1 | 0% | 1,712 | 5,933 | +247% | 0 | 0 | — |
case-05 | pass→pass | 7,002 | 6,363 | -9% | 1 | 1 | 0% | 1,201 | 5,109 | +325% | 0 | 0 | — |
case-06 | pass→pass | 10,077 | 10,155 | +1% | 1 | 1 | 0% | 1,965 | 5,873 | +199% | 0 | 0 | — |
case-07 | pass→pass | 12,094 | 11,537 | -5% | 1 | 1 | 0% | 2,386 | 6,380 | +167% | 0 | 0 | — |
case-08 | fail→pass | 6,203 | 2,755 | -56% | 1 | 1 | 0% | 1,173 | 4,228 | +260% | 0 | 0 | — |
case-09 | pass→pass | 7,426 | 6,292 | -15% | 1 | 1 | 0% | 1,339 | 5,084 | +280% | 0 | 0 | — |
case-10 | pass→pass | 3,504 | 3,301 | -6% | 1 | 1 | 0% | 673 | 4,473 | +565% | 0 | 0 | — |
case-11 | pass→pass | 7,080 | 5,467 | -23% | 1 | 1 | 0% | 1,239 | 4,886 | +294% | 0 | 0 | — |
case-12 | pass→pass | 5,324 | 4,024 | -24% | 1 | 1 | 0% | 944 | 4,608 | +388% | 0 | 0 | — |
case-13 | fail→pass | 6,679 | 6,196 | -7% | 1 | 1 | 0% | 1,240 | 5,055 | +308% | 0 | 0 | — |
case-14 | pass→pass | 6,768 | 3,770 | -44% | 1 | 1 | 0% | 1,271 | 4,588 | +261% | 0 | 0 | — |
case-15 | pass→pass | 6,470 | 5,678 | -12% | 1 | 1 | 0% | 1,157 | 4,901 | +324% | 0 | 0 | — |
case-16 | pass→pass | 6,083 | 6,448 | +6% | 1 | 1 | 0% | 1,119 | 5,100 | +356% | 0 | 0 | — |
case-17 | pass→pass | 6,519 | 5,562 | -15% | 1 | 1 | 0% | 1,171 | 4,983 | +326% | 0 | 0 | — |
case-18 | fail→pass | 11,433 | 2,790 | -76% | 1 | 1 | 0% | 1,928 | 4,377 | +127% | 0 | 0 | — |
case-19 | fail→pass | 8,522 | 2,785 | -67% | 1 | 1 | 0% | 1,670 | 4,343 | +160% | 0 | 0 | — |
case-20 | fail→pass | 6,144 | 2,446 | -60% | 1 | 1 | 0% | 1,075 | 4,278 | +298% | 0 | 0 | — |
case-21 | fail→fail | 8,354 | 5,961 | -29% | 1 | 1 | 0% | 1,512 | 4,897 | +224% | 0 | 0 | — |
case-22 | fail→fail | 16,877 | 13,310 | -21% | 1 | 1 | 0% | 3,139 | 6,388 | +104% | 0 | 0 | — |
case-23 | fail→fail | 12,516 | 9,721 | -22% | 1 | 1 | 0% | 2,209 | 5,710 | +158% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 23 cases were attempted. The headline lift of +22 percentage points is the difference between those two pass rates over the 23 comparable cases.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
Other measured skills in the registry, with their headline benchmark lift.