executing-plans
executing-plans
Use when executing an implementation plan in the current session as the implementer yourself — your human partner chose inline execution, or no subagent tool is available
sap-fiori-url-generatorGenerate SAP Fiori Launchpad URLs from app names using AppList.json. Looks up app information by name and constructs proper FLP URLs with required parameters like sap-client and sap-language.
Independent GitHub snapshot · Automated classification · Original documentation governs
This skill enables you to generate SAP Fiori Launchpad (FLP) URLs based on app names from the AppList.json file.
When you need to look up SAP Fiori app information:
App List Database: Read references/AppList.json - contains all SAP Fiori apps with their Semantic Object-Action mappings, App IDs, descriptions, and technical details.
Use this reference to:
The AppList.json data can be obtained from SAP's Fiori Apps Library:
This ensures the app list stays current with the latest SAP Fiori applications.
When a user provides:
https://myserver.com:44300)You will:
The complete SAP Fiori Launchpad URL follows this pattern:
{BASE_URL}/sap/bc/ui2/flp?sap-client={CLIENT}&sap-language={LANGUAGE}#{SEMANTIC_OBJECT}-{ACTION}
https://myserver.com:44300)
100)
EN, DE, FR)
EN if not specified by userFirst, read the AppList.json file to access the app data:
const fs = require("fs");
const appList = JSON.parse(fs.readFileSync("AppList.json", "utf8"));
Search for the app by name (case-insensitive, partial match):
function findAppByName(appName) {
const normalizedSearch = appName.toLowerCase().trim();
return appList.find(
(app) =>
app["App Name"] &&
app["App Name"].toLowerCase().includes(normalizedSearch),
);
}
Get the "Semantic Object - Action" field:
function getSemanticObjectAction(app) {
const semanticAction = app["Semantic Object - Action"];
if (!semanticAction || semanticAction === "NaN" || semanticAction === null) {
throw new Error("No Semantic Object-Action found for this app");
}
return semanticAction;
}
Build the complete FLP URL:
function generateFioriUrl(baseUrl, client, semanticAction, language = "EN") {
// Validate required parameters
if (!baseUrl) {
throw new Error("BASE_URL is required and must be provided by user");
}
if (!client) {
throw new Error("sap-client is required and must be provided by user");
}
// Remove trailing slash from base URL if present
const cleanBaseUrl = baseUrl.replace(/\/$/, "");
return `${cleanBaseUrl}/sap/bc/ui2/flp?sap-client=${client}&sap-language=${language}#${semanticAction}`;
}
https://myserver.com:44300 (USER MUST PROVIDE)100 (USER MUST PROVIDE)Create Maintenance Request (USER MUST PROVIDE)EN (optional - defaults to EN if not specified)MaintenanceWorkRequest-createhttps://myserver.com:44300/sap/bc/ui2/flp?sap-client=100&sap-language=EN#MaintenanceWorkRequest-create
If the app name is not found in AppList.json:
Error: App "{app_name}" not found in AppList.json
Suggestion: Check spelling or try searching with partial name
If the app exists but has no Semantic Object-Action:
Error: App "{app_name}" (ID: {app_id}) does not have a Semantic Object-Action defined
Note: This app may not be launchable via FLP URL
If multiple apps match the search term:
Found multiple apps matching "{search_term}":
1. App Name 1 (ID: F1234)
2. App Name 2 (ID: F5678)
Please specify which app you want
When an exact match isn't found, suggest similar apps:
function findSimilarApps(searchTerm, limit = 5) {
const normalized = searchTerm.toLowerCase();
return appList
.filter(
(app) =>
app["App Name"] && app["App Name"].toLowerCase().includes(normalized),
)
.slice(0, limit)
.map((app) => ({
name: app["App Name"],
id: app["App ID"],
semanticAction: app["Semantic Object - Action"],
}));
}
Provide additional app information:
function getAppDetails(app) {
return {
name: app["App Name"],
id: app["App ID"],
description: app["App Description"],
semanticAction: app["Semantic Object - Action"],
technicalCatalog: app["Technical Catalog"],
transactionCode: app["Transaction Codes"],
component: app["Application Component"],
};
}
User: "Generate URL for Create Maintenance Request app with base URL https://myserver.com:44300 and client 100"
Response:
App Found: Create Maintenance Request (F1511A)
Semantic Object-Action: MaintenanceWorkRequest-create
Generated URL:
https://myserver.com:44300/sap/bc/ui2/flp?sap-client=100&sap-language=EN#MaintenanceWorkRequest-create
User: "Generate URL for Create Maintenance Request in German, base URL https://myserver.com:44300, client 100"
Response:
App Found: Create Maintenance Request (F1511A)
Semantic Object-Action: MaintenanceWorkRequest-create
Generated URL:
https://myserver.com:44300/sap/bc/ui2/flp?sap-client=100&sap-language=DE#MaintenanceWorkRequest-create
User: "Generate URL for Create Maintenance Request"
Response:
Error: Missing required parameters
Please provide:
- Base URL (e.g., https://myserver.com:44300)
- SAP Client (e.g., 100)
- App Name (provided: Create Maintenance Request)
- Language (optional, defaults to EN)
Example: Generate URL for "Create Maintenance Request" with base URL https://myserver.com:44300 and client 100
User: "Find apps related to 'Workflow'"
Response:
Found 8 apps matching "Workflow":
1. Manage Workflows (F2190)
Action: Workflow-showList
2. Workflow Component (F2506)
Action: Not available
3. Manage Workflow Templates (F2787)
Action: WorkflowTemplate-showList
4. Manage Workflows - For Bank Accounts (F2796)
Action: BankAccount-workflowShowList
5. Manage Workflow Scenarios (F3067)
Action: WorkflowScenario-showList
To generate a URL, please provide:
- Base URL (e.g., https://myserver.com:44300)
- SAP Client (e.g., 100)
- Which app you want from the list above
Common SAP language codes:
EN - EnglishDE - German (Deutsch)ES - Spanish (Español)FR - French (Français)IT - Italian (Italiano)PT - Portuguese (Português)ZH - Chinese (中文)JA - Japanese (日本語)KO - Korean (한국어)Each app entry contains:
Some apps may have NaN or null values for certain fields. Always check:
http:// or https://)sap-language=EN as default if not specifiedconst fs = require("fs");
class FioriUrlGenerator {
constructor(appListPath) {
this.apps = JSON.parse(fs.readFileSync(appListPath, "utf8"));
}
findApp(appName) {
const normalized = appName.toLowerCase().trim();
return this.apps.find(
(app) =>
app["App Name"] && app["App Name"].toLowerCase().includes(normalized),
);
}
generateUrl(baseUrl, client, appName, options = {}) {
const { language = "EN" } = options;
// Validate required parameters
if (!baseUrl) {
throw new Error("Base URL is required - must be provided by user");
}
if (!client) {
throw new Error("SAP Client is required - must be provided by user");
}
// Find the app
const app = this.findApp(appName);
if (!app) {
throw new Error(`App "${appName}" not found`);
}
// Extract semantic action
const semanticAction = app["Semantic Object - Action"];
if (!semanticAction || semanticAction === "NaN") {
throw new Error(`App "${app["App Name"]}" has no Semantic Object-Action`);
}
// Clean base URL
const cleanBaseUrl = baseUrl.replace(/\/$/, "");
// Construct URL
return {
url: `${cleanBaseUrl}/sap/bc/ui2/flp?sap-client=${client}&sap-language=${language}#${semanticAction}`,
appDetails: {
name: app["App Name"],
id: app["App ID"],
description: app["App Description"],
semanticAction: semanticAction,
},
};
}
}
// Usage - User MUST provide base URL and client
const generator = new FioriUrlGenerator("./AppList.json");
const result = generator.generateUrl(
"https://myserver.com:44300", // User provided
"100", // User provided
"Create Maintenance Request", // User provided
{ language: "EN" }, // Optional - defaults to EN
);
console.log(result.url);
This skill enables seamless SAP Fiori URL generation by:
The generated URLs can be directly used to launch SAP Fiori apps in the Fiori Launchpad.