mirror of
https://github.com/ivuorinen/actions.git
synced 2026-03-08 09:56:38 +00:00
* chore(claude): add hooks, skills, and agents for Claude Code Add auto-formatting hooks (ruff, shfmt, prettier, actionlint), rules.yml edit blocker, 5 skills (/release, /test-action, /new-action, /validate, /check-pins), and 2 subagents (action-validator, test-coverage-reviewer). Update CLAUDE.md with hook documentation. * fix(claude): add tool availability guards and fix skill docs Add jq availability checks to hook scripts (block-rules-yml.sh, post-edit-write.sh) and wrap actionlint call in command -v guard, consistent with project rules #2 and #10. Fix validate skill to reflect actual make all pipeline order and note that make test runs separately. * fix(claude): correct skill docs per PR review feedback Fix validate skill description to say "precommit" instead of "test", and fix check-pins SHA guidance to use origin/main instead of HEAD. * feat(tools): add SHA-pinning enforcement to check-version-refs The check-version-refs script previously only displayed existing SHA-pinned refs but silently skipped non-SHA references. Add a validation pass that detects and reports any ivuorinen/actions/* references not using a 40-char hex SHA, exiting 1 on violations. * fix(tools): fix temp file leak in check-version-refs.sh Write find output directly to $violations_file instead of $violations_file.all so the EXIT trap covers cleanup on all exit paths, not just the happy path.
47 lines
1.0 KiB
Bash
Executable File
47 lines
1.0 KiB
Bash
Executable File
#!/bin/sh
|
|
set -eu
|
|
|
|
# Read JSON input from stdin to get the file path
|
|
if ! command -v jq >/dev/null 2>&1; then
|
|
echo "Error: jq is required but not found" >&2
|
|
exit 1
|
|
fi
|
|
|
|
INPUT=$(cat)
|
|
FILE_PATH=$(echo "$INPUT" | jq -r '.tool_input.file_path // .tool_input.filePath // empty')
|
|
|
|
if [ -z "$FILE_PATH" ]; then
|
|
exit 0
|
|
fi
|
|
|
|
case "$FILE_PATH" in
|
|
*/rules.yml)
|
|
# rules.yml should not be reached here (blocked by PreToolUse),
|
|
# but skip formatting just in case
|
|
exit 0
|
|
;;
|
|
*.py)
|
|
ruff format --quiet "$FILE_PATH" 2>/dev/null || true
|
|
ruff check --fix --quiet "$FILE_PATH" 2>/dev/null || true
|
|
;;
|
|
*.sh)
|
|
shfmt -w "$FILE_PATH" 2>/dev/null || true
|
|
shellcheck "$FILE_PATH" 2>&1 || true
|
|
;;
|
|
*.yml | *.yaml | *.json)
|
|
npx prettier --write "$FILE_PATH" 2>/dev/null || true
|
|
;;
|
|
*.md)
|
|
npx prettier --write "$FILE_PATH" 2>/dev/null || true
|
|
;;
|
|
esac
|
|
|
|
# Run actionlint on action.yml files
|
|
case "$FILE_PATH" in
|
|
*/action.yml)
|
|
if command -v actionlint >/dev/null 2>&1; then
|
|
actionlint "$FILE_PATH" 2>&1 || true
|
|
fi
|
|
;;
|
|
esac
|