Files
Bastien Chanot ea9e5c1dab feat(hooks): ring terminal on turn end via Stop hook
Notification matcher covers input-needed events only; end of turn had no
signal but idle_prompt, ~60s late. Wire notify-attention.sh on Stop too,
branching on hook_event_name for the message. Signal only: returns
terminalSequence + suppressOutput, never blocks (guard vs BDR-083).

Header documents both client-side prerequisites found in BLK-020.
2026-09-03 00:28:40 +02:00

363 lines
9.2 KiB
JSON

{
"cleanupPeriodDays": 7,
"attribution": {
"commit": "",
"pr": "",
"sessionUrl": false
},
"permissions": {
"allow": [
"Bash(git status)",
"Bash(git log*)",
"Bash(git diff*)",
"Bash(git branch*)",
"Bash(git fetch*)",
"Bash(git pull*)",
"Bash(git add *)",
"Bash(git commit*)",
"Bash(git checkout *)",
"Bash(git switch *)",
"Bash(git stash)",
"Bash(git stash push*)",
"Bash(git stash list*)",
"Bash(git stash show*)",
"Bash(git tag*)",
"Bash(git show*)",
"Bash(ls *)",
"Bash(ls)",
"Bash(find *)",
"Bash(cat *)",
"Bash(head *)",
"Bash(tail *)",
"Bash(grep *)",
"Bash(rg *)",
"Bash(fd *)",
"Bash(wc *)",
"Bash(echo *)",
"Bash(pwd)",
"Bash(which *)",
"Bash(type *)",
"Bash(whoami)",
"Bash(uname *)",
"Bash(mkdir -p *)",
"Bash(touch *)",
"Bash(jq *)",
"Bash(yq *)",
"Bash(awk *)",
"Bash(sort *)",
"Bash(uniq *)",
"Bash(tr *)",
"Bash(cut *)",
"Bash(diff *)",
"Bash(rtk grep *)",
"Bash(*/rtk grep *)",
"Bash(rtk ls)",
"Bash(rtk ls *)",
"Bash(*/rtk ls)",
"Bash(*/rtk ls *)",
"Bash(rtk cat *)",
"Bash(*/rtk cat *)",
"Bash(rtk head *)",
"Bash(*/rtk head *)",
"Bash(rtk tail *)",
"Bash(*/rtk tail *)",
"Bash(rtk wc *)",
"Bash(*/rtk wc *)",
"Bash(rtk diff *)",
"Bash(*/rtk diff *)",
"Bash(rtk git status)",
"Bash(*/rtk git status)",
"Bash(rtk git log*)",
"Bash(*/rtk git log*)",
"Bash(rtk git diff*)",
"Bash(*/rtk git diff*)",
"Bash(rtk git show*)",
"Bash(*/rtk git show*)",
"Bash(rtk git branch*)",
"Bash(*/rtk git branch*)",
"Read(**/*.md)",
"Read(**/*.txt)",
"Read(**/*.json)",
"Read(**/*.yaml)",
"Read(**/*.yml)",
"Read(**/*.toml)",
"Read(**/*.lock)",
"Read(**/*.gitignore)",
"Read(**/*.dockerignore)",
"Read(**/.claudeignore)",
"Read(**/Makefile)",
"Read(**/Dockerfile*)",
"Read(**/docker-compose*)"
],
"deny": [
"Bash(rm -rf *)",
"Bash(rm -rf /*)",
"Bash(rm -r *)",
"Bash(rm -fr *)",
"Bash(rmdir *)",
"Bash(git push --force)",
"Bash(git push --force *)",
"Bash(git push -f*)",
"Bash(git push * +*)",
"Bash(git reset --hard*)",
"Bash(git clean -fd*)",
"Bash(sudo rm*)",
"Bash(sudo chmod*)",
"Bash(sudo chown*)",
"Bash(sudo dd*)",
"Bash(su *)",
"Bash(chmod 777 *)",
"Bash(chmod -R 777 *)",
"Bash(ssh *)",
"Bash(scp *)",
"Bash(rsync *)",
"Bash(nc *)",
"Bash(netcat *)",
"Bash(kill -9 *)",
"Bash(killall *)",
"Bash(pkill *)",
"Bash(crontab *)",
"Bash(systemctl *)",
"Bash(service *)",
"Bash(npm install -g *)",
"Read(**/.env)",
"Read(**/.env.*)",
"Read(**/secrets/**)",
"Read(**/*.pem)",
"Read(**/*.key)",
"Read(**/*.p12)",
"Read(**/*.pfx)",
"Read(**/id_rsa*)",
"Read(**/id_ed25519*)",
"Read(**/.ssh/**)",
"Read(**/credentials)",
"Read(**/credentials.json)",
"Read(**/.aws/credentials)",
"Read(**/.azure/**)",
"Edit(**/.env)",
"Edit(**/.env.*)",
"Edit(**/secrets/**)",
"Edit(**/*.pem)",
"Edit(**/*.key)",
"Edit(**/*.p12)",
"Edit(**/*.pfx)",
"Edit(**/id_rsa*)",
"Edit(**/id_ed25519*)",
"Edit(**/.ssh/**)",
"Edit(**/credentials)",
"Edit(**/credentials.json)",
"Edit(**/.aws/credentials)",
"Edit(**/.azure/**)",
"Edit(**/*.lock)",
"Edit(**/package-lock.json)",
"Edit(**/pnpm-lock.yaml)",
"Edit(**/go.sum)",
"Edit(**/node_modules/**)",
"Bash(eval *)",
"Bash(exec *)",
"Bash(find * -delete*)",
"Bash(find * -exec rm*)",
"Bash(find * -execdir rm*)",
"Bash(find * -exec *)",
"Bash(find * -execdir *)",
"Bash(perl -e *)",
"Bash(ruby -e *)",
"Bash(cat .env)",
"Bash(cat .env.*)",
"Bash(cat */.env)",
"Bash(cat */.env.*)",
"Bash(cat */secrets/*)",
"Bash(cat */*.pem)",
"Bash(cat */*.key)",
"Bash(cat */id_rsa*)",
"Bash(cat */id_ed25519*)",
"Bash(cat */.aws/credentials)",
"Bash(head .env)",
"Bash(head .env.*)",
"Bash(tail .env)",
"Bash(tail .env.*)",
"Bash(less .env)",
"Bash(less .env.*)",
"Bash(more .env)",
"Bash(more .env.*)",
"Bash(grep * .env)",
"Bash(grep * .env.*)",
"Bash(env)",
"Bash(printenv)",
"Bash(printenv *)",
"Bash(export *)",
"Bash(cp .env*)",
"Bash(cp **/.env*)",
"Bash(cp **/secrets/*)",
"Bash(mv .env*)",
"Bash(mv **/.env*)",
"Bash(mv **/secrets/*)",
"Bash(git add .env*)",
"Bash(git add **/.env*)",
"Bash(cp **/id_rsa*)",
"Bash(cp **/id_ed25519*)",
"Bash(cp **/.ssh/*)",
"Bash(source /dev/stdin)",
"Bash(xargs * .env*)",
"Bash(tar * .env*)",
"Bash(zip * .env*)",
"Bash(base64 .env*)",
"Bash(rtk cat *.env*)",
"Bash(*/rtk cat *.env*)",
"Bash(rtk grep * .env*)",
"Bash(*/rtk grep * .env*)",
"Bash(rtk head *.env*)",
"Bash(*/rtk head *.env*)",
"Bash(rtk tail *.env*)",
"Bash(*/rtk tail *.env*)"
],
"ask": [
"Bash(bash -c *)",
"Bash(curl * | bash)",
"Bash(wget * | bash)",
"Bash(curl * | sh)",
"Bash(wget * | sh)",
"Bash(mkfifo *)",
"Bash(node -e *)",
"Bash(python3 -c *)",
"Bash(python -c *)",
"Bash(git push *)",
"Bash(git push)",
"Bash(docker run *)",
"Bash(docker exec *)",
"Bash(docker-compose up*)",
"Bash(docker compose up*)",
"Bash(brew install *)",
"Bash(apt install *)",
"Bash(apt-get install *)",
"Bash(dnf install *)",
"Bash(pacman -S *)",
"WebSearch",
"WebFetch",
"Bash(xargs *)",
"Bash(sed *)",
"Bash(cp *)",
"Bash(mv *)",
"Bash(git stash pop*)",
"Bash(git stash drop*)",
"Bash(git stash clear)",
"mcp__magic__21st_magic_component_builder",
"mcp__magic__21st_magic_component_refiner",
"mcp__magic__21st_magic_component_inspiration",
"mcp__magic__logo_search"
],
"defaultMode": "auto",
"disableBypassPermissionsMode": "disable",
"additionalDirectories": []
},
"model": "opus[1m]",
"hooks": {
"SessionStart": [
{
"hooks": [
{
"type": "command",
"command": "bash ~/.claude/hooks/session-start.sh"
}
]
}
],
"PreToolUse": [
{
"matcher": "Bash",
"hooks": [
{
"type": "command",
"command": "bash ~/.claude/hooks/rtk-rewrite.sh"
}
]
}
],
"Notification": [
{
"matcher": "permission_prompt|idle_prompt|agent_needs_input|elicitation_dialog|elicitation_url_dialog",
"hooks": [
{
"type": "command",
"command": "bash ~/.claude/hooks/notify-attention.sh",
"timeout": 5,
"statusMessage": "Ringing terminal bell..."
}
]
}
],
"Stop": [
{
"hooks": [
{
"type": "command",
"command": "bash ~/.claude/hooks/notify-attention.sh",
"timeout": 5,
"statusMessage": "Ringing terminal bell..."
}
]
}
],
"UserPromptSubmit": [
{
"hooks": [
{
"type": "command",
"command": "bash ~/.claude/hooks/design-toolchain-reminder.sh",
"timeout": 5,
"statusMessage": "Checking design signals..."
},
{
"type": "command",
"command": "bash ~/.claude/hooks/ctx7-reminder.sh",
"timeout": 5,
"statusMessage": "Checking fast-libs..."
}
]
}
]
},
"statusLine": {
"type": "command",
"command": "bash ~/.claude/hooks/statusline.sh"
},
"enabledPlugins": {
"example-skills@anthropic-agent-skills": false,
"ui-ux-pro-max@ui-ux-pro-max-skill": true,
"security-guidance@claude-code-plugins": true,
"superpowers@superpowers-marketplace": true,
"pr-review-toolkit@claude-code-plugins": false,
"frontend-design@claude-plugins-official": true
},
"extraKnownMarketplaces": {
"claude-code-plugins": {
"source": {
"source": "github",
"repo": "anthropics/claude-code"
}
},
"superpowers-marketplace": {
"source": {
"source": "github",
"repo": "obra/superpowers-marketplace"
}
},
"ui-ux-pro-max-skill": {
"source": {
"source": "github",
"repo": "nextlevelbuilder/ui-ux-pro-max-skill"
}
},
"anthropic-agent-skills": {
"source": {
"source": "github",
"repo": "anthropics/skills"
}
}
},
"effortLevel": "xhigh",
"remoteControlAtStartup": true,
"inputNeededNotifEnabled": true,
"skipAutoPermissionPrompt": true
}