From ui5-modernization
Fixes manifest.json issues reported by UI5 linter for rules like outdated version, deprecated libraries, components, and APIs. Automatically updates to modern UI5 compatible.
How this skill is triggered — by the user, by Claude, or both
Slash command
/ui5-modernization:fix-manifest-jsonThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
This skill fixes manifest.json issues that the UI5 linter detects but cannot auto-fix because they may require understanding of the application's dependencies and structure.
This skill fixes manifest.json issues that the UI5 linter detects but cannot auto-fix because they may require understanding of the application's dependencies and structure.
| Rule ID | Message Pattern | This Skill's Action |
|---|---|---|
no-outdated-manifest-version | manifest.json must be modernized to Version 2 | Update _version to "2.0.0" |
no-legacy-ui5-version-in-manifest | Use UI5 version 1.136.0 or higher | Update minUI5Version to "1.136.0" |
no-deprecated-library | Use of deprecated library '...' | Remove from dependencies/libs |
no-deprecated-component | Use of deprecated component '...' | Remove from dependencies/components |
no-deprecated-api | Use of deprecated view type '...' | Change to "XML" |
no-deprecated-api | Use of deprecated property 'sap.ui5/resources/js' | Remove if empty |
no-deprecated-api | Use of deprecated class '...' (model types) | Flag for manual modernization |
no-removed-manifest-property | Property '...' has been removed in Manifest Version 2 | Remove the property |
Apply this skill when you see linter output like:
manifest.json:2:3 error manifest.json must be modernized to Version 2 no-outdated-manifest-version
manifest.json:15:5 error Use UI5 version 1.136.0 or higher in manifest.json no-legacy-ui5-version-in-manifest
manifest.json:20:7 error Use of deprecated library 'sap.ui.commons' no-deprecated-library
manifest.json:25:7 error Use of deprecated view type 'JSON' no-deprecated-api
manifest.json:30:9 error Property '/sap.ui5/rootView/async' has been removed in Manifest Version 2 no-removed-manifest-property
no-outdated-manifest-version - Update _version to 2.0.0IMPORTANT: Only update the root _version to "2.0.0". Do NOT change nested _version properties inside sap.app, sap.ui, sap.ui5, etc. — those should remain at their current values (e.g., "1.1.0", "1.2.0").
// Before
{
"_version": "1.12.0",
"sap.app": {
"_version": "1.1.0",
...
},
"sap.ui5": {
"_version": "1.2.0",
...
}
}
// After — only root _version changed
{
"_version": "2.0.0",
"sap.app": {
"_version": "1.1.0",
...
},
"sap.ui5": {
"_version": "1.2.0",
...
}
}
After updating to version 2.0.0, you MUST also apply these consequential changes:
type: "View" to routing config or targets (see section 8)no-legacy-ui5-version-in-manifest - Update minUI5Version// Before
"dependencies": {
"minUI5Version": "1.120.0",
...
}
// After
"dependencies": {
"minUI5Version": "1.136.0",
...
}
If minUI5Version is an array, update all entries below 1.136.0.
no-deprecated-library - Remove Deprecated LibrariesRemove these deprecated libraries from sap.ui5/dependencies/libs:
sap.ui.commons - Use sap.m insteadsap.ui.ux3 - Use sap.m and sap.f insteadsap.makit - Use sap.viz insteadsap.me - Use sap.m insteadsap.ca.ui - Use standard controlssap.landvisz - Deprecatedsap.ui.vtm - Deprecatedsap.sac.grid - Deprecated since 1.112, removed 1.114sap.ui.suite - Deprecated since 1.108sap.zen.commons - Deprecated since 1.89sap.zen.crosstab - Deprecated since 1.89sap.zen.dsh - Deprecated since 1.89// Before
"libs": {
"sap.m": {},
"sap.ui.commons": {},
"sap.ui.layout": {}
}
// After
"libs": {
"sap.m": {},
"sap.ui.layout": {}
}
no-deprecated-component - Remove Deprecated ComponentsRemove deprecated components from sap.ui5/dependencies/components.
no-deprecated-api - Fix View TypesChange deprecated view types to "XML" (or "Typed" for JS-heavy view cases):
JSON → XMLHTML → XMLJS → XML (or consider Typed view as an alternative for complex JS logic)Template → XMLApplies to:
sap.ui5/rootView/typesap.ui5/routing/config/viewTypesap.ui5/routing/targets/*/viewType// Before
"rootView": {
"viewName": "my.app.view.Main",
"type": "JSON"
}
// After
"rootView": {
"viewName": "my.app.view.Main",
"type": "XML"
}
Important: When changing view types, the actual view file must also be converted to XML format. Flag this for manual review.
no-removed-manifest-property - Remove Async Properties (Manifest v2)In manifest version 2.0.0+, the async flag is implicitly true for the root view and the routing configuration, so it must be removed from exactly these two locations:
sap.ui5/rootView/asyncsap.ui5/routing/config/async// Before (v2)
"rootView": {
"viewName": "my.app.view.Main",
"type": "XML",
"async": true
}
// After (v2)
"rootView": {
"viewName": "my.app.view.Main",
"type": "XML"
}
SCOPE WARNING — do NOT remove async from anywhere else. The implicit-async behavior applies only to rootView and routing.config. Other locations where async may legitimately appear (and must be preserved) include:
sap.ui5/models/*/settings/async (e.g., OData/JSON model async loading flag)sap.app/dataSources/* settings that include asyncsap.ui5/extends, sap.ui5/componentUsages, or third-party namespacesasync inside route definitions that is not the top-level routing.config.asyncThe linter rule no-removed-manifest-property only fires for the two paths above. Trust the linter's pointer — only remove the exact properties it flags.
no-deprecated-api - Remove sap.ui5/resources/jsIf the array is empty, remove the entire js property (and resources if it becomes empty).
// Before
"resources": {
"js": []
}
// After
// (resources section removed if empty)
If not empty, this requires manual modernization to proper module dependencies.
When _version is updated to "2.0.0", the routing configuration properties must also be renamed. The view-prefixed property names are deprecated in version 2.
Property renaming rules:
| Old Property (v1.x) | New Property (v2.0.0) | Where |
|---|---|---|
viewPath | path | routing.config |
viewName | name | routing.config and routing.targets.* |
viewId | id | routing.targets.* |
viewLevel | level | routing.targets.* |
viewType | viewType | Unchanged — keep as-is |
New required property:
| Property | Value | Where |
|---|---|---|
type | "View" | routing.config (applies to all targets) OR each individual routing.targets.* entry |
Before (v1.x):
"routing": {
"config": {
"routerClass": "sap.m.routing.Router",
"viewType": "XML",
"viewPath": "my.app.view",
"controlId": "app",
"controlAggregation": "pages",
"async": true
},
"routes": [
{
"name": "main",
"pattern": "",
"target": "main"
}
],
"targets": {
"main": {
"viewName": "Main",
"viewId": "main",
"viewLevel": 1
},
"detail": {
"viewName": "Detail",
"viewId": "detail",
"viewLevel": 2
}
}
}
After (v2.0.0):
"routing": {
"config": {
"routerClass": "sap.m.routing.Router",
"viewType": "XML",
"path": "my.app.view",
"controlId": "app",
"controlAggregation": "pages",
"type": "View"
},
"routes": [
{
"name": "main",
"pattern": "",
"target": "main"
}
],
"targets": {
"main": {
"name": "Main",
"id": "main",
"level": 1
},
"detail": {
"name": "Detail",
"id": "detail",
"level": 2
}
}
}
Changes summary:
viewPath → path in configviewName → name in each targetviewId → id in each targetviewLevel → level in each targetviewType stays as viewType (unchanged)async removed only from routing.config (implicit true in v2). Do NOT touch async on models, dataSources, or other unrelated config — see Section 6 scope warning.type: "View" added to config (alternatively, add "type": "View" to each individual target if mixing views and components)When to add type to config vs per target:
type in config (most common): All targets are viewstype per target: Mixed routing targets (some views, some components)no-outdated-manifest-version: Update root _version to "2.0.0" (keep nested _version values unchanged)no-legacy-ui5-version-in-manifest: Update minUI5Version to "1.136.0"no-deprecated-library: Remove the library from dependenciesno-deprecated-component: Remove the component from dependenciesno-deprecated-api (view type): Change to "XML"no-deprecated-api (resources/js): Remove if emptyno-removed-manifest-property: Remove the property_version was updated to 2.0.0, also apply routing modernization:
viewPath → path, viewName → name, viewId → id, viewLevel → level in routing config and targetstype: "View" to routing.config (or per target)async only from sap.ui5/rootView and sap.ui5/routing/config. Do NOT remove async from model settings, dataSources, or any other path — those keep their async flag.Given linter output:
manifest.json:2:3 error manifest.json must be modernized to Version 2 no-outdated-manifest-version
manifest.json:15:5 error Use UI5 version 1.136.0 or higher in manifest.json no-legacy-ui5-version-in-manifest
manifest.json:20:7 error Use of deprecated library 'sap.ui.commons' no-deprecated-library
manifest.json:35:9 error Property '/sap.ui5/rootView/async' has been removed in Manifest Version 2 no-removed-manifest-property
manifest.json:40:9 error Property '/sap.ui5/routing/config/async' has been removed in Manifest Version 2 no-removed-manifest-property
Transform:
// Before
{
"_version": "1.12.0",
"sap.app": {
"_version": "1.1.0",
...
},
"sap.ui5": {
"_version": "1.2.0",
"dependencies": {
"minUI5Version": "1.84.0",
"libs": {
"sap.m": {},
"sap.ui.commons": {},
"sap.ui.layout": {}
}
},
"rootView": {
"viewName": "my.app.view.Main",
"type": "XML",
"async": true
},
"routing": {
"config": {
"routerClass": "sap.m.routing.Router",
"viewType": "XML",
"viewPath": "my.app.view",
"controlId": "app",
"controlAggregation": "pages",
"async": true
},
"routes": [
{ "name": "main", "pattern": "", "target": "main" }
],
"targets": {
"main": {
"viewName": "Main",
"viewId": "main",
"viewLevel": 1
}
}
}
}
}
// After
{
"_version": "2.0.0",
"sap.app": {
"_version": "1.1.0",
...
},
"sap.ui5": {
"_version": "1.2.0",
"dependencies": {
"minUI5Version": "1.136.0",
"libs": {
"sap.m": {},
"sap.ui.layout": {}
}
},
"rootView": {
"viewName": "my.app.view.Main",
"type": "XML"
},
"routing": {
"config": {
"routerClass": "sap.m.routing.Router",
"viewType": "XML",
"path": "my.app.view",
"controlId": "app",
"controlAggregation": "pages",
"type": "View"
},
"routes": [
{ "name": "main", "pattern": "", "target": "main" }
],
"targets": {
"main": {
"name": "Main",
"id": "main",
"level": 1
}
}
}
}
}
_version to 2.0.0 — do NOT change nested _version properties inside sap.app, sap.ui, sap.ui5, etc._version to 2.0.0, always apply routing property renames and add type: "View" in the same passminUI5Version update means the app won't run on older UI5 versions - this is intentional for modern UI5 compatibility_version to 2.0.0, synchronizationMode and other v1-specific properties should also be removed if presentsap.ui/supportedThemes causes an error in manifest v2 — remove it if presentIAsyncContentCreation is NOT enforced by manifest v2 — it must be explicitly added in Component.js by the fix-component-async skill (this skill does not handle it)JS, JSON, HTML) the default replacement is XML, but for complex JS-heavy views, consider Typed views as an alternativeIAsyncContentCreation interface — defer to that skill for correct placementdata-sap-ui-libs), use fix-bootstrap-params instead of this skillclaude plugin install ui5-modernization@claude-plugins-officialFixes deprecated UI5 controls, classes, interfaces, types, and properties that the UI5 linter detects but cannot auto-fix. Provides replacement guidance for deprecated APIs in JS and XML views.
Enforces SAP UI5 coding standards including async loading, ComponentSupport, CSP compliance, OData binding, i18n, TypeScript events, CAP integration, and form layouts (Form with ColumnLayout).
Reviews SAP Fiori/UI5 apps for design guidelines, MVC structure, OData patterns, performance, accessibility, and launchpad integration from source code.