Compare commits

..

1 Commits

Author SHA1 Message Date
Daisy Hollman
7e287ffe95 feat: add renames map for auto-migration of renamed plugins
Adds a top-level "renames" map to marketplace.json with the four
historical renames (adlc, airwallex, convex-backend, vals) so that
users who installed under the old slug auto-migrate to the new one
once the loader-side support in cci#43997 ships.

Also documents in README.md that plugin `name` is an immutable slug:
use `displayName` for label changes, and if a rename is unavoidable,
add a `renames` entry.

Part of CC-2871.

Co-Authored-By: Claude <noreply@anthropic.com>
2026-06-22 17:34:37 +00:00
5 changed files with 116 additions and 414 deletions

View File

@@ -6,6 +6,12 @@
"name": "Anthropic",
"email": "support@anthropic.com"
},
"renames": {
"adlc": "agentforce-adlc",
"airwallex": "airwallex-agentos",
"convex-backend": "convex",
"vals": "valtown"
},
"plugins": [
{
"name": "42crunch-api-security-testing",
@@ -57,7 +63,7 @@
"source": {
"source": "url",
"url": "https://github.com/SalesforceAIResearch/agentforce-adlc.git",
"sha": "2b2f59d9f29d3dae3a4bec0b953237f03bbba7af"
"sha": "772aaa20ebdd97736a94ebcd9d60fd3949342b60"
},
"homepage": "https://github.com/SalesforceAIResearch/agentforce-adlc"
},
@@ -77,7 +83,7 @@
"source": {
"source": "url",
"url": "https://github.com/AikidoSec/aikido-claude-plugin.git",
"sha": "fbe11e287175e5eda448516dd2f741a63b276514"
"sha": "01e8cf542500e579cff948a0fa0365e4f819d7b4"
},
"homepage": "https://github.com/AikidoSec/aikido-claude-plugin"
},
@@ -123,7 +129,7 @@
"source": {
"source": "url",
"url": "https://github.com/gemini-cli-extensions/alloydb.git",
"sha": "2bc309c97558356ca1599c29bef9c17bf10d45e4"
"sha": "98bdfce9ab49622f5f4b1428130cc79feb37d93e"
},
"homepage": "https://cloud.google.com/alloydb"
},
@@ -137,7 +143,7 @@
"source": {
"source": "url",
"url": "https://github.com/gemini-cli-extensions/alloydb-omni.git",
"sha": "da3dd45c7098f7fe11f95c01ae6ce8125459b534"
"sha": "23f9166ba3950728fb2c48390b2e35cc3ddd3b35"
},
"homepage": "https://github.com/gemini-cli-extensions/alloydb-omni"
},
@@ -223,7 +229,7 @@
"source": {
"source": "url",
"url": "https://github.com/astronomer/agents.git",
"sha": "ed2fe757381ff42337fd7bce56a50f31134d9dce"
"sha": "da0048c49f88335c9d9cc617837e182ba04a2ab5"
},
"homepage": "https://github.com/astronomer/agents"
},
@@ -244,7 +250,7 @@
"source": {
"source": "url",
"url": "https://github.com/atlassian/atlassian-mcp-server.git",
"sha": "55cfdc55afed1e273354f840a238421fbd9eee86"
"sha": "f4911dba81f25782c88815b03deabf444cd46e0d"
},
"homepage": "https://github.com/atlassian/atlassian-mcp-server"
},
@@ -276,7 +282,7 @@
"url": "https://github.com/auth0/agent-skills.git",
"path": "plugins/auth0",
"ref": "main",
"sha": "3e3a5d84fe922378bd2c2eafb7f7986759e3c87e"
"sha": "838a181a235d8e563b437555794ddfe9bd60284b"
},
"homepage": "https://auth0.com"
},
@@ -337,7 +343,7 @@
"url": "https://github.com/aws/agent-toolkit-for-aws.git",
"path": "plugins/aws-core",
"ref": "main",
"sha": "7898a91483218173d096db3de6892c2dc545d160"
"sha": "ff1dc6f45f5203147f6cd52662cc74ded4bb0825"
},
"homepage": "https://github.com/aws/agent-toolkit-for-aws"
},
@@ -353,7 +359,7 @@
"url": "https://github.com/aws/agent-toolkit-for-aws.git",
"path": "plugins/aws-data-analytics",
"ref": "main",
"sha": "49ca75209219a89ac43690d6ca0a59d976933ee8"
"sha": "ff1dc6f45f5203147f6cd52662cc74ded4bb0825"
},
"homepage": "https://github.com/aws/agent-toolkit-for-aws"
},
@@ -382,7 +388,7 @@
"url": "https://github.com/awslabs/agent-plugins.git",
"path": "plugins/aws-serverless",
"ref": "main",
"sha": "ba79e65ab968ed456b3cbee5f2d851d58239e864"
"sha": "c65ee436b0db77bb75d380aef6fbdc9b114edf2a"
},
"homepage": "https://github.com/awslabs/agent-plugins"
},
@@ -398,7 +404,7 @@
"url": "https://github.com/awslabs/startups.git",
"path": "advisor/plugins/aws-startup-advisor",
"ref": "main",
"sha": "b533244f9956412964fbd33c869c100f90b332ef"
"sha": "2e1d603a43b241f13ed40e4d1762f5e4ed744ecc"
},
"homepage": "https://github.com/awslabs/startups"
},
@@ -425,7 +431,7 @@
"source": {
"source": "url",
"url": "https://github.com/microsoft/azure-skills.git",
"sha": "2cd48ca625cddcc1d377d2861fbddd54417c70cc"
"sha": "206ad20914b60368f907ab84f64cb4aa50bbfb20"
},
"homepage": "https://github.com/microsoft/azure-skills"
},
@@ -477,7 +483,7 @@
"source": {
"source": "url",
"url": "https://github.com/gemini-cli-extensions/bigquery-data-analytics.git",
"sha": "89f3048eef8c808d1b3c53c90348b18c9a73055c"
"sha": "4e64d8488e95697a348b88b8ee47f0e676b2544b"
},
"homepage": "https://github.com/gemini-cli-extensions/bigquery-data-analytics"
},
@@ -493,7 +499,7 @@
"url": "https://github.com/boltz-bio/boltz-api-skills.git",
"path": "plugins/boltz",
"ref": "main",
"sha": "70e480ebb14baecfc4456b49eb8b724611470b7c"
"sha": "59c4c2868b8ebbd1eca1f4b94bb99bf96220d15e"
},
"homepage": "https://boltz.bio"
},
@@ -521,7 +527,7 @@
"source": {
"source": "url",
"url": "https://github.com/brightdata/skills.git",
"sha": "e825f02fbcd7a89087fd1053a57ddcd45113370f"
"sha": "8d427e9871566efe3f0a1c8888f98b6fe8288831"
},
"homepage": "https://docs.brightdata.com"
},
@@ -535,7 +541,7 @@
"source": {
"source": "url",
"url": "https://github.com/buildkite/skills.git",
"sha": "6ab569537d836b66edcc52d61c566bdfa670a7c2"
"sha": "ffffb1ed6c82a3b170433572b93d85b764c91bab"
},
"homepage": "https://buildkite.com"
},
@@ -551,7 +557,7 @@
"url": "https://github.com/carta/plugins.git",
"path": "plugins/carta-cap-table",
"ref": "main",
"sha": "d73954d3d9ce1e3fce1ec2b9ee6819922dd539e3"
"sha": "62a5752861040f198e2c646761618cfedc2657b4"
},
"homepage": "https://carta.com"
},
@@ -567,7 +573,7 @@
"url": "https://github.com/carta/plugins.git",
"path": "plugins/carta-crm",
"ref": "main",
"sha": "d73a3615864a5590ad6105df1b3e1b26324d1813"
"sha": "62a5752861040f198e2c646761618cfedc2657b4"
},
"homepage": "https://carta.com"
},
@@ -583,7 +589,7 @@
"url": "https://github.com/carta/plugins.git",
"path": "plugins/carta-investors",
"ref": "main",
"sha": "d73a3615864a5590ad6105df1b3e1b26324d1813"
"sha": "bb45f4b388a0d96366b137a8c47d03c45434d1fa"
},
"homepage": "https://carta.com"
},
@@ -610,7 +616,7 @@
"source": {
"source": "url",
"url": "https://github.com/ChromeDevTools/chrome-devtools-mcp.git",
"sha": "6a9466378c13b6ccba91b54091ea83a5ca37a8db"
"sha": "52cf8c40081567a200442ab12fad43edb550b0d4"
},
"homepage": "https://github.com/ChromeDevTools/chrome-devtools-mcp"
},
@@ -626,7 +632,7 @@
"url": "https://github.com/circlefin/skills.git",
"path": "plugins/circle",
"ref": "master",
"sha": "c7d269a2025e26410e0e23fb5a73c769dc07d088"
"sha": "8ee9281f6e5ab737236ce969348adc463e6c2f79"
},
"homepage": "https://www.circle.com"
},
@@ -732,7 +738,7 @@
"source": {
"source": "url",
"url": "https://github.com/gemini-cli-extensions/cloud-sql-mysql.git",
"sha": "fda5aac59a50258d61f115f4962325b7ca8c3b36"
"sha": "4508637f66362b70b75ea6e40d41a7ef8efabcc6"
},
"homepage": "https://github.com/gemini-cli-extensions/cloud-sql-mysql"
},
@@ -746,7 +752,7 @@
"source": {
"source": "url",
"url": "https://github.com/gemini-cli-extensions/cloud-sql-postgresql.git",
"sha": "38ab73d23d58342ea046d1163ddc9f1a83d13303"
"sha": "849ce3fdc200219d2228380d2112f2bae3abc81f"
},
"homepage": "https://cloud.google.com/sql"
},
@@ -760,7 +766,7 @@
"source": {
"source": "url",
"url": "https://github.com/gemini-cli-extensions/cloud-sql-sqlserver.git",
"sha": "5069d84c78ccdc6a0177f2c7a7849b9708bde425"
"sha": "e55c1ff46d92dfcfedc6cf1139cf5eb5beb9f02d"
},
"homepage": "https://github.com/gemini-cli-extensions/cloud-sql-sqlserver"
},
@@ -769,7 +775,7 @@
"source": {
"source": "url",
"url": "https://github.com/cloudflare/skills.git",
"sha": "27ce0c0e159225caa7ed30ebefd4107aa6c52497"
"sha": "ffcc622bf112eccc49c4b433faa5dd28e9ede2ea"
},
"description": "Skills for the Cloudflare developer platform: Workers, Durable Objects, Agents SDK, MCP servers, Wrangler CLI, and web performance.",
"category": "deployment",
@@ -839,7 +845,7 @@
"source": {
"source": "url",
"url": "https://github.com/coderabbitai/skills.git",
"sha": "2fd091d9582deccf19929e21f934921d0e8f686e"
"sha": "a81eb76a1539e4a3f2b5c6fc133849124e72d303"
},
"homepage": "https://github.com/coderabbitai/skills"
},
@@ -853,7 +859,7 @@
"source": {
"source": "url",
"url": "https://github.com/CodSpeedHQ/codspeed.git",
"sha": "7ce2c9823f67522a81572814c6c8bebab0ca5687"
"sha": "90c83f42f4269f88046109df120046f677b9d873"
},
"homepage": "https://codspeed.io"
},
@@ -878,7 +884,7 @@
"source": {
"source": "url",
"url": "https://github.com/spotify/confidence-ai-plugins.git",
"sha": "136a99ec77041e07d2757030ed27c0437040426d"
"sha": "01d1198bae6032854c192b7232af563698768777"
},
"homepage": "https://confidence.spotify.com"
},
@@ -904,7 +910,7 @@
"source": {
"source": "url",
"url": "https://github.com/get-convex/convex-backend-skill.git",
"sha": "bb4275f38abc4aa7196b936be756d2811dc4b4fc"
"sha": "b04d9d3c83bf8446302be95e12cb834fba6fe622"
},
"homepage": "https://github.com/get-convex/convex-backend-skill",
"keywords": [
@@ -935,7 +941,7 @@
"source": {
"source": "url",
"url": "https://github.com/CrowdStrike/foundry-skills.git",
"sha": "20ef548a615a5a8a18de7edbe65eb4bb10c8563b"
"sha": "a7e6a75ad2d9aa4093771e8c07d455c1ce39aae1"
},
"homepage": "https://github.com/CrowdStrike/foundry-skills"
},
@@ -981,7 +987,7 @@
"source": {
"source": "url",
"url": "https://github.com/dash0hq/dash0-agent-plugin.git",
"sha": "fb9a6207929e5fc45c2661e5c74a2e077b3de79d"
"sha": "44be3b6fd8e6cbd1c5e59436a3e8db91d5920d0c"
},
"homepage": "https://dash0.com/"
},
@@ -992,7 +998,7 @@
"source": {
"source": "url",
"url": "https://github.com/astronomer/agents.git",
"sha": "ed2fe757381ff42337fd7bce56a50f31134d9dce"
"sha": "da0048c49f88335c9d9cc617837e182ba04a2ab5"
},
"homepage": "https://github.com/astronomer/agents"
},
@@ -1016,7 +1022,7 @@
"source": {
"source": "url",
"url": "https://github.com/astronomer/agents.git",
"sha": "ed2fe757381ff42337fd7bce56a50f31134d9dce"
"sha": "da0048c49f88335c9d9cc617837e182ba04a2ab5"
},
"homepage": "https://github.com/astronomer/agents"
},
@@ -1029,26 +1035,10 @@
"url": "https://github.com/awslabs/agent-plugins.git",
"path": "plugins/databases-on-aws",
"ref": "main",
"sha": "96a073a195491f2192c256ba66730b631ced03e1"
"sha": "c65ee436b0db77bb75d380aef6fbdc9b114edf2a"
},
"homepage": "https://github.com/awslabs/agent-plugins"
},
{
"name": "databricks",
"description": "Databricks skills for the CLI, Apps, Lakebase, Model Serving, Lakeflow Jobs, Spark Declarative Pipelines, Declarative Automation Bundles (DABs), and classic-to-serverless migration.",
"author": {
"name": "Databricks"
},
"category": "database",
"source": {
"source": "git-subdir",
"url": "https://github.com/databricks/databricks-agent-skills.git",
"path": "plugins/databricks/claude",
"ref": "main",
"sha": "e337277c9771597bd2a67dfc5f8dd1d1afc887c6"
},
"homepage": "https://developers.databricks.com/"
},
{
"name": "datadog",
"description": "Use Datadog directly in Claude Code through a preconfigured Datadog MCP server. Query logs, metrics, traces, dashboards, and more through natural conversation. This plugin is in preview.",
@@ -1087,7 +1077,7 @@
"source": {
"source": "url",
"url": "https://github.com/gemini-cli-extensions/dataproc.git",
"sha": "6d6ac3889bf448e33a0ad96174bc5b0849c74ebe"
"sha": "a8d5220007ae51a7104428acd38748432de597a8"
},
"homepage": "https://github.com/gemini-cli-extensions/dataproc"
},
@@ -1101,7 +1091,7 @@
"source": {
"source": "url",
"url": "https://github.com/datarobot-oss/datarobot-agent-skills.git",
"sha": "0e28dc839859f523f4d8d418612cdadb7a4a3ce7"
"sha": "00207d8d614128deef728a9e6f7f07a3f1d958c6"
},
"homepage": "https://datarobot.com"
},
@@ -1114,7 +1104,7 @@
"url": "https://github.com/microsoft/Dataverse-skills.git",
"path": ".github/plugins/dataverse",
"ref": "main",
"sha": "9b23d74ea15a4a638ea7b28daf004b0ef3226602"
"sha": "1175021761a2f135ea7505208f074ed0fae45255"
},
"homepage": "https://github.com/microsoft/Dataverse-skills"
},
@@ -1163,26 +1153,10 @@
"source": {
"source": "url",
"url": "https://github.com/dominodatalab/domino-claude-plugin.git",
"sha": "64f44339466b10982a5b1f0e7292ca832b3551f1"
"sha": "c2649c78bac350715594352ca61d2df9e3340783"
},
"homepage": "https://www.domino.ai"
},
{
"name": "dropbox",
"description": "The Dropbox plugin for Claude connects your Dropbox files directly to Claude, so you can search, organize, save generated content, and create sharing links without switching tools. It respects your existing Dropbox permissions, and Claude only works with files you already have access to.",
"author": {
"name": "Dropbox"
},
"category": "productivity",
"source": {
"source": "git-subdir",
"url": "https://github.com/dropbox/dropbox-ai-plugins.git",
"path": "claude",
"ref": "main",
"sha": "2f9c81a5d012cc9c389132331a93f4ade06a97a9"
},
"homepage": "https://www.dropbox.com"
},
{
"name": "duckdb-skills",
"description": "DuckDB-powered skills for Claude Code: read any data file, attach and query DuckDB databases, search DuckDB/DuckLake docs, search past session logs, and install/update DuckDB extensions.",
@@ -1221,7 +1195,7 @@
"source": {
"source": "url",
"url": "https://github.com/exa-labs/exa-mcp-server.git",
"sha": "40d9990f48c55301535b0ea2d950176e6f115df3"
"sha": "9ea4ba3e67f87c462c3e06b192470e837ed9009e"
},
"homepage": "https://exa.ai/docs/reference/exa-mcp"
},
@@ -1245,7 +1219,7 @@
"url": "https://github.com/expo/skills.git",
"path": "plugins/expo",
"ref": "main",
"sha": "ad897fdf0c6593d0cc7523198aa752c6f62adeda"
"sha": "b553ae4e1755bec11eac21517fe63040c7e07f2c"
},
"homepage": "https://github.com/expo/skills/blob/main/plugins/expo/README.md"
},
@@ -1293,7 +1267,7 @@
"source": {
"source": "url",
"url": "https://github.com/figma/mcp-server-guide.git",
"sha": "bea8bea5f676ab2bf76fa822b82f50b66653c098"
"sha": "2efd0e37d10c35c4a7cf6d2b7381c9dc1a569bd4"
},
"homepage": "https://github.com/figma/mcp-server-guide"
},
@@ -1311,7 +1285,7 @@
"source": {
"source": "url",
"url": "https://github.com/firecrawl/firecrawl-claude-plugin.git",
"sha": "069551a7d2b0379ea7589a9e2f46062e69820a2d"
"sha": "e30c89f7b065b29a7283d49a4dcc5e302900fda3"
},
"homepage": "https://github.com/firecrawl/firecrawl-claude-plugin.git"
},
@@ -1325,7 +1299,7 @@
"source": {
"source": "url",
"url": "https://github.com/gemini-cli-extensions/firestore-native.git",
"sha": "581b498b39529c895889742e51ea4a6d3bf2d547"
"sha": "26ab5016e0216cf86f0988e1d11b52b5a101783e"
},
"homepage": "https://github.com/gemini-cli-extensions/firestore-native"
},
@@ -1428,7 +1402,7 @@
"source": {
"source": "url",
"url": "https://github.com/huggingface/skills.git",
"sha": "35e8c35a1ae5b462e0bb23d444d25569c3bb6700"
"sha": "ea9a24f38a98baf2430dab3bcb31a89753ae9e6d"
},
"homepage": "https://github.com/huggingface/skills.git"
},
@@ -1442,7 +1416,7 @@
"source": {
"source": "url",
"url": "https://github.com/hunter-io/claude-plugin.git",
"sha": "0a03795dfe7258f46e702a2898bfc25aebbfcc58"
"sha": "9929ccf4f228171398049633da7afd8f1b65646b"
},
"homepage": "https://hunter.io"
},
@@ -1456,7 +1430,7 @@
"source": {
"source": "url",
"url": "https://github.com/heygen-com/hyperframes.git",
"sha": "56859b618f45f646835c717a8a6dfaabbbda636d"
"sha": "091137e3c32f7c247b6a7cc1c81ece36cd60a937"
},
"homepage": "https://hyperframes.heygen.com"
},
@@ -1510,7 +1484,7 @@
"source": "github",
"repo": "jfrog/claude-plugin",
"commit": "259c8e718266c16e99b4f30ae9b1ed0f9f00d98d",
"sha": "320a5585d6d9747668bd20e1c512c577d1e871d3"
"sha": "ac0ea16e9e96c9837b26d3c7d6bdfecd41cb6149"
},
"homepage": "https://jfrog.com"
},
@@ -1563,7 +1537,7 @@
"source": {
"source": "url",
"url": "https://github.com/langfuse/claude-observability-plugin.git",
"sha": "938df41639efcaa22790b1a216308b6ed626a8b7"
"sha": "597af67d6c6b369f3e55db6cfa2ebe444f1af46c"
},
"homepage": "https://langfuse.com/integrations/other/claude-code"
},
@@ -1669,7 +1643,7 @@
"url": "https://github.com/pydantic/skills.git",
"path": "plugins/logfire",
"ref": "main",
"sha": "f0c20b9895f06d58823032f13e68c6aaae9dd3fa"
"sha": "1e7a4567d8375e8ef07ad078d7f38bc03ce5e944"
},
"homepage": "https://github.com/pydantic/skills/tree/main/plugins/logfire"
},
@@ -1699,7 +1673,7 @@
"source": {
"source": "url",
"url": "https://github.com/gemini-cli-extensions/looker.git",
"sha": "2f871191fc110c51442cc0ab4210af329d0ebc63"
"sha": "0b4e497ef9839fce0ae1efd40216fee15a1c5e33"
},
"homepage": "https://github.com/gemini-cli-extensions/looker"
},
@@ -1840,7 +1814,7 @@
"url": "https://github.com/mercadopago/mercadopago-claude-marketplace.git",
"path": "plugins/mercadopago",
"ref": "main",
"sha": "fffc567d1cbfe18b361bf00da5677b470a94f49a"
"sha": "ba967158392bec9f0c199cd39196af64222f0ab0"
},
"homepage": "https://github.com/mercadopago/mercadopago-claude-marketplace/tree/main/plugins/mercadopago"
},
@@ -1867,7 +1841,7 @@
"url": "https://github.com/awslabs/startups.git",
"path": "migrate/plugins/migration-to-aws",
"ref": "main",
"sha": "e49c21bf8b4883a9646938c00091633dfb8f483f"
"sha": "2e1d603a43b241f13ed40e4d1762f5e4ed744ecc"
},
"homepage": "https://github.com/awslabs/startups"
},
@@ -1945,7 +1919,7 @@
"source": {
"source": "url",
"url": "https://github.com/netlify/context-and-tools.git",
"sha": "a1d397b8addd2cd8e61e6592542203ecfa7c5152"
"sha": "ab80a6ed2b6c4933a3f964101c82b45cab847b5b"
},
"homepage": "https://github.com/netlify/context-and-tools"
},
@@ -1981,7 +1955,7 @@
"source": {
"source": "url",
"url": "https://github.com/nvsecurity/nightvision-skills.git",
"sha": "67af610a1da439e10b1714d3896a2a02bf1ebd63"
"sha": "a510be06ca7fb2a0b1ffe38d4163f56dbc3b9e93"
},
"homepage": "https://github.com/nvsecurity/nightvision-skills"
},
@@ -1991,7 +1965,7 @@
"source": {
"source": "url",
"url": "https://github.com/Nimbleway/agent-skills.git",
"sha": "1a599ea15f71d20cc6f85692030021146931997a"
"sha": "eb97261aa8145fa6d0f45d62d0955805fa06fb91"
},
"homepage": "https://docs.nimbleway.com/integrations/agent-skills/plugin-installation"
},
@@ -2018,26 +1992,10 @@
"url": "https://github.com/NVIDIA/skills.git",
"path": "plugins/nvidia-skills",
"ref": "main",
"sha": "26811af1bbb5fb5c8ff3fc5dc04a6f36840615c1"
"sha": "366564ddf68ad55b3c12a2faee3d2fd3d3de3b36"
},
"homepage": "https://github.com/NVIDIA/skills"
},
{
"name": "oracle-ai-data-platform-workbench-databricks-migrator",
"description": "Drive the Oracle AI Data Platform (AIDP) Databricks Migration Toolkit in natural language. Plans and executes automated Databricks → AIDP migrations of notebooks, jobs, schedules, and catalog DDL — Pass-1 dependency rewrite + Pass-2 cell-by-cell execute/verify/fix on a live AIDP cluster with Claude.",
"author": {
"name": "Oracle"
},
"category": "development",
"source": {
"source": "git-subdir",
"url": "https://github.com/oracle-samples/oracle-aidp-samples.git",
"path": "ai/claude-code-plugins/oracle-ai-data-platform-workbench-databricks-migrator",
"ref": "main",
"sha": "a88bcf3a9f9acca94663a727de42d8535e869486"
},
"homepage": "https://docs.oracle.com/en/cloud/paas/ai-data-platform/index.html"
},
{
"name": "oracle-ai-data-platform-workbench-engineer-agent",
"description": "Oracle AI Data Platform (AIDP) Workbench engineer agent for Claude Code — a 37-skill agent that operates the full Spark/Delta lakehouse in natural language. Discovers your catalog into a grounding cache, turns plain English into accurate Spark SQL, and runs the lifecycle (CREATE/INSERT/UPDATE/DELETE/MERGE, OPTIMIZE/VACUUM, time-travel). Ingests files, profiles data and sets quality rules, authors and repairs pipelines, provisions clusters, and debugs via the Spark UI. Governs the platform (roles, credential store, Delta Sharing, audit logs), plus native Git, bundles, and MLOps/MLflow. Runs via the official Oracle aidp CLI.",
@@ -2096,7 +2054,7 @@
"url": "https://github.com/growthxai/output.git",
"path": "coding_assistants/claude/plugins/outputai",
"ref": "main",
"sha": "2da721305432195c2d92020167bf11905421fe61"
"sha": "66f1583420ff5c2912e331045ed225f45e835a63"
},
"homepage": "https://output.ai"
},
@@ -2206,7 +2164,7 @@
"source": {
"source": "url",
"url": "https://github.com/PostHog/ai-plugin.git",
"sha": "835f4f647fec8a8fbde8ea00cf9b2432a35d7e5b"
"sha": "d09ebca2302c085cef2dd576f2b6ec88fe254ce1"
},
"homepage": "https://posthog.com/docs/model-context-protocol"
},
@@ -2272,7 +2230,7 @@
"url": "https://github.com/pydantic/skills.git",
"path": "plugins/ai",
"ref": "main",
"sha": "f0c20b9895f06d58823032f13e68c6aaae9dd3fa"
"sha": "1e7a4567d8375e8ef07ad078d7f38bc03ce5e944"
},
"homepage": "https://github.com/pydantic/skills/tree/main/plugins/ai"
},
@@ -2310,7 +2268,7 @@
"source": {
"source": "url",
"url": "https://github.com/qdrant/skills.git",
"sha": "0651740b38ed466ad12907bfb848e5f4b71b25e2"
"sha": "80f1980d126039c762664a3fe660bbad2eb1ec11"
},
"homepage": "https://skills.qdrant.tech"
},
@@ -2335,7 +2293,7 @@
"source": {
"source": "url",
"url": "https://github.com/TheQtCompanyRnD/agent-skills.git",
"sha": "6e3411d7e58965aa31fa3803c398511f27b29216"
"sha": "2be55aaf050cf0e5d92d62966c473d2c5f6d780a"
},
"homepage": "https://www.qt.io/"
},
@@ -2349,7 +2307,7 @@
"source": {
"source": "url",
"url": "https://github.com/quarkusio/quarkus-agent-mcp.git",
"sha": "1804071ef5f0c7ca2a2e8d6708b1eef4a1fec74a"
"sha": "4c1fcf1cba1f292315f7d33261274798305ea954"
},
"homepage": "https://quarkus.io"
},
@@ -2401,7 +2359,7 @@
"url": "https://github.com/redis/agent-skills.git",
"path": "plugins/redis-development",
"ref": "main",
"sha": "3d6f25505ea2adff4dd62d5a0e7f4a5b076fa047"
"sha": "5ca2e1a2d82a768221e8f71a02e3ca095a37d38e"
},
"homepage": "https://redis.io"
},
@@ -2411,7 +2369,7 @@
"source": {
"source": "url",
"url": "https://github.com/Digital-Process-Tools/claude-remember.git",
"sha": "f1a00382598ef627c858d9eed6438047b072ba41"
"sha": "8bd6255f081dc7123b6b64d335a2c8c5a379ea00"
},
"homepage": "https://github.com/Digital-Process-Tools/claude-remember"
},
@@ -2425,7 +2383,7 @@
"source": {
"source": "url",
"url": "https://github.com/resend/resend-skills.git",
"sha": "298207bbe7a43d1886dc9490ecf880b5442600f9"
"sha": "288efc7103c8177c9019dea79cf0099bacabb81d"
},
"homepage": "https://resend.com"
},
@@ -2451,7 +2409,7 @@
"source": {
"source": "url",
"url": "https://github.com/rilldata/agent-skills.git",
"sha": "c8c8738f44826150d52304cd4fb70cc3ecbdca2e"
"sha": "9bdc4efa38a9ad419104fc2d1bb3e89529202487"
},
"homepage": "https://docs.rilldata.com/developers/build/ai-configuration"
},
@@ -2584,26 +2542,10 @@
"url": "https://github.com/SAP/open-ux-tools.git",
"path": "packages/fiori-mcp-server",
"ref": "main",
"sha": "0cddd1a565895e5a12623b9e6aa19758cdbf80df"
"sha": "2ad82bdef290e4a099441753be75987cf84ecd1a"
},
"homepage": "https://github.com/SAP/open-ux-tools/tree/main/packages/fiori-mcp-server"
},
{
"name": "sap-hana-cli",
"description": "150+ SAP HANA database tools for AI assistants. Query tables, import/export data, profile data quality, compare schemas, manage backups, monitor performance, and more. Connects to SAP HANA Cloud and on-premise databases.",
"author": {
"name": "SAP SE",
"email": "ospo@sap.com",
"url": "https://www.sap.com"
},
"category": "database",
"source": {
"source": "url",
"url": "https://github.com/SAP-samples/hana-cli-claude-plugin.git",
"sha": "abadd0aba32792b6378ed784e9f6d3e5b25dfc2a"
},
"homepage": "https://github.com/SAP-samples/hana-cli-claude-plugin"
},
{
"name": "sap-mdk-server",
"description": "MCP server for SAP Mobile Development Kit (MDK). Build and modify MDK applications with AI assistance — schema lookups, action validation, rule editing, and project scaffolding.",
@@ -2616,7 +2558,7 @@
"source": {
"source": "url",
"url": "https://github.com/SAP/mdk-mcp-server.git",
"sha": "a3df54e69dfcf193b92b0c081a4acbeefb92b419"
"sha": "10ff6ccfee094b9fb3b3877a41f00fa278b1bcc4"
},
"homepage": "https://help.sap.com/docs/MDK"
},
@@ -2656,7 +2598,7 @@
"source": "git-subdir",
"url": "https://github.com/semgrep/mcp-marketplace.git",
"path": "plugin",
"sha": "5ee984a4aeee83b3edae3ed44be4be8d333d24d1"
"sha": "18771d9a7f78b0cb15711ad759ab253b20aeb45d"
},
"homepage": "https://github.com/semgrep/mcp-marketplace.git"
},
@@ -2666,10 +2608,10 @@
"category": "monitoring",
"source": {
"source": "url",
"url": "https://github.com/getsentry/plugin-claude.git",
"sha": "f69cf097dd4c2fd56cab2738442e78848ff6d206"
"url": "https://github.com/getsentry/sentry-for-claude.git",
"sha": "9ab3551758913a4144517d4fafb71476a48c64f8"
},
"homepage": "https://github.com/getsentry/plugin-claude"
"homepage": "https://github.com/getsentry/sentry-for-claude/tree/main"
},
{
"name": "sentry-cli",
@@ -2683,7 +2625,7 @@
"url": "https://github.com/getsentry/cli.git",
"path": "plugins/sentry-cli",
"ref": "main",
"sha": "20b469aa5a21acd9bad0650670a08dbe671f499b"
"sha": "33028c2ac93e027ce3faa9045efc91d895deae1a"
},
"homepage": "https://sentry.io"
},
@@ -2709,7 +2651,7 @@
"url": "https://github.com/ServiceNow/sdk.git",
"path": "providers/claude/plugin",
"ref": "master",
"sha": "4aadc235ad57a7442e42529869e68ff19c59596c"
"sha": "35ef6130d8a49e67b531bde2f987808426273d15"
},
"homepage": "https://servicenow.github.io/sdk/"
},
@@ -2748,7 +2690,7 @@
"source": {
"source": "url",
"url": "https://github.com/Shopify/Shopify-AI-Toolkit.git",
"sha": "2de64b683f8120e215e783fbee12aa037ce77f55"
"sha": "a8e87a7cff153479eb77230d9c232484a1f3062f"
},
"homepage": "https://shopify.dev"
},
@@ -2770,7 +2712,7 @@
"source": {
"source": "url",
"url": "https://github.com/slackapi/slack-mcp-plugin.git",
"sha": "1559729e80eafb1e93fba4aae30c43a85fe35355"
"sha": "9ae6855c4cf81ce8ecd23b12560ff295721c0d07"
},
"homepage": "https://github.com/slackapi/slack-mcp-plugin/tree/main"
},
@@ -2800,7 +2742,7 @@
"source": {
"source": "url",
"url": "https://github.com/SonarSource/sonarqube-agent-plugins.git",
"sha": "5b4783d8749074e8e0c26ca8590990b1489771eb"
"sha": "86eb67ba72ae804f604baa58990f5388c6655410"
},
"homepage": "https://www.sonarsource.com"
},
@@ -2836,7 +2778,7 @@
"source": {
"source": "url",
"url": "https://github.com/gemini-cli-extensions/spanner.git",
"sha": "88030b07ba0d39475ff22e3d410b92fa543d0b67"
"sha": "e6a93f9ce95758ce7b7c54330871cfb40e53b976"
},
"homepage": "https://github.com/gemini-cli-extensions/spanner"
},
@@ -2860,7 +2802,7 @@
"url": "https://github.com/stripe/ai.git",
"path": "providers/claude/plugin",
"ref": "main",
"sha": "23b54f12503eb18bb05eb9de9fbaeb301bec80b0"
"sha": "d9527bfc2d0993f3d2a650501e53e4f68d179ca3"
},
"homepage": "https://github.com/stripe/ai/tree/main/providers/claude/plugin"
},
@@ -2928,7 +2870,7 @@
"source": {
"source": "url",
"url": "https://github.com/JetBrains/teamcity-cli.git",
"sha": "42ce6a22b1a8167120adbfa8de8b79f36e698133"
"sha": "2406cb584cc5ca729ed9303b27bd070cf7b206ec"
},
"homepage": "https://www.jetbrains.com/teamcity/"
},
@@ -3021,25 +2963,7 @@
"url": "https://github.com/UI5/plugins-coding-agents.git",
"path": "plugins/ui5",
"ref": "main",
"sha": "d1e3a43fa80ef160cb42689b88d665e25a5a81a1"
},
"homepage": "https://github.com/UI5/plugins-coding-agents"
},
{
"name": "ui5-modernization",
"description": "Complete UI5 modernization toolkit with workflow and specialized fix patterns for modernizing SAPUI5/OpenUI5 applications.",
"author": {
"name": "SAP SE",
"email": "openui5@sap.com",
"url": "https://www.sap.com"
},
"category": "development",
"source": {
"source": "git-subdir",
"url": "https://github.com/UI5/plugins-coding-agents.git",
"path": "plugins/ui5-modernization",
"ref": "main",
"sha": "d1e3a43fa80ef160cb42689b88d665e25a5a81a1"
"sha": "60f66f3341cb69ab4f649f1f60d70649bf391be2"
},
"homepage": "https://github.com/UI5/plugins-coding-agents"
},
@@ -3057,7 +2981,7 @@
"url": "https://github.com/UI5/plugins-coding-agents.git",
"path": "plugins/ui5-typescript-conversion",
"ref": "main",
"sha": "d1e3a43fa80ef160cb42689b88d665e25a5a81a1"
"sha": "60f66f3341cb69ab4f649f1f60d70649bf391be2"
},
"homepage": "https://github.com/UI5/plugins-coding-agents"
},
@@ -3073,7 +2997,7 @@
"url": "https://github.com/val-town/plugins.git",
"path": "plugin",
"ref": "main",
"sha": "22594eb245d5b06714c99248d68c333169274b21"
"sha": "1f7928397349f2ccb228302d8b062c7f20745871"
},
"homepage": "https://val.town"
},
@@ -3112,7 +3036,7 @@
"source": {
"source": "url",
"url": "https://github.com/vercel/vercel-plugin.git",
"sha": "5f3f0ad7931ad49d6a4c6ed43ab4bf4781a69f6d"
"sha": "b2f2bc09dd05b15db9cb2e696f57872e85944aad"
},
"homepage": "https://github.com/vercel/vercel-plugin"
},
@@ -3151,7 +3075,7 @@
"source": {
"source": "url",
"url": "https://github.com/wix/skills.git",
"sha": "1ea953a29525ce8ff07a3b5a3a107927804c3eba"
"sha": "9cd9d7c60470194a6c3170e3d093a818a2f11d6b"
},
"homepage": "https://dev.wix.com/docs/wix-cli/guides/development/about-wix-skills"
},
@@ -3204,7 +3128,7 @@
"url": "https://github.com/zapier/zapier-mcp.git",
"path": "plugins/zapier",
"ref": "main",
"sha": "469651fe7fdaa3dfc6a476ef5bad6c354773366a"
"sha": "469b06007824bb859982a95d2dad5caec11e0bf1"
},
"homepage": "https://github.com/zapier/zapier-mcp/tree/main/plugins/zapier"
},
@@ -3261,20 +3185,6 @@
"sha": "a2162c384e1ffb68b3bf14783ea9a1a762c85ff5"
},
"homepage": "https://github.com/zscaler/zscaler-mcp-server"
},
{
"name": "langfuse",
"description": "Skills for working with Langfuse, the open-source LLM engineering platform for tracing, prompt management, and evaluation.",
"author": {
"name": "Langfuse"
},
"category": "monitoring",
"source": {
"source": "url",
"url": "https://github.com/langfuse/skills.git",
"sha": "c39789078b848160a695947907db3ba40b7a2bce"
},
"homepage": "https://langfuse.com"
}
]
}

View File

@@ -1,153 +0,0 @@
'use strict';
// Shared logic for letting a NON-MEMBER pull request stay open and be reviewed, scoped to
// the contributor's own already-listed plugin repo. No maintained allowlist, no individuals.
//
// Trust model: we do NOT verify the submitter's identity. We trust the SOURCE REPO. A PR is
// in scope only if it ADDS marketplace.json entries whose source.url is a repo that ALREADY
// backs a live entry in this marketplace (derived from the base marketplace.json), pinned to
// a commit in that repo. Because the repo is org-controlled and the SHA pins to a real commit
// there, the shipped code is the org's code regardless of who opened the PR. Merge still
// requires CI + a maintainer approval.
//
// Used by:
// - close-external-prs.yml (skip the auto-close when in scope)
// - external-pr-scope-guard.yml (required status check: fail a non-member PR that is out of scope)
//
// Security: evaluate() reads base + head marketplace.json as DATA via the API and parses them;
// it never checks out or executes head code.
const MARKETPLACE = '.claude-plugin/marketplace.json';
function normalizeRepo(u) {
return String(u || '').trim().toLowerCase()
.replace(/^git\+/, '')
.replace(/^https?:\/\//, '')
.replace(/\.git$/, '')
.replace(/\/+$/, '');
}
function pluginsByName(json) {
const map = {};
for (const p of (json && json.plugins) || []) { if (p && p.name) map[p.name] = p; }
return map;
}
// Repos that already back a live entry, derived from the base marketplace.json.
function liveReposOf(base) {
const s = new Set();
for (const name of Object.keys(base)) {
const u = base[name] && base[name].source && base[name].source.url;
if (!u) continue;
const r = normalizeRepo(u);
if (r.split('/').length >= 3) s.add(r); // host/org/repo
}
return s;
}
// Pure decision over an already-computed diff. Returns { ok, problems, added, removed, modified }.
// before = plugins at the MERGE-BASE (what head forked from), after = plugins at HEAD,
// liveRepos = repos already live on the current base branch. Diffing before->after (not
// base-tip->head) isolates THIS PR's changes; a stale fork no longer shows main's later
// additions as phantom removals.
function analyze({ changedFiles, before, after, liveRepos }) {
const problems = [];
const off = changedFiles.filter(n => n !== MARKETPLACE);
if (off.length) problems.push(`changes files other than ${MARKETPLACE}: ${off.join(', ')}`);
const baseNames = new Set(Object.keys(before));
const headNames = new Set(Object.keys(after));
const removed = [...baseNames].filter(n => !headNames.has(n));
const added = [...headNames].filter(n => !baseNames.has(n));
const modified = [...headNames].filter(
n => baseNames.has(n) && JSON.stringify(before[n]) !== JSON.stringify(after[n])
);
if (removed.length) problems.push(`removes existing entr${removed.length > 1 ? 'ies' : 'y'}: ${removed.join(', ')}`);
if (modified.length) problems.push(`modifies existing entr${modified.length > 1 ? 'ies' : 'y'}: ${modified.join(', ')}`);
if (!off.length && !added.length && !removed.length && !modified.length) {
problems.push('makes no in-scope change (expected additions to marketplace.json)');
}
for (const name of added) {
const u = after[name] && after[name].source && after[name].source.url;
if (!u) { problems.push(`added "${name}" has no source.url to validate`); continue; }
const r = normalizeRepo(u);
if (r.split('/').length < 3) { problems.push(`added "${name}" source.url ${u} is not a valid repo URL`); continue; }
if (!liveRepos.has(r)) {
problems.push(`added "${name}" points at ${u}, a repo with no existing live plugin in this marketplace`);
}
}
return { ok: problems.length === 0, problems, added, removed, modified, liveRepoCount: liveRepos.size };
}
async function readPlugins(github, owner, repo, ref) {
try {
const { data } = await github.rest.repos.getContent({ owner, repo, ref, path: MARKETPLACE });
return pluginsByName(JSON.parse(Buffer.from(data.content, 'base64').toString('utf8')));
} catch (e) {
return null;
}
}
// API wrapper used by both workflows. Fetches the diff + base/head marketplace.json, delegates to analyze().
async function evaluate({ github, context }) {
const pr = context.payload.pull_request;
const owner = context.repo.owner, repo = context.repo.repo;
const files = await github.paginate(github.rest.pulls.listFiles, {
owner, repo, pull_number: pr.number, per_page: 100,
});
const changedFiles = files.map(f => f.filename);
// Diff THIS PR's changes (merge-base -> head), not base-tip -> head, so a fork that is
// behind main doesn't show main's later additions as phantom removals.
let mergeBaseSha = pr.base.sha;
try {
const cmp = await github.rest.repos.compareCommits({ owner, repo, base: pr.base.sha, head: pr.head.sha });
if (cmp && cmp.data && cmp.data.merge_base_commit && cmp.data.merge_base_commit.sha) {
mergeBaseSha = cmp.data.merge_base_commit.sha;
}
} catch (e) { /* fall back to base.sha */ }
const liveBase = await readPlugins(github, owner, repo, pr.base.sha); // current base branch (for "already live")
const before = await readPlugins(github, owner, repo, mergeBaseSha); // what head forked from
const after = await readPlugins(github, pr.head.repo.owner.login, pr.head.repo.name, pr.head.sha);
if (liveBase === null || before === null || after === null) {
return { ok: false, problems: ['could not read marketplace.json at base, merge-base, and/or head'], added: [], removed: [], modified: [] };
}
return analyze({ changedFiles, before, after, liveRepos: liveReposOf(liveBase) });
}
// Authors that are NOT subject to the external-contributor scope rules:
// - the repo's own automation bot — its bump PRs legitimately MODIFY existing entries
// (SHA bumps), which the additions-only external-contributor rule forbids; AND
// - org members (write/admin).
// Safe under pull_request_target: a fork PR cannot set its author to github-actions[bot]
// (that login is only ever the org's own GITHUB_TOKEN workflow), and the member path is a
// real permission lookup. Wrapped in try/catch because getCollaboratorPermissionLevel throws
// for a non-collaborator/unknown user — without this, both callers would error the job rather
// than fall through to scope evaluation.
const EXEMPT_BOTS = new Set(['github-actions[bot]']);
async function isExemptAuthor({ github, context }) {
const author = context.payload.pull_request.user.login;
if (EXEMPT_BOTS.has(author)) {
return { exempt: true, reason: `${author} is the trusted automation bot` };
}
try {
const { data } = await github.rest.repos.getCollaboratorPermissionLevel({
owner: context.repo.owner, repo: context.repo.repo, username: author,
});
if (['admin', 'write'].includes(data.permission)) {
return { exempt: true, reason: `${author} is ${data.permission} (member)` };
}
} catch (e) {
// not a collaborator / lookup failed → not exempt; fall through to scope evaluation
}
return { exempt: false };
}
module.exports = { normalizeRepo, liveReposOf, analyze, readPlugins, evaluate, isExemptAuthor, MARKETPLACE };

View File

@@ -7,46 +7,30 @@ on:
permissions:
pull-requests: write
issues: write
contents: read
jobs:
check-membership:
if: vars.DISABLE_EXTERNAL_PR_CHECK != 'true'
runs-on: ubuntu-latest
steps:
# pull_request_target: checks out the BASE repo (trusted), so the allowlist + shared
# script below are this repo's versions, never the fork's.
- uses: actions/checkout@v4
- name: Close PR unless author is a member or the PR is an in-scope external contribution
- name: Check if author has write access
uses: actions/github-script@v7
with:
script: |
const author = context.payload.pull_request.user.login;
const { evaluate, isExemptAuthor } = require(`${process.env.GITHUB_WORKSPACE}/.github/scripts/external-pr-scope.js`);
const { data } = await github.rest.repos.getCollaboratorPermissionLevel({
owner: context.repo.owner,
repo: context.repo.repo,
username: author
});
// Members (write/admin) and the repo's own automation bot (bump SHA PRs) are never
// auto-closed.
const ex = await isExemptAuthor({ github, context });
if (ex.exempt) {
console.log(`${ex.reason} — allowing PR`);
if (['admin', 'write'].includes(data.permission)) {
console.log(`${author} has ${data.permission} access, allowing PR`);
return;
}
// Non-member: allow the PR to stay open ONLY if it is an in-scope external
// contribution — it adds marketplace.json entries whose source repo ALREADY backs
// a live plugin here, and changes nothing else. (No maintained allowlist: the set
// of allowed repos is derived from the live marketplace.) This grants only the
// right to open a reviewable PR; the validate + scan checks and a maintainer
// approval still gate the merge (the External PR Scope Guard is advisory signal,
// not a required check).
const result = await evaluate({ github, context });
if (result.ok && result.added.length > 0) {
console.log(`In-scope external contribution (adds: ${result.added.join(', ')}) — allowing PR.`);
return;
}
console.log(`Closing PR from ${author}: ${result.problems.join('; ') || 'out of scope'}`);
console.log(`${author} has ${data.permission} access, closing PR`);
await github.rest.issues.createComment({
owner: context.repo.owner,

View File

@@ -1,54 +0,0 @@
name: External PR Scope Guard
# Advisory check that surfaces what a NON-MEMBER pull request may change.
# Members (write/admin) and the repo's own automation bot (bump SHA PRs) are unrestricted and
# skip this check. For a non-member PR this fails unless the PR is an in-scope external
# contribution per .github/scripts/external-pr-scope.js: it changes ONLY
# .claude-plugin/marketplace.json, the delta is additions-only (no existing entry modified or
# removed), and every ADDED entry's source.url is a repo that ALREADY backs a live plugin in
# this marketplace (the allowed set is derived from the live marketplace — there is no
# maintained allowlist).
#
# Do NOT add this job to branch protection as a required status check. The merge gate is the
# `validate` + `scan` checks plus a maintainer approval; this guard is advisory signal for the
# reviewer, not a hard gate. (Making it required would block the no-approval bump-merge path.)
#
# Security: runs on pull_request_target but checks out only the BASE repo (trusted) for the
# shared script; the head marketplace.json is fetched as DATA via the API and parsed, never executed.
on:
pull_request_target:
types: [opened, synchronize, reopened]
permissions:
contents: read
pull-requests: read
jobs:
scope-guard:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4 # base repo (trusted)
- uses: actions/github-script@v7
with:
script: |
const { evaluate, isExemptAuthor } = require(`${process.env.GITHUB_WORKSPACE}/.github/scripts/external-pr-scope.js`);
// Members (write/admin) and the repo's own automation bot (bump SHA PRs) are
// unrestricted; only genuinely external contributions are scope-checked.
const ex = await isExemptAuthor({ github, context });
if (ex.exempt) {
console.log(`${ex.reason} — scope guard not applicable.`);
return;
}
const result = await evaluate({ github, context });
if (!result.ok) {
core.setFailed(
`Scope guard: a non-member PR may only ADD marketplace.json entries whose source repo already backs a live plugin here.\n - ` +
result.problems.join('\n - ')
);
return;
}
console.log(`Scope guard passed: adds ${result.added.join(', ') || 'none'}, all from repos already live here.`);

View File

@@ -42,6 +42,21 @@ plugin-name/
└── README.md # Documentation
```
## Plugin names are immutable
The `name` field in a marketplace entry is an **immutable slug**. Once a plugin has been published, its `name` must not change — users have it installed under that slug, and renaming it breaks their install with a `plugin-not-found` error.
- To change how a plugin is labeled in the UI, set or update `displayName` instead.
- If a rename is genuinely unavoidable, add an entry to the top-level `renames` map in `.claude-plugin/marketplace.json` so existing installs auto-migrate:
```json
"renames": {
"old-name": "new-name"
}
```
The Claude Code plugin loader reads this map and transparently rewrites the old slug to the new one on the user's next sync.
## Skill-bundle plugins
When a plugin's source repository ships skills (`SKILL.md` files) without a `.claude-plugin/plugin.json` manifest, the marketplace entry can declare the skills directly using `strict: false` and an explicit `skills` array.