#!/bin/bash set -euo pipefail SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" source "$SCRIPT_DIR/kugetsu-config.sh" log() { local level="${1:-}" local component="${2:-}" local message="${3:-}" local timestamp timestamp=$(date -Iseconds) case "$level" in info|warn|error|debug) ;; *) echo "Error: log level must be info|warn|error|debug" >&2 return 1 ;; esac if [ -z "$message" ]; then message="$component" component="${level}" level="info" fi local masked masked=$(mask_sensitive_vars "$message") echo "[$timestamp] $level $component $masked" } log_debug() { log "debug" "$1" "${2:-}"; } log_info() { log "info" "$1" "${2:-}"; } log_warn() { log "warn" "$1" "${2:-}"; } log_error() { log "error" "$1" "${2:-}"; } cmd_logs() { local count="${1:-10}" if [ ! -d "$LOGS_DIR" ]; then echo "No logs found." return fi find "$LOGS_DIR" -type f -mtime +7 -delete 2>/dev/null ls -lt "$LOGS_DIR" | head -$((count + 1)) | tail -$count | while read line; do echo "$line" done echo "" echo "Recent log contents:" echo "====================" for log in $(ls -lt "$LOGS_DIR" | head -$((count + 1)) | tail -$count | awk '{print $NF}'); do if [ -f "$LOGS_DIR/$log" ]; then echo "" echo "--- $log ---" tail -20 "$LOGS_DIR/$log" | while read line; do echo " $(mask_sensitive_vars "$line")" done fi done } kugetsu_add_notification() { local notification_type="$1" local message="$2" local issue_ref="${3:-}" local timestamp=$(date -Iseconds) mkdir -p "$(dirname "$NOTIFICATIONS_FILE")" local notifications="[]" if [ -f "$NOTIFICATIONS_FILE" ]; then notifications=$(cat "$NOTIFICATIONS_FILE") fi notifications=$(echo "$notifications" | python3 -c " import json import sys notifications = json.load(sys.stdin) new_notification = { 'type': '$notification_type', 'message': '''$message'''.replace('\"', '\"'), 'issue_ref': '$issue_ref' if '$issue_ref' else None, 'timestamp': '$timestamp', 'read': False } notifications.append(new_notification) notifications = notifications[-50:] if len(notifications) > 50 else notifications print(json.dumps(notifications, indent=2)) ") echo "$notifications" > "$NOTIFICATIONS_FILE" } cmd_notify() { local action="${1:-list}" case "$action" in list) if [ ! -f "$NOTIFICATIONS_FILE" ]; then echo "No notifications." return fi local notifications=$(cat "$NOTIFICATIONS_FILE") local count=$(echo "$notifications" | python3 -c "import sys, json; n=json.load(sys.stdin); print(sum(1 for x in n if not x.get('read', False)))") if [ "$count" -eq 0 ]; then echo "No unread notifications." return fi echo "Unread notifications ($count):" echo "$notifications" | python3 -c "import sys, json; [print(f\" [{x.get('timestamp', '')}] {x.get('type', '')}: {x.get('message', '')}\") for x in json.load(sys.stdin) if not x.get('read', False)]" ;; clear) if [ -f "$NOTIFICATIONS_FILE" ]; then python3 -c "import json; print(json.dumps([x for x in json.load(open('$NOTIFICATIONS_FILE')) if x.get('read', False)], indent=2))" > "$NOTIFICATIONS_FILE" echo "Cleared unread notifications." fi ;; *) echo "Usage: kugetsu notify [list|clear]" >&2 exit 1 ;; esac }