3d57db9644
`stat -f '%Lp'` is BSD/macOS syntax. On Linux, `stat -f` prints filesystem info (Block size / Inodes / ...) and still exits 0, so the `||` fallback to `stat -c '%a'` never fires. That left `$perms` as multi-line garbage, the `!= "600"` check was always true, and every Linux SessionStart hook invocation printed a bogus warning plus the whole `stat -f` filesystem dump. Reorder to try GNU stat first, fall back to BSD for macOS. Verified on Linux (cpython-3.12 / bash 5.x) — hook now emits the expected compact Ready banner with no false warning. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
113 lines
3.7 KiB
Bash
Executable File
113 lines
3.7 KiB
Bash
Executable File
#!/bin/bash
|
|
set -euo pipefail
|
|
|
|
# Check last30days configuration status and show appropriate welcome message.
|
|
# Priority: .claude/last30days.env > ~/.config/last30days/.env > env vars
|
|
|
|
PROJECT_ENV=".claude/last30days.env"
|
|
GLOBAL_ENV="$HOME/.config/last30days/.env"
|
|
|
|
# Helper: warn if file permissions are too open
|
|
check_perms() {
|
|
local file="$1"
|
|
if [[ ! -f "$file" ]]; then return; fi
|
|
local perms
|
|
# Try GNU stat first (Linux), fall back to BSD stat (macOS).
|
|
# On Linux, `stat -f` prints filesystem info (not permissions) and exits 0,
|
|
# so the previous BSD-first ordering left $perms as multi-line garbage on
|
|
# every Linux session start and printed a false WARNING.
|
|
perms=$(stat -c '%a' "$file" 2>/dev/null || stat -f '%Lp' "$file" 2>/dev/null || echo "")
|
|
if [[ -n "$perms" && "$perms" != "600" && "$perms" != "400" ]]; then
|
|
echo "/last30days: WARNING — $file has permissions $perms (should be 600)."
|
|
echo " Fix: chmod 600 $file"
|
|
fi
|
|
}
|
|
|
|
# Load env file into variables for inspection (without exporting)
|
|
load_env_vars() {
|
|
local file="$1"
|
|
if [[ -f "$file" ]]; then
|
|
while IFS='=' read -r key value; do
|
|
# Skip comments, empty lines
|
|
[[ "$key" =~ ^[[:space:]]*# ]] && continue
|
|
[[ -z "$key" ]] && continue
|
|
key=$(echo "$key" | xargs)
|
|
value=$(echo "$value" | xargs | sed 's/^["'\''"]//;s/["'\''"]$//')
|
|
if [[ -n "$key" && -n "$value" ]]; then
|
|
eval "ENV_${key}=\"${value}\""
|
|
fi
|
|
done < "$file"
|
|
fi
|
|
}
|
|
|
|
# Determine which config file is active
|
|
CONFIG_FILE=""
|
|
if [[ -f "$PROJECT_ENV" ]]; then
|
|
CONFIG_FILE="$PROJECT_ENV"
|
|
check_perms "$PROJECT_ENV"
|
|
elif [[ -f "$GLOBAL_ENV" ]]; then
|
|
CONFIG_FILE="$GLOBAL_ENV"
|
|
check_perms "$GLOBAL_ENV"
|
|
fi
|
|
|
|
# Load config if found
|
|
if [[ -n "$CONFIG_FILE" ]]; then
|
|
load_env_vars "$CONFIG_FILE"
|
|
fi
|
|
|
|
# Check SETUP_COMPLETE (from file or env)
|
|
SETUP_COMPLETE="${ENV_SETUP_COMPLETE:-${SETUP_COMPLETE:-}}"
|
|
|
|
# If setup has never been run, show welcome message for new users
|
|
if [[ -z "$SETUP_COMPLETE" && -z "$CONFIG_FILE" && -z "${OPENAI_API_KEY:-}" && -z "${SCRAPECREATORS_API_KEY:-}" && -z "${AUTH_TOKEN:-}" && -z "${XAI_API_KEY:-}" ]]; then
|
|
cat <<'EOF'
|
|
/last30days: Ready to use. Run /last30days to get started — setup takes 30 seconds.
|
|
|
|
Reddit, Hacker News, and Polymarket work out of the box.
|
|
The setup wizard can unlock X/Twitter, YouTube, and more.
|
|
EOF
|
|
exit 0
|
|
fi
|
|
|
|
# Setup done but check for ScrapeCreators
|
|
HAS_SCRAPECREATORS="${ENV_SCRAPECREATORS_API_KEY:-${SCRAPECREATORS_API_KEY:-}}"
|
|
HAS_X="${ENV_AUTH_TOKEN:-${AUTH_TOKEN:-}}"
|
|
HAS_XAI="${ENV_XAI_API_KEY:-${XAI_API_KEY:-}}"
|
|
HAS_YTDLP=""
|
|
if command -v yt-dlp &>/dev/null; then
|
|
HAS_YTDLP="yes"
|
|
fi
|
|
HAS_BSKY="${ENV_BSKY_HANDLE:-${BSKY_HANDLE:-}}"
|
|
HAS_EXA="${ENV_EXA_API_KEY:-${EXA_API_KEY:-}}"
|
|
|
|
# Count active sources
|
|
SOURCE_COUNT=2 # HN + Polymarket are always free
|
|
if [[ -n "$HAS_X" || -n "$HAS_XAI" ]]; then
|
|
SOURCE_COUNT=$((SOURCE_COUNT + 1))
|
|
fi
|
|
# Reddit public JSON always works
|
|
SOURCE_COUNT=$((SOURCE_COUNT + 1))
|
|
if [[ -n "$HAS_YTDLP" ]]; then
|
|
SOURCE_COUNT=$((SOURCE_COUNT + 1))
|
|
fi
|
|
if [[ -n "$HAS_EXA" ]]; then
|
|
SOURCE_COUNT=$((SOURCE_COUNT + 1))
|
|
fi
|
|
if [[ -n "$HAS_BSKY" ]]; then
|
|
SOURCE_COUNT=$((SOURCE_COUNT + 1))
|
|
fi
|
|
if [[ -n "$HAS_SCRAPECREATORS" ]]; then
|
|
SOURCE_COUNT=$((SOURCE_COUNT + 3)) # Reddit comments + TikTok + Instagram
|
|
fi
|
|
|
|
if [[ -n "$HAS_SCRAPECREATORS" ]]; then
|
|
# Fully configured — compact ready message
|
|
echo "/last30days: Ready — ${SOURCE_COUNT} sources active."
|
|
else
|
|
# Setup done but missing ScrapeCreators — recommend it
|
|
echo "/last30days: Ready — ${SOURCE_COUNT} sources active."
|
|
echo " Tip: Add ScrapeCreators for Reddit comments + TikTok + Instagram."
|
|
echo " 10,000 free API calls, no credit card — scrapecreators.com"
|
|
echo " last30days has no affiliation with any API provider."
|
|
fi
|