#!/usr/bin/env bash set -Eeuo pipefail # SessionStart-hook wrapper around the bin/ implementation memory-status.sh -- # surfaces the project's Claude memory status to the user. Wired in the user-level # settings.json (hooks.SessionStart). # - reads the hook payload as JSON on stdin (.cwd) and runs the util with it. # - the util prints the memory status block (the CLAUDE.md memory rows); this # wrapper wraps it in a single systemMessage. # - when cwd is $HOME, appends a warning: $HOME is not treated as a project, so # home skills (~/.claude/skills) only load with --add-dir $HOME. The hook can't # tell whether that flag was passed (no payload exposes it), so it always warns. # - ANSI-colours the message: memory rows cyan, a "(missing)" row red with an ❌, # the $HOME warning yellow with ⚠️. jq encodes the ESC byte as an escape in the # JSON; the harness turns it back into a real ESC when it prints the message. # Colours wrap each line around its already-computed padding, so the util's # column alignment stays intact (ANSI bytes never count toward printf's width). # - leads the message with a newline so the harness's "SessionStart:... says:" # header sits on its own line and the table starts at column 0. # - never blocks the session: a util failure yields an empty message. self=$(realpath -- "${BASH_SOURCE[0]}") util="$(dirname -- "$(dirname -- "$self")")/bin/memory-status.sh" input=$(cat) cwd=$(jq --raw-output '.cwd // empty' <<<"$input" 2>/dev/null) || cwd="" [ -n "$cwd" ] || cwd=$PWD esc=$'\033' cyan="${esc}[36m" red="${esc}[31m" yellow="${esc}[33m" reset="${esc}[0m" out=$(bash "$util" "$cwd") || out="" # Colour the memory block line by line: a "(missing)" row red with an ❌ error # sign, every other row cyan. if [ -n "$out" ]; then block="" while IFS= read -r line; do [ -n "$block" ] && block+=$'\n' case $line in *'(missing)'*) block+="${red}❌ ${line}${reset}" ;; *) block+="${cyan}${line}${reset}" ;; esac done <<<"$out" out=$block fi if [ "$cwd" = "$HOME" ]; then warn="⚠️ Started from \$HOME: home skills (~/.claude/skills) don't auto-load here." warn+=$'\n'"⚠️ Did you think to --add-dir \$HOME? Restart with it to surface them." [ -n "$out" ] && out+=$'\n\n' out+="${yellow}${warn}${reset}" fi [ -n "$out" ] && out=$'\n'$out jq --null-input --arg msg "$out" '{systemMessage: $msg}'