ScuttleBot

scuttlebot / skills / scuttlebot-relay / scripts / install-claude-relay.sh
Source Blame History 360 lines
016a29f… lmata 1 #!/usr/bin/env bash
016a29f… lmata 2 # Install the tracked Claude relay hooks plus binary launcher into a local setup.
016a29f… lmata 3
016a29f… lmata 4 set -euo pipefail
016a29f… lmata 5
016a29f… lmata 6 usage() {
016a29f… lmata 7 cat <<'EOF'
016a29f… lmata 8 Usage:
016a29f… lmata 9 bash skills/scuttlebot-relay/scripts/install-claude-relay.sh [options]
016a29f… lmata 10
016a29f… lmata 11 Options:
016a29f… lmata 12 --url URL Set SCUTTLEBOT_URL in the shared env file.
016a29f… lmata 13 --token TOKEN Set SCUTTLEBOT_TOKEN in the shared env file.
016a29f… lmata 14 --channel CHANNEL Set SCUTTLEBOT_CHANNEL in the shared env file.
1d3caa2… lmata 15 --channels CSV Set SCUTTLEBOT_CHANNELS in the shared env file.
b8ce843… lmata 16 --transport MODE Set SCUTTLEBOT_TRANSPORT (http or irc). Default: irc.
b8ce843… lmata 17 --irc-addr ADDR Set SCUTTLEBOT_IRC_ADDR. Default: 127.0.0.1:6667.
b8ce843… lmata 18 --irc-pass PASS Write SCUTTLEBOT_IRC_PASS for fixed-identity IRC mode.
b8ce843… lmata 19 --auto-register Remove SCUTTLEBOT_IRC_PASS so IRC mode auto-registers session nicks. Default.
016a29f… lmata 20 --enabled Write SCUTTLEBOT_HOOKS_ENABLED=1. Default.
016a29f… lmata 21 --disabled Write SCUTTLEBOT_HOOKS_ENABLED=0.
016a29f… lmata 22 --config-file PATH Shared env file path. Default: ~/.config/scuttlebot-relay.env
016a29f… lmata 23 --hooks-dir PATH Claude hooks install dir. Default: ~/.claude/hooks
016a29f… lmata 24 --settings-json PATH Claude settings JSON. Default: ~/.claude/settings.json
016a29f… lmata 25 --bin-dir PATH Launcher install dir. Default: ~/.local/bin
016a29f… lmata 26 --help Show this help.
016a29f… lmata 27
016a29f… lmata 28 Environment defaults:
016a29f… lmata 29 SCUTTLEBOT_URL
016a29f… lmata 30 SCUTTLEBOT_TOKEN
016a29f… lmata 31 SCUTTLEBOT_CHANNEL
1d3caa2… lmata 32 SCUTTLEBOT_CHANNELS
b8ce843… lmata 33 SCUTTLEBOT_TRANSPORT
b8ce843… lmata 34 SCUTTLEBOT_IRC_ADDR
b8ce843… lmata 35 SCUTTLEBOT_IRC_PASS
b8ce843… lmata 36 SCUTTLEBOT_IRC_DELETE_ON_CLOSE
016a29f… lmata 37 SCUTTLEBOT_HOOKS_ENABLED
b8ce843… lmata 38 SCUTTLEBOT_INTERRUPT_ON_MESSAGE
b8ce843… lmata 39 SCUTTLEBOT_POLL_INTERVAL
b8ce843… lmata 40 SCUTTLEBOT_PRESENCE_HEARTBEAT
016a29f… lmata 41 SCUTTLEBOT_CONFIG_FILE
016a29f… lmata 42 CLAUDE_HOOKS_DIR
016a29f… lmata 43 CLAUDE_SETTINGS_JSON
016a29f… lmata 44 CLAUDE_BIN_DIR
016a29f… lmata 45
016a29f… lmata 46 Examples:
016a29f… lmata 47 bash skills/scuttlebot-relay/scripts/install-claude-relay.sh \
016a29f… lmata 48 --url http://localhost:8080 \
016a29f… lmata 49 --token "$(./run.sh token)" \
016a29f… lmata 50 --channel general
016a29f… lmata 51
016a29f… lmata 52 SCUTTLEBOT_HOOKS_ENABLED=0 make install-claude-relay
016a29f… lmata 53 EOF
016a29f… lmata 54 }
016a29f… lmata 55
016a29f… lmata 56 SCRIPT_DIR=$(CDPATH= cd -- "$(dirname -- "$0")" && pwd)
016a29f… lmata 57 REPO_ROOT=$(CDPATH= cd -- "$SCRIPT_DIR/../../.." && pwd)
016a29f… lmata 58
016a29f… lmata 59 SCUTTLEBOT_URL_VALUE="${SCUTTLEBOT_URL:-}"
016a29f… lmata 60 SCUTTLEBOT_TOKEN_VALUE="${SCUTTLEBOT_TOKEN:-}"
016a29f… lmata 61 SCUTTLEBOT_CHANNEL_VALUE="${SCUTTLEBOT_CHANNEL:-}"
1d3caa2… lmata 62 SCUTTLEBOT_CHANNELS_VALUE="${SCUTTLEBOT_CHANNELS:-}"
b8ce843… lmata 63 SCUTTLEBOT_TRANSPORT_VALUE="${SCUTTLEBOT_TRANSPORT:-irc}"
b8ce843… lmata 64 SCUTTLEBOT_IRC_ADDR_VALUE="${SCUTTLEBOT_IRC_ADDR:-127.0.0.1:6667}"
b8ce843… lmata 65 if [ -n "${SCUTTLEBOT_IRC_PASS:-}" ]; then
b8ce843… lmata 66 SCUTTLEBOT_IRC_PASS_MODE="fixed"
b8ce843… lmata 67 SCUTTLEBOT_IRC_PASS_VALUE="$SCUTTLEBOT_IRC_PASS"
b8ce843… lmata 68 else
b8ce843… lmata 69 SCUTTLEBOT_IRC_PASS_MODE="auto"
b8ce843… lmata 70 SCUTTLEBOT_IRC_PASS_VALUE=""
b8ce843… lmata 71 fi
b8ce843… lmata 72 SCUTTLEBOT_IRC_DELETE_ON_CLOSE_VALUE="${SCUTTLEBOT_IRC_DELETE_ON_CLOSE:-1}"
016a29f… lmata 73 SCUTTLEBOT_HOOKS_ENABLED_VALUE="${SCUTTLEBOT_HOOKS_ENABLED:-1}"
b8ce843… lmata 74 SCUTTLEBOT_INTERRUPT_ON_MESSAGE_VALUE="${SCUTTLEBOT_INTERRUPT_ON_MESSAGE:-1}"
b8ce843… lmata 75 SCUTTLEBOT_POLL_INTERVAL_VALUE="${SCUTTLEBOT_POLL_INTERVAL:-2s}"
b8ce843… lmata 76 SCUTTLEBOT_PRESENCE_HEARTBEAT_VALUE="${SCUTTLEBOT_PRESENCE_HEARTBEAT:-60s}"
016a29f… lmata 77
016a29f… lmata 78 CONFIG_FILE="${SCUTTLEBOT_CONFIG_FILE:-$HOME/.config/scuttlebot-relay.env}"
016a29f… lmata 79 HOOKS_DIR="${CLAUDE_HOOKS_DIR:-$HOME/.claude/hooks}"
016a29f… lmata 80 SETTINGS_JSON="${CLAUDE_SETTINGS_JSON:-$HOME/.claude/settings.json}"
016a29f… lmata 81 BIN_DIR="${CLAUDE_BIN_DIR:-$HOME/.local/bin}"
016a29f… lmata 82
016a29f… lmata 83 while [ $# -gt 0 ]; do
016a29f… lmata 84 case "$1" in
016a29f… lmata 85 --url)
016a29f… lmata 86 SCUTTLEBOT_URL_VALUE="${2:?missing value for --url}"
016a29f… lmata 87 shift 2
016a29f… lmata 88 ;;
016a29f… lmata 89 --token)
016a29f… lmata 90 SCUTTLEBOT_TOKEN_VALUE="${2:?missing value for --token}"
016a29f… lmata 91 shift 2
016a29f… lmata 92 ;;
016a29f… lmata 93 --channel)
016a29f… lmata 94 SCUTTLEBOT_CHANNEL_VALUE="${2:?missing value for --channel}"
1d3caa2… lmata 95 shift 2
1d3caa2… lmata 96 ;;
1d3caa2… lmata 97 --channels)
1d3caa2… lmata 98 SCUTTLEBOT_CHANNELS_VALUE="${2:?missing value for --channels}"
b8ce843… lmata 99 shift 2
b8ce843… lmata 100 ;;
b8ce843… lmata 101 --transport)
b8ce843… lmata 102 SCUTTLEBOT_TRANSPORT_VALUE="${2:?missing value for --transport}"
b8ce843… lmata 103 shift 2
b8ce843… lmata 104 ;;
b8ce843… lmata 105 --irc-addr)
b8ce843… lmata 106 SCUTTLEBOT_IRC_ADDR_VALUE="${2:?missing value for --irc-addr}"
b8ce843… lmata 107 shift 2
b8ce843… lmata 108 ;;
b8ce843… lmata 109 --irc-pass)
b8ce843… lmata 110 SCUTTLEBOT_IRC_PASS_MODE="fixed"
b8ce843… lmata 111 SCUTTLEBOT_IRC_PASS_VALUE="${2:?missing value for --irc-pass}"
b8ce843… lmata 112 shift 2
b8ce843… lmata 113 ;;
b8ce843… lmata 114 --auto-register)
b8ce843… lmata 115 SCUTTLEBOT_IRC_PASS_MODE="auto"
b8ce843… lmata 116 SCUTTLEBOT_IRC_PASS_VALUE=""
b8ce843… lmata 117 shift
016a29f… lmata 118 ;;
016a29f… lmata 119 --enabled)
016a29f… lmata 120 SCUTTLEBOT_HOOKS_ENABLED_VALUE=1
016a29f… lmata 121 shift
016a29f… lmata 122 ;;
016a29f… lmata 123 --disabled)
016a29f… lmata 124 SCUTTLEBOT_HOOKS_ENABLED_VALUE=0
016a29f… lmata 125 shift
016a29f… lmata 126 ;;
016a29f… lmata 127 --config-file)
016a29f… lmata 128 CONFIG_FILE="${2:?missing value for --config-file}"
016a29f… lmata 129 shift 2
016a29f… lmata 130 ;;
016a29f… lmata 131 --hooks-dir)
016a29f… lmata 132 HOOKS_DIR="${2:?missing value for --hooks-dir}"
016a29f… lmata 133 shift 2
016a29f… lmata 134 ;;
016a29f… lmata 135 --settings-json)
016a29f… lmata 136 SETTINGS_JSON="${2:?missing value for --settings-json}"
016a29f… lmata 137 shift 2
016a29f… lmata 138 ;;
016a29f… lmata 139 --bin-dir)
016a29f… lmata 140 BIN_DIR="${2:?missing value for --bin-dir}"
016a29f… lmata 141 shift 2
016a29f… lmata 142 ;;
016a29f… lmata 143 --help|-h)
016a29f… lmata 144 usage
016a29f… lmata 145 exit 0
016a29f… lmata 146 ;;
016a29f… lmata 147 *)
016a29f… lmata 148 printf 'install-claude-relay: unknown argument %s\n' "$1" >&2
016a29f… lmata 149 usage >&2
016a29f… lmata 150 exit 2
016a29f… lmata 151 ;;
016a29f… lmata 152 esac
016a29f… lmata 153 done
016a29f… lmata 154
016a29f… lmata 155 need_cmd() {
016a29f… lmata 156 if ! command -v "$1" >/dev/null 2>&1; then
016a29f… lmata 157 printf 'install-claude-relay: required command not found: %s\n' "$1" >&2
016a29f… lmata 158 exit 1
016a29f… lmata 159 fi
016a29f… lmata 160 }
016a29f… lmata 161
016a29f… lmata 162 backup_file() {
016a29f… lmata 163 local path="$1"
016a29f… lmata 164 if [ -f "$path" ] && [ ! -f "${path}.bak" ]; then
016a29f… lmata 165 cp "$path" "${path}.bak"
016a29f… lmata 166 fi
016a29f… lmata 167 }
016a29f… lmata 168
016a29f… lmata 169 ensure_parent_dir() {
016a29f… lmata 170 mkdir -p "$(dirname "$1")"
016a29f… lmata 171 }
1d3caa2… lmata 172
1d3caa2… lmata 173 normalize_channels() {
1d3caa2… lmata 174 local primary="$1"
1d3caa2… lmata 175 local raw="$2"
1d3caa2… lmata 176 local IFS=','
1d3caa2… lmata 177 local items=()
1d3caa2… lmata 178 local extra_items=()
1d3caa2… lmata 179 local item channel seen=""
1d3caa2… lmata 180
1d3caa2… lmata 181 if [ -n "$primary" ]; then
1d3caa2… lmata 182 items+=("$primary")
1d3caa2… lmata 183 fi
1d3caa2… lmata 184 if [ -n "$raw" ]; then
1d3caa2… lmata 185 read -r -a extra_items <<< "$raw"
1d3caa2… lmata 186 items+=("${extra_items[@]}")
1d3caa2… lmata 187 fi
1d3caa2… lmata 188
1d3caa2… lmata 189 for item in "${items[@]}"; do
1d3caa2… lmata 190 channel="${item//[$' \t\r\n']/}"
1d3caa2… lmata 191 channel="${channel#\#}"
1d3caa2… lmata 192 [ -n "$channel" ] || continue
1d3caa2… lmata 193 case ",$seen," in
1d3caa2… lmata 194 *,"$channel",*) ;;
1d3caa2… lmata 195 *) seen="${seen:+$seen,}$channel" ;;
1d3caa2… lmata 196 esac
1d3caa2… lmata 197 done
1d3caa2… lmata 198
1d3caa2… lmata 199 printf '%s' "$seen"
1d3caa2… lmata 200 }
1d3caa2… lmata 201
1d3caa2… lmata 202 first_channel() {
1d3caa2… lmata 203 local channels
1d3caa2… lmata 204 channels=$(normalize_channels "" "$1")
1d3caa2… lmata 205 printf '%s' "${channels%%,*}"
1d3caa2… lmata 206 }
1d3caa2… lmata 207
1d3caa2… lmata 208 if [ -z "$SCUTTLEBOT_CHANNEL_VALUE" ] && [ -n "$SCUTTLEBOT_CHANNELS_VALUE" ]; then
1d3caa2… lmata 209 SCUTTLEBOT_CHANNEL_VALUE="$(first_channel "$SCUTTLEBOT_CHANNELS_VALUE")"
1d3caa2… lmata 210 fi
1d3caa2… lmata 211 if [ -n "$SCUTTLEBOT_CHANNEL_VALUE" ]; then
1d3caa2… lmata 212 SCUTTLEBOT_CHANNELS_VALUE="$(normalize_channels "$SCUTTLEBOT_CHANNEL_VALUE" "$SCUTTLEBOT_CHANNELS_VALUE")"
1d3caa2… lmata 213 fi
b8ce843… lmata 214
016a29f… lmata 215 upsert_env_var() {
016a29f… lmata 216 local file="$1"
016a29f… lmata 217 local key="$2"
016a29f… lmata 218 local value="$3"
016a29f… lmata 219 local escaped
016a29f… lmata 220 escaped=$(printf '%q' "$value")
016a29f… lmata 221 awk -v key="$key" -v value="$escaped" '
016a29f… lmata 222 BEGIN { done = 0 }
016a29f… lmata 223 $0 ~ "^(export[[:space:]]+)?" key "=" {
016a29f… lmata 224 if (!done) {
016a29f… lmata 225 print key "=" value
016a29f… lmata 226 done = 1
016a29f… lmata 227 }
016a29f… lmata 228 next
016a29f… lmata 229 }
016a29f… lmata 230 { print }
016a29f… lmata 231 END {
016a29f… lmata 232 if (!done) {
016a29f… lmata 233 print key "=" value
016a29f… lmata 234 }
016a29f… lmata 235 }
b8ce843… lmata 236 ' "$file" > "${file}.tmp"
b8ce843… lmata 237 mv "${file}.tmp" "$file"
b8ce843… lmata 238 }
b8ce843… lmata 239
b8ce843… lmata 240 remove_env_var() {
b8ce843… lmata 241 local file="$1"
b8ce843… lmata 242 local key="$2"
b8ce843… lmata 243 awk -v key="$key" '
b8ce843… lmata 244 $0 ~ "^(export[[:space:]]+)?" key "=" { next }
b8ce843… lmata 245 { print }
016a29f… lmata 246 ' "$file" > "${file}.tmp"
016a29f… lmata 247 mv "${file}.tmp" "$file"
016a29f… lmata 248 }
016a29f… lmata 249
016a29f… lmata 250 need_cmd jq
016a29f… lmata 251 need_cmd go
016a29f… lmata 252
016a29f… lmata 253 POST_CMD="$HOOKS_DIR/scuttlebot-post.sh"
016a29f… lmata 254 CHECK_CMD="$HOOKS_DIR/scuttlebot-check.sh"
016a29f… lmata 255 LAUNCHER_DST="$BIN_DIR/claude-relay"
016a29f… lmata 256
016a29f… lmata 257 mkdir -p "$HOOKS_DIR" "$BIN_DIR"
016a29f… lmata 258 ensure_parent_dir "$SETTINGS_JSON"
016a29f… lmata 259 ensure_parent_dir "$CONFIG_FILE"
016a29f… lmata 260
016a29f… lmata 261 backup_file "$POST_CMD"
016a29f… lmata 262 backup_file "$CHECK_CMD"
016a29f… lmata 263 backup_file "$LAUNCHER_DST"
016a29f… lmata 264 install -m 0755 "$REPO_ROOT/skills/scuttlebot-relay/hooks/scuttlebot-post.sh" "$POST_CMD"
016a29f… lmata 265 install -m 0755 "$REPO_ROOT/skills/scuttlebot-relay/hooks/scuttlebot-check.sh" "$CHECK_CMD"
016a29f… lmata 266
016a29f… lmata 267 printf 'Building claude-relay binary...\n'
016a29f… lmata 268 (cd "$REPO_ROOT" && go build -o "$LAUNCHER_DST" ./cmd/claude-relay)
016a29f… lmata 269
016a29f… lmata 270 backup_file "$SETTINGS_JSON"
016a29f… lmata 271 if [ -f "$SETTINGS_JSON" ]; then
016a29f… lmata 272 jq --arg pre_matcher "Bash|Edit|Write" \
016a29f… lmata 273 --arg pre_cmd "$CHECK_CMD" \
016a29f… lmata 274 --arg post_matcher "Bash|Read|Edit|Write|Glob|Grep|Agent" \
016a29f… lmata 275 --arg post_cmd "$POST_CMD" '
016a29f… lmata 276 def ensure_matcher_entry(section; matcher; cmd):
016a29f… lmata 277 .hooks = (.hooks // {})
016a29f… lmata 278 | .hooks[section] = (.hooks[section] // [])
016a29f… lmata 279 | if any(.hooks[section][]?; .matcher == matcher) then
016a29f… lmata 280 .hooks[section] |= map(
016a29f… lmata 281 if .matcher == matcher then
016a29f… lmata 282 (.hooks = (.hooks // []))
016a29f… lmata 283 | if any(.hooks[]?; .type == "command" and .command == cmd) then . else .hooks += [{"type":"command","command":cmd}] end
016a29f… lmata 284 else
016a29f… lmata 285 .
016a29f… lmata 286 end
016a29f… lmata 287 )
016a29f… lmata 288 else
016a29f… lmata 289 .hooks[section] += [{"matcher":matcher,"hooks":[{"type":"command","command":cmd}]}]
016a29f… lmata 290 end;
016a29f… lmata 291 ensure_matcher_entry("PreToolUse"; $pre_matcher; $pre_cmd)
016a29f… lmata 292 | ensure_matcher_entry("PostToolUse"; $post_matcher; $post_cmd)
016a29f… lmata 293 ' "$SETTINGS_JSON" > "${SETTINGS_JSON}.tmp"
016a29f… lmata 294 else
016a29f… lmata 295 jq -n \
016a29f… lmata 296 --arg pre_cmd "$CHECK_CMD" \
016a29f… lmata 297 --arg post_cmd "$POST_CMD" '
016a29f… lmata 298 {
016a29f… lmata 299 hooks: {
016a29f… lmata 300 "PreToolUse": [
016a29f… lmata 301 {
016a29f… lmata 302 matcher: "Bash|Edit|Write",
016a29f… lmata 303 hooks: [{type: "command", command: $pre_cmd}]
016a29f… lmata 304 }
016a29f… lmata 305 ],
016a29f… lmata 306 "PostToolUse": [
016a29f… lmata 307 {
016a29f… lmata 308 matcher: "Bash|Read|Edit|Write|Glob|Grep|Agent",
016a29f… lmata 309 hooks: [{type: "command", command: $post_cmd}]
016a29f… lmata 310 }
016a29f… lmata 311 ]
016a29f… lmata 312 }
016a29f… lmata 313 }
016a29f… lmata 314 ' > "${SETTINGS_JSON}.tmp"
016a29f… lmata 315 fi
016a29f… lmata 316 mv "${SETTINGS_JSON}.tmp" "$SETTINGS_JSON"
016a29f… lmata 317
016a29f… lmata 318 backup_file "$CONFIG_FILE"
016a29f… lmata 319 if [ ! -f "$CONFIG_FILE" ]; then
016a29f… lmata 320 : > "$CONFIG_FILE"
016a29f… lmata 321 fi
016a29f… lmata 322 if [ -n "$SCUTTLEBOT_URL_VALUE" ]; then
016a29f… lmata 323 upsert_env_var "$CONFIG_FILE" SCUTTLEBOT_URL "$SCUTTLEBOT_URL_VALUE"
016a29f… lmata 324 fi
016a29f… lmata 325 if [ -n "$SCUTTLEBOT_TOKEN_VALUE" ]; then
016a29f… lmata 326 upsert_env_var "$CONFIG_FILE" SCUTTLEBOT_TOKEN "$SCUTTLEBOT_TOKEN_VALUE"
016a29f… lmata 327 fi
016a29f… lmata 328 if [ -n "$SCUTTLEBOT_CHANNEL_VALUE" ]; then
016a29f… lmata 329 upsert_env_var "$CONFIG_FILE" SCUTTLEBOT_CHANNEL "${SCUTTLEBOT_CHANNEL_VALUE#\#}"
1d3caa2… lmata 330 fi
1d3caa2… lmata 331 if [ -n "$SCUTTLEBOT_CHANNELS_VALUE" ]; then
1d3caa2… lmata 332 upsert_env_var "$CONFIG_FILE" SCUTTLEBOT_CHANNELS "$SCUTTLEBOT_CHANNELS_VALUE"
b8ce843… lmata 333 fi
b8ce843… lmata 334 upsert_env_var "$CONFIG_FILE" SCUTTLEBOT_TRANSPORT "$SCUTTLEBOT_TRANSPORT_VALUE"
b8ce843… lmata 335 upsert_env_var "$CONFIG_FILE" SCUTTLEBOT_IRC_ADDR "$SCUTTLEBOT_IRC_ADDR_VALUE"
b8ce843… lmata 336 if [ "$SCUTTLEBOT_IRC_PASS_MODE" = "fixed" ]; then
b8ce843… lmata 337 upsert_env_var "$CONFIG_FILE" SCUTTLEBOT_IRC_PASS "$SCUTTLEBOT_IRC_PASS_VALUE"
b8ce843… lmata 338 else
b8ce843… lmata 339 remove_env_var "$CONFIG_FILE" SCUTTLEBOT_IRC_PASS
b8ce843… lmata 340 fi
b8ce843… lmata 341 upsert_env_var "$CONFIG_FILE" SCUTTLEBOT_IRC_DELETE_ON_CLOSE "$SCUTTLEBOT_IRC_DELETE_ON_CLOSE_VALUE"
016a29f… lmata 342 upsert_env_var "$CONFIG_FILE" SCUTTLEBOT_HOOKS_ENABLED "$SCUTTLEBOT_HOOKS_ENABLED_VALUE"
b8ce843… lmata 343 upsert_env_var "$CONFIG_FILE" SCUTTLEBOT_INTERRUPT_ON_MESSAGE "$SCUTTLEBOT_INTERRUPT_ON_MESSAGE_VALUE"
b8ce843… lmata 344 upsert_env_var "$CONFIG_FILE" SCUTTLEBOT_POLL_INTERVAL "$SCUTTLEBOT_POLL_INTERVAL_VALUE"
b8ce843… lmata 345 upsert_env_var "$CONFIG_FILE" SCUTTLEBOT_PRESENCE_HEARTBEAT "$SCUTTLEBOT_PRESENCE_HEARTBEAT_VALUE"
016a29f… lmata 346
016a29f… lmata 347 printf 'Installed Claude relay files:\n'
016a29f… lmata 348 printf ' hooks: %s\n' "$HOOKS_DIR"
016a29f… lmata 349 printf ' settings: %s\n' "$SETTINGS_JSON"
016a29f… lmata 350 printf ' launcher: %s\n' "$LAUNCHER_DST"
016a29f… lmata 351 printf ' env: %s\n' "$CONFIG_FILE"
b8ce843… lmata 352 printf ' irc auth: %s\n' "$([ "$SCUTTLEBOT_IRC_PASS_MODE" = "fixed" ] && printf 'fixed-pass override' || printf 'auto-register')"
016a29f… lmata 353 printf '\n'
016a29f… lmata 354 printf 'Next steps:\n'
016a29f… lmata 355 printf ' 1. Launch with: %s\n' "$LAUNCHER_DST"
016a29f… lmata 356 printf ' 2. Watch IRC for: claude-{repo}-{session}\n'
016a29f… lmata 357 printf ' 3. Mention that nick to interrupt before the next action\n'
016a29f… lmata 358 printf '\n'
016a29f… lmata 359 printf 'Disable without uninstalling:\n'
016a29f… lmata 360 printf ' SCUTTLEBOT_HOOKS_ENABLED=0 %s\n' "$LAUNCHER_DST"

Keyboard Shortcuts

Open search /
Next entry (timeline) j
Previous entry (timeline) k
Open focused entry Enter
Show this help ?
Toggle theme Top nav button