diff --git a/plugins/actionlint/.claude-plugin/plugin.json b/plugins/actionlint/.claude-plugin/plugin.json index ad58810e1..7b0e739e4 100644 --- a/plugins/actionlint/.claude-plugin/plugin.json +++ b/plugins/actionlint/.claude-plugin/plugin.json @@ -1,7 +1,7 @@ { "$schema": "https://json.schemastore.org/claude-code-plugin-manifest.json", "name": "actionlint", - "version": "0.4.0", + "version": "0.4.1", "description": "Lint GitHub Actions workflow files on edit via actionlint, surfacing findings as advisory context.", "author": { "name": "Melodic Software", diff --git a/plugins/actionlint/CHANGELOG.md b/plugins/actionlint/CHANGELOG.md index fbc44ff33..3a4b1830a 100644 --- a/plugins/actionlint/CHANGELOG.md +++ b/plugins/actionlint/CHANGELOG.md @@ -3,6 +3,15 @@ All notable changes to the `actionlint` plugin are documented here. Format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/); this plugin uses semantic versioning. +## [0.4.1] + +### Changed + +- Hook stdin is read via the shared `hook::buffer_stdin` helper (bounded `read -t`, + default 2s) instead of a bare `cat`, so a Windows Win32-pipe late-EOF stall can no + longer hang the hook indefinitely. Empty or timed-out stdin exits as a skip, matching + the existing empty-payload behavior. + ## [0.4.0] ### Added diff --git a/plugins/actionlint/hooks/actionlint-check.sh b/plugins/actionlint/hooks/actionlint-check.sh index 78d7382e6..d0a8b4c98 100755 --- a/plugins/actionlint/hooks/actionlint-check.sh +++ b/plugins/actionlint/hooks/actionlint-check.sh @@ -35,7 +35,7 @@ emit_tel() { hook::emit_telemetry "$@" } -INPUT=$(cat) +INPUT=$(hook::buffer_stdin) || exit 0 # jq-free applicability pre-filter: never emit the jq notice for an edit this # hook would not lint anyway (the Write|Edit matcher is broader than the diff --git a/plugins/bash-format/.claude-plugin/plugin.json b/plugins/bash-format/.claude-plugin/plugin.json index 17c615750..778f3be2d 100644 --- a/plugins/bash-format/.claude-plugin/plugin.json +++ b/plugins/bash-format/.claude-plugin/plugin.json @@ -1,7 +1,7 @@ { "$schema": "https://json.schemastore.org/claude-code-plugin-manifest.json", "name": "bash-format", - "version": "0.5.0", + "version": "0.5.1", "description": "Auto-format and lint shell scripts on edit via shfmt + ShellCheck, using the consuming repo's own .editorconfig and .shellcheckrc.", "author": { "name": "Melodic Software", diff --git a/plugins/bash-format/CHANGELOG.md b/plugins/bash-format/CHANGELOG.md index 96fc3afa4..18e135501 100644 --- a/plugins/bash-format/CHANGELOG.md +++ b/plugins/bash-format/CHANGELOG.md @@ -3,6 +3,15 @@ All notable changes to the `bash-format` plugin are documented here. Format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/); this plugin uses semantic versioning. +## [0.5.1] + +### Changed + +- Hook stdin is read via the shared `hook::buffer_stdin` helper (bounded `read -t`, + default 2s) instead of a bare `cat`, so a Windows Win32-pipe late-EOF stall can no + longer hang the hook indefinitely. Empty or timed-out stdin exits as a skip, matching + the existing empty-payload behavior. + ## [0.5.0] ### Added diff --git a/plugins/bash-format/hooks/bash-format.sh b/plugins/bash-format/hooks/bash-format.sh index d5bcd725f..0e08f342c 100755 --- a/plugins/bash-format/hooks/bash-format.sh +++ b/plugins/bash-format/hooks/bash-format.sh @@ -37,7 +37,7 @@ emit_tel() { hook::emit_telemetry "$@" } -INPUT=$(cat) +INPUT=$(hook::buffer_stdin) || exit 0 # jq-free applicability pre-filter: never emit the jq notice for an edit this # hook would not process anyway (the Write|Edit matcher is broader than the diff --git a/plugins/biome-format/.claude-plugin/plugin.json b/plugins/biome-format/.claude-plugin/plugin.json index 2f6f997f9..288550546 100644 --- a/plugins/biome-format/.claude-plugin/plugin.json +++ b/plugins/biome-format/.claude-plugin/plugin.json @@ -1,7 +1,7 @@ { "$schema": "https://json.schemastore.org/claude-code-plugin-manifest.json", "name": "biome-format", - "version": "0.4.0", + "version": "0.4.1", "description": "Auto-format and lint JS/TS/JSX/JSON on edit via Biome, only when a biome.json governs the repo — using the consuming repo's own Biome config.", "author": { "name": "Melodic Software", diff --git a/plugins/biome-format/CHANGELOG.md b/plugins/biome-format/CHANGELOG.md index d2d449ce8..bb7d81c0a 100644 --- a/plugins/biome-format/CHANGELOG.md +++ b/plugins/biome-format/CHANGELOG.md @@ -3,6 +3,15 @@ All notable changes to the `biome-format` plugin are documented here. Format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/); this plugin uses semantic versioning. +## [0.4.1] + +### Changed + +- Hook stdin is read via the shared `hook::buffer_stdin` helper (bounded `read -t`, + default 2s) instead of a bare `cat`, so a Windows Win32-pipe late-EOF stall can no + longer hang the hook indefinitely. Empty or timed-out stdin exits as a skip, matching + the existing empty-payload behavior. + ## [0.4.0] ### Added diff --git a/plugins/biome-format/hooks/biome-format.sh b/plugins/biome-format/hooks/biome-format.sh index 103f467a0..805892e44 100755 --- a/plugins/biome-format/hooks/biome-format.sh +++ b/plugins/biome-format/hooks/biome-format.sh @@ -41,7 +41,7 @@ emit_tel() { hook::emit_telemetry "$@" } -INPUT=$(cat) +INPUT=$(hook::buffer_stdin) || exit 0 # jq-free applicability pre-filter: never emit the jq notice for an edit this # hook would not process anyway (the Write|Edit matcher is broader than the diff --git a/plugins/desktop-notification/.claude-plugin/plugin.json b/plugins/desktop-notification/.claude-plugin/plugin.json index c8a48cc10..deff00bc7 100644 --- a/plugins/desktop-notification/.claude-plugin/plugin.json +++ b/plugins/desktop-notification/.claude-plugin/plugin.json @@ -1,7 +1,7 @@ { "$schema": "https://json.schemastore.org/claude-code-plugin-manifest.json", "name": "desktop-notification", - "version": "0.4.0", + "version": "0.4.1", "description": "Alert you when Claude Code needs input — an audible terminal bell, an OSC 9 terminal notification, and an OS-native toast (macOS/Linux) on permission and idle prompts.", "author": { "name": "Melodic Software", diff --git a/plugins/desktop-notification/CHANGELOG.md b/plugins/desktop-notification/CHANGELOG.md index 380907688..b01d27655 100644 --- a/plugins/desktop-notification/CHANGELOG.md +++ b/plugins/desktop-notification/CHANGELOG.md @@ -3,6 +3,15 @@ All notable changes to the `desktop-notification` plugin are documented here. Format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/); this plugin uses semantic versioning. +## [0.4.1] + +### Changed + +- Hook stdin is read via the shared `hook::buffer_stdin` helper (bounded `read -t`, + default 2s) instead of a bare `cat`, so a Windows Win32-pipe late-EOF stall can no + longer hang the hook indefinitely. Empty or timed-out stdin exits as a skip, matching + the existing empty-payload behavior. + ## [0.4.0] ### Added diff --git a/plugins/desktop-notification/hooks/desktop-notification.sh b/plugins/desktop-notification/hooks/desktop-notification.sh index 95599b86a..e8c1ea171 100755 --- a/plugins/desktop-notification/hooks/desktop-notification.sh +++ b/plugins/desktop-notification/hooks/desktop-notification.sh @@ -39,11 +39,10 @@ hook::check_enabled "DESKTOP_NOTIFICATION" # advisory exit 0. Empty start => telemetry is skipped, the hook still notifies. start=${EPOCHREALTIME:-} -# Read inherited fd0 directly (bare cat) — NEVER `/dev/null || true; } -# Unwired (sink unset), clean fixture: the only legitimate jq spawn is -# hook::read_file_path's file_path parse — TOOL, FILE_REL and data_json are -# all telemetry-only and must not be built. +# Unwired (sink unset), clean fixture: the legitimate jq spawns are +# hook::buffer_stdin's payload-completeness probe (`jq -e .` — a piped read +# always ends read -d '' with a non-zero status at EOF, so the probe runs on +# every invocation) and hook::read_file_path's file_path parse — TOOL, FILE_REL +# and data_json are all telemetry-only and must not be built. : >"$CYG_LOG" : >"$JQ_LOG" printf '# Gate Doc\n\nClean text.\n' >"$REPO/fixtureGate.md" @@ -731,10 +733,10 @@ else fail "telemetry-gate/unwired: $CYG_LM_UNWIRED cygpath -lm spawns: $(cat "$CYG_LOG")" fi JQ_UNWIRED="$(wc -l <"$JQ_LOG")" -if [[ "$JQ_UNWIRED" -eq 1 ]]; then - ok "telemetry-gate/unwired: exactly 1 jq spawn (file_path parse only)" +if [[ "$JQ_UNWIRED" -eq 2 ]]; then + ok "telemetry-gate/unwired: exactly 2 jq spawns (stdin probe + file_path parse)" else - fail "telemetry-gate/unwired: expected 1 jq spawn, got $JQ_UNWIRED: $(cat "$JQ_LOG")" + fail "telemetry-gate/unwired: expected 2 jq spawns, got $JQ_UNWIRED: $(cat "$JQ_LOG")" fi # Wired (stub sink), same fixture shape: the payload construction must still diff --git a/plugins/powershell-format/.claude-plugin/plugin.json b/plugins/powershell-format/.claude-plugin/plugin.json index 7b1afeb14..ed3653ea5 100644 --- a/plugins/powershell-format/.claude-plugin/plugin.json +++ b/plugins/powershell-format/.claude-plugin/plugin.json @@ -1,7 +1,7 @@ { "$schema": "https://json.schemastore.org/claude-code-plugin-manifest.json", "name": "powershell-format", - "version": "0.4.1", + "version": "0.4.2", "description": "Auto-format and lint PowerShell on edit via PSScriptAnalyzer, only when a PSScriptAnalyzerSettings.psd1 governs the repo — using the consuming repo's own analyzer settings.", "author": { "name": "Melodic Software", diff --git a/plugins/powershell-format/CHANGELOG.md b/plugins/powershell-format/CHANGELOG.md index f63ba8714..af641f6c3 100644 --- a/plugins/powershell-format/CHANGELOG.md +++ b/plugins/powershell-format/CHANGELOG.md @@ -3,6 +3,15 @@ All notable changes to the `powershell-format` plugin are documented here. Format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/); this plugin uses semantic versioning. +## [0.4.2] + +### Changed + +- Hook stdin is read via the shared `hook::buffer_stdin` helper (bounded `read -t`, + default 2s) instead of a bare `cat`, so a Windows Win32-pipe late-EOF stall can no + longer hang the hook indefinitely. Empty or timed-out stdin exits as a skip, matching + the existing empty-payload behavior. + ## [0.4.1] ### Changed diff --git a/plugins/powershell-format/hooks/powershell-format.sh b/plugins/powershell-format/hooks/powershell-format.sh index 187d60359..db0c38a63 100755 --- a/plugins/powershell-format/hooks/powershell-format.sh +++ b/plugins/powershell-format/hooks/powershell-format.sh @@ -45,7 +45,7 @@ emit_tel() { hook::emit_telemetry "$@" } -INPUT=$(cat) +INPUT=$(hook::buffer_stdin) || exit 0 # jq-free applicability pre-filter: never emit the jq notice for an edit this # hook would not process anyway (the Write|Edit matcher is broader than the diff --git a/plugins/ruff-format/.claude-plugin/plugin.json b/plugins/ruff-format/.claude-plugin/plugin.json index 97e4b7a4c..985fff317 100644 --- a/plugins/ruff-format/.claude-plugin/plugin.json +++ b/plugins/ruff-format/.claude-plugin/plugin.json @@ -1,7 +1,7 @@ { "$schema": "https://json.schemastore.org/claude-code-plugin-manifest.json", "name": "ruff-format", - "version": "0.4.0", + "version": "0.4.1", "description": "Auto-format and lint Python on edit via Ruff, only when a Ruff config governs the repo — using the consuming repo's own Ruff config.", "author": { "name": "Melodic Software", diff --git a/plugins/ruff-format/CHANGELOG.md b/plugins/ruff-format/CHANGELOG.md index 362792dbb..726a885e8 100644 --- a/plugins/ruff-format/CHANGELOG.md +++ b/plugins/ruff-format/CHANGELOG.md @@ -3,6 +3,15 @@ All notable changes to the `ruff-format` plugin are documented here. Format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/); this plugin uses semantic versioning. +## [0.4.1] + +### Changed + +- Hook stdin is read via the shared `hook::buffer_stdin` helper (bounded `read -t`, + default 2s) instead of a bare `cat`, so a Windows Win32-pipe late-EOF stall can no + longer hang the hook indefinitely. Empty or timed-out stdin exits as a skip, matching + the existing empty-payload behavior. + ## [0.4.0] ### Added diff --git a/plugins/ruff-format/hooks/ruff-format.sh b/plugins/ruff-format/hooks/ruff-format.sh index d77355445..3bf438c99 100755 --- a/plugins/ruff-format/hooks/ruff-format.sh +++ b/plugins/ruff-format/hooks/ruff-format.sh @@ -49,7 +49,7 @@ emit_tel() { hook::emit_telemetry "$@" } -INPUT=$(cat) +INPUT=$(hook::buffer_stdin) || exit 0 # jq-free applicability pre-filter: never emit the jq notice for an edit this # hook would not process anyway (the Write|Edit matcher is broader than the