blob: 87fa4ad5447b7e0b20994c9859c09116f30f84c7 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
|
#!/bin/sh
# SessionStart(startup|resume) hook: title the session "<host>-<project>"
# (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"
|