ScuttleBot

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