155 lines
5.8 KiB
Bash
Executable File
155 lines
5.8 KiB
Bash
Executable File
#!/bin/bash
|
|
#
|
|
# File: .claude/hooks/github-star-reminder.sh
|
|
#
|
|
# AgentVibes - Finally, your AI Agents can Talk Back! Text-to-Speech WITH personality for AI Assistants!
|
|
# Website: https://agentvibes.org
|
|
# Repository: https://github.com/paulpreibisch/AgentVibes
|
|
#
|
|
# Co-created by Paul Preibisch with Claude AI
|
|
# Copyright (c) 2025 Paul Preibisch
|
|
#
|
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
# you may not use this file except in compliance with the License.
|
|
# You may obtain a copy of the License at
|
|
#
|
|
# http://www.apache.org/licenses/LICENSE-2.0
|
|
#
|
|
# Unless required by applicable law or agreed to in writing, software
|
|
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
# See the License for the specific language governing permissions and
|
|
# limitations under the License.
|
|
#
|
|
# DISCLAIMER: This software is provided "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
|
# express or implied, including but not limited to the warranties of
|
|
# merchantability, fitness for a particular purpose and noninfringement.
|
|
# In no event shall the authors or copyright holders be liable for any claim,
|
|
# damages or other liability, whether in an action of contract, tort or
|
|
# otherwise, arising from, out of or in connection with the software or the
|
|
# use or other dealings in the software.
|
|
#
|
|
# ---
|
|
#
|
|
# @fileoverview GitHub Star Reminder System - Gentle daily reminder to star repository
|
|
# @context Shows a once-per-day reminder to encourage users to support the project without being annoying
|
|
# @architecture Timestamp-based tracking using daily date comparison in a state file
|
|
# @dependencies date command for timestamp generation
|
|
# @entrypoints Called by play-tts.sh router on every TTS execution, sourced or executed directly
|
|
# @patterns Rate-limiting via file-based state, graceful degradation, user-opt-out support
|
|
# @related .claude/github-star-reminder.txt (state file), .claude/github-star-reminder-disabled.flag (opt-out)
|
|
|
|
# Determine config directory (project-local or global)
|
|
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
CLAUDE_DIR="$(dirname "$SCRIPT_DIR")"
|
|
|
|
# Check if we have a project-local .claude directory
|
|
if [[ -d "$CLAUDE_DIR" ]] && [[ "$CLAUDE_DIR" != "$HOME/.claude" ]]; then
|
|
REMINDER_FILE="$CLAUDE_DIR/github-star-reminder.txt"
|
|
else
|
|
REMINDER_FILE="$HOME/.claude/github-star-reminder.txt"
|
|
mkdir -p "$HOME/.claude"
|
|
fi
|
|
|
|
GITHUB_REPO="https://github.com/paulpreibisch/AgentVibes"
|
|
|
|
# @function is_reminder_disabled
|
|
# @intent Check if GitHub star reminders have been disabled by the user
|
|
# @why Respect user preferences and provide opt-out mechanism for reminders
|
|
# @param None
|
|
# @returns None
|
|
# @exitcode 0=reminders disabled, 1=reminders enabled
|
|
# @sideeffects Reads flag files from local/global .claude directories
|
|
# @edgecases Checks both flag file and "disabled" text in reminder file for backward compatibility
|
|
# @calledby should_show_reminder
|
|
# @calls cat for reading reminder file content
|
|
is_reminder_disabled() {
|
|
# Check for disable flag file
|
|
local disable_file_local="$CLAUDE_DIR/github-star-reminder-disabled.flag"
|
|
local disable_file_global="$HOME/.claude/github-star-reminder-disabled.flag"
|
|
|
|
if [[ -f "$disable_file_local" ]] || [[ -f "$disable_file_global" ]]; then
|
|
return 0 # Disabled
|
|
fi
|
|
|
|
# Check if reminder file contains "disabled"
|
|
if [[ -f "$REMINDER_FILE" ]]; then
|
|
local content=$(cat "$REMINDER_FILE" 2>/dev/null)
|
|
if [[ "$content" == "disabled" ]]; then
|
|
return 0 # Disabled
|
|
fi
|
|
fi
|
|
|
|
return 1 # Not disabled
|
|
}
|
|
|
|
# @function should_show_reminder
|
|
# @intent Determine if reminder should be displayed based on date and disable status
|
|
# @why Implement once-per-day rate limiting to avoid annoying users
|
|
# @param None
|
|
# @returns None
|
|
# @exitcode 0=should show, 1=should not show
|
|
# @sideeffects Reads .claude/github-star-reminder.txt for last reminder date
|
|
# @edgecases Shows reminder if file doesn't exist (first run), compares YYYYMMDD format dates
|
|
# @calledby Main execution block
|
|
# @calls is_reminder_disabled, cat, date
|
|
should_show_reminder() {
|
|
# Check if disabled first
|
|
if is_reminder_disabled; then
|
|
return 1
|
|
fi
|
|
|
|
# If no reminder file exists, show it
|
|
if [[ ! -f "$REMINDER_FILE" ]]; then
|
|
return 0
|
|
fi
|
|
|
|
# Read last reminder date
|
|
LAST_REMINDER=$(cat "$REMINDER_FILE" 2>/dev/null || echo "0")
|
|
CURRENT_DATE=$(date +%Y%m%d)
|
|
|
|
# Show reminder if it's a new day
|
|
if [[ "$LAST_REMINDER" != "$CURRENT_DATE" ]]; then
|
|
return 0
|
|
fi
|
|
|
|
return 1
|
|
}
|
|
|
|
# @function show_reminder
|
|
# @intent Display friendly GitHub star reminder with opt-out instructions
|
|
# @why Encourage community support while being respectful and non-intrusive
|
|
# @param None
|
|
# @returns None
|
|
# @exitcode Always 0
|
|
# @sideeffects Updates reminder file with current date, writes to stdout
|
|
# @edgecases None
|
|
# @calledby Main execution block when should_show_reminder returns true
|
|
# @calls date, echo
|
|
show_reminder() {
|
|
echo ""
|
|
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
|
|
echo "⭐ Enjoying AgentVibes?"
|
|
echo ""
|
|
echo " If you find this project helpful, please consider giving us"
|
|
echo " a star on GitHub! It helps others discover AgentVibes and"
|
|
echo " motivates us to keep improving it."
|
|
echo ""
|
|
echo " 👉 $GITHUB_REPO"
|
|
echo ""
|
|
echo " Thank you for your support! 🙏"
|
|
echo ""
|
|
echo " 💡 To disable these reminders, run:"
|
|
echo " echo \"disabled\" > $REMINDER_FILE"
|
|
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
|
|
echo ""
|
|
|
|
# Update the reminder file with today's date
|
|
date +%Y%m%d > "$REMINDER_FILE"
|
|
}
|
|
|
|
# Main execution
|
|
if should_show_reminder; then
|
|
show_reminder
|
|
fi
|