#!/bin/sh # SessionStart(startup|resume) hook: title the session "-" # (e.g. "ratio-rulesets", "velox-work") so remote sessions are identifiable # in the claude.ai/code and mobile session lists instead of auto-generated # names. # # Project = basename of the git toplevel when cwd is inside a repo (a session # started in a subdirectory still names the project), else basename of cwd. # # Only fires when the session has no title yet: a /rename, an earlier run, or # any other titling must not be clobbered on resume. The harness ignores # sessionTitle on clear/compact sources, so the settings matcher restricts to # startup|resume. # # Wire in settings.json: # # "SessionStart": [ # { "matcher": "startup|resume", # "hooks": [ { "type": "command", # "command": "~/.claude/hooks/session-title.sh" } ] } # ] input=$(cat) existing=$(echo "$input" | jq -r '.session_title // empty') [ -n "$existing" ] && exit 0 cwd=$(echo "$input" | jq -r '.cwd // empty') [ -n "$cwd" ] || cwd=$PWD project=$(git -C "$cwd" rev-parse --show-toplevel 2>/dev/null) if [ -n "$project" ]; then project=$(basename "$project") else project=$(basename "$cwd") fi # uname -n, not hostname: Arch doesn't ship hostname by default (inetutils). host=$(uname -n) python3 -c 'import json,sys; print(json.dumps({"hookSpecificOutput":{"hookEventName":"SessionStart","sessionTitle":sys.argv[1]}}))' "$host-$project"