-
-
Save peterkc/1a0e8a54d241561a10137eef7164372e to your computer and use it in GitHub Desktop.
A UserPromptSubmit hook for Claude Code to stop it saying "You're right"
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| { | |
| "hooks": { | |
| "UserPromptSubmit": [ | |
| { | |
| "hooks": [ | |
| { | |
| "type": "command", | |
| "command": "$CLAUDE_PROJECT_DIR/.claude/hooks/you_are_not_right.sh" | |
| } | |
| ] | |
| } | |
| ] | |
| } | |
| } |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| #!/usr/bin/env bash | |
| set -euo pipefail | |
| trap 'echo "at line $LINENO, exit code $? from $BASH_COMMAND" >&2; exit 1' ERR | |
| # This is a Claude Code hook to stop it saying "you are right". | |
| # | |
| # Installation: | |
| # 1. Save this script and chmod +x it to make it executable. | |
| # 2. Within Claude Code, /hooks / UserPromptSubmit > Add a new hook (this file) | |
| # | |
| # How it works: | |
| # This script checks whether the assistant has recently told the user they are right. | |
| # If so, it appends a system-reminder to the following user prompt, | |
| # reminding the assistant not to do that, and giving it constructive | |
| # examples of how it should respond to the user instead. | |
| stdin=$(cat) | |
| transcript_path=$(echo "$stdin" | jq -r ".transcript_path") | |
| # We'll look through the last 5 items in the transcript. | |
| # Sometimes the final item will be assistant thinking, | |
| # and the previous one will be "you're right". | |
| # We'll look for any triggering phrase like "You're right" | |
| # or "you are absolutely correct". | |
| items=$(grep '"role":"assistant"' "$transcript_path" | tail -n 5) | |
| needs_reminder=false | |
| while IFS= read -r item; do | |
| [[ "$(jq -r '.type // empty' <<< "$item")" == "assistant" ]] || continue | |
| [[ "$(jq -r '.message.content[0].type // empty' <<< "$item")" == "text" ]] || continue | |
| text=$(jq -r '.message.content[0].text' <<< "$item") | |
| [[ "${text:0:80}" =~ .*[Yy]ou.*(right|correct) ]] && needs_reminder=true | |
| [[ "${text:0:80}" =~ .*[Aa]bsolutely ]] && needs_reminder=true | |
| [[ "${text:0:80}" =~ .*사용자가.*맞다 ]] && needs_reminder=true # Korean | |
| [[ "${text:0:80}" =~ .*맞습니다 ]] && needs_reminder=true # Korean | |
| done <<< "$items" | |
| [[ "$needs_reminder" == "true" ]] || exit 0 | |
| # upon exit code 0, Claude Code will append stdout to the context | |
| # and proceed. | |
| cat <<'EOF' | |
| <system-reminder> | |
| Avoid reflexive agreement phrases like "you are right" or "absolutely correct." | |
| Instead, engage thoughtfully: analyze the user's reasoning, identify potential improvements, | |
| or provide substantive confirmation when their approach is sound. | |
| When the user presents a valid solution: | |
| - Acknowledge the correctness with specific technical reasoning | |
| - Consider edge cases, alternative approaches, or potential optimizations | |
| - Build collaboratively rather than merely agreeing | |
| When the user's approach has issues: | |
| - Identify specific problems or gaps | |
| - Suggest concrete improvements | |
| - Explain the technical reasoning behind your analysis | |
| <example> | |
| user: It's failing on empty inputs, so we should add a null-check. | |
| assistant: That addresses the immediate null case. For robustness, | |
| checking for all falsy values (null, undefined, empty string) would | |
| handle the broader input validation concern more comprehensively. | |
| </example> | |
| <example> | |
| user: I'm concerned that we haven't handled connection failure. | |
| assistant: Good catch - the connection attempt on line 42 lacks error | |
| handling. If that fails, the catch block on line 49 won't trigger. | |
| Moving the try-catch around the connection attempt would resolve this. | |
| </example> | |
| <example> | |
| user: We should use async/await here instead of promises. | |
| assistant: Async/await would improve readability here. The current promise | |
| chain handles errors correctly and the logic is sound - converting to | |
| async/await maintains the same error handling while making the code | |
| more maintainable. | |
| </example> | |
| </system-reminder> | |
| EOF | |
| exit 0 |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
e.g., Claude gave me this. Name the file
you_are_not_right.ps1and see if it works:Here's the PowerShell equivalent of that bash script:
Key changes from bash to PowerShell:
set -euo pipefailandtrapwith$ErrorActionPreference = 'Stop',Set-StrictMode, and a try-catch block$(cat)to[Console]::In.ReadToEnd()jqwith PowerShell's built-inConvertFrom-JsonGet-Contentinstead ofgrepandtail[[ =~ ]]to PowerShell's-matchoperatorcat <<'EOF'with PowerShell's@'...'@here-string syntaxThe script maintains the same logic and functionality as the original bash version.