mirror of
https://github.com/anthropics/claude-plugins-official.git
synced 2026-07-15 03:33:32 +00:00
Compare commits
124 Commits
codemod-dy
...
venv-targe
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
e7fe15d9ba | ||
|
|
e97f9a40b9 | ||
|
|
78fa3df8d6 | ||
|
|
56fd6abb97 | ||
|
|
c9b8f92b53 | ||
|
|
7279412e77 | ||
|
|
484653886e | ||
|
|
c7af5e02bc | ||
|
|
8ea0761c82 | ||
|
|
600c99b404 | ||
|
|
d28241b7ef | ||
|
|
46c72e981f | ||
|
|
3f8fc630b8 | ||
|
|
fbd57be8e5 | ||
|
|
413d293096 | ||
|
|
e4a454a7eb | ||
|
|
d30ef44d74 | ||
|
|
6ee4f1e1df | ||
|
|
c4b91a6e24 | ||
|
|
e656f87725 | ||
|
|
eaa69c48cb | ||
|
|
46dc6920be | ||
|
|
92954b1b92 | ||
|
|
0784122e63 | ||
|
|
7465bdcc27 | ||
|
|
7209a2ca09 | ||
|
|
71941bb301 | ||
|
|
eeb3316d51 | ||
|
|
66bca6b6f6 | ||
|
|
be8b438e1a | ||
|
|
43297b9419 | ||
|
|
b110a96045 | ||
|
|
9087f2c348 | ||
|
|
9277728768 | ||
|
|
5518e4b87d | ||
|
|
2bf67d3cfd | ||
|
|
c5fd33161c | ||
|
|
2b58efffc3 | ||
|
|
f4cf218b9b | ||
|
|
db5b3d5999 | ||
|
|
5316ced830 | ||
|
|
13ac3cb075 | ||
|
|
5a20d10780 | ||
|
|
9eae436aa2 | ||
|
|
ee7ce490f9 | ||
|
|
460bc2b3a4 | ||
|
|
1a7db730cb | ||
|
|
3ebb9c7a85 | ||
|
|
9ef08d32aa | ||
|
|
b8e4462957 | ||
|
|
2f9c3234ab | ||
|
|
c5660ed060 | ||
|
|
9ecfe41bdd | ||
|
|
d5265b0377 | ||
|
|
c7f3eb4b8f | ||
|
|
3b46b04964 | ||
|
|
a379ddd580 | ||
|
|
8a0797c1eb | ||
|
|
447aef7de0 | ||
|
|
7e9d5e46d1 | ||
|
|
14e6461b03 | ||
|
|
634ea8dfdf | ||
|
|
fa5b2907d3 | ||
|
|
f0a6e581ab | ||
|
|
820c25f30e | ||
|
|
62e1eee8ba | ||
|
|
1266fa54fe | ||
|
|
662eb2a84d | ||
|
|
b9fcf71aa3 | ||
|
|
276c66d983 | ||
|
|
96627692d8 | ||
|
|
2dad4fb0e9 | ||
|
|
764c85b81b | ||
|
|
0fc58e49d1 | ||
|
|
14207a6858 | ||
|
|
51081f898a | ||
|
|
c6cd307f91 | ||
|
|
1f41ee16b7 | ||
|
|
0590b22bed | ||
|
|
c0e06a05f0 | ||
|
|
cb3f6930c7 | ||
|
|
481d531f7d | ||
|
|
9d53eaee3b | ||
|
|
887f70cb5d | ||
|
|
a96db3dd4d | ||
|
|
5a4b44267a | ||
|
|
627d4dd3c4 | ||
|
|
4902efd113 | ||
|
|
cf6decf9e8 | ||
|
|
088593ec3b | ||
|
|
206d02f684 | ||
|
|
e2be9a8197 | ||
|
|
68a97f85ba | ||
|
|
f1aaa8e4ce | ||
|
|
5b6b55808d | ||
|
|
db71168abe | ||
|
|
1f761e4c37 | ||
|
|
8f09d55614 | ||
|
|
d0419b8ad5 | ||
|
|
09404ab125 | ||
|
|
de573bd846 | ||
|
|
f92fc04666 | ||
|
|
2b8ae0bc72 | ||
|
|
1b3d7c29eb | ||
|
|
26e06be79b | ||
|
|
5e14a52052 | ||
|
|
640704824b | ||
|
|
e53f64964b | ||
|
|
a9310efd27 | ||
|
|
b6a4ea1f6a | ||
|
|
2057bc4652 | ||
|
|
0bcd12a7d1 | ||
|
|
f2691c1439 | ||
|
|
330492c3d6 | ||
|
|
e7e1e791cb | ||
|
|
0714e5b202 | ||
|
|
623b6704d3 | ||
|
|
f5e552802c | ||
|
|
e69b3a26ef | ||
|
|
475e5fe15f | ||
|
|
b61e11909c | ||
|
|
7eb80c4f5b | ||
|
|
1e0be923c5 | ||
|
|
43fcf6d513 |
@@ -19,7 +19,7 @@
|
||||
"url": "https://github.com/42Crunch-AI/claude-plugins.git",
|
||||
"path": "plugins/api-security-testing",
|
||||
"ref": "v1.5.5",
|
||||
"sha": "b7e131e30ff033be2176faf796c94c151a68c63a"
|
||||
"sha": "5cfa510f7ea4d940f0ff5f6688a21e4ea0db0a18"
|
||||
},
|
||||
"homepage": "https://42crunch.com"
|
||||
},
|
||||
@@ -77,7 +77,7 @@
|
||||
"source": {
|
||||
"source": "url",
|
||||
"url": "https://github.com/AikidoSec/aikido-claude-plugin.git",
|
||||
"sha": "79ac524f87c9faa9a356ff3d495b8a5b77e01bbd"
|
||||
"sha": "603d5eac5ef00d9db65fa4f15058345e7bce3352"
|
||||
},
|
||||
"homepage": "https://github.com/AikidoSec/aikido-claude-plugin"
|
||||
},
|
||||
@@ -150,7 +150,7 @@
|
||||
"url": "https://github.com/awslabs/agent-plugins.git",
|
||||
"path": "plugins/amazon-location-service",
|
||||
"ref": "main",
|
||||
"sha": "d8243e5f8f3933d656b3bdfe09cd658a5d9b9fac"
|
||||
"sha": "58373593c6ed2e4684181f81369c0b7a4c916423"
|
||||
},
|
||||
"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": "e9b4e15193666e1b513b5652ded23fab160bdc4e"
|
||||
"sha": "fb22979da93d27dcb17b832dbd473e6b0caf2ca8"
|
||||
},
|
||||
"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": "7ce4a12d3cabb506294134c91a1b876d4b166a70"
|
||||
"sha": "789b4544b85a989694501e4f405b522f2d711cf6"
|
||||
},
|
||||
"homepage": "https://github.com/astronomer/agents"
|
||||
},
|
||||
@@ -233,7 +233,7 @@
|
||||
"source": {
|
||||
"source": "url",
|
||||
"url": "https://github.com/atlanhq/agent-toolkit.git",
|
||||
"sha": "789507c02d2495235240d10d67aaac8b2051023a"
|
||||
"sha": "86bb1ad27f80e189b328333d2271b360ae579f2b"
|
||||
},
|
||||
"homepage": "https://docs.atlan.com/"
|
||||
},
|
||||
@@ -244,7 +244,7 @@
|
||||
"source": {
|
||||
"source": "url",
|
||||
"url": "https://github.com/atlassian/atlassian-mcp-server.git",
|
||||
"sha": "9b52fb18e184edc307ce33f8bf4cdf148dedf1f2"
|
||||
"sha": "f4911dba81f25782c88815b03deabf444cd46e0d"
|
||||
},
|
||||
"homepage": "https://github.com/atlassian/atlassian-mcp-server"
|
||||
},
|
||||
@@ -275,7 +275,7 @@
|
||||
"url": "https://github.com/auth0/agent-skills.git",
|
||||
"path": "plugins/auth0",
|
||||
"ref": "main",
|
||||
"sha": "bdf0dc23f8b17446b2c94bc9f2e5a58d3f1bc114"
|
||||
"sha": "b595bdb9b574569e864eef86c3d48c06e2cf414c"
|
||||
},
|
||||
"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": "c0991f463b54ac94af32a730d6d13293dcff98cf"
|
||||
"sha": "f5ba81082aafe865ffe947ceabc574a7a0353e57"
|
||||
},
|
||||
"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": "d8243e5f8f3933d656b3bdfe09cd658a5d9b9fac"
|
||||
"sha": "58373593c6ed2e4684181f81369c0b7a4c916423"
|
||||
},
|
||||
"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": "c0991f463b54ac94af32a730d6d13293dcff98cf"
|
||||
"sha": "f5ba81082aafe865ffe947ceabc574a7a0353e57"
|
||||
},
|
||||
"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": "c0991f463b54ac94af32a730d6d13293dcff98cf"
|
||||
"sha": "f5ba81082aafe865ffe947ceabc574a7a0353e57"
|
||||
},
|
||||
"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": "d8243e5f8f3933d656b3bdfe09cd658a5d9b9fac"
|
||||
"sha": "58373593c6ed2e4684181f81369c0b7a4c916423"
|
||||
},
|
||||
"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": "b3e5ee487ed27d8c776d9b854d7e109f1514c75b"
|
||||
"sha": "944e5b17bb4b6a84a76b6382e3f5d7fa9abd7bbd"
|
||||
},
|
||||
"homepage": "https://github.com/awslabs/startups"
|
||||
},
|
||||
@@ -414,7 +414,7 @@
|
||||
"source": {
|
||||
"source": "url",
|
||||
"url": "https://github.com/base44/skills.git",
|
||||
"sha": "ec420cf2edd2c7e9a523d5afe2e71498a6357fa4"
|
||||
"sha": "aef0fa35f21b3c0c000d5ab8c0b068e6188618b6"
|
||||
},
|
||||
"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": "67c30be97a0a3f46bc6e8d56df449ae108eda9c5"
|
||||
"sha": "76a043a08c0a10eb73756d04031a613568017067"
|
||||
},
|
||||
"homepage": "https://docs.bigdata.com"
|
||||
},
|
||||
@@ -472,7 +472,7 @@
|
||||
"source": {
|
||||
"source": "url",
|
||||
"url": "https://github.com/brightdata/skills.git",
|
||||
"sha": "bd5bd76bc889f54b744bab3db3cbd42751a1e5b0"
|
||||
"sha": "8d427e9871566efe3f0a1c8888f98b6fe8288831"
|
||||
},
|
||||
"homepage": "https://docs.brightdata.com"
|
||||
},
|
||||
@@ -502,7 +502,7 @@
|
||||
"url": "https://github.com/carta/plugins.git",
|
||||
"path": "plugins/carta-cap-table",
|
||||
"ref": "main",
|
||||
"sha": "c39482a45c1e4c02922fe5cef3d61fb010a0b2d9"
|
||||
"sha": "ab95e738e5fa8945d0e0faa1e43b7d618980ac76"
|
||||
},
|
||||
"homepage": "https://carta.com"
|
||||
},
|
||||
@@ -518,7 +518,7 @@
|
||||
"url": "https://github.com/carta/plugins.git",
|
||||
"path": "plugins/carta-crm",
|
||||
"ref": "main",
|
||||
"sha": "c39482a45c1e4c02922fe5cef3d61fb010a0b2d9"
|
||||
"sha": "4b5796517b62c4aeaac1a0bb6ccdaebeb73475a5"
|
||||
},
|
||||
"homepage": "https://carta.com"
|
||||
},
|
||||
@@ -534,7 +534,7 @@
|
||||
"url": "https://github.com/carta/plugins.git",
|
||||
"path": "plugins/carta-investors",
|
||||
"ref": "main",
|
||||
"sha": "c39482a45c1e4c02922fe5cef3d61fb010a0b2d9"
|
||||
"sha": "ab95e738e5fa8945d0e0faa1e43b7d618980ac76"
|
||||
},
|
||||
"homepage": "https://carta.com"
|
||||
},
|
||||
@@ -561,7 +561,7 @@
|
||||
"source": {
|
||||
"source": "url",
|
||||
"url": "https://github.com/ChromeDevTools/chrome-devtools-mcp.git",
|
||||
"sha": "6bd8c91678035b5aa18ee40f72e1f630aa528837"
|
||||
"sha": "228cf3936ad99d9e0c09b43d77fbbac8712f2357"
|
||||
},
|
||||
"homepage": "https://github.com/ChromeDevTools/chrome-devtools-mcp"
|
||||
},
|
||||
@@ -720,7 +720,7 @@
|
||||
"source": {
|
||||
"source": "url",
|
||||
"url": "https://github.com/cloudflare/skills.git",
|
||||
"sha": "c5b7b06b073fa0b4abbd63964630f97d81da69c4"
|
||||
"sha": "12520fd63a1e958be217a93f48ce1f04bc9055f3"
|
||||
},
|
||||
"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": "c6112f168b405df8e7310b12a9b80484cd01ac14"
|
||||
"sha": "41f4db99123434f3e24d0b9caca3e2b65d7ee24d"
|
||||
},
|
||||
"homepage": "https://codspeed.io"
|
||||
},
|
||||
@@ -872,7 +872,7 @@
|
||||
"source": {
|
||||
"source": "url",
|
||||
"url": "https://github.com/CrowdStrike/foundry-skills.git",
|
||||
"sha": "0a651a1472e4c03603780517374c654236bcce8b"
|
||||
"sha": "a7e6a75ad2d9aa4093771e8c07d455c1ce39aae1"
|
||||
},
|
||||
"homepage": "https://github.com/CrowdStrike/foundry-skills"
|
||||
},
|
||||
@@ -918,7 +918,7 @@
|
||||
"source": {
|
||||
"source": "url",
|
||||
"url": "https://github.com/dash0hq/dash0-agent-plugin.git",
|
||||
"sha": "5ff7aa5b8e52e10d10e45ea8e2f7cbebc86758bf"
|
||||
"sha": "37fd498b0775d98fcd27ff3c0fe3f68e412482a4"
|
||||
},
|
||||
"homepage": "https://dash0.com/"
|
||||
},
|
||||
@@ -929,7 +929,7 @@
|
||||
"source": {
|
||||
"source": "url",
|
||||
"url": "https://github.com/astronomer/agents.git",
|
||||
"sha": "7ce4a12d3cabb506294134c91a1b876d4b166a70"
|
||||
"sha": "789b4544b85a989694501e4f405b522f2d711cf6"
|
||||
},
|
||||
"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": "b47cae53405e90dd97d1ecde890a8d4707d1f115"
|
||||
"sha": "6f60c83ad13436f953224a61477d6380c199214b"
|
||||
},
|
||||
"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": "7ce4a12d3cabb506294134c91a1b876d4b166a70"
|
||||
"sha": "789b4544b85a989694501e4f405b522f2d711cf6"
|
||||
},
|
||||
"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": "d8243e5f8f3933d656b3bdfe09cd658a5d9b9fac"
|
||||
"sha": "58373593c6ed2e4684181f81369c0b7a4c916423"
|
||||
},
|
||||
"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": "b5a8f7a4bc4d31a1f139a232efbba6127af0474a"
|
||||
"sha": "ec2ecdd49d54ef490b344a850cff1feb1230c409"
|
||||
},
|
||||
"homepage": "https://datarobot.com"
|
||||
},
|
||||
@@ -1048,7 +1048,7 @@
|
||||
"url": "https://github.com/awslabs/agent-plugins.git",
|
||||
"path": "plugins/deploy-on-aws",
|
||||
"ref": "main",
|
||||
"sha": "d8243e5f8f3933d656b3bdfe09cd658a5d9b9fac"
|
||||
"sha": "58373593c6ed2e4684181f81369c0b7a4c916423"
|
||||
},
|
||||
"homepage": "https://github.com/awslabs/agent-plugins"
|
||||
},
|
||||
@@ -1150,7 +1150,7 @@
|
||||
"url": "https://github.com/expo/skills.git",
|
||||
"path": "plugins/expo",
|
||||
"ref": "main",
|
||||
"sha": "c38860242118df93d4ec4381a34f4144fff61928"
|
||||
"sha": "1a5693e0acc95a0829ff1656b4426fee2f2c1167"
|
||||
},
|
||||
"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": "54ad156019d7362a56d8024b9adbe99952aa29b6"
|
||||
"sha": "2efd0e37d10c35c4a7cf6d2b7381c9dc1a569bd4"
|
||||
},
|
||||
"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": "f88103bd0ccfe9e1e7a3a7d849de26d197978c9a"
|
||||
"sha": "d7f42424cfddfb567efbae100023b94dfb4571be"
|
||||
},
|
||||
"homepage": "https://github.com/gemini-cli-extensions/firestore-native"
|
||||
},
|
||||
@@ -1333,7 +1333,7 @@
|
||||
"source": {
|
||||
"source": "url",
|
||||
"url": "https://github.com/huggingface/skills.git",
|
||||
"sha": "d7223848c3895fbd447faf2aec73e0a6cdd7fdcd"
|
||||
"sha": "7bf59b7f85b79c74207b10d5e425934514e8b089"
|
||||
},
|
||||
"homepage": "https://github.com/huggingface/skills.git"
|
||||
},
|
||||
@@ -1361,7 +1361,7 @@
|
||||
"source": {
|
||||
"source": "url",
|
||||
"url": "https://github.com/heygen-com/hyperframes.git",
|
||||
"sha": "acd8e11789a7bf92f0ed4fac24ff030cd758da37"
|
||||
"sha": "c52165d1b63cf11955ceb4e2265cbe34b0718852"
|
||||
},
|
||||
"homepage": "https://hyperframes.heygen.com"
|
||||
},
|
||||
@@ -1429,7 +1429,7 @@
|
||||
"source": {
|
||||
"source": "url",
|
||||
"url": "https://github.com/gemini-cli-extensions/knowledge-catalog.git",
|
||||
"sha": "317e96fdd12aa61778b950192aff627efdc21099"
|
||||
"sha": "b3df58e81ae46a1497a1186fc82119d328ec730c"
|
||||
},
|
||||
"homepage": "https://github.com/gemini-cli-extensions/knowledge-catalog"
|
||||
},
|
||||
@@ -1540,7 +1540,7 @@
|
||||
"url": "https://github.com/pydantic/skills.git",
|
||||
"path": "plugins/logfire",
|
||||
"ref": "main",
|
||||
"sha": "ddc7d00569458f3838c6cf489f5be6c59afaf8c1"
|
||||
"sha": "1e7a4567d8375e8ef07ad078d7f38bc03ce5e944"
|
||||
},
|
||||
"homepage": "https://github.com/pydantic/skills/tree/main/plugins/logfire"
|
||||
},
|
||||
@@ -1554,7 +1554,7 @@
|
||||
"source": {
|
||||
"source": "url",
|
||||
"url": "https://github.com/gemini-cli-extensions/looker.git",
|
||||
"sha": "e912c0342f1bfd436e9236aaef7cc732239c80f7"
|
||||
"sha": "ef38964514c9b6634ac9a211d3987222bb36bf6e"
|
||||
},
|
||||
"homepage": "https://github.com/gemini-cli-extensions/looker"
|
||||
},
|
||||
@@ -1602,7 +1602,7 @@
|
||||
"source": {
|
||||
"source": "url",
|
||||
"url": "https://github.com/lusha-oss/lusha-mcp-plugin.git",
|
||||
"sha": "8fc71d5473ea40e01a92001787f0f3caaf5ca30e"
|
||||
"sha": "affbc76b03c1a46c0dffc5b7a374cf7af17b26e8"
|
||||
},
|
||||
"homepage": "https://www.lusha.com"
|
||||
},
|
||||
@@ -1708,7 +1708,7 @@
|
||||
"url": "https://github.com/awslabs/startups.git",
|
||||
"path": "migrate/plugins/migration-to-aws",
|
||||
"ref": "main",
|
||||
"sha": "3c5d6a7deb24c3318be8b78ef75545539ab1bbcd"
|
||||
"sha": "944e5b17bb4b6a84a76b6382e3f5d7fa9abd7bbd"
|
||||
},
|
||||
"homepage": "https://github.com/awslabs/startups"
|
||||
},
|
||||
@@ -1759,7 +1759,7 @@
|
||||
"url": "https://github.com/neondatabase/agent-skills.git",
|
||||
"path": "plugins/neon-postgres",
|
||||
"ref": "main",
|
||||
"sha": "bd9ec7ff273ce54bdd3ebe581d5b0802a3479618"
|
||||
"sha": "58b84dfb0815cca6dbb2f40bfdb23ddf934d2b5f"
|
||||
},
|
||||
"homepage": "https://github.com/neondatabase/agent-skills/tree/main/plugins/neon-postgres"
|
||||
},
|
||||
@@ -1770,7 +1770,7 @@
|
||||
"source": {
|
||||
"source": "url",
|
||||
"url": "https://github.com/netlify/context-and-tools.git",
|
||||
"sha": "22025ef6c9dc9ef88d0c9c047980c10cacb178ee"
|
||||
"sha": "c594226e29e05cd6da81b73e8d5a67c6742b4437"
|
||||
},
|
||||
"homepage": "https://github.com/netlify/context-and-tools"
|
||||
},
|
||||
@@ -1839,7 +1839,7 @@
|
||||
"url": "https://github.com/NVIDIA/skills.git",
|
||||
"path": "plugins/nvidia-skills",
|
||||
"ref": "main",
|
||||
"sha": "fd1e6fd1971eb7113a4dd206a028246fa4b3d8b4"
|
||||
"sha": "071d2fe0ef34b77a56f2f1401c223848572d5a97"
|
||||
},
|
||||
"homepage": "https://github.com/NVIDIA/skills"
|
||||
},
|
||||
@@ -1855,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": "00cedef34c99d642d969f87965736768de01cbd6"
|
||||
"sha": "deadf8f862f1360e08fd7de470ad1af38c3edb31"
|
||||
},
|
||||
"homepage": "https://docs.oracle.com/en/cloud/paas/ai-data-platform/index.html"
|
||||
},
|
||||
@@ -1885,7 +1885,7 @@
|
||||
"url": "https://github.com/growthxai/output.git",
|
||||
"path": "coding_assistants/claude/plugins/outputai",
|
||||
"ref": "main",
|
||||
"sha": "65cd087132dce880362c52384b8237eb9202ceea"
|
||||
"sha": "be9352cb3cb4bd7c204be0150db8c205dd939d9e"
|
||||
},
|
||||
"homepage": "https://output.ai"
|
||||
},
|
||||
@@ -1995,7 +1995,7 @@
|
||||
"source": {
|
||||
"source": "url",
|
||||
"url": "https://github.com/PostHog/ai-plugin.git",
|
||||
"sha": "db4a86632293ca66eec9a6d278786ddb22c1787e"
|
||||
"sha": "f674efefafeff7152294642f8559906eed885210"
|
||||
},
|
||||
"homepage": "https://posthog.com/docs/model-context-protocol"
|
||||
},
|
||||
@@ -2050,7 +2050,7 @@
|
||||
"url": "https://github.com/pydantic/skills.git",
|
||||
"path": "plugins/ai",
|
||||
"ref": "main",
|
||||
"sha": "ddc7d00569458f3838c6cf489f5be6c59afaf8c1"
|
||||
"sha": "1e7a4567d8375e8ef07ad078d7f38bc03ce5e944"
|
||||
},
|
||||
"homepage": "https://github.com/pydantic/skills/tree/main/plugins/ai"
|
||||
},
|
||||
@@ -2088,7 +2088,7 @@
|
||||
"source": {
|
||||
"source": "url",
|
||||
"url": "https://github.com/qdrant/skills.git",
|
||||
"sha": "82337ccd4be601e52871f101844d57b2adbac52b"
|
||||
"sha": "0814a0875db7a31bf29e46821668ef1b07f9f696"
|
||||
},
|
||||
"homepage": "https://skills.qdrant.tech"
|
||||
},
|
||||
@@ -2113,7 +2113,7 @@
|
||||
"source": {
|
||||
"source": "url",
|
||||
"url": "https://github.com/TheQtCompanyRnD/agent-skills.git",
|
||||
"sha": "a7189a7bc17e616b725e7ce4e46a4f5ebd50d94f"
|
||||
"sha": "2be55aaf050cf0e5d92d62966c473d2c5f6d780a"
|
||||
},
|
||||
"homepage": "https://www.qt.io/"
|
||||
},
|
||||
@@ -2127,7 +2127,7 @@
|
||||
"source": {
|
||||
"source": "url",
|
||||
"url": "https://github.com/quarkusio/quarkus-agent-mcp.git",
|
||||
"sha": "91c7986e41234827db2632ed07770301468c9dbc"
|
||||
"sha": "0ecd6237518001b92da64499f0b43103a278f95f"
|
||||
},
|
||||
"homepage": "https://quarkus.io"
|
||||
},
|
||||
@@ -2140,7 +2140,7 @@
|
||||
"url": "https://github.com/railwayapp/railway-skills.git",
|
||||
"path": "plugins/railway",
|
||||
"ref": "main",
|
||||
"sha": "1df604ebd18f528ff16b84975125ecff944cc036"
|
||||
"sha": "836d42c1b652953c17a4523a07f1b8a68cc22064"
|
||||
},
|
||||
"homepage": "https://docs.railway.com/ai/claude-code-plugin"
|
||||
},
|
||||
@@ -2300,7 +2300,7 @@
|
||||
"url": "https://github.com/awslabs/agent-plugins.git",
|
||||
"path": "plugins/sagemaker-ai",
|
||||
"ref": "main",
|
||||
"sha": "d8243e5f8f3933d656b3bdfe09cd658a5d9b9fac"
|
||||
"sha": "58373593c6ed2e4684181f81369c0b7a4c916423"
|
||||
},
|
||||
"homepage": "https://github.com/awslabs/agent-plugins"
|
||||
},
|
||||
@@ -2314,7 +2314,7 @@
|
||||
"source": {
|
||||
"source": "url",
|
||||
"url": "https://github.com/sanity-io/agent-toolkit.git",
|
||||
"sha": "66f0ec5d9167b3ccb8b3450e5ec34f3b523d4139"
|
||||
"sha": "2d7b7c08a31a6e5b613e33a9edc76456e4d7c052"
|
||||
},
|
||||
"homepage": "https://www.sanity.io"
|
||||
},
|
||||
@@ -2348,7 +2348,7 @@
|
||||
"url": "https://github.com/SAP/open-ux-tools.git",
|
||||
"path": "packages/fiori-mcp-server",
|
||||
"ref": "main",
|
||||
"sha": "604f28952b720579ca9369978ba73493092fdf13"
|
||||
"sha": "cf2d1ef7f5641416c8f3ce7da7afac6c9271ad39"
|
||||
},
|
||||
"homepage": "https://github.com/SAP/open-ux-tools/tree/main/packages/fiori-mcp-server"
|
||||
},
|
||||
@@ -2380,14 +2380,14 @@
|
||||
"url": "https://github.com/spotify/save-to-spotify.git",
|
||||
"path": "plugin",
|
||||
"ref": "main",
|
||||
"sha": "cd4ea68111d96769b09c0b0d2199e692cf00a73c"
|
||||
"sha": "a62408bcfb5e5be686e1fdcc361398493b8c4160"
|
||||
},
|
||||
"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.3",
|
||||
"version": "2.0.5",
|
||||
"author": {
|
||||
"name": "Anthropic",
|
||||
"email": "support@anthropic.com"
|
||||
@@ -2415,7 +2415,7 @@
|
||||
"source": {
|
||||
"source": "url",
|
||||
"url": "https://github.com/getsentry/sentry-for-claude.git",
|
||||
"sha": "87de81a1300acc03fffa2438877fa2dcf078e703"
|
||||
"sha": "9780bfc111f97b359893169e79c33d1e393891e5"
|
||||
},
|
||||
"homepage": "https://github.com/getsentry/sentry-for-claude/tree/main"
|
||||
},
|
||||
@@ -2431,7 +2431,7 @@
|
||||
"url": "https://github.com/getsentry/cli.git",
|
||||
"path": "plugins/sentry-cli",
|
||||
"ref": "main",
|
||||
"sha": "18111b95ac8819d58e4f0334d4b8ee8f72513d1e"
|
||||
"sha": "a55d2a805aea69f6abb3fe58ed162377867ba2c5"
|
||||
},
|
||||
"homepage": "https://sentry.io"
|
||||
},
|
||||
@@ -2534,7 +2534,7 @@
|
||||
"url": "https://github.com/Snowflake-Labs/snowflake-ai-kit.git",
|
||||
"path": "plugins/cortex-code",
|
||||
"ref": "main",
|
||||
"sha": "7d2c7e7e0788e255019a64a8690aa5f85d073a2c"
|
||||
"sha": "5a8f277f623394838ee76399261f4704c19eaba7"
|
||||
},
|
||||
"homepage": "https://docs.snowflake.com/en/user-guide/cortex-code"
|
||||
},
|
||||
@@ -2548,7 +2548,7 @@
|
||||
"source": {
|
||||
"source": "url",
|
||||
"url": "https://github.com/SonarSource/sonarqube-agent-plugins.git",
|
||||
"sha": "712b93281f4e67c16ed9b81dde090e1f73f8bfc8"
|
||||
"sha": "8c46904b2c21eb98d827c185e15ef5f6dd820312"
|
||||
},
|
||||
"homepage": "https://www.sonarsource.com"
|
||||
},
|
||||
@@ -2608,7 +2608,7 @@
|
||||
"url": "https://github.com/stripe/ai.git",
|
||||
"path": "providers/claude/plugin",
|
||||
"ref": "main",
|
||||
"sha": "b8f6adcb5d05f6ff01334411561ee8cb1ec014c6"
|
||||
"sha": "d076d0558c3b3d86149c2dddc84054fe9c6dd3e0"
|
||||
},
|
||||
"homepage": "https://github.com/stripe/ai/tree/main/providers/claude/plugin"
|
||||
},
|
||||
@@ -2707,7 +2707,7 @@
|
||||
"source": {
|
||||
"source": "url",
|
||||
"url": "https://github.com/togethercomputer/skills.git",
|
||||
"sha": "8aa08ca126a50d5e76f6d378f47386cee4267984"
|
||||
"sha": "86bdd6627675eac3f2055f028e4acdd4d1b03fb0"
|
||||
},
|
||||
"homepage": "https://www.together.ai"
|
||||
},
|
||||
@@ -2769,7 +2769,7 @@
|
||||
"url": "https://github.com/UI5/plugins-coding-agents.git",
|
||||
"path": "plugins/ui5",
|
||||
"ref": "main",
|
||||
"sha": "9b3d7d80356f687725f9584988e4038dbead0d53"
|
||||
"sha": "6d72751f0b2983c379aaa457fe4c7cf4a075a66d"
|
||||
},
|
||||
"homepage": "https://github.com/UI5/plugins-coding-agents"
|
||||
},
|
||||
@@ -2787,7 +2787,7 @@
|
||||
"url": "https://github.com/UI5/plugins-coding-agents.git",
|
||||
"path": "plugins/ui5-typescript-conversion",
|
||||
"ref": "main",
|
||||
"sha": "9b3d7d80356f687725f9584988e4038dbead0d53"
|
||||
"sha": "80f2d93287054f9d30dd990e842e15bcfca581c9"
|
||||
},
|
||||
"homepage": "https://github.com/UI5/plugins-coding-agents"
|
||||
},
|
||||
@@ -2803,7 +2803,7 @@
|
||||
"url": "https://github.com/val-town/plugins.git",
|
||||
"path": "plugin",
|
||||
"ref": "main",
|
||||
"sha": "02631f998eda9b88d73d699703b062db059d506b"
|
||||
"sha": "1f7928397349f2ccb228302d8b062c7f20745871"
|
||||
},
|
||||
"homepage": "https://val.town"
|
||||
},
|
||||
@@ -2881,7 +2881,7 @@
|
||||
"source": {
|
||||
"source": "url",
|
||||
"url": "https://github.com/wix/skills.git",
|
||||
"sha": "9666bc8d4856d9028e815610c23ab4f48d8ddd3b"
|
||||
"sha": "def21835af3e6f0d86bf8c18acb1aaad7fdc9cd8"
|
||||
},
|
||||
"homepage": "https://dev.wix.com/docs/wix-cli/guides/development/about-wix-skills"
|
||||
},
|
||||
@@ -2934,7 +2934,7 @@
|
||||
"url": "https://github.com/zapier/zapier-mcp.git",
|
||||
"path": "plugins/zapier",
|
||||
"ref": "main",
|
||||
"sha": "770167c572deaf74c588b45d88003ddf2145d608"
|
||||
"sha": "ea8ed6b4de66e9bb46c12b3a38da8286e3770ad9"
|
||||
},
|
||||
"homepage": "https://github.com/zapier/zapier-mcp/tree/main/plugins/zapier"
|
||||
},
|
||||
@@ -2988,7 +2988,7 @@
|
||||
"source": {
|
||||
"source": "url",
|
||||
"url": "https://github.com/zscaler/zscaler-mcp-server.git",
|
||||
"sha": "f84ce4f0ed48047614a4202ac311cbdf00ea9a10"
|
||||
"sha": "a2162c384e1ffb68b3bf14783ea9a1a762c85ff5"
|
||||
},
|
||||
"homepage": "https://github.com/zscaler/zscaler-mcp-server"
|
||||
}
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "security-guidance",
|
||||
"version": "2.0.3",
|
||||
"version": "2.0.5",
|
||||
"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,6 +40,15 @@ 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
|
||||
|
||||
|
||||
# Phase + err-kind integer encoding for sdk_bootstrap_phase / sdk_bootstrap_err.
|
||||
@@ -63,6 +72,7 @@ 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,
|
||||
@@ -102,6 +112,41 @@ 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.
|
||||
@@ -158,6 +203,145 @@ 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 _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",
|
||||
"claude-agent-sdk"],
|
||||
capture_output=True, timeout=120, check=True,
|
||||
)
|
||||
return BUILT_TARGET, "", ""
|
||||
except subprocess.CalledProcessError as e:
|
||||
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
|
||||
@@ -246,6 +430,12 @@ 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, "", ""
|
||||
|
||||
err_phase = ""
|
||||
err_kind = ""
|
||||
we_own_sentinel = False
|
||||
@@ -360,10 +550,27 @@ 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
|
||||
@@ -467,6 +674,30 @@ 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
|
||||
# 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()
|
||||
# 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,6 +55,12 @@ 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