34 lines
1.4 KiB
Bash
Executable file
34 lines
1.4 KiB
Bash
Executable file
#!/usr/bin/env bash
|
|
# PostToolUse: shellcheck a shell script the moment it is edited.
|
|
#
|
|
# The scripts under infra/deploy/ run as root over SSH against live hosts with no
|
|
# test suite in front of them — a quoting bug or an unset-variable typo is found on
|
|
# the host, or not at all. shell-lint.yml already guards this, but only after a
|
|
# push: a five-minute round trip to learn about a missing quote, by which point the
|
|
# context that produced it is gone.
|
|
#
|
|
# Findings are fed back to the model rather than blocking the edit. The file is
|
|
# already written; the useful move is to fix it now, in the same turn.
|
|
#
|
|
# Matches shell-lint.yml's pinned shellcheck when one is on PATH. If shellcheck is
|
|
# not installed this exits quietly — CI is still the backstop, and a missing local
|
|
# tool must not break editing.
|
|
set -uo pipefail
|
|
|
|
payload=$(cat)
|
|
command -v jq >/dev/null 2>&1 || exit 0
|
|
command -v shellcheck >/dev/null 2>&1 || exit 0
|
|
|
|
path=$(printf '%s' "$payload" | jq -r '.tool_response.filePath // .tool_input.file_path // ""')
|
|
[ -n "$path" ] || exit 0
|
|
case "$path" in *.sh) ;; *) exit 0 ;; esac
|
|
[ -f "$path" ] || exit 0
|
|
|
|
if out=$(shellcheck -f gcc "$path" 2>&1); then
|
|
exit 0
|
|
fi
|
|
|
|
# Keep the feedback small: findings only, capped.
|
|
out=$(printf '%s' "$out" | head -30)
|
|
jq -n --arg p "$path" --arg o "$out" \
|
|
'{decision:"block", reason:("shellcheck findings in \($p) — shell-lint CI will fail on these, so fix them now:\n\($o)")}'
|