mirror of
https://github.com/ivuorinen/dotfiles.git
synced 2026-02-08 13:50:53 +00:00
feat(claude): add shfmt/vendor hooks and shell-validate skill
This commit is contained in:
26
.claude/settings.json
Normal file
26
.claude/settings.json
Normal file
@@ -0,0 +1,26 @@
|
||||
{
|
||||
"hooks": {
|
||||
"PreToolUse": [
|
||||
{
|
||||
"matcher": "Edit|Write",
|
||||
"hooks": [
|
||||
{
|
||||
"type": "command",
|
||||
"command": "fp=$(cat | jq -r '.tool_input.file_path // empty') && [ -n \"$fp\" ] && case \"$fp\" in */fzf-tmux|*/yarn.lock|*/.yarn/*) echo \"BLOCKED: $fp is a vendor/lock file — do not edit directly\" >&2; exit 2;; esac; exit 0"
|
||||
}
|
||||
]
|
||||
}
|
||||
],
|
||||
"PostToolUse": [
|
||||
{
|
||||
"matcher": "Edit|Write",
|
||||
"hooks": [
|
||||
{
|
||||
"type": "command",
|
||||
"command": "fp=$(cat | jq -r '.tool_input.file_path // empty') && [ -n \"$fp\" ] && [ -f \"$fp\" ] && case \"$fp\" in *.sh|*/bin/*) head -1 \"$fp\" | grep -qE '^#!.*(ba)?sh' && command -v shfmt > /dev/null && shfmt -i 2 -bn -ci -sr -fn -w \"$fp\";; esac; exit 0"
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
37
.claude/skills/shell-validate/SKILL.md
Normal file
37
.claude/skills/shell-validate/SKILL.md
Normal file
@@ -0,0 +1,37 @@
|
||||
---
|
||||
name: shell-validate
|
||||
description: Validate shell scripts after editing. Apply when writing or modifying any shell script in local/bin/ or scripts/.
|
||||
user-invocable: false
|
||||
allowed-tools: Bash, Read, Grep
|
||||
---
|
||||
|
||||
After editing any shell script in `local/bin/`, `scripts/`, or `config/` (files with a `#!` shebang or `# shellcheck shell=` directive), validate it:
|
||||
|
||||
## 1. Determine the shell
|
||||
|
||||
- `/bin/sh` or `#!/usr/bin/env sh` shebang -> POSIX, use `sh -n`
|
||||
- `/bin/bash` or `#!/usr/bin/env bash` shebang -> Bash, use `bash -n`
|
||||
- `# shellcheck shell=bash` directive (no shebang) -> use `bash -n`
|
||||
- `# shellcheck shell=sh` directive (no shebang) -> use `sh -n`
|
||||
- No shebang and no directive -> default to `bash -n`
|
||||
|
||||
## 2. Syntax check
|
||||
|
||||
Run the appropriate syntax checker:
|
||||
|
||||
```bash
|
||||
bash -n <file> # for bash scripts
|
||||
sh -n <file> # for POSIX sh scripts
|
||||
```
|
||||
|
||||
If syntax check fails, fix the issue before proceeding.
|
||||
|
||||
## 3. ShellCheck
|
||||
|
||||
Run `shellcheck <file>`. The project `.shellcheckrc` already disables SC2039, SC2166, SC2154, SC1091, SC2174, SC2016. Only report and fix warnings that are NOT in that exclude list.
|
||||
|
||||
## Key files to never validate (not shell scripts)
|
||||
|
||||
- `local/bin/fzf-tmux` (vendor file)
|
||||
- `*.md` files
|
||||
- `*.bats` test files (Bats, not plain shell)
|
||||
Reference in New Issue
Block a user