Compare commits

...

48 Commits

Author SHA1 Message Date
Mohamed Hegazy
70c28b9c2f security-guidance: emit schema-valid Stop-hook output (#2159) — 2.0.2 → 2.0.3
Fixes #2159. The Stop hook emits feedback via
`hookSpecificOutput: {hookEventName: "Stop", additionalContext}`, but
`Stop`/`SubagentStop` are NOT members of CC's `hookSpecificOutput`
discriminated union (coreSchemas.ts — valid members are PreToolUse,
PostToolUse, UserPromptSubmit, SessionStart, etc.). So the emitted shape
violates CC's documented hook-output schema.

Impact is CC-version-dependent — important nuance, established empirically:

  - Reporter (array0224-cloud) on CLI 2.1.150 / 2.1.152: CC rejects the
    Stop feedback; the block/reason never reaches the model, so the
    auto-rewake/fix loop is lost. (Detection still runs + logs.)

  - On CLI 2.1.160 (current) the asyncRewake completion path is lenient:
    its gate is `isSyncHookJSONOutput` (hooks.ts) which is just
    `!(json.async === true)` — NOT a strict schema parse. So the invalid
    hookSpecificOutput is tolerated: metrics + rewakeSummary are still
    consumed and the model still receives the findings. I could NOT
    reproduce the rejection on 2.1.160, and BQ confirms Stop-path
    vulns_found metrics are recorded normally (~21k with-vuln fires / 3d),
    i.e. NOT dropped. (An earlier draft of this message claimed metrics
    were dropped — that was wrong; corrected after checking telemetry +
    repro'ing the old plugin on 2.1.160.)

So this is defensive schema-correctness: the plugin should emit output
that conforms to CC's documented union regardless of how strictly a given
CC version validates it. The reporter's environment validates strictly;
relying on the current version's leniency is fragile.

Fix (CC's documented asyncRewake "clean pattern" — hooks.ts: "error text
on stderr, JSON on stdout"):
  - For Stop/SubagentStop, emit_metrics writes guidance to stderr (the
    asyncRewake body channel CC delivers via `stderr || stdout`) and sets
    top-level `decision: "block"` + `reason` (valid SyncHookJSONOutput
    fields; also the documented sync Stop-hook contract for the `-p`
    fallback). It does NOT emit a Stop hookSpecificOutput.
  - PostToolUse (commit-review, push-sweep) is unchanged — valid union
    member, keeps the modern hookSpecificOutput protocol.

Verified locally on macOS Python 3.13:

  - py_compile clean.
  - 11 new tests (test_2159_stop_hook_schema.py) pin the contract: Stop
    output carries no hookSpecificOutput, uses top-level decision/reason,
    writes guidance to stderr; the emitted hookEventName (when present) is
    a valid union member. 2 existing tests that asserted the buggy
    Stop->hookSpecificOutput shape were corrected. Full suite 464/464
    pass + 2 skipped.

  - END-TO-END in /tmux on CLI 2.1.160:
    * FIXED plugin (2.0.3): staged pickle.loads + os.system, benign edit
      pulls the file into review_set; Stop LLM review found 2 critical
      vulns; CC delivered a clean rewake ("Background security review
      found issues" + both findings). All hooks (UPS, PostToolUse[Edit]
      pattern, PostToolUse[Bash] commit-review, Stop) fired clean; zero
      schema rejections / errors / http_err in the debug log.
    * OLD plugin (2.0.2) on the SAME 2.1.160: also delivered Stop feedback
      (confirming the no-repro-on-latest finding above) — which proves the
      fix carries NO regression risk on current CC while making the output
      robust for the stricter versions where it actually breaks.

Version bumped 2.0.2 -> 2.0.3 per the per-PR-bump policy (#2114: a bump is
the only way the fix reaches the existing fleet — relevant for users still
on the CC versions where this breaks).

Closes #2159.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-06-02 11:30:11 -07:00
github-actions[bot]
c7abc99aa1 bump(amazon-location-service): f16aaf2a → 187edde6 (#2163)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2026-06-02 09:55:47 -05:00
github-actions[bot]
3a0bba1d81 bump(carta-cap-table): f512df80 → 49cfc652 (#2169)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2026-06-02 09:54:33 -05:00
github-actions[bot]
c326beefc4 bump(chrome-devtools-mcp): 2e039c09 → 692b28ad (#2171)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2026-06-02 09:53:19 -05:00
github-actions[bot]
cc8231f0e8 bump(datarobot-agent-skills): 4c3dfbd2 → 1bef2843 (#2172)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2026-06-02 09:52:06 -05:00
github-actions[bot]
768c45f7c7 bump(cds-mcp): 92dc99f5 → 9658cea9 (#2129)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2026-06-02 09:50:52 -05:00
github-actions[bot]
890215ba95 bump(huggingface-skills): df627be1 → 49abf82b (#2138)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2026-06-02 09:47:11 -05:00
github-actions[bot]
77c7b71496 bump(quarkus-agent): 32cad78b → 065b4595 (#2144)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2026-06-02 09:44:02 -05:00
github-actions[bot]
8e3e55e512 bump(aws-amplify): f16aaf2a → 187edde6 (#2165)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2026-06-02 09:40:50 -05:00
github-actions[bot]
a8c0b70061 bump(aws-serverless): f16aaf2a → 187edde6 (#2166)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2026-06-02 09:39:37 -05:00
github-actions[bot]
4167d03e26 bump(bigdata-com): c77a09ca → 67c30be9 (#2167)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2026-06-02 09:38:22 -05:00
github-actions[bot]
8900b21abc bump(brightdata-plugin): da735491 → 68651246 (#2168)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2026-06-02 09:37:06 -05:00
github-actions[bot]
0e4789818a bump(carta-crm): f512df80 → 49cfc652 (#2170)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2026-06-02 09:35:52 -05:00
github-actions[bot]
89a3934ffa bump(desktop-commander): 9c44119a → ce4669cc (#2173)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2026-06-02 09:34:38 -05:00
github-actions[bot]
4053de6b37 bump(duende-skills): 2c803785 → 72e39de9 (#2175)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2026-06-02 09:33:23 -05:00
github-actions[bot]
907ad63743 bump(mcp-apps): 9a37ad71 → 7d4434e9 (#2177)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2026-06-02 09:32:08 -05:00
github-actions[bot]
75c86cb7ad bump(nvidia-skills): 62b685a2 → 91dbdf23 (#2179)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2026-06-02 09:30:54 -05:00
github-actions[bot]
b9447ff795 bump(pydantic-ai): eb17c0da → 56dadc9c (#2181)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2026-06-02 09:29:39 -05:00
github-actions[bot]
9a8303c6d9 bump(sentry-cli): db907679 → 5abcacdf (#2182)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2026-06-02 09:28:22 -05:00
github-actions[bot]
9557d751dc bump(teamcity-cli): 9436b94b → 533c8cb2 (#2185)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2026-06-02 09:27:08 -05:00
github-actions[bot]
eac1df92db bump(togetherai-skills): a1277729 → f957e292 (#2186)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2026-06-02 09:25:52 -05:00
github-actions[bot]
4263502749 bump(vibe-prospecting): c00b11db → 7ed0c4e2 (#2187)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2026-06-02 09:24:36 -05:00
github-actions[bot]
c0c282b87b bump(azure): 7cb89c22 → d3440b8a (#2125)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2026-06-02 09:23:22 -05:00
github-actions[bot]
abeea5843f bump(clickhouse): 36889764 → bfd22b9c (#2130)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2026-06-02 09:21:33 -05:00
github-actions[bot]
a5d43627ef bump(codspeed): 407dd3c9 → f79d57d2 (#2131)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2026-06-02 09:18:56 -05:00
github-actions[bot]
6a8591db5f bump(convex): ece93250 → 002f9c83 (#2132)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2026-06-02 09:16:18 -05:00
github-actions[bot]
31fd7f0923 bump(dash0): d1ad56f8 → 0ec3db6b (#2134)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2026-06-02 09:13:58 -05:00
github-actions[bot]
9cb21aab75 bump(firecrawl): e71cec48 → 81178096 (#2137)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2026-06-02 09:11:53 -05:00
github-actions[bot]
7328989616 bump(hunter): 9b614652 → 4eb5fbbc (#2139)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2026-06-02 09:09:48 -05:00
github-actions[bot]
8a7f6912b2 bump(hyperframes): bc3701f5 → 3c7e2f36 (#2140)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2026-06-02 09:07:26 -05:00
github-actions[bot]
a6ce4ca3d5 bump(outputai): 0eeffece → 5a87ebc1 (#2142)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2026-06-02 09:05:21 -05:00
github-actions[bot]
785a75e88b bump(pigment): 4bf16c80 → abf36e64 (#2143)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2026-06-02 09:03:34 -05:00
github-actions[bot]
697a046997 bump(sentry): d6123be3 → 849303a8 (#2148)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2026-06-02 09:00:06 -05:00
github-actions[bot]
8d45b83d6c bump(alloydb): 4a756532 → bbf4eb36 (#2162)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2026-06-02 08:58:31 -05:00
github-actions[bot]
87e08885b5 bump(atlan): b0efcc8e → cda594f4 (#2164)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2026-06-02 08:57:16 -05:00
github-actions[bot]
2de71f5542 bump(dominodatalab): 47c6e0a7 → 56c3fc39 (#2174)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2026-06-02 08:56:01 -05:00
github-actions[bot]
798cb06aa3 bump(logfire): eb17c0da → 56dadc9c (#2176)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2026-06-02 08:54:47 -05:00
github-actions[bot]
2a22053549 bump(postiz): 238aede6 → 41c5a9db (#2180)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2026-06-02 08:53:31 -05:00
github-actions[bot]
754f7f2f54 bump(stripe): 99425a01 → 38cc559c (#2183)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2026-06-02 08:52:16 -05:00
github-actions[bot]
05107962e7 bump(superpowers): f2cbfbef → 6fd45076 (#2184)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2026-06-02 08:51:01 -05:00
github-actions[bot]
56a8f8df52 bump(wix): c5b343f2 → 2da8231f (#2188)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2026-06-02 08:49:04 -05:00
Mohamed Hegazy
bf7e852731 Merge pull request #2154 from anthropics/venv-failure-deepdive
security-guidance: 5 venv-specific err_kind categories + stderr_signature bucket (2.0.1 → 2.0.2)
2026-06-01 17:29:36 -07:00
Bryan Thompson
3866e34b15 Add sagemaker-ai plugin (re-list after YAML fix) (#2158)
sagemaker-ai was dropped from the marketplace in #1762 (validate-plugins
adoption) due to a manifest/YAML error. AWS has since fixed it; the plugin
validates clean at awslabs/agent-plugins@187edde (claude plugin validate passes).

Re-listed as a git-subdir source SHA-pinned to current monorepo HEAD,
matching its sibling AWS entries (deploy-on-aws, databases-on-aws).

Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-01 17:25:46 -07:00
Bryan Thompson
3d490adc34 bump(databases-on-aws, deploy-on-aws): f16aaf2a → 187edde (#2157)
Both plugins in awslabs/agent-plugins had their subpaths edited in commit
187edde (after the morning bump cron pinned them to f16aaf2a), so they fell
behind again on merge. Manual catch-up bump to current monorepo HEAD.

- databases-on-aws: 4 files changed under plugins/databases-on-aws/ (v1.1.0)
- deploy-on-aws:    7 files changed under plugins/deploy-on-aws/ (v1.2.0)

Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-01 17:25:16 -07:00
github-actions[bot]
08d1b59559 bump(amazon-location-service): 9d46cc0a → f16aaf2a (#2120)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2026-06-01 19:08:14 -05:00
github-actions[bot]
49880c89fe bump(databases-on-aws): 9d46cc0a → f16aaf2a (#2135)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2026-06-01 18:42:30 -05:00
github-actions[bot]
7951b76e19 bump(deploy-on-aws): 9d46cc0a → f16aaf2a (#2136)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2026-06-01 18:41:19 -05:00
Bryan Thompson
9cc1748a65 Add aws-startup-advisor plugin (#2156) 2026-06-02 00:38:25 +01:00
3 changed files with 121 additions and 65 deletions

View File

@@ -107,7 +107,7 @@
"source": {
"source": "url",
"url": "https://github.com/gemini-cli-extensions/alloydb.git",
"sha": "4a75653275b095fcacf1508796b0fee8cc758c07"
"sha": "bbf4eb3664faf129ab8ff8c4b959d7e59c03d347"
},
"homepage": "https://cloud.google.com/alloydb"
},
@@ -120,7 +120,7 @@
"url": "https://github.com/awslabs/agent-plugins.git",
"path": "plugins/amazon-location-service",
"ref": "main",
"sha": "9d46cc0a092c0a8c01a5bd06a4349985cc6c8f08"
"sha": "187edde6e122116b43211049195627a5069bda80"
},
"homepage": "https://github.com/awslabs/agent-plugins"
},
@@ -203,7 +203,7 @@
"source": {
"source": "url",
"url": "https://github.com/atlanhq/agent-toolkit.git",
"sha": "b0efcc8e6adc64d052b634ac1103932390413fd9"
"sha": "cda594f40503cd2ae144052237fa2890e024828c"
},
"homepage": "https://docs.atlan.com/"
},
@@ -274,7 +274,7 @@
"url": "https://github.com/awslabs/agent-plugins.git",
"path": "plugins/aws-amplify",
"ref": "main",
"sha": "f16aaf2a4ec7d59963c4fdf91e7358bd485e992e"
"sha": "187edde6e122116b43211049195627a5069bda80"
},
"homepage": "https://github.com/awslabs/agent-plugins"
},
@@ -335,10 +335,26 @@
"url": "https://github.com/awslabs/agent-plugins.git",
"path": "plugins/aws-serverless",
"ref": "main",
"sha": "f16aaf2a4ec7d59963c4fdf91e7358bd485e992e"
"sha": "187edde6e122116b43211049195627a5069bda80"
},
"homepage": "https://github.com/awslabs/agent-plugins"
},
{
"name": "aws-startup-advisor",
"description": "Skills for startups building on AWS: an Activate knowledge base (FAQ, credits, programs, partner offers, sample architectures, 277+ learn articles), a prompt library of 29+ copy-paste prompts plus installable agents, and an interactive discovery workflow that scaffolds an AWS architecture.",
"author": {
"name": "Amazon Web Services"
},
"category": "development",
"source": {
"source": "git-subdir",
"url": "https://github.com/awslabs/startups.git",
"path": "advisor/plugins/aws-startup-advisor",
"ref": "main",
"sha": "23a4f5eaf74a0f0fcf86f8a05bd36618a3f5faae"
},
"homepage": "https://github.com/awslabs/startups"
},
{
"name": "azure",
"description": "Transform Claude into an Azure expert. This plugin integrates the Azure MCP server and specialized Azure skills to move beyond generic advice. It enables Claude to perform real-world tasks: listing resources, validating deployments, diagnosing infrastructure issues, and optimizing costs across 50+ Azure services.",
@@ -346,7 +362,7 @@
"source": {
"source": "url",
"url": "https://github.com/microsoft/azure-skills.git",
"sha": "7cb89c221ecc9eccb71580aaff3695408cdeef2b"
"sha": "d3440b8a4f138585a512ecd4e0c54ede13ab1cc2"
},
"homepage": "https://github.com/microsoft/azure-skills"
},
@@ -384,7 +400,7 @@
"url": "https://github.com/Bigdata-com/bigdata-plugins-marketplace.git",
"path": "plugins/bigdata-com",
"ref": "main",
"sha": "c77a09caabdc8783adbcbf8bbe05a0f57da12b19"
"sha": "67c30be97a0a3f46bc6e8d56df449ae108eda9c5"
},
"homepage": "https://docs.bigdata.com"
},
@@ -412,7 +428,7 @@
"source": {
"source": "url",
"url": "https://github.com/brightdata/skills.git",
"sha": "da73549126e5834a9230ee5532d4917d43aedf11"
"sha": "68651246ad1819b98a1fc15ce10239e55406ff37"
},
"homepage": "https://docs.brightdata.com"
},
@@ -442,7 +458,7 @@
"url": "https://github.com/carta/plugins.git",
"path": "plugins/carta-cap-table",
"ref": "main",
"sha": "f512df80dd54fd0a607ece2f18a9d226ca705019"
"sha": "49cfc652620672f3e4d4ca31c4ba4c6ebcc568de"
},
"homepage": "https://carta.com"
},
@@ -458,7 +474,7 @@
"url": "https://github.com/carta/plugins.git",
"path": "plugins/carta-crm",
"ref": "main",
"sha": "f512df80dd54fd0a607ece2f18a9d226ca705019"
"sha": "49cfc652620672f3e4d4ca31c4ba4c6ebcc568de"
},
"homepage": "https://carta.com"
},
@@ -490,7 +506,7 @@
"source": {
"source": "url",
"url": "https://github.com/cap-js/mcp-server.git",
"sha": "92dc99f5ba0c56957ed5d390484693a69ebd1206"
"sha": "9658cea90c782a6ab007ac16278c90fa4feca0ed"
},
"homepage": "https://cap.cloud.sap/"
},
@@ -501,7 +517,7 @@
"source": {
"source": "url",
"url": "https://github.com/ChromeDevTools/chrome-devtools-mcp.git",
"sha": "2e039c09e1a273581d9b51081a0feb8a57791947"
"sha": "692b28adac70f6475737ffbc4e6e2a0bb65569db"
},
"homepage": "https://github.com/ChromeDevTools/chrome-devtools-mcp"
},
@@ -595,7 +611,7 @@
"source": {
"source": "url",
"url": "https://github.com/ClickHouse/clickhouse-claude-code-plugin.git",
"sha": "36889764f504cb92ab71ffe54b4c55488290ed7f"
"sha": "bfd22b9ca64288c149a623c45ad933b23f9de019"
},
"homepage": "https://github.com/ClickHouse/clickhouse-claude-code-plugin"
},
@@ -716,7 +732,7 @@
"source": {
"source": "url",
"url": "https://github.com/CodSpeedHQ/codspeed.git",
"sha": "407dd3c930b8dc5e5655a2d91a65d88f01829955"
"sha": "f79d57d207f039e44a31a976564715f7731e71b6"
},
"homepage": "https://codspeed.io"
},
@@ -753,7 +769,7 @@
"source": {
"source": "url",
"url": "https://github.com/get-convex/convex-backend-skill.git",
"sha": "ece93250d560f0ce32a24223dea92b33050b2a66"
"sha": "002f9c834cdb834ddef1e4867d87cb6e80f0acba"
},
"homepage": "https://github.com/get-convex/convex-backend-skill",
"keywords": [
@@ -830,7 +846,7 @@
"source": {
"source": "url",
"url": "https://github.com/dash0hq/dash0-agent-plugin.git",
"sha": "d1ad56f86f2a9ae74eccf1df2bb2985c963005b1"
"sha": "0ec3db6b75d98badccf533597ce9a22fec744f5f"
},
"homepage": "https://dash0.com/"
},
@@ -878,7 +894,7 @@
"url": "https://github.com/awslabs/agent-plugins.git",
"path": "plugins/databases-on-aws",
"ref": "main",
"sha": "9d46cc0a092c0a8c01a5bd06a4349985cc6c8f08"
"sha": "187edde6e122116b43211049195627a5069bda80"
},
"homepage": "https://github.com/awslabs/agent-plugins"
},
@@ -920,7 +936,7 @@
"source": {
"source": "url",
"url": "https://github.com/datarobot-oss/datarobot-agent-skills.git",
"sha": "4c3dfbd259bc2c6c815f7575d27ca26bc09d0d17"
"sha": "1bef28436b91fc945b8529d1a57b471cde3154ea"
},
"homepage": "https://datarobot.com"
},
@@ -946,7 +962,7 @@
"url": "https://github.com/awslabs/agent-plugins.git",
"path": "plugins/deploy-on-aws",
"ref": "main",
"sha": "9d46cc0a092c0a8c01a5bd06a4349985cc6c8f08"
"sha": "187edde6e122116b43211049195627a5069bda80"
},
"homepage": "https://github.com/awslabs/agent-plugins"
},
@@ -962,7 +978,7 @@
"url": "https://github.com/wonderwhy-er/DesktopCommanderMCP.git",
"path": "plugins/claude",
"ref": "main",
"sha": "9c44119a480ec6460f82d59aeb90cf274bc3dd7b"
"sha": "ce4669cca7a07bd5d493cedb01df400790ec9e23"
},
"homepage": "https://desktopcommander.app"
},
@@ -982,7 +998,7 @@
"source": {
"source": "url",
"url": "https://github.com/dominodatalab/domino-claude-plugin.git",
"sha": "47c6e0a7daa11b21eb6e12779c9d679569e8ffe2"
"sha": "56c3fc39d2f2f26d58d0f27d4dad138b0edec456"
},
"homepage": "https://www.domino.ai"
},
@@ -1010,7 +1026,7 @@
"source": {
"source": "url",
"url": "https://github.com/DuendeSoftware/duende-skills.git",
"sha": "2c803785061db150d8ecea098327b404b74dbf6a"
"sha": "72e39de9f10c5dafaa7f32f58fcdbd5a8f3e5c14"
},
"homepage": "https://duendesoftware.com"
},
@@ -1114,7 +1130,7 @@
"source": {
"source": "url",
"url": "https://github.com/firecrawl/firecrawl-claude-plugin.git",
"sha": "e71cec486062680f0c8f8823afcb3558ad81ce60"
"sha": "81178096fa7ae860285923948b8ba13d03c7fa0c"
},
"homepage": "https://github.com/firecrawl/firecrawl-claude-plugin.git"
},
@@ -1217,7 +1233,7 @@
"source": {
"source": "url",
"url": "https://github.com/huggingface/skills.git",
"sha": "df627be1837523c91ac6df472e3dc543d3107bd9"
"sha": "49abf82b2ef2ff2bcc6ca072aac0fe8627390a1d"
},
"homepage": "https://github.com/huggingface/skills.git"
},
@@ -1231,7 +1247,7 @@
"source": {
"source": "url",
"url": "https://github.com/hunter-io/claude-plugin.git",
"sha": "9b6146520c48f9dcc6092f106e5c1a5762ca3e7a"
"sha": "4eb5fbbcb75e0c4c4f2c0d8aa02756165fdde629"
},
"homepage": "https://hunter.io"
},
@@ -1245,7 +1261,7 @@
"source": {
"source": "url",
"url": "https://github.com/heygen-com/hyperframes.git",
"sha": "bc3701f5905c5ba7c8cf03c3bbe3a49162d2b1f1"
"sha": "3c7e2f36497de471e5a63ecc6d582522d206b208"
},
"homepage": "https://hyperframes.heygen.com"
},
@@ -1410,7 +1426,7 @@
"url": "https://github.com/pydantic/skills.git",
"path": "plugins/logfire",
"ref": "main",
"sha": "eb17c0da94de81488825c0198475233dc1f06393"
"sha": "56dadc9c3b4551b7baf01a9a9f728dc72383bd07"
},
"homepage": "https://github.com/pydantic/skills/tree/main/plugins/logfire"
},
@@ -1485,7 +1501,7 @@
"url": "https://github.com/modelcontextprotocol/ext-apps.git",
"path": "plugins/mcp-apps",
"ref": "main",
"sha": "9a37ad71827d076af06978fa7f7f510449687061"
"sha": "7d4434e991516d91286dded5bb10266cd6cddd02"
},
"homepage": "https://modelcontextprotocol.io"
},
@@ -1665,7 +1681,7 @@
"url": "https://github.com/NVIDIA/skills.git",
"path": "plugins/nvidia-skills",
"ref": "main",
"sha": "62b685a20ac45285cafd1e22782abbed33172c17"
"sha": "91dbdf239b8af3b4c1511e0cfa5b505235a08ab1"
},
"homepage": "https://github.com/NVIDIA/skills"
},
@@ -1697,7 +1713,7 @@
"url": "https://github.com/growthxai/output.git",
"path": "coding_assistants/claude/plugins/outputai",
"ref": "main",
"sha": "0eeffece25b6f471c48b705a214471164b8c5946"
"sha": "5a87ebc13343ce6ebabac0bcc443c1da0bcf2459"
},
"homepage": "https://output.ai"
},
@@ -1745,7 +1761,7 @@
"source": {
"source": "url",
"url": "https://github.com/gopigment/ai-plugins.git",
"sha": "4bf16c80558416b9d69fa6531af8588fb2fcbe27"
"sha": "abf36e64750d1323a4cc5fe79161597668231224"
},
"homepage": "https://www.pigment.com"
},
@@ -1817,7 +1833,7 @@
"source": {
"source": "url",
"url": "https://github.com/gitroomhq/postiz-agent.git",
"sha": "238aede6c72672b3201ae0ee533ec0cd53eb51d1"
"sha": "41c5a9dbd6b2776863e7c05c22e7a385c208321c"
},
"homepage": "https://postiz.com/agent"
},
@@ -1862,7 +1878,7 @@
"url": "https://github.com/pydantic/skills.git",
"path": "plugins/ai",
"ref": "main",
"sha": "eb17c0da94de81488825c0198475233dc1f06393"
"sha": "56dadc9c3b4551b7baf01a9a9f728dc72383bd07"
},
"homepage": "https://github.com/pydantic/skills/tree/main/plugins/ai"
},
@@ -1939,7 +1955,7 @@
"source": {
"source": "url",
"url": "https://github.com/quarkusio/quarkus-agent-mcp.git",
"sha": "32cad78bd9040efe31794cfc10f70caf2a724dd9"
"sha": "065b4595cf9116f76bf87323fe29573d72a77a65"
},
"homepage": "https://quarkus.io"
},
@@ -2103,6 +2119,19 @@
}
}
},
{
"name": "sagemaker-ai",
"description": "Build, train, and deploy AI models with deep AWS AI/ML expertise brought directly into your coding assistants, covering the surface area of Amazon SageMaker AI.",
"category": "development",
"source": {
"source": "git-subdir",
"url": "https://github.com/awslabs/agent-plugins.git",
"path": "plugins/sagemaker-ai",
"ref": "main",
"sha": "187edde6e122116b43211049195627a5069bda80"
},
"homepage": "https://github.com/awslabs/agent-plugins"
},
{
"name": "sanity",
"description": "Sanity content platform integration with MCP server, agent skills, and slash commands. Query and author content, build and optimize GROQ queries, design schemas, and set up Visual Editing.",
@@ -2186,7 +2215,7 @@
{
"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.2",
"version": "2.0.3",
"author": {
"name": "Anthropic",
"email": "support@anthropic.com"
@@ -2214,7 +2243,7 @@
"source": {
"source": "url",
"url": "https://github.com/getsentry/sentry-for-claude.git",
"sha": "d6123be331e2224b037e1ffefd27c806e7566dcf"
"sha": "849303a8411c242d250885ffe714235a3bc2f5fe"
},
"homepage": "https://github.com/getsentry/sentry-for-claude/tree/main"
},
@@ -2230,7 +2259,7 @@
"url": "https://github.com/getsentry/cli.git",
"path": "plugins/sentry-cli",
"ref": "main",
"sha": "db90767935558db16c45036f89e68edaa1dde106"
"sha": "5abcacdf8f0b613bceee7aa7aebb9db1d75ed5e2"
},
"homepage": "https://sentry.io"
},
@@ -2393,7 +2422,7 @@
"url": "https://github.com/stripe/ai.git",
"path": "providers/claude/plugin",
"ref": "main",
"sha": "99425a010474c6aab745a975d06764e323c2c4d4"
"sha": "38cc559cab7eab62f11bc3809b93af45f28063f6"
},
"homepage": "https://github.com/stripe/ai/tree/main/providers/claude/plugin"
},
@@ -2427,7 +2456,7 @@
"source": {
"source": "url",
"url": "https://github.com/obra/superpowers.git",
"sha": "f2cbfbefebbfef77321e4c9abc9e949826bea9d7"
"sha": "6fd4507659784c351abbd2bc264c7162cfd386dc"
},
"homepage": "https://github.com/obra/superpowers.git"
},
@@ -2461,7 +2490,7 @@
"source": {
"source": "url",
"url": "https://github.com/JetBrains/teamcity-cli.git",
"sha": "9436b94b228579ba952aba809357776c3db9ce1a"
"sha": "533c8cb20928be912188fd8ae40fcba24cc720ca"
},
"homepage": "https://www.jetbrains.com/teamcity/"
},
@@ -2492,7 +2521,7 @@
"source": {
"source": "url",
"url": "https://github.com/togethercomputer/skills.git",
"sha": "a1277729f7914d886df213de922865d30a214a9d"
"sha": "f957e2929edebde0c364e804f8b38a3714db92b4"
},
"homepage": "https://www.together.ai"
},
@@ -2611,7 +2640,7 @@
"source": {
"source": "url",
"url": "https://github.com/explorium-ai/vibeprospecting-plugin.git",
"sha": "c00b11db4efc3e7b7aaffc10d71db33c806d5607"
"sha": "7ed0c4e2965ee315132c3c714609b46b23b5edc0"
},
"homepage": "https://www.vibeprospecting.ai/product/claude-plugin"
},
@@ -2636,7 +2665,7 @@
"source": {
"source": "url",
"url": "https://github.com/wix/skills.git",
"sha": "c5b343f2dadba06da91ee6de07272161fb68d40d"
"sha": "2da8231fcdc49a48af64b050ba5e1a85c3968670"
},
"homepage": "https://dev.wix.com/docs/wix-cli/guides/development/about-wix-skills"
},

View File

@@ -1,6 +1,6 @@
{
"name": "security-guidance",
"version": "2.0.2",
"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",

View File

@@ -221,15 +221,34 @@ def emit_metrics(
task-notification one-liner. Must be in the same JSON line as the metrics
because CC stops scanning stdout after the first {-prefixed line.
`additional_context` (asyncRewake findings): model-visible guidance text
that CC surfaces via the modern hook-output protocol
(hookSpecificOutput.additionalContext) instead of the legacy stderr +
exit(2) pair. The caller passes the finding-explanation text it would
have written to stderr; the JSON channel carries it cleanly so CC's UI
shows the reason properly instead of "Permission denied with no reason".
See anthropics/claude-plugins-official#1375 and #1783. Empty/None
means no hookSpecificOutput field is emitted (preserves backward compat
for legacy emit-sites that only want metrics).
`additional_context` (asyncRewake findings): model-visible guidance text.
Delivery channel depends on `hook_event_name` because CC's hook-output
contract is NOT symmetric across events:
- PostToolUse (commit-review, push-sweep): surfaced via the modern
hookSpecificOutput.additionalContext protocol. `PostToolUse` is a
member of CC's hookSpecificOutput discriminated union
(coreSchemas.ts), so the JSON validates and metrics/rewakeSummary
are consumed. See #1375 / #1783 for why this replaced the legacy
stderr + exit(2) shape for PostToolUse.
- Stop / SubagentStop: there is NO `Stop` member in that union, so
emitting hookSpecificOutput{hookEventName:"Stop"} makes the whole
line fail isSyncHookJSONOutput validation — which on the asyncRewake
path silently drops metrics AND rewakeSummary, and (because the
legacy stderr write was removed) leaks the raw JSON to the model as
the rewake body. CC's asyncRewake delivery actually reads
`stderr || stdout` for the model-visible body and only scans stdout
JSON for metrics+rewakeSummary — it never reads additionalContext
on this path. So for Stop we use the documented clean pattern:
guidance on stderr, valid JSON (metrics + rewakeSummary +
top-level decision/reason) on stdout. The top-level decision:"block"
+ reason also covers the sync-fallback path (single-shot `claude -p`,
where asyncRewake degrades to a sync Stop hook that reads
decision/reason). See #2159.
Empty/None additional_context emits neither channel (back-compat for
metrics-only callers).
`system_message` (optional, asyncRewake only): user-visible TUI message,
distinct from rewakeSummary which is the task-notification one-liner.
@@ -237,10 +256,9 @@ def emit_metrics(
surface; systemMessage adds a per-fire override when the static
rewakeMessage isn't specific enough for the finding being shown.
`hook_event_name` (used only when additional_context is set): which event
the hookSpecificOutput attaches to. Defaults to "PostToolUse" since the
commit-review and push-sweep handlers are the most common callers;
handle_stop_hook explicitly passes "Stop".
`hook_event_name` (used only when additional_context is set): selects the
delivery channel above. Defaults to "PostToolUse" (commit-review and
push-sweep are the most common callers); handle_stop_hook passes "Stop".
"""
head = {}
if _PV and "pv" not in metrics:
@@ -252,14 +270,23 @@ def emit_metrics(
if rewake_summary:
out["rewakeSummary"] = rewake_summary
if additional_context:
# Wrap in hookSpecificOutput per CC's modern hook-output contract.
# Drops the legacy `sys.stderr.write(...) + sys.exit(2)` shape that
# left CC's UI showing "denied with no reason" (#1783) and triggered
# "json output validation failed" on older CC versions (#1375).
out["hookSpecificOutput"] = {
"hookEventName": hook_event_name,
"additionalContext": additional_context,
}
if hook_event_name in ("Stop", "SubagentStop"):
# Stop is NOT in CC's hookSpecificOutput union — emitting it there
# fails schema validation and drops metrics+rewakeSummary (#2159).
# Clean pattern: guidance on stderr (the asyncRewake body channel,
# delivered via `stderr || stdout`), top-level decision/reason for
# the sync-fallback path. stdout JSON stays valid so metrics +
# rewakeSummary survive.
sys.stderr.write(additional_context)
sys.stderr.flush()
out["decision"] = "block"
out["reason"] = additional_context
else:
# PostToolUse et al. — valid union member; modern protocol.
out["hookSpecificOutput"] = {
"hookEventName": hook_event_name,
"additionalContext": additional_context,
}
if system_message:
out["systemMessage"] = system_message
print(json.dumps(out), flush=True)