1#!/bin/bash
2# Crush Hook Helper Functions
3# These functions are automatically available in all hooks.
4# No need to source this file - it's prepended automatically.
5
6# Permission helpers
7
8# Approve the current tool call.
9# Usage: crush_approve ["message"]
10crush_approve() {
11 export CRUSH_PERMISSION=approve
12 [ -n "$1" ] && export CRUSH_MESSAGE="$1"
13}
14
15# Deny the current tool call.
16# Usage: crush_deny ["message"]
17crush_deny() {
18 export CRUSH_PERMISSION=deny
19 export CRUSH_CONTINUE=false
20 [ -n "$1" ] && export CRUSH_MESSAGE="$1"
21 exit 2
22}
23
24# Ask user for permission (default behavior).
25# Usage: crush_ask ["message"]
26crush_ask() {
27 export CRUSH_PERMISSION=ask
28 [ -n "$1" ] && export CRUSH_MESSAGE="$1"
29}
30
31# Context helpers
32
33# Add raw text content to LLM context.
34# Usage: crush_add_context "content"
35crush_add_context() {
36 export CRUSH_CONTEXT_CONTENT="$1"
37}
38
39# Add a file to be loaded into LLM context.
40# Usage: crush_add_context_file "/path/to/file.md"
41crush_add_context_file() {
42 if [ -z "$CRUSH_CONTEXT_FILES" ]; then
43 export CRUSH_CONTEXT_FILES="$1"
44 else
45 export CRUSH_CONTEXT_FILES="$CRUSH_CONTEXT_FILES:$1"
46 fi
47}
48
49# Modification helpers
50
51# Modify the user prompt (UserPromptSubmit hooks only).
52# Usage: crush_modify_prompt "new prompt text"
53crush_modify_prompt() {
54 export CRUSH_MODIFIED_PROMPT="$1"
55}
56
57# Modify tool input parameters (PreToolUse hooks only).
58# Values are parsed as JSON when valid, supporting strings, numbers, booleans, arrays, objects.
59# Usage: crush_modify_input "param_name" "value"
60# Examples:
61# crush_modify_input "command" "ls -la"
62# crush_modify_input "offset" "100"
63# crush_modify_input "run_in_background" "true"
64# crush_modify_input "ignore" '["*.log","*.tmp"]'
65crush_modify_input() {
66 local key="$1"
67 local value="$2"
68 if [ -z "$CRUSH_MODIFIED_INPUT" ]; then
69 export CRUSH_MODIFIED_INPUT="$key=$value"
70 else
71 export CRUSH_MODIFIED_INPUT="$CRUSH_MODIFIED_INPUT:$key=$value"
72 fi
73}
74
75# Modify tool output (PostToolUse hooks only).
76# Usage: crush_modify_output "field_name" "value"
77crush_modify_output() {
78 local key="$1"
79 local value="$2"
80 if [ -z "$CRUSH_MODIFIED_OUTPUT" ]; then
81 export CRUSH_MODIFIED_OUTPUT="$key=$value"
82 else
83 export CRUSH_MODIFIED_OUTPUT="$CRUSH_MODIFIED_OUTPUT:$key=$value"
84 fi
85}
86
87# Stop execution.
88# Usage: crush_stop ["message"]
89crush_stop() {
90 export CRUSH_CONTINUE=false
91 [ -n "$1" ] && export CRUSH_MESSAGE="$1"
92 exit 1
93}
94