From 43ac5395b9094db35a4667f2a29269766ae33a1f Mon Sep 17 00:00:00 2001 From: Jeremiah Lowin <153965+jlowin@users.noreply.github.com> Date: Thu, 26 Feb 2026 11:12:23 -0500 Subject: [PATCH] Add SessionStart hook to install gh CLI in cloud sessions (#3308) Co-authored-by: Marvin Context Protocol <41898282+Marvin Context Protocol@users.noreply.github.com> Co-authored-by: Jeremiah Lowin --- .claude/hooks/session-init.sh | 26 ++++++++++++++++++++++++++ .claude/settings.json | 15 +++++++++++++++ 2 files changed, 41 insertions(+) create mode 100755 .claude/hooks/session-init.sh create mode 100644 .claude/settings.json diff --git a/.claude/hooks/session-init.sh b/.claude/hooks/session-init.sh new file mode 100755 index 000000000..3c767fc54 --- /dev/null +++ b/.claude/hooks/session-init.sh @@ -0,0 +1,26 @@ +#!/bin/bash +set -e + +# Only run in remote/cloud environments +if [ "$CLAUDE_CODE_REMOTE" != "true" ]; then + exit 0 +fi + +command -v gh &> /dev/null && exit 0 + +LOCAL_BIN="$HOME/.local/bin" +mkdir -p "$LOCAL_BIN" + +ARCH=$(uname -m | sed 's/x86_64/amd64/;s/aarch64/arm64/') +VERSION=$(curl -fsSL https://api.github.com/repos/cli/cli/releases/latest | grep '"tag_name"' | cut -d'"' -f4) +TARBALL="gh_${VERSION#v}_linux_${ARCH}.tar.gz" + +echo "Installing gh ${VERSION}..." +TEMP=$(mktemp -d) +trap 'rm -rf "$TEMP"' EXIT +curl -fsSL "https://github.com/cli/cli/releases/download/${VERSION}/${TARBALL}" | tar -xz -C "$TEMP" +cp "$TEMP"/gh_*/bin/gh "$LOCAL_BIN/gh" +chmod 755 "$LOCAL_BIN/gh" + +[ -n "$CLAUDE_ENV_FILE" ] && echo "export PATH=\"$LOCAL_BIN:\$PATH\"" >> "$CLAUDE_ENV_FILE" +echo "gh installed: $("$LOCAL_BIN/gh" --version | head -1)" diff --git a/.claude/settings.json b/.claude/settings.json new file mode 100644 index 000000000..afc82c2ea --- /dev/null +++ b/.claude/settings.json @@ -0,0 +1,15 @@ +{ + "hooks": { + "SessionStart": [ + { + "hooks": [ + { + "type": "command", + "command": "bash \"$CLAUDE_PROJECT_DIR\"/.claude/hooks/session-init.sh", + "timeout": 120 + } + ] + } + ] + } +}