mirror of
https://github.com/anthropics/claude-plugins-official.git
synced 2026-07-06 04:13:28 +00:00
Compare commits
1 Commits
macos-altp
...
williamq/u
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
01451cb17d |
@@ -19,7 +19,7 @@
|
||||
"url": "https://github.com/42Crunch-AI/claude-plugins.git",
|
||||
"path": "plugins/api-security-testing",
|
||||
"ref": "v1.5.5",
|
||||
"sha": "bc781f96be8ce17a2972e8a9a3ef38b1ca7e8cc4"
|
||||
"sha": "b7e131e30ff033be2176faf796c94c151a68c63a"
|
||||
},
|
||||
"homepage": "https://42crunch.com"
|
||||
},
|
||||
@@ -35,7 +35,7 @@
|
||||
"url": "https://github.com/adobe/skills.git",
|
||||
"path": "plugins/creative-cloud/adobe-for-creativity",
|
||||
"ref": "main",
|
||||
"sha": "c467bf831064ebda26f39dd30c02d7cce03eb26c"
|
||||
"sha": "253f56901e058800ccb97ffd5bf1e3329d5f2e00"
|
||||
},
|
||||
"homepage": "https://github.com/adobe/skills/tree/main/plugins/creative-cloud/adobe-for-creativity"
|
||||
},
|
||||
@@ -77,7 +77,7 @@
|
||||
"source": {
|
||||
"source": "url",
|
||||
"url": "https://github.com/AikidoSec/aikido-claude-plugin.git",
|
||||
"sha": "01e8cf542500e579cff948a0fa0365e4f819d7b4"
|
||||
"sha": "79ac524f87c9faa9a356ff3d495b8a5b77e01bbd"
|
||||
},
|
||||
"homepage": "https://github.com/AikidoSec/aikido-claude-plugin"
|
||||
},
|
||||
@@ -109,7 +109,7 @@
|
||||
"url": "https://github.com/airwallex/airwallex-marketplace.git",
|
||||
"path": "plugins/airwallex",
|
||||
"ref": "master",
|
||||
"sha": "683a7536f9445c07439d087607b44b0383b8c41d"
|
||||
"sha": "a49ef1ec801fd776adc4db9f2bb4a78463981bc9"
|
||||
},
|
||||
"homepage": "https://www.airwallex.com/docs"
|
||||
},
|
||||
@@ -150,7 +150,7 @@
|
||||
"url": "https://github.com/awslabs/agent-plugins.git",
|
||||
"path": "plugins/amazon-location-service",
|
||||
"ref": "main",
|
||||
"sha": "7a17df718d26f07414b876e77a7480fa25089b08"
|
||||
"sha": "d8243e5f8f3933d656b3bdfe09cd658a5d9b9fac"
|
||||
},
|
||||
"homepage": "https://github.com/awslabs/agent-plugins"
|
||||
},
|
||||
@@ -161,7 +161,7 @@
|
||||
"url": "https://github.com/amplitude/mcp-marketplace.git",
|
||||
"path": "plugins/amplitude",
|
||||
"ref": "main",
|
||||
"sha": "fb22979da93d27dcb17b832dbd473e6b0caf2ca8"
|
||||
"sha": "e9b4e15193666e1b513b5652ded23fab160bdc4e"
|
||||
},
|
||||
"description": "Use Amplitude as an expert analyst — instrument Amplitude, discover product opportunities, analyze charts, create dashboards, manage experiments, and understand users and accounts.",
|
||||
"category": "monitoring",
|
||||
@@ -223,7 +223,7 @@
|
||||
"source": {
|
||||
"source": "url",
|
||||
"url": "https://github.com/astronomer/agents.git",
|
||||
"sha": "789b4544b85a989694501e4f405b522f2d711cf6"
|
||||
"sha": "7ce4a12d3cabb506294134c91a1b876d4b166a70"
|
||||
},
|
||||
"homepage": "https://github.com/astronomer/agents"
|
||||
},
|
||||
@@ -233,7 +233,7 @@
|
||||
"source": {
|
||||
"source": "url",
|
||||
"url": "https://github.com/atlanhq/agent-toolkit.git",
|
||||
"sha": "86bb1ad27f80e189b328333d2271b360ae579f2b"
|
||||
"sha": "789507c02d2495235240d10d67aaac8b2051023a"
|
||||
},
|
||||
"homepage": "https://docs.atlan.com/"
|
||||
},
|
||||
@@ -244,7 +244,7 @@
|
||||
"source": {
|
||||
"source": "url",
|
||||
"url": "https://github.com/atlassian/atlassian-mcp-server.git",
|
||||
"sha": "f4911dba81f25782c88815b03deabf444cd46e0d"
|
||||
"sha": "9b52fb18e184edc307ce33f8bf4cdf148dedf1f2"
|
||||
},
|
||||
"homepage": "https://github.com/atlassian/atlassian-mcp-server"
|
||||
},
|
||||
@@ -256,7 +256,7 @@
|
||||
"source": "url",
|
||||
"url": "https://github.com/BrainBlend-AI/atomic-agents.git",
|
||||
"path": "claude-plugin/atomic-agents",
|
||||
"sha": "94220182f88df0292a8b59d01b61170ff6c61fd4"
|
||||
"sha": "324399402b9b5965313de6a34ea09d6bb149a200"
|
||||
},
|
||||
"homepage": "https://github.com/BrainBlend-AI/atomic-agents",
|
||||
"tags": [
|
||||
@@ -275,7 +275,7 @@
|
||||
"url": "https://github.com/auth0/agent-skills.git",
|
||||
"path": "plugins/auth0",
|
||||
"ref": "main",
|
||||
"sha": "b595bdb9b574569e864eef86c3d48c06e2cf414c"
|
||||
"sha": "bdf0dc23f8b17446b2c94bc9f2e5a58d3f1bc114"
|
||||
},
|
||||
"homepage": "https://auth0.com/docs/quickstart/agent-skills"
|
||||
},
|
||||
@@ -291,7 +291,7 @@
|
||||
"url": "https://github.com/aws/agent-toolkit-for-aws.git",
|
||||
"path": "plugins/aws-agents",
|
||||
"ref": "main",
|
||||
"sha": "a9d1c70fe7442a97678e82b62c7c61bcb0deeaea"
|
||||
"sha": "c0991f463b54ac94af32a730d6d13293dcff98cf"
|
||||
},
|
||||
"homepage": "https://github.com/aws/agent-toolkit-for-aws"
|
||||
},
|
||||
@@ -304,7 +304,7 @@
|
||||
"url": "https://github.com/awslabs/agent-plugins.git",
|
||||
"path": "plugins/aws-amplify",
|
||||
"ref": "main",
|
||||
"sha": "7a17df718d26f07414b876e77a7480fa25089b08"
|
||||
"sha": "d8243e5f8f3933d656b3bdfe09cd658a5d9b9fac"
|
||||
},
|
||||
"homepage": "https://github.com/awslabs/agent-plugins"
|
||||
},
|
||||
@@ -320,7 +320,7 @@
|
||||
"url": "https://github.com/aws/agent-toolkit-for-aws.git",
|
||||
"path": "plugins/aws-core",
|
||||
"ref": "main",
|
||||
"sha": "a9d1c70fe7442a97678e82b62c7c61bcb0deeaea"
|
||||
"sha": "c0991f463b54ac94af32a730d6d13293dcff98cf"
|
||||
},
|
||||
"homepage": "https://github.com/aws/agent-toolkit-for-aws"
|
||||
},
|
||||
@@ -336,7 +336,7 @@
|
||||
"url": "https://github.com/aws/agent-toolkit-for-aws.git",
|
||||
"path": "plugins/aws-data-analytics",
|
||||
"ref": "main",
|
||||
"sha": "a9d1c70fe7442a97678e82b62c7c61bcb0deeaea"
|
||||
"sha": "c0991f463b54ac94af32a730d6d13293dcff98cf"
|
||||
},
|
||||
"homepage": "https://github.com/aws/agent-toolkit-for-aws"
|
||||
},
|
||||
@@ -365,7 +365,7 @@
|
||||
"url": "https://github.com/awslabs/agent-plugins.git",
|
||||
"path": "plugins/aws-serverless",
|
||||
"ref": "main",
|
||||
"sha": "7a17df718d26f07414b876e77a7480fa25089b08"
|
||||
"sha": "d8243e5f8f3933d656b3bdfe09cd658a5d9b9fac"
|
||||
},
|
||||
"homepage": "https://github.com/awslabs/agent-plugins"
|
||||
},
|
||||
@@ -381,7 +381,7 @@
|
||||
"url": "https://github.com/awslabs/startups.git",
|
||||
"path": "advisor/plugins/aws-startup-advisor",
|
||||
"ref": "main",
|
||||
"sha": "3eae13125da8cc923f010b19321137efd0e69a66"
|
||||
"sha": "b3e5ee487ed27d8c776d9b854d7e109f1514c75b"
|
||||
},
|
||||
"homepage": "https://github.com/awslabs/startups"
|
||||
},
|
||||
@@ -392,7 +392,7 @@
|
||||
"source": {
|
||||
"source": "url",
|
||||
"url": "https://github.com/microsoft/azure-skills.git",
|
||||
"sha": "82492494405b948c8422766ddae390714bbd78ed"
|
||||
"sha": "966330ee4fc61978b6e324993687e917125a1f36"
|
||||
},
|
||||
"homepage": "https://github.com/microsoft/azure-skills"
|
||||
},
|
||||
@@ -414,7 +414,7 @@
|
||||
"source": {
|
||||
"source": "url",
|
||||
"url": "https://github.com/base44/skills.git",
|
||||
"sha": "aef0fa35f21b3c0c000d5ab8c0b068e6188618b6"
|
||||
"sha": "ec420cf2edd2c7e9a523d5afe2e71498a6357fa4"
|
||||
},
|
||||
"homepage": "https://docs.base44.com"
|
||||
},
|
||||
@@ -430,7 +430,7 @@
|
||||
"url": "https://github.com/Bigdata-com/bigdata-plugins-marketplace.git",
|
||||
"path": "plugins/bigdata-com",
|
||||
"ref": "main",
|
||||
"sha": "76a043a08c0a10eb73756d04031a613568017067"
|
||||
"sha": "67c30be97a0a3f46bc6e8d56df449ae108eda9c5"
|
||||
},
|
||||
"homepage": "https://docs.bigdata.com"
|
||||
},
|
||||
@@ -472,7 +472,7 @@
|
||||
"source": {
|
||||
"source": "url",
|
||||
"url": "https://github.com/brightdata/skills.git",
|
||||
"sha": "8d427e9871566efe3f0a1c8888f98b6fe8288831"
|
||||
"sha": "bd5bd76bc889f54b744bab3db3cbd42751a1e5b0"
|
||||
},
|
||||
"homepage": "https://docs.brightdata.com"
|
||||
},
|
||||
@@ -486,7 +486,7 @@
|
||||
"source": {
|
||||
"source": "url",
|
||||
"url": "https://github.com/buildkite/skills.git",
|
||||
"sha": "e6c7784f46a2c070fdf7e6fe1b61cd3ca0e20166"
|
||||
"sha": "a43e944f2017146d0a6b7d8ea2bf21b02484e1d3"
|
||||
},
|
||||
"homepage": "https://buildkite.com"
|
||||
},
|
||||
@@ -502,7 +502,7 @@
|
||||
"url": "https://github.com/carta/plugins.git",
|
||||
"path": "plugins/carta-cap-table",
|
||||
"ref": "main",
|
||||
"sha": "5e119d7848e1f495092df4e41ac43e609e3293d1"
|
||||
"sha": "c39482a45c1e4c02922fe5cef3d61fb010a0b2d9"
|
||||
},
|
||||
"homepage": "https://carta.com"
|
||||
},
|
||||
@@ -518,7 +518,7 @@
|
||||
"url": "https://github.com/carta/plugins.git",
|
||||
"path": "plugins/carta-crm",
|
||||
"ref": "main",
|
||||
"sha": "5e119d7848e1f495092df4e41ac43e609e3293d1"
|
||||
"sha": "c39482a45c1e4c02922fe5cef3d61fb010a0b2d9"
|
||||
},
|
||||
"homepage": "https://carta.com"
|
||||
},
|
||||
@@ -534,7 +534,7 @@
|
||||
"url": "https://github.com/carta/plugins.git",
|
||||
"path": "plugins/carta-investors",
|
||||
"ref": "main",
|
||||
"sha": "5e119d7848e1f495092df4e41ac43e609e3293d1"
|
||||
"sha": "c39482a45c1e4c02922fe5cef3d61fb010a0b2d9"
|
||||
},
|
||||
"homepage": "https://carta.com"
|
||||
},
|
||||
@@ -561,7 +561,7 @@
|
||||
"source": {
|
||||
"source": "url",
|
||||
"url": "https://github.com/ChromeDevTools/chrome-devtools-mcp.git",
|
||||
"sha": "ed02047ae90f25c4c15adb8fd7e224b963f43135"
|
||||
"sha": "6bd8c91678035b5aa18ee40f72e1f630aa528837"
|
||||
},
|
||||
"homepage": "https://github.com/ChromeDevTools/chrome-devtools-mcp"
|
||||
},
|
||||
@@ -720,7 +720,7 @@
|
||||
"source": {
|
||||
"source": "url",
|
||||
"url": "https://github.com/cloudflare/skills.git",
|
||||
"sha": "8ff55f2a574f498bbf89675279d92b7a61f4d521"
|
||||
"sha": "c5b7b06b073fa0b4abbd63964630f97d81da69c4"
|
||||
},
|
||||
"description": "Skills for the Cloudflare developer platform: Workers, Durable Objects, Agents SDK, MCP servers, Wrangler CLI, and web performance.",
|
||||
"category": "deployment",
|
||||
@@ -804,7 +804,7 @@
|
||||
"source": {
|
||||
"source": "url",
|
||||
"url": "https://github.com/CodSpeedHQ/codspeed.git",
|
||||
"sha": "9e21a9c0415c848d1c6d7e66c221f7524433899d"
|
||||
"sha": "c6112f168b405df8e7310b12a9b80484cd01ac14"
|
||||
},
|
||||
"homepage": "https://codspeed.io"
|
||||
},
|
||||
@@ -841,7 +841,7 @@
|
||||
"source": {
|
||||
"source": "url",
|
||||
"url": "https://github.com/get-convex/convex-backend-skill.git",
|
||||
"sha": "d184f54776d20dd834218b11b83feb42d5e2a065"
|
||||
"sha": "002f9c834cdb834ddef1e4867d87cb6e80f0acba"
|
||||
},
|
||||
"homepage": "https://github.com/get-convex/convex-backend-skill",
|
||||
"keywords": [
|
||||
@@ -872,7 +872,7 @@
|
||||
"source": {
|
||||
"source": "url",
|
||||
"url": "https://github.com/CrowdStrike/foundry-skills.git",
|
||||
"sha": "a7e6a75ad2d9aa4093771e8c07d455c1ce39aae1"
|
||||
"sha": "0a651a1472e4c03603780517374c654236bcce8b"
|
||||
},
|
||||
"homepage": "https://github.com/CrowdStrike/foundry-skills"
|
||||
},
|
||||
@@ -918,7 +918,7 @@
|
||||
"source": {
|
||||
"source": "url",
|
||||
"url": "https://github.com/dash0hq/dash0-agent-plugin.git",
|
||||
"sha": "e1a46f085171787382465b7148070da36127119f"
|
||||
"sha": "5ff7aa5b8e52e10d10e45ea8e2f7cbebc86758bf"
|
||||
},
|
||||
"homepage": "https://dash0.com/"
|
||||
},
|
||||
@@ -929,7 +929,7 @@
|
||||
"source": {
|
||||
"source": "url",
|
||||
"url": "https://github.com/astronomer/agents.git",
|
||||
"sha": "789b4544b85a989694501e4f405b522f2d711cf6"
|
||||
"sha": "7ce4a12d3cabb506294134c91a1b876d4b166a70"
|
||||
},
|
||||
"homepage": "https://github.com/astronomer/agents"
|
||||
},
|
||||
@@ -943,7 +943,7 @@
|
||||
"source": {
|
||||
"source": "url",
|
||||
"url": "https://github.com/gemini-cli-extensions/data-agent-kit-starter-pack.git",
|
||||
"sha": "65a480a04dc09fe51fab66fde61b1a2baa443741"
|
||||
"sha": "b47cae53405e90dd97d1ecde890a8d4707d1f115"
|
||||
},
|
||||
"homepage": "https://github.com/gemini-cli-extensions/data-agent-kit-starter-pack"
|
||||
},
|
||||
@@ -953,7 +953,7 @@
|
||||
"source": {
|
||||
"source": "url",
|
||||
"url": "https://github.com/astronomer/agents.git",
|
||||
"sha": "789b4544b85a989694501e4f405b522f2d711cf6"
|
||||
"sha": "7ce4a12d3cabb506294134c91a1b876d4b166a70"
|
||||
},
|
||||
"homepage": "https://github.com/astronomer/agents"
|
||||
},
|
||||
@@ -966,7 +966,7 @@
|
||||
"url": "https://github.com/awslabs/agent-plugins.git",
|
||||
"path": "plugins/databases-on-aws",
|
||||
"ref": "main",
|
||||
"sha": "7a17df718d26f07414b876e77a7480fa25089b08"
|
||||
"sha": "d8243e5f8f3933d656b3bdfe09cd658a5d9b9fac"
|
||||
},
|
||||
"homepage": "https://github.com/awslabs/agent-plugins"
|
||||
},
|
||||
@@ -1022,7 +1022,7 @@
|
||||
"source": {
|
||||
"source": "url",
|
||||
"url": "https://github.com/datarobot-oss/datarobot-agent-skills.git",
|
||||
"sha": "6937e65a4f652ecc08b8b53bd7e79f6e3d1f69b3"
|
||||
"sha": "b5a8f7a4bc4d31a1f139a232efbba6127af0474a"
|
||||
},
|
||||
"homepage": "https://datarobot.com"
|
||||
},
|
||||
@@ -1035,7 +1035,7 @@
|
||||
"url": "https://github.com/microsoft/Dataverse-skills.git",
|
||||
"path": ".github/plugins/dataverse",
|
||||
"ref": "main",
|
||||
"sha": "1175021761a2f135ea7505208f074ed0fae45255"
|
||||
"sha": "2c37394346be1afc1db12cc5b89f5dee3617c45c"
|
||||
},
|
||||
"homepage": "https://github.com/microsoft/Dataverse-skills"
|
||||
},
|
||||
@@ -1048,7 +1048,7 @@
|
||||
"url": "https://github.com/awslabs/agent-plugins.git",
|
||||
"path": "plugins/deploy-on-aws",
|
||||
"ref": "main",
|
||||
"sha": "7a17df718d26f07414b876e77a7480fa25089b08"
|
||||
"sha": "d8243e5f8f3933d656b3bdfe09cd658a5d9b9fac"
|
||||
},
|
||||
"homepage": "https://github.com/awslabs/agent-plugins"
|
||||
},
|
||||
@@ -1150,7 +1150,7 @@
|
||||
"url": "https://github.com/expo/skills.git",
|
||||
"path": "plugins/expo",
|
||||
"ref": "main",
|
||||
"sha": "39d50f0caeacec8a17588534bb32aa962c677a3d"
|
||||
"sha": "c38860242118df93d4ec4381a34f4144fff61928"
|
||||
},
|
||||
"homepage": "https://github.com/expo/skills/blob/main/plugins/expo/README.md"
|
||||
},
|
||||
@@ -1198,7 +1198,7 @@
|
||||
"source": {
|
||||
"source": "url",
|
||||
"url": "https://github.com/figma/mcp-server-guide.git",
|
||||
"sha": "2efd0e37d10c35c4a7cf6d2b7381c9dc1a569bd4"
|
||||
"sha": "54ad156019d7362a56d8024b9adbe99952aa29b6"
|
||||
},
|
||||
"homepage": "https://github.com/figma/mcp-server-guide"
|
||||
},
|
||||
@@ -1230,7 +1230,7 @@
|
||||
"source": {
|
||||
"source": "url",
|
||||
"url": "https://github.com/gemini-cli-extensions/firestore-native.git",
|
||||
"sha": "d151daf6a5fde7f46fde824292828ab630220282"
|
||||
"sha": "f88103bd0ccfe9e1e7a3a7d849de26d197978c9a"
|
||||
},
|
||||
"homepage": "https://github.com/gemini-cli-extensions/firestore-native"
|
||||
},
|
||||
@@ -1333,7 +1333,7 @@
|
||||
"source": {
|
||||
"source": "url",
|
||||
"url": "https://github.com/huggingface/skills.git",
|
||||
"sha": "c68f1b08d9eb3af22cdc1d3fb60e9cdb78522556"
|
||||
"sha": "d7223848c3895fbd447faf2aec73e0a6cdd7fdcd"
|
||||
},
|
||||
"homepage": "https://github.com/huggingface/skills.git"
|
||||
},
|
||||
@@ -1361,7 +1361,7 @@
|
||||
"source": {
|
||||
"source": "url",
|
||||
"url": "https://github.com/heygen-com/hyperframes.git",
|
||||
"sha": "3b3ece81d1a0b36038e67e58d9ca620e4a3122e9"
|
||||
"sha": "acd8e11789a7bf92f0ed4fac24ff030cd758da37"
|
||||
},
|
||||
"homepage": "https://hyperframes.heygen.com"
|
||||
},
|
||||
@@ -1429,7 +1429,7 @@
|
||||
"source": {
|
||||
"source": "url",
|
||||
"url": "https://github.com/gemini-cli-extensions/knowledge-catalog.git",
|
||||
"sha": "fe4e94035824fa41f7d06426531bbed7bec2520c"
|
||||
"sha": "317e96fdd12aa61778b950192aff627efdc21099"
|
||||
},
|
||||
"homepage": "https://github.com/gemini-cli-extensions/knowledge-catalog"
|
||||
},
|
||||
@@ -1458,20 +1458,6 @@
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "langfuse-observability",
|
||||
"description": "The Langfuse x Claude Code Observability Plugin",
|
||||
"author": {
|
||||
"name": "Langfuse"
|
||||
},
|
||||
"category": "monitoring",
|
||||
"source": {
|
||||
"source": "url",
|
||||
"url": "https://github.com/langfuse/claude-observability-plugin.git",
|
||||
"sha": "597af67d6c6b369f3e55db6cfa2ebe444f1af46c"
|
||||
},
|
||||
"homepage": "https://langfuse.com/integrations/other/claude-code"
|
||||
},
|
||||
{
|
||||
"name": "laravel-boost",
|
||||
"description": "Laravel development toolkit MCP server. Provides intelligent assistance for Laravel applications including Artisan commands, Eloquent queries, routing, migrations, and framework-specific code generation.",
|
||||
@@ -1554,7 +1540,7 @@
|
||||
"url": "https://github.com/pydantic/skills.git",
|
||||
"path": "plugins/logfire",
|
||||
"ref": "main",
|
||||
"sha": "1e7a4567d8375e8ef07ad078d7f38bc03ce5e944"
|
||||
"sha": "ddc7d00569458f3838c6cf489f5be6c59afaf8c1"
|
||||
},
|
||||
"homepage": "https://github.com/pydantic/skills/tree/main/plugins/logfire"
|
||||
},
|
||||
@@ -1568,24 +1554,10 @@
|
||||
"source": {
|
||||
"source": "url",
|
||||
"url": "https://github.com/gemini-cli-extensions/looker.git",
|
||||
"sha": "ef38964514c9b6634ac9a211d3987222bb36bf6e"
|
||||
"sha": "e912c0342f1bfd436e9236aaef7cc732239c80f7"
|
||||
},
|
||||
"homepage": "https://github.com/gemini-cli-extensions/looker"
|
||||
},
|
||||
{
|
||||
"name": "lovable",
|
||||
"description": "Build, iterate on, deploy, and manage Lovable apps from Claude Code. Bundles the official Lovable MCP server (remote, OAuth 2.1) and adds focused commands for the common build/iterate/database workflows, with credit- and publish-safety prompts.",
|
||||
"author": {
|
||||
"name": "Lovable"
|
||||
},
|
||||
"category": "development",
|
||||
"source": {
|
||||
"source": "url",
|
||||
"url": "https://github.com/lovablelabs/mcp.git",
|
||||
"sha": "9321737a737cf719db44c8124507f75e0bd0d270"
|
||||
},
|
||||
"homepage": "https://lovable.dev"
|
||||
},
|
||||
{
|
||||
"name": "lua-lsp",
|
||||
"description": "Lua language server for code intelligence",
|
||||
@@ -1630,7 +1602,7 @@
|
||||
"source": {
|
||||
"source": "url",
|
||||
"url": "https://github.com/lusha-oss/lusha-mcp-plugin.git",
|
||||
"sha": "affbc76b03c1a46c0dffc5b7a374cf7af17b26e8"
|
||||
"sha": "8fc71d5473ea40e01a92001787f0f3caaf5ca30e"
|
||||
},
|
||||
"homepage": "https://www.lusha.com"
|
||||
},
|
||||
@@ -1736,7 +1708,7 @@
|
||||
"url": "https://github.com/awslabs/startups.git",
|
||||
"path": "migrate/plugins/migration-to-aws",
|
||||
"ref": "main",
|
||||
"sha": "3eae13125da8cc923f010b19321137efd0e69a66"
|
||||
"sha": "3c5d6a7deb24c3318be8b78ef75545539ab1bbcd"
|
||||
},
|
||||
"homepage": "https://github.com/awslabs/startups"
|
||||
},
|
||||
@@ -1787,7 +1759,7 @@
|
||||
"url": "https://github.com/neondatabase/agent-skills.git",
|
||||
"path": "plugins/neon-postgres",
|
||||
"ref": "main",
|
||||
"sha": "e09dafdc62a11fc8a20134afcb70dc2aab2feb88"
|
||||
"sha": "bd9ec7ff273ce54bdd3ebe581d5b0802a3479618"
|
||||
},
|
||||
"homepage": "https://github.com/neondatabase/agent-skills/tree/main/plugins/neon-postgres"
|
||||
},
|
||||
@@ -1798,7 +1770,7 @@
|
||||
"source": {
|
||||
"source": "url",
|
||||
"url": "https://github.com/netlify/context-and-tools.git",
|
||||
"sha": "ab80a6ed2b6c4933a3f964101c82b45cab847b5b"
|
||||
"sha": "22025ef6c9dc9ef88d0c9c047980c10cacb178ee"
|
||||
},
|
||||
"homepage": "https://github.com/netlify/context-and-tools"
|
||||
},
|
||||
@@ -1830,7 +1802,7 @@
|
||||
"source": {
|
||||
"source": "url",
|
||||
"url": "https://github.com/nvsecurity/nightvision-skills.git",
|
||||
"sha": "a510be06ca7fb2a0b1ffe38d4163f56dbc3b9e93"
|
||||
"sha": "7d7a3f342bbf4d02b6e012279800cf91ff0c1c97"
|
||||
},
|
||||
"homepage": "https://github.com/nvsecurity/nightvision-skills"
|
||||
},
|
||||
@@ -1840,7 +1812,7 @@
|
||||
"source": {
|
||||
"source": "url",
|
||||
"url": "https://github.com/Nimbleway/agent-skills.git",
|
||||
"sha": "e72345e283f977d4f7bb4d6d415b5964a385bdf1"
|
||||
"sha": "9736dfc757f5ed4f05da0480b202af09e93a27de"
|
||||
},
|
||||
"homepage": "https://docs.nimbleway.com/integrations/agent-skills/plugin-installation"
|
||||
},
|
||||
@@ -1867,7 +1839,7 @@
|
||||
"url": "https://github.com/NVIDIA/skills.git",
|
||||
"path": "plugins/nvidia-skills",
|
||||
"ref": "main",
|
||||
"sha": "b0c4c9abca3e0b493d96a1574c9678daf086c4b5"
|
||||
"sha": "fd1e6fd1971eb7113a4dd206a028246fa4b3d8b4"
|
||||
},
|
||||
"homepage": "https://github.com/NVIDIA/skills"
|
||||
},
|
||||
@@ -1883,7 +1855,7 @@
|
||||
"url": "https://github.com/oracle-samples/oracle-aidp-samples.git",
|
||||
"path": "ai/claude-code-plugins/oracle-ai-data-platform-workbench-spark-connectors",
|
||||
"ref": "main",
|
||||
"sha": "fd54df54076da5fa95fdb4a63398d2edb8724edb"
|
||||
"sha": "00cedef34c99d642d969f87965736768de01cbd6"
|
||||
},
|
||||
"homepage": "https://docs.oracle.com/en/cloud/paas/ai-data-platform/index.html"
|
||||
},
|
||||
@@ -1913,7 +1885,7 @@
|
||||
"url": "https://github.com/growthxai/output.git",
|
||||
"path": "coding_assistants/claude/plugins/outputai",
|
||||
"ref": "main",
|
||||
"sha": "bd6bd4960b00f340c1e345620a8eb42d6c696e5f"
|
||||
"sha": "65cd087132dce880362c52384b8237eb9202ceea"
|
||||
},
|
||||
"homepage": "https://output.ai"
|
||||
},
|
||||
@@ -2023,7 +1995,7 @@
|
||||
"source": {
|
||||
"source": "url",
|
||||
"url": "https://github.com/PostHog/ai-plugin.git",
|
||||
"sha": "071b9b841a987aa93409d4db1499237a5120bc63"
|
||||
"sha": "db4a86632293ca66eec9a6d278786ddb22c1787e"
|
||||
},
|
||||
"homepage": "https://posthog.com/docs/model-context-protocol"
|
||||
},
|
||||
@@ -2044,7 +2016,7 @@
|
||||
"source": {
|
||||
"source": "url",
|
||||
"url": "https://github.com/Postman-Devrel/postman-claude-code-plugin.git",
|
||||
"sha": "cb8e002ec9b94d84e1d247bcb3e854dec4de0ace"
|
||||
"sha": "812678b3d1d1956815252d8f25e3ccc10d1bca8f"
|
||||
},
|
||||
"homepage": "https://learning.postman.com/docs/developer/postman-mcp-server/"
|
||||
},
|
||||
@@ -2078,7 +2050,7 @@
|
||||
"url": "https://github.com/pydantic/skills.git",
|
||||
"path": "plugins/ai",
|
||||
"ref": "main",
|
||||
"sha": "1e7a4567d8375e8ef07ad078d7f38bc03ce5e944"
|
||||
"sha": "ddc7d00569458f3838c6cf489f5be6c59afaf8c1"
|
||||
},
|
||||
"homepage": "https://github.com/pydantic/skills/tree/main/plugins/ai"
|
||||
},
|
||||
@@ -2116,7 +2088,7 @@
|
||||
"source": {
|
||||
"source": "url",
|
||||
"url": "https://github.com/qdrant/skills.git",
|
||||
"sha": "80f1980d126039c762664a3fe660bbad2eb1ec11"
|
||||
"sha": "82337ccd4be601e52871f101844d57b2adbac52b"
|
||||
},
|
||||
"homepage": "https://skills.qdrant.tech"
|
||||
},
|
||||
@@ -2141,7 +2113,7 @@
|
||||
"source": {
|
||||
"source": "url",
|
||||
"url": "https://github.com/TheQtCompanyRnD/agent-skills.git",
|
||||
"sha": "2be55aaf050cf0e5d92d62966c473d2c5f6d780a"
|
||||
"sha": "a7189a7bc17e616b725e7ce4e46a4f5ebd50d94f"
|
||||
},
|
||||
"homepage": "https://www.qt.io/"
|
||||
},
|
||||
@@ -2155,7 +2127,7 @@
|
||||
"source": {
|
||||
"source": "url",
|
||||
"url": "https://github.com/quarkusio/quarkus-agent-mcp.git",
|
||||
"sha": "bcab0174a0f3a076a265958d9017da15c1f87d01"
|
||||
"sha": "91c7986e41234827db2632ed07770301468c9dbc"
|
||||
},
|
||||
"homepage": "https://quarkus.io"
|
||||
},
|
||||
@@ -2168,7 +2140,7 @@
|
||||
"url": "https://github.com/railwayapp/railway-skills.git",
|
||||
"path": "plugins/railway",
|
||||
"ref": "main",
|
||||
"sha": "aa1e055b0f18d13787232b164cfb7416b553bd03"
|
||||
"sha": "1df604ebd18f528ff16b84975125ecff944cc036"
|
||||
},
|
||||
"homepage": "https://docs.railway.com/ai/claude-code-plugin"
|
||||
},
|
||||
@@ -2191,7 +2163,7 @@
|
||||
"source": "url",
|
||||
"url": "https://github.com/RevenueCat/rc-claude-code-plugin.git",
|
||||
"path": "revenuecat",
|
||||
"sha": "e0470e8f5413decb0dc67156057b4b5cfc6df447"
|
||||
"sha": "473fd504bf13d25e76bf4a0267b42be3794f6266"
|
||||
},
|
||||
"homepage": "https://www.revenuecat.com"
|
||||
},
|
||||
@@ -2243,7 +2215,7 @@
|
||||
"source": "url",
|
||||
"url": "https://github.com/RevenueCat/rc-claude-code-plugin.git",
|
||||
"path": "revenuecat",
|
||||
"sha": "e0470e8f5413decb0dc67156057b4b5cfc6df447"
|
||||
"sha": "473fd504bf13d25e76bf4a0267b42be3794f6266"
|
||||
},
|
||||
"homepage": "https://www.revenuecat.com"
|
||||
},
|
||||
@@ -2328,7 +2300,7 @@
|
||||
"url": "https://github.com/awslabs/agent-plugins.git",
|
||||
"path": "plugins/sagemaker-ai",
|
||||
"ref": "main",
|
||||
"sha": "7a17df718d26f07414b876e77a7480fa25089b08"
|
||||
"sha": "d8243e5f8f3933d656b3bdfe09cd658a5d9b9fac"
|
||||
},
|
||||
"homepage": "https://github.com/awslabs/agent-plugins"
|
||||
},
|
||||
@@ -2342,7 +2314,7 @@
|
||||
"source": {
|
||||
"source": "url",
|
||||
"url": "https://github.com/sanity-io/agent-toolkit.git",
|
||||
"sha": "2d7b7c08a31a6e5b613e33a9edc76456e4d7c052"
|
||||
"sha": "66f0ec5d9167b3ccb8b3450e5ec34f3b523d4139"
|
||||
},
|
||||
"homepage": "https://www.sanity.io"
|
||||
},
|
||||
@@ -2376,7 +2348,7 @@
|
||||
"url": "https://github.com/SAP/open-ux-tools.git",
|
||||
"path": "packages/fiori-mcp-server",
|
||||
"ref": "main",
|
||||
"sha": "384fb88f5b4662ec0f7e1ac81689ebccaa9d7cb8"
|
||||
"sha": "604f28952b720579ca9369978ba73493092fdf13"
|
||||
},
|
||||
"homepage": "https://github.com/SAP/open-ux-tools/tree/main/packages/fiori-mcp-server"
|
||||
},
|
||||
@@ -2408,14 +2380,14 @@
|
||||
"url": "https://github.com/spotify/save-to-spotify.git",
|
||||
"path": "plugin",
|
||||
"ref": "main",
|
||||
"sha": "a62408bcfb5e5be686e1fdcc361398493b8c4160"
|
||||
"sha": "cd4ea68111d96769b09c0b0d2199e692cf00a73c"
|
||||
},
|
||||
"homepage": "https://github.com/spotify/save-to-spotify"
|
||||
},
|
||||
{
|
||||
"name": "security-guidance",
|
||||
"description": "Security review for Claude-generated code. Pattern-based warnings on edits, LLM-powered diff review on Stop, and an agentic commit reviewer that catches injection, XSS, SSRF, hardcoded secrets, and 25+ other vulnerability classes.",
|
||||
"version": "2.0.7",
|
||||
"version": "2.0.3",
|
||||
"author": {
|
||||
"name": "Anthropic",
|
||||
"email": "support@anthropic.com"
|
||||
@@ -2443,7 +2415,7 @@
|
||||
"source": {
|
||||
"source": "url",
|
||||
"url": "https://github.com/getsentry/sentry-for-claude.git",
|
||||
"sha": "765cca4683e77271900fdf3521a555a04528baaf"
|
||||
"sha": "87de81a1300acc03fffa2438877fa2dcf078e703"
|
||||
},
|
||||
"homepage": "https://github.com/getsentry/sentry-for-claude/tree/main"
|
||||
},
|
||||
@@ -2459,7 +2431,7 @@
|
||||
"url": "https://github.com/getsentry/cli.git",
|
||||
"path": "plugins/sentry-cli",
|
||||
"ref": "main",
|
||||
"sha": "4fda3dc169b914a8dec53c18d127ccbe67dbbf3e"
|
||||
"sha": "18111b95ac8819d58e4f0334d4b8ee8f72513d1e"
|
||||
},
|
||||
"homepage": "https://sentry.io"
|
||||
},
|
||||
@@ -2562,7 +2534,7 @@
|
||||
"url": "https://github.com/Snowflake-Labs/snowflake-ai-kit.git",
|
||||
"path": "plugins/cortex-code",
|
||||
"ref": "main",
|
||||
"sha": "5a8f277f623394838ee76399261f4704c19eaba7"
|
||||
"sha": "7d2c7e7e0788e255019a64a8690aa5f85d073a2c"
|
||||
},
|
||||
"homepage": "https://docs.snowflake.com/en/user-guide/cortex-code"
|
||||
},
|
||||
@@ -2576,7 +2548,7 @@
|
||||
"source": {
|
||||
"source": "url",
|
||||
"url": "https://github.com/SonarSource/sonarqube-agent-plugins.git",
|
||||
"sha": "25460dd53961fb4dba3c4b9026b29dfbbd3d87e0"
|
||||
"sha": "712b93281f4e67c16ed9b81dde090e1f73f8bfc8"
|
||||
},
|
||||
"homepage": "https://www.sonarsource.com"
|
||||
},
|
||||
@@ -2636,7 +2608,7 @@
|
||||
"url": "https://github.com/stripe/ai.git",
|
||||
"path": "providers/claude/plugin",
|
||||
"ref": "main",
|
||||
"sha": "7e7f72eb42e06f79e7bc75f86e9395f4c8232c00"
|
||||
"sha": "b8f6adcb5d05f6ff01334411561ee8cb1ec014c6"
|
||||
},
|
||||
"homepage": "https://github.com/stripe/ai/tree/main/providers/claude/plugin"
|
||||
},
|
||||
@@ -2648,7 +2620,7 @@
|
||||
"source": "url",
|
||||
"url": "https://github.com/sumup/sumup-skills.git",
|
||||
"path": "providers/claude/plugin",
|
||||
"sha": "b69ff6f5afcd5934af70529e529c0dd8abe46cbe"
|
||||
"sha": "5b9b2d72c63fefd9038db0a9c571d3d64ff6353c"
|
||||
},
|
||||
"homepage": "https://www.sumup.com/"
|
||||
},
|
||||
@@ -2704,7 +2676,7 @@
|
||||
"source": {
|
||||
"source": "url",
|
||||
"url": "https://github.com/JetBrains/teamcity-cli.git",
|
||||
"sha": "4865b1b75e77889355393a46dc56a0363ce3330d"
|
||||
"sha": "67e21f0be908daa7ca1e04c8016d1bc81750baee"
|
||||
},
|
||||
"homepage": "https://www.jetbrains.com/teamcity/"
|
||||
},
|
||||
@@ -2735,7 +2707,7 @@
|
||||
"source": {
|
||||
"source": "url",
|
||||
"url": "https://github.com/togethercomputer/skills.git",
|
||||
"sha": "86bdd6627675eac3f2055f028e4acdd4d1b03fb0"
|
||||
"sha": "8aa08ca126a50d5e76f6d378f47386cee4267984"
|
||||
},
|
||||
"homepage": "https://www.together.ai"
|
||||
},
|
||||
@@ -2797,7 +2769,7 @@
|
||||
"url": "https://github.com/UI5/plugins-coding-agents.git",
|
||||
"path": "plugins/ui5",
|
||||
"ref": "main",
|
||||
"sha": "80f2d93287054f9d30dd990e842e15bcfca581c9"
|
||||
"sha": "9b3d7d80356f687725f9584988e4038dbead0d53"
|
||||
},
|
||||
"homepage": "https://github.com/UI5/plugins-coding-agents"
|
||||
},
|
||||
@@ -2815,7 +2787,7 @@
|
||||
"url": "https://github.com/UI5/plugins-coding-agents.git",
|
||||
"path": "plugins/ui5-typescript-conversion",
|
||||
"ref": "main",
|
||||
"sha": "80f2d93287054f9d30dd990e842e15bcfca581c9"
|
||||
"sha": "9b3d7d80356f687725f9584988e4038dbead0d53"
|
||||
},
|
||||
"homepage": "https://github.com/UI5/plugins-coding-agents"
|
||||
},
|
||||
@@ -2831,7 +2803,7 @@
|
||||
"url": "https://github.com/val-town/plugins.git",
|
||||
"path": "plugin",
|
||||
"ref": "main",
|
||||
"sha": "1f7928397349f2ccb228302d8b062c7f20745871"
|
||||
"sha": "02631f998eda9b88d73d699703b062db059d506b"
|
||||
},
|
||||
"homepage": "https://val.town"
|
||||
},
|
||||
@@ -2870,7 +2842,7 @@
|
||||
"source": {
|
||||
"source": "url",
|
||||
"url": "https://github.com/vercel/vercel-plugin.git",
|
||||
"sha": "b73bc95636c4f4d749ea242b669e0f78f5e72751"
|
||||
"sha": "6e51924cb249e2941de005d59f1ac6f768477b98"
|
||||
},
|
||||
"homepage": "https://github.com/vercel/vercel-plugin"
|
||||
},
|
||||
@@ -2884,7 +2856,7 @@
|
||||
"source": {
|
||||
"source": "url",
|
||||
"url": "https://github.com/explorium-ai/vibeprospecting-plugin.git",
|
||||
"sha": "14cb2971a99661382f5a56a9caa7c2d526c4e444"
|
||||
"sha": "aa5903f52d79e7f2a5f9c324c6fff7d5a5d92631"
|
||||
},
|
||||
"homepage": "https://www.vibeprospecting.ai/product/claude-plugin"
|
||||
},
|
||||
@@ -2909,7 +2881,7 @@
|
||||
"source": {
|
||||
"source": "url",
|
||||
"url": "https://github.com/wix/skills.git",
|
||||
"sha": "561315d22a49544d6518d3a753973d3a95dfafcc"
|
||||
"sha": "9666bc8d4856d9028e815610c23ab4f48d8ddd3b"
|
||||
},
|
||||
"homepage": "https://dev.wix.com/docs/wix-cli/guides/development/about-wix-skills"
|
||||
},
|
||||
@@ -2962,7 +2934,7 @@
|
||||
"url": "https://github.com/zapier/zapier-mcp.git",
|
||||
"path": "plugins/zapier",
|
||||
"ref": "main",
|
||||
"sha": "ea8ed6b4de66e9bb46c12b3a38da8286e3770ad9"
|
||||
"sha": "770167c572deaf74c588b45d88003ddf2145d608"
|
||||
},
|
||||
"homepage": "https://github.com/zapier/zapier-mcp/tree/main/plugins/zapier"
|
||||
},
|
||||
@@ -3016,7 +2988,7 @@
|
||||
"source": {
|
||||
"source": "url",
|
||||
"url": "https://github.com/zscaler/zscaler-mcp-server.git",
|
||||
"sha": "a2162c384e1ffb68b3bf14783ea9a1a762c85ff5"
|
||||
"sha": "f84ce4f0ed48047614a4202ac311cbdf00ea9a10"
|
||||
},
|
||||
"homepage": "https://github.com/zscaler/zscaler-mcp-server"
|
||||
}
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "security-guidance",
|
||||
"version": "2.0.7",
|
||||
"version": "2.0.3",
|
||||
"description": "Security review for Claude-generated code. Pattern-based warnings on edits, LLM-powered diff review on Stop, and an agentic commit reviewer that catches injection, XSS, SSRF, hardcoded secrets, and 25+ other vulnerability classes.",
|
||||
"author": {
|
||||
"name": "David Dworken",
|
||||
|
||||
@@ -40,26 +40,6 @@ BUILD_FAILED = 3 # venv create or pip install raised/timed out
|
||||
SKIP_SENTINEL = 5 # another SessionStart is currently building
|
||||
HOOK_PY_INCOMPATIBLE = 6 # hook interpreter is <3.10 — SDK syntax can't load
|
||||
# here no matter how the venv was built. See #2071.
|
||||
# --target fallback: when `python -m venv` can't bootstrap pip (ensurepip
|
||||
# missing — Debian python3-venv not installed, or a python.org/pyenv build
|
||||
# without ensurepip), fall back to `pip install --target <dir>` which needs
|
||||
# only the system pip, not venv/ensurepip. Telemetry (v2.0.4 sdk_has_pip
|
||||
# probe) confirmed ~95% of venv_ensurepip_fail users HAVE pip, so this
|
||||
# recovers the agentic reviewer for them instead of degrading to pattern +
|
||||
# single-shot review. See #2154 follow-up.
|
||||
BUILT_TARGET = 7 # venv ensurepip failed → SDK pip-installed via --target
|
||||
NOOP_TARGET = 8 # --target libs already present and importable
|
||||
SKIP_COOLDOWN = 9 # a recent build was signal-killed (memory pressure) — not
|
||||
# retrying this session to avoid burning the user's
|
||||
# memory/CPU on a build that keeps getting killed. CCR
|
||||
# repro confirmed the dominant Linux BUILD_FAILED is a
|
||||
# SIGKILL/SIGSEGV of the memory-heavy venv+pip subprocess
|
||||
# (rc<0, empty streams). See #2154 follow-up.
|
||||
|
||||
# How long to skip rebuilds after a signal kill. Retries at most once per
|
||||
# window so a machine whose memory frees up still recovers (just not every
|
||||
# session). Keyed by marker mtime.
|
||||
SIGNAL_KILL_COOLDOWN_SEC = 24 * 3600
|
||||
|
||||
|
||||
# Phase + err-kind integer encoding for sdk_bootstrap_phase / sdk_bootstrap_err.
|
||||
@@ -83,7 +63,6 @@ SDK_BOOTSTRAP_PHASE_CODES = {
|
||||
"venv": 2, # python -m venv --clear
|
||||
"pip": 3, # pip install
|
||||
"main": 4, # uncaught exception above main()
|
||||
"pip_target": 5, # `pip install --target` fallback (venv ensurepip failed)
|
||||
}
|
||||
SDK_BOOTSTRAP_ERR_CODES = {
|
||||
"pip_no_match": 1,
|
||||
@@ -96,11 +75,6 @@ SDK_BOOTSTRAP_ERR_CODES = {
|
||||
"proxy_auth": 8,
|
||||
"stderr_timeout": 9, # pip stderr containing "timeout"/"timed out"
|
||||
"subprocess_timeout": 10, # subprocess.TimeoutExpired (>120s)
|
||||
"signal_killed": 16, # venv/pip subprocess killed by a signal
|
||||
# (rc<0 or 128+sig) — OOM-killer SIGKILL /
|
||||
# RLIMIT_AS SIGSEGV, empty streams. The
|
||||
# actual rc rides in sdk_bootstrap_rc. This
|
||||
# is the dominant Linux failure (CCR repro).
|
||||
# Venv-stage specific categories added after PR #2112 telemetry surfaced
|
||||
# 2,406 phase=2/err=99 sessions in the first 3h of v2.0.1 — venv phase
|
||||
# failing in ways the original pip-flavored patterns didn't catch. These
|
||||
@@ -128,41 +102,6 @@ SDK_BOOTSTRAP_ERR_CODES = {
|
||||
"_uncategorized": 99,
|
||||
}
|
||||
|
||||
# Exception-type encoding for the "exc:<TypeName>" err_kinds (the generic
|
||||
# `except Exception` path — venv/pip raised a Python exception rather than
|
||||
# a CalledProcessError with categorizable stderr).
|
||||
#
|
||||
# #2154 telemetry surfaced that the dominant remaining venv BUILD_FAILED
|
||||
# bucket (phase=venv, err=99) is ~99% `exc:` with stderr_sig=NULL — i.e.
|
||||
# exceptions, not stderr-bearing subprocess failures — so the stderr_sig
|
||||
# hash couldn't distinguish them. This maps the exception TYPE to a stable
|
||||
# code so BQ can tell FileNotFoundError (python/venv binary missing) from
|
||||
# PermissionError (read-only home) from a bare OSError, etc.
|
||||
#
|
||||
# All the FileNotFoundError/PermissionError/etc. entries are OSError
|
||||
# subclasses, so they ALSO carry an errno (see _encode_errno) — the type
|
||||
# code gives the Python class, errno gives the OS-level cause. APPEND-ONLY.
|
||||
SDK_BOOTSTRAP_EXC_CODES = {
|
||||
"FileNotFoundError": 1, # interpreter/venv path component missing
|
||||
"PermissionError": 2, # read-only home, sandboxed FS
|
||||
"NotADirectoryError": 3,
|
||||
"IsADirectoryError": 4,
|
||||
"FileExistsError": 5, # (sentinel race is handled separately; this
|
||||
# is FileExistsError from elsewhere in venv)
|
||||
"OSError": 6, # bare OSError — errno carries the real cause
|
||||
"BlockingIOError": 7,
|
||||
"BrokenPipeError": 8,
|
||||
"ConnectionError": 9,
|
||||
"TimeoutError": 10, # distinct from subprocess.TimeoutExpired
|
||||
"InterruptedError": 11,
|
||||
"MemoryError": 12,
|
||||
"UnicodeDecodeError": 13,
|
||||
"ValueError": 14,
|
||||
"RuntimeError": 15,
|
||||
# 16–98 reserved; APPEND-ONLY.
|
||||
"_other_exc": 99, # an exception type not in this map
|
||||
}
|
||||
|
||||
|
||||
def _encode_phase(s):
|
||||
"""Map err_phase string to its telemetry integer code, or 0 if unset.
|
||||
@@ -181,10 +120,6 @@ def _encode_err_kind(s):
|
||||
return 0
|
||||
if s in SDK_BOOTSTRAP_ERR_CODES:
|
||||
return SDK_BOOTSTRAP_ERR_CODES[s]
|
||||
# "signal_killed:<rc>" carries the returncode in sdk_bootstrap_rc; the
|
||||
# category maps to the signal_killed code.
|
||||
if s.startswith("signal_killed"):
|
||||
return SDK_BOOTSTRAP_ERR_CODES["signal_killed"]
|
||||
# Prefix matches for the catch-all categories
|
||||
if s.startswith("exc:") or s.startswith("other:") or s == "other":
|
||||
return SDK_BOOTSTRAP_ERR_CODES["_uncategorized"]
|
||||
@@ -192,52 +127,6 @@ def _encode_err_kind(s):
|
||||
return SDK_BOOTSTRAP_ERR_CODES["_uncategorized"]
|
||||
|
||||
|
||||
def _encode_rc(err_kind):
|
||||
"""Extract the subprocess returncode embedded in a 'signal_killed:<rc>'
|
||||
err_kind (e.g. -11 SIGSEGV / -9 SIGKILL / 139 shell-wrapped). Emitted as
|
||||
sdk_bootstrap_rc so BQ can tell OOM-killer (-9) from RLIMIT_AS (-11).
|
||||
Returns 0 when absent/non-numeric."""
|
||||
if not err_kind or not err_kind.startswith("signal_killed:"):
|
||||
return 0
|
||||
try:
|
||||
return int(err_kind.split(":", 1)[1])
|
||||
except (ValueError, IndexError):
|
||||
return 0
|
||||
|
||||
|
||||
def _is_signal_kill(returncode) -> bool:
|
||||
"""A subprocess killed by a signal rather than a clean non-zero exit.
|
||||
subprocess.run (no shell, as used here) reports negative rc = -signum
|
||||
(SIGKILL→-9 OOM-killer, SIGSEGV→-11 RLIMIT_AS, SIGABRT→-6). The 128+sig
|
||||
forms (134/137/139) are defensive for any shell-wrapped path. Paired with
|
||||
empty stdout+stderr this is the memory-kill signature (CCR repro)."""
|
||||
if returncode is None:
|
||||
return False
|
||||
return returncode < 0 or returncode in (134, 137, 139)
|
||||
|
||||
|
||||
def _cooldown_remaining(state_dir) -> float:
|
||||
"""Seconds left in the signal-kill cooldown (0 if none/expired). Reads the
|
||||
marker's mtime; a missing/unreadable marker means not in cooldown."""
|
||||
marker = Path(state_dir) / "agent-sdk-venv.cooldown"
|
||||
try:
|
||||
age = time.time() - marker.stat().st_mtime
|
||||
except OSError:
|
||||
return 0.0
|
||||
return max(0.0, SIGNAL_KILL_COOLDOWN_SEC - age)
|
||||
|
||||
|
||||
def _write_cooldown(state_dir) -> None:
|
||||
"""Start/refresh the signal-kill cooldown so we stop re-attempting a build
|
||||
that keeps getting killed every session. Best-effort."""
|
||||
try:
|
||||
Path(state_dir).mkdir(parents=True, exist_ok=True)
|
||||
(Path(state_dir) / "agent-sdk-venv.cooldown").write_text(
|
||||
time.strftime("%Y-%m-%dT%H:%M:%SZ", time.gmtime()))
|
||||
except OSError:
|
||||
pass
|
||||
|
||||
|
||||
def _encode_stderr_sig(err_kind):
|
||||
"""Bounded integer hash of the stderr tail captured in "other:<tail>"
|
||||
err_kinds. Lets us distinguish patterns INSIDE the _uncategorized
|
||||
@@ -269,190 +158,6 @@ def _encode_stderr_sig(err_kind):
|
||||
return int.from_bytes(h[:2], "big") % 1000
|
||||
|
||||
|
||||
def _encode_exc_kind(err_kind):
|
||||
"""Map an "exc:<TypeName>[:errno]" err_kind to its exception-type code
|
||||
(SDK_BOOTSTRAP_EXC_CODES). Returns 0 for non-exc err_kinds (so the
|
||||
sdk_bootstrap_exc field auto-omits on stderr/categorized failures).
|
||||
Unmapped exception types → 99 (_other_exc)."""
|
||||
if not err_kind or not err_kind.startswith("exc:"):
|
||||
return 0
|
||||
# "exc:OSError:28" → "OSError"; "exc:RuntimeError" → "RuntimeError"
|
||||
name = err_kind[len("exc:"):].split(":", 1)[0].strip()
|
||||
if not name:
|
||||
return 0
|
||||
return SDK_BOOTSTRAP_EXC_CODES.get(name, SDK_BOOTSTRAP_EXC_CODES["_other_exc"])
|
||||
|
||||
|
||||
def _encode_errno(err_kind):
|
||||
"""Extract the OS errno from an "exc:<TypeName>:<errno>" err_kind.
|
||||
OSError-family exceptions embed their errno (ENOENT=2, EACCES=13,
|
||||
ENOSPC=28, …) — the OS-level cause is far more actionable than the
|
||||
Python class alone. Returns 0 when absent/non-numeric (field omitted)."""
|
||||
if not err_kind or not err_kind.startswith("exc:"):
|
||||
return 0
|
||||
parts = err_kind.split(":")
|
||||
if len(parts) < 3:
|
||||
return 0
|
||||
try:
|
||||
return int(parts[2])
|
||||
except (ValueError, IndexError):
|
||||
return 0
|
||||
|
||||
|
||||
def _probe_has_pip() -> bool:
|
||||
"""True iff the current interpreter can run pip (`-m pip --version`).
|
||||
|
||||
Probed only on the venv_ensurepip_fail path (see __main__), NOT on the
|
||||
happy path — it's an extra subprocess we only want when diagnosing a
|
||||
failure. The result decides whether a `pip install --target` fallback
|
||||
(Option A) is even viable for this machine: ensurepip/venv missing but
|
||||
pip present → --target would work; pip also missing → it wouldn't, and
|
||||
the user needs a system package (python3-venv / a complete Python)."""
|
||||
try:
|
||||
r = subprocess.run(
|
||||
[sys.executable, "-m", "pip", "--version"],
|
||||
capture_output=True, timeout=10,
|
||||
)
|
||||
return r.returncode == 0
|
||||
except Exception:
|
||||
return False
|
||||
|
||||
|
||||
def _probe_alt_python() -> int:
|
||||
"""When the hook interpreter is <3.10 (HOOK_PY_INCOMPATIBLE), look for a
|
||||
3.10+ interpreter at well-known install locations that aren't necessarily
|
||||
on the hook's PATH — Homebrew (/opt/homebrew, /usr/local), python.org
|
||||
framework builds, and the `py`/distro layouts. Returns the HIGHEST version
|
||||
found encoded as major*100+minor (e.g. 312), or 0 if none.
|
||||
|
||||
Purpose (telemetry only, for now): size how many of the macOS Python-3.9
|
||||
cohort actually HAVE a newer interpreter that sg-python.sh's PATH probe
|
||||
missed — i.e. how many are RECOVERABLE by an explicit-path search vs.
|
||||
genuinely 3.9-only. Emitted as sdk_alt_py. Existence-checks the versioned
|
||||
binaries (cheap); a later explicit-path search would version-verify before
|
||||
exec'ing. Probed only on the incompatible path, so healthy sessions never
|
||||
pay for it."""
|
||||
candidates = []
|
||||
for minor in (14, 13, 12, 11, 10):
|
||||
candidates += [
|
||||
f"/opt/homebrew/bin/python3.{minor}", # Apple-Silicon Homebrew
|
||||
f"/usr/local/bin/python3.{minor}", # Intel Homebrew / python.org shim
|
||||
f"/Library/Frameworks/Python.framework/Versions/3.{minor}/bin/python3", # python.org
|
||||
f"/usr/bin/python3.{minor}", # distro-managed (Linux)
|
||||
]
|
||||
best = 0
|
||||
for path in candidates:
|
||||
try:
|
||||
if os.access(path, os.X_OK):
|
||||
# path name encodes the minor; parse it back to a code
|
||||
base = os.path.basename(path)
|
||||
minor = None
|
||||
if base.startswith("python3."):
|
||||
minor = int(base.split(".")[1])
|
||||
elif "/Versions/3." in path:
|
||||
minor = int(path.split("/Versions/3.")[1].split("/")[0])
|
||||
if minor is not None:
|
||||
best = max(best, 300 + minor)
|
||||
except (OSError, ValueError, IndexError):
|
||||
continue
|
||||
return best
|
||||
|
||||
|
||||
def _pip_err_from_stderr(stderr_b):
|
||||
"""Categorize a pip-install stderr into a known err_kind (the pip subset
|
||||
of SDK_BOOTSTRAP_ERR_CODES). Used by the --target fallback; mirrors the
|
||||
pip branches of main()'s inline categorizer. Kept as a sibling rather
|
||||
than extracting main()'s chain (which also has venv-phase branches) to
|
||||
avoid disturbing the working venv categorization."""
|
||||
if isinstance(stderr_b, bytes):
|
||||
s = stderr_b.decode("utf-8", errors="replace")
|
||||
else:
|
||||
s = str(stderr_b or "")
|
||||
low = s.lower()
|
||||
if "no matching distribution" in low or "could not find a version" in low:
|
||||
return "pip_no_match"
|
||||
if ("name or service not known" in low or "name resolution" in low
|
||||
or "nodename nor servname" in low or "temporary failure in name" in low):
|
||||
return "dns_fail"
|
||||
if "connection refused" in low or "connection reset" in low:
|
||||
return "conn_refused"
|
||||
if "ssl" in low and ("verify" in low or "certificate" in low):
|
||||
return "ssl_verify"
|
||||
if "permission denied" in low or "read-only file system" in low:
|
||||
return "perm_denied"
|
||||
if "no module named pip" in low or "no module named ensurepip" in low:
|
||||
return "no_pip"
|
||||
if "no space left" in low or "disk quota" in low:
|
||||
return "disk_full"
|
||||
if "proxy" in low and ("authent" in low or "tunnel" in low or "407" in low):
|
||||
return "proxy_auth"
|
||||
if "timeout" in low or "timed out" in low:
|
||||
return "stderr_timeout"
|
||||
tail = next((ln.strip() for ln in reversed(s.splitlines()) if ln.strip()), "")[:60]
|
||||
return f"other:{tail}" if tail else "other"
|
||||
|
||||
|
||||
def _target_dir(state_dir) -> Path:
|
||||
return Path(state_dir) / "agent-sdk-libs"
|
||||
|
||||
|
||||
def _target_sdk_importable(state_dir) -> bool:
|
||||
"""True iff the --target libs dir has an importable claude_agent_sdk,
|
||||
probed with THIS interpreter (the one llm.py will import it from) and the
|
||||
target dir prepended to sys.path. Cheap dir-check first to avoid a
|
||||
subprocess on the common no-target path."""
|
||||
target = _target_dir(state_dir)
|
||||
if not (target / "claude_agent_sdk").is_dir():
|
||||
return False
|
||||
try:
|
||||
r = subprocess.run(
|
||||
[sys.executable, "-c",
|
||||
"import sys; sys.path.insert(0, sys.argv[1]); import claude_agent_sdk",
|
||||
str(target)],
|
||||
capture_output=True, timeout=10,
|
||||
)
|
||||
return r.returncode == 0
|
||||
except Exception:
|
||||
return False
|
||||
|
||||
|
||||
def _build_via_target(state_dir) -> tuple[int, str, str]:
|
||||
"""Fallback install when `python -m venv` can't bootstrap pip (ensurepip
|
||||
missing — Debian python3-venv absent, or a python.org/pyenv build without
|
||||
ensurepip). `pip install --target <dir>` needs only the system pip, not
|
||||
venv/ensurepip. v2.0.4 telemetry (sdk_has_pip) confirmed ~95% of
|
||||
venv_ensurepip_fail users have pip. The consumer (llm.py) adds this flat
|
||||
dir to sys.path. Returns (outcome, err_phase, err_kind).
|
||||
|
||||
--upgrade so a stale/partial target dir from a prior failed attempt
|
||||
doesn't make pip refuse; --prefer-binary mirrors the venv path's wheel
|
||||
preference (ARM64 Windows cryptography)."""
|
||||
target = _target_dir(state_dir)
|
||||
try:
|
||||
subprocess.run(
|
||||
[sys.executable, "-m", "pip", "install",
|
||||
"--target", str(target), "--upgrade",
|
||||
"--disable-pip-version-check", "--prefer-binary", "--no-cache-dir",
|
||||
"claude-agent-sdk"],
|
||||
capture_output=True, timeout=120, check=True,
|
||||
)
|
||||
return BUILT_TARGET, "", ""
|
||||
except subprocess.CalledProcessError as e:
|
||||
# A --target pip install is also memory-heavy, so it too can be
|
||||
# signal-killed under memory pressure — cool down, same as the venv path.
|
||||
if _is_signal_kill(e.returncode):
|
||||
_write_cooldown(state_dir)
|
||||
return BUILD_FAILED, "pip_target", f"signal_killed:{e.returncode}"
|
||||
return BUILD_FAILED, "pip_target", _pip_err_from_stderr(e.stderr)
|
||||
except subprocess.TimeoutExpired:
|
||||
return BUILD_FAILED, "pip_target", "subprocess_timeout"
|
||||
except Exception as e:
|
||||
errno = getattr(e, "errno", None)
|
||||
if isinstance(errno, int):
|
||||
return BUILD_FAILED, "pip_target", f"exc:{type(e).__name__}:{errno}"
|
||||
return BUILD_FAILED, "pip_target", f"exc:{type(e).__name__}"
|
||||
|
||||
|
||||
def _sdk_on_syspath() -> bool:
|
||||
# find_spec is ~10ms; actually importing the SDK pulls in
|
||||
# transitive deps and costs ~800ms — too heavy for a
|
||||
@@ -541,20 +246,6 @@ def main() -> tuple[int, str, str]:
|
||||
except Exception:
|
||||
pass # broken venv; rebuild below
|
||||
|
||||
# If a prior run installed the SDK via the --target fallback (ensurepip
|
||||
# path), reuse it. Only reached when there's no working venv, so healthy
|
||||
# NOOP_VENV users never pay for this probe.
|
||||
if _target_sdk_importable(state_dir):
|
||||
return NOOP_TARGET, "", ""
|
||||
|
||||
# If a recent build was signal-killed (memory pressure), don't re-attempt
|
||||
# this session — the memory-heavy venv+pip just gets killed again, burning
|
||||
# the user's resources. Retry at most once per cooldown window. Reached
|
||||
# only after all no-op probes, so a machine that later gets the SDK via
|
||||
# system/venv/target still short-circuits above.
|
||||
if _cooldown_remaining(state_dir) > 0:
|
||||
return SKIP_COOLDOWN, "", ""
|
||||
|
||||
err_phase = ""
|
||||
err_kind = ""
|
||||
we_own_sentinel = False
|
||||
@@ -587,25 +278,14 @@ def main() -> tuple[int, str, str]:
|
||||
# --prefer-binary tells pip to pick it. Cross-platform safe: no-op
|
||||
# on platforms where the latest version already has a wheel.
|
||||
err_phase = "pip"
|
||||
# --no-cache-dir trims pip's peak memory (no cache read/write/unpack
|
||||
# buffering) — helps marginal low-memory machines get under the OOM
|
||||
# threshold that kills the dominant Linux builds (CCR repro).
|
||||
subprocess.run(
|
||||
[str(venv_py), "-m", "pip", "install", "--quiet",
|
||||
"--disable-pip-version-check", "--prefer-binary", "--no-cache-dir",
|
||||
"--disable-pip-version-check", "--prefer-binary",
|
||||
"claude-agent-sdk"],
|
||||
capture_output=True, timeout=120, check=True,
|
||||
)
|
||||
return BUILT, "", ""
|
||||
except subprocess.CalledProcessError as e:
|
||||
# Signal kill (OOM-killer SIGKILL / RLIMIT_AS SIGSEGV) — rc<0, empty
|
||||
# streams. The dominant Linux failure. Record the rc, start a cooldown
|
||||
# so we stop retry-storming a build that keeps getting killed, and
|
||||
# skip the stderr categorization (there's nothing in stderr). err_phase
|
||||
# says whether it died creating the venv or installing via pip.
|
||||
if _is_signal_kill(e.returncode):
|
||||
_write_cooldown(state_dir)
|
||||
return BUILD_FAILED, err_phase, f"signal_killed:{e.returncode}"
|
||||
# Capture a stderr fingerprint so telemetry can split BUILD_FAILED by
|
||||
# root cause (no-network, package-not-found, dns-fail, etc.).
|
||||
# Categorize first, then keep a short raw tail for the long tail of
|
||||
@@ -680,27 +360,10 @@ def main() -> tuple[int, str, str]:
|
||||
"",
|
||||
)[:60]
|
||||
err_kind = f"other:{tail}" if tail else "other"
|
||||
# venv couldn't bootstrap pip (ensurepip missing) but pip itself may
|
||||
# work — fall back to a flat `pip install --target`. Only this one
|
||||
# category falls through; every other venv/pip failure is terminal.
|
||||
# The finally block unlinks our sentinel first (so the target build
|
||||
# isn't blocked by it); _build_via_target does the target install.
|
||||
if err_kind == "venv_ensurepip_fail":
|
||||
if we_own_sentinel:
|
||||
sentinel.unlink(missing_ok=True)
|
||||
we_own_sentinel = False
|
||||
return _build_via_target(state_dir)
|
||||
return BUILD_FAILED, err_phase, err_kind
|
||||
except subprocess.TimeoutExpired:
|
||||
return BUILD_FAILED, err_phase, "subprocess_timeout"
|
||||
except Exception as e:
|
||||
# Embed errno for OSError-family exceptions ("exc:OSError:28") so
|
||||
# telemetry can decode the OS-level cause (ENOENT/EACCES/ENOSPC/…),
|
||||
# not just the Python class. #2154 follow-up: this is the dominant
|
||||
# remaining venv BUILD_FAILED bucket. See _encode_exc_kind/_encode_errno.
|
||||
errno = getattr(e, "errno", None)
|
||||
if isinstance(errno, int):
|
||||
return BUILD_FAILED, err_phase, f"exc:{type(e).__name__}:{errno}"
|
||||
return BUILD_FAILED, err_phase, f"exc:{type(e).__name__}"
|
||||
finally:
|
||||
# Only remove the sentinel if THIS process created it. The
|
||||
@@ -804,44 +467,6 @@ if __name__ == "__main__":
|
||||
sig = _encode_stderr_sig(err_kind)
|
||||
if sig:
|
||||
metrics["sdk_bootstrap_stderr_sig"] = sig
|
||||
# Exception-type + errno for the "exc:" bucket (the dominant
|
||||
# remaining venv BUILD_FAILED mode per #2154 telemetry). Both
|
||||
# auto-omit (0) on stderr/categorized failures.
|
||||
exc = _encode_exc_kind(err_kind)
|
||||
if exc:
|
||||
metrics["sdk_bootstrap_exc"] = exc
|
||||
exc_errno = _encode_errno(err_kind)
|
||||
if exc_errno:
|
||||
metrics["sdk_bootstrap_errno"] = exc_errno
|
||||
# Subprocess returncode for signal kills (-9 OOM-killer / -11
|
||||
# RLIMIT_AS / -6 abort). Confirms in prod which signal dominates the
|
||||
# Linux memory-kill bucket. 0 (omitted) for non-signal failures.
|
||||
rc = _encode_rc(err_kind)
|
||||
if rc:
|
||||
metrics["sdk_bootstrap_rc"] = rc
|
||||
# venv_ensurepip_fail (code 11) is the top categorizable venv
|
||||
# failure, and telemetry shows it's NOT just Debian — macOS has the
|
||||
# most distinct affected users. Probe whether this interpreter has
|
||||
# pip so we know if a `pip install --target` fallback (Option A)
|
||||
# would actually help, vs the user needing a system package. Probed
|
||||
# only here (not on the happy path) to avoid an extra subprocess
|
||||
# per healthy session.
|
||||
if _encode_err_kind(err_kind) == 11:
|
||||
metrics["sdk_has_pip"] = _probe_has_pip()
|
||||
# When the hook interpreter is <3.10 (HOOK_PY_INCOMPATIBLE), probe for a
|
||||
# 3.10+ interpreter at known non-PATH locations. Non-zero sdk_alt_py =
|
||||
# this user is RECOVERABLE by an explicit-path search in sg-python.sh; 0 =
|
||||
# genuinely 3.9-only (needs a user install). Sizes the macOS Py-3.9 cohort
|
||||
# (~13.6% of macOS sessions) before we build the search. Incompatible path
|
||||
# only — healthy sessions never run it.
|
||||
if outcome == HOOK_PY_INCOMPATIBLE:
|
||||
metrics["sdk_alt_py"] = _probe_alt_python()
|
||||
# Interpreter version (major*100 + minor, e.g. 309 / 312), emitted on
|
||||
# every bootstrap. Disambiguates the macOS cohort (Apple 3.9 vs a 3.10+
|
||||
# with broken ensurepip) for both venv_ensurepip_fail AND
|
||||
# HOOK_PY_INCOMPATIBLE (whose "py_3.9" err_kind otherwise collapses to
|
||||
# err=99, losing the version). Cheap — no subprocess, just sys.version_info.
|
||||
metrics["sdk_hook_py"] = sys.version_info[0] * 100 + sys.version_info[1]
|
||||
pv = _plugin_version_int()
|
||||
if pv:
|
||||
metrics["pv"] = pv
|
||||
|
||||
@@ -55,12 +55,6 @@ def _inject_agent_sdk_venv_into_syspath(state_dir):
|
||||
candidates = (
|
||||
glob.glob(os.path.join(venv_root, "lib", "python*", "site-packages"))
|
||||
+ glob.glob(os.path.join(venv_root, "Lib", "site-packages"))
|
||||
# `pip install --target` fallback (ensure_agent_sdk BUILT_TARGET, used
|
||||
# when venv can't bootstrap pip): a FLAT layout — packages sit directly
|
||||
# in agent-sdk-libs/, not under a site-packages subdir. See #2154
|
||||
# follow-up. The pywin32 .pth bootstrap below applies here too (target
|
||||
# installs don't process .pth at runtime, same as a manual venv insert).
|
||||
+ [os.path.join(state_dir, "agent-sdk-libs")]
|
||||
)
|
||||
added = False
|
||||
for sp in candidates:
|
||||
|
||||
Reference in New Issue
Block a user