From 518510e603f49b713302f03577821080bfee547c Mon Sep 17 00:00:00 2001 From: Matthias Osswald Date: Wed, 3 Jun 2026 13:29:20 +0200 Subject: [PATCH 1/7] refactor: Remove duplicate plugin.json Claude Code also supports the root `plugin.json` file. --- .../.claude-plugin/plugin.json | 21 ----------------- plugins/ui5/.claude-plugin/plugin.json | 23 ------------------- 2 files changed, 44 deletions(-) delete mode 100644 plugins/ui5-typescript-conversion/.claude-plugin/plugin.json delete mode 100644 plugins/ui5/.claude-plugin/plugin.json diff --git a/plugins/ui5-typescript-conversion/.claude-plugin/plugin.json b/plugins/ui5-typescript-conversion/.claude-plugin/plugin.json deleted file mode 100644 index 0dbf5f3..0000000 --- a/plugins/ui5-typescript-conversion/.claude-plugin/plugin.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "name": "ui5-typescript-conversion", - "version": "0.1.2", - "description": "SAPUI5 / OpenUI5 plugin for coding agents. Converts JavaScript-based UI5 projects to TypeScript.", - "author": { - "name": "SAP SE" - }, - "homepage": "https://github.com/UI5/plugins-coding-agents", - "repository": "https://github.com/UI5/plugins-coding-agents", - "license": "Apache-2.0", - "keywords": [ - "sap", - "ui5", - "sapui5", - "openui5", - "claude", - "plugin", - "typescript", - "conversion" - ] -} diff --git a/plugins/ui5/.claude-plugin/plugin.json b/plugins/ui5/.claude-plugin/plugin.json deleted file mode 100644 index 57cb535..0000000 --- a/plugins/ui5/.claude-plugin/plugin.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "name": "ui5", - "version": "0.1.2", - "description": "SAPUI5 / OpenUI5 plugin for coding agents. Creates and validates UI5 projects, accesses API documentation, runs UI5 linter, retrieves development guidelines and best practices for UI5 development.", - "author": { - "name": "SAP SE" - }, - "homepage": "https://github.com/UI5/plugins-coding-agents", - "repository": "https://github.com/UI5/plugins-coding-agents", - "license": "Apache-2.0", - "keywords": [ - "sap", - "ui5", - "sapui5", - "openui5", - "claude", - "plugin", - "linter", - "api documentation", - "development guidelines", - "best practices" - ] -} From ee7310ff0ecd6fe27fb73f253e14cbecd2b826fd Mon Sep 17 00:00:00 2001 From: Matthias Osswald Date: Wed, 3 Jun 2026 13:30:18 +0200 Subject: [PATCH 2/7] refactor(ui5-typescript-conversion): Move skill to sub-dir Although this seems to have worked with Claude Code, it is generally required to place each skill in a separate sub-directory with the same name as the skill. --- .../skills/{ => ui5-typescript-conversion}/SKILL.md | 0 .../{ => ui5-typescript-conversion}/references/test_conversion.md | 0 2 files changed, 0 insertions(+), 0 deletions(-) rename plugins/ui5-typescript-conversion/skills/{ => ui5-typescript-conversion}/SKILL.md (100%) rename plugins/ui5-typescript-conversion/skills/{ => ui5-typescript-conversion}/references/test_conversion.md (100%) diff --git a/plugins/ui5-typescript-conversion/skills/SKILL.md b/plugins/ui5-typescript-conversion/skills/ui5-typescript-conversion/SKILL.md similarity index 100% rename from plugins/ui5-typescript-conversion/skills/SKILL.md rename to plugins/ui5-typescript-conversion/skills/ui5-typescript-conversion/SKILL.md diff --git a/plugins/ui5-typescript-conversion/skills/references/test_conversion.md b/plugins/ui5-typescript-conversion/skills/ui5-typescript-conversion/references/test_conversion.md similarity index 100% rename from plugins/ui5-typescript-conversion/skills/references/test_conversion.md rename to plugins/ui5-typescript-conversion/skills/ui5-typescript-conversion/references/test_conversion.md From 246873f949e7a775da7917670a2ed96f0ff128e4 Mon Sep 17 00:00:00 2001 From: Matthias Osswald Date: Wed, 3 Jun 2026 13:32:45 +0200 Subject: [PATCH 3/7] refactor(ui5): Do not list skills individually --- plugins/ui5/plugin.json | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/plugins/ui5/plugin.json b/plugins/ui5/plugin.json index 79f7dc9..2bf6aa7 100644 --- a/plugins/ui5/plugin.json +++ b/plugins/ui5/plugin.json @@ -19,8 +19,5 @@ "development guidelines", "best practices" ], - "skills": [ - "./skills/ui5-best-practices", - "./skills/ui5-best-practices-integration-cards" - ] + "skills": ["./skills/"] } From 521a422ceb18e9d3f6796c9dd8b56f3b2e86875e Mon Sep 17 00:00:00 2001 From: Matthias Osswald Date: Wed, 3 Jun 2026 14:25:48 +0200 Subject: [PATCH 4/7] ci: Verify plugin.json copies stay in sync with root Add CI step that fails when any registered copy of plugins//plugin.json differs from the root file. Currently checks .github/plugin/plugin.json, required by github/awesome-copilot external-plugin smoke test. --- .github/workflows/ci.yml | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index ad09a59..38fbf5b 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -42,3 +42,27 @@ jobs: - name: Perform dependency check run: npm run knip + + - name: Verify plugin.json copies are in sync + run: | + set -eu + COPIES=( + ".github/plugin/plugin.json" + ) + failed=0 + for root in plugins/*/plugin.json; do + dir=$(dirname "$root") + for rel in "${COPIES[@]}"; do + copy="$dir/$rel" + if [ ! -f "$copy" ]; then + echo "::error file=$copy::missing copy of $root" + failed=1 + continue + fi + if ! diff -u "$root" "$copy"; then + echo "::error file=$copy::differs from $root" + failed=1 + fi + done + done + exit $failed From 73359a99c65a6a7c606750e684b5b37e6e570a83 Mon Sep 17 00:00:00 2001 From: Matthias Osswald Date: Wed, 3 Jun 2026 14:35:23 +0200 Subject: [PATCH 5/7] ci: Add plugin.json copies for awesome-copilot smoke test Copy each plugins//plugin.json to /.github/plugin/plugin.json, required by github/awesome-copilot external-plugin install verification. Sync with root enforced by CI step added in previous commit. --- .../.github/plugin/plugin.json | 21 +++++++++++++++++ plugins/ui5/.github/plugin/plugin.json | 23 +++++++++++++++++++ 2 files changed, 44 insertions(+) create mode 100644 plugins/ui5-typescript-conversion/.github/plugin/plugin.json create mode 100644 plugins/ui5/.github/plugin/plugin.json diff --git a/plugins/ui5-typescript-conversion/.github/plugin/plugin.json b/plugins/ui5-typescript-conversion/.github/plugin/plugin.json new file mode 100644 index 0000000..44ef34d --- /dev/null +++ b/plugins/ui5-typescript-conversion/.github/plugin/plugin.json @@ -0,0 +1,21 @@ +{ + "name": "ui5-typescript-conversion", + "version": "0.1.2", + "description": "SAPUI5 / OpenUI5 plugin for coding agents. Converts JavaScript-based UI5 projects to TypeScript.", + "author": { + "name": "SAP SE" + }, + "homepage": "https://github.com/UI5/plugins-coding-agents", + "repository": "https://github.com/UI5/plugins-coding-agents", + "license": "Apache-2.0", + "keywords": [ + "sap", + "ui5", + "sapui5", + "openui5", + "plugin", + "typescript", + "conversion" + ], + "skills": ["./skills/"] +} diff --git a/plugins/ui5/.github/plugin/plugin.json b/plugins/ui5/.github/plugin/plugin.json new file mode 100644 index 0000000..2bf6aa7 --- /dev/null +++ b/plugins/ui5/.github/plugin/plugin.json @@ -0,0 +1,23 @@ +{ + "name": "ui5", + "version": "0.1.2", + "description": "SAPUI5 / OpenUI5 plugin for coding agents. Creates and validates UI5 projects, accesses API documentation, runs UI5 linter, retrieves development guidelines and best practices for UI5 development.", + "author": { + "name": "SAP SE" + }, + "homepage": "https://github.com/UI5/plugins-coding-agents", + "repository": "https://github.com/UI5/plugins-coding-agents", + "license": "Apache-2.0", + "keywords": [ + "sap", + "ui5", + "sapui5", + "openui5", + "plugin", + "linter", + "api documentation", + "development guidelines", + "best practices" + ], + "skills": ["./skills/"] +} From 9417901f1cf0a30f0fae88dae582d3551e1fcb99 Mon Sep 17 00:00:00 2001 From: Matthias Osswald Date: Wed, 3 Jun 2026 14:41:00 +0200 Subject: [PATCH 6/7] fix(ui5): Normalize keywords to lowercase-hyphenated form The github/awesome-copilot marketplace's external-plugin validator rejects keywords containing spaces or uppercase characters; only lowercase letters, digits, and hyphens are allowed (max 30 chars, max 10 entries per plugin). Replace 'api documentation', 'development guidelines', and 'best practices' with their hyphenated equivalents so the plugin passes intake validation when listed in plugins/external.json. Reference: - awesome-copilot/eng/external-plugin-validation.mjs (regex /^[a-z0-9-]+$/) - awesome-copilot/CONTRIBUTING.md - 'Adding External Plugins' ('keywords as lowercase hyphenated tags') --- plugins/ui5/.github/plugin/plugin.json | 6 +++--- plugins/ui5/plugin.json | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/plugins/ui5/.github/plugin/plugin.json b/plugins/ui5/.github/plugin/plugin.json index 2bf6aa7..0eacb94 100644 --- a/plugins/ui5/.github/plugin/plugin.json +++ b/plugins/ui5/.github/plugin/plugin.json @@ -15,9 +15,9 @@ "openui5", "plugin", "linter", - "api documentation", - "development guidelines", - "best practices" + "api-documentation", + "development-guidelines", + "best-practices" ], "skills": ["./skills/"] } diff --git a/plugins/ui5/plugin.json b/plugins/ui5/plugin.json index 2bf6aa7..0eacb94 100644 --- a/plugins/ui5/plugin.json +++ b/plugins/ui5/plugin.json @@ -15,9 +15,9 @@ "openui5", "plugin", "linter", - "api documentation", - "development guidelines", - "best practices" + "api-documentation", + "development-guidelines", + "best-practices" ], "skills": ["./skills/"] } From 5ddbb2b7e8cd626e37ae60c0ce5161a7abac7ac4 Mon Sep 17 00:00:00 2001 From: Matthias Osswald Date: Wed, 3 Jun 2026 15:13:40 +0200 Subject: [PATCH 7/7] fix(ui5): Wrap MCP server config in mcpServers key Align with the plugin spec, which requires a top-level "mcpServers" wrapper around server entries. Both Claude Code and Copilot CLI tolerated the flat shape, but the spec-compliant form is safer for strict validators down the line. --- plugins/ui5/.mcp.json | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/plugins/ui5/.mcp.json b/plugins/ui5/.mcp.json index 1a1ac45..0a5d497 100644 --- a/plugins/ui5/.mcp.json +++ b/plugins/ui5/.mcp.json @@ -1,6 +1,8 @@ { - "ui5-mcp-server": { - "command": "npx", - "args": ["-y", "@ui5/mcp-server"] + "mcpServers": { + "ui5-mcp-server": { + "command": "npx", + "args": ["-y", "@ui5/mcp-server"] + } } }