- cmd_list: show sessions in table format ordered by last updated time - cmd_list: display issue_ref, state, last_updated, and session_id columns - cmd_logs: cleaner timestamp formatting with human-readable dates - cmd_logs: color-coded log levels (error=red, warn=yellow, info=green, debug=cyan) - cmd_logs: improved visual separation between log entries fixes #252
176 lines
5.6 KiB
Bash
Executable File
176 lines
5.6 KiB
Bash
Executable File
#!/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
|
|
|
|
local log_files=()
|
|
while IFS= read -r line; do
|
|
log_files+=("$line")
|
|
done < <(ls -lt "$LOGS_DIR" | head -$((count + 1)) | tail -$count | awk '{print $NF}')
|
|
|
|
echo "=== Recent Logs ($count files) ==="
|
|
echo ""
|
|
printf "%-30s %8s %s\n" "FILE" "SIZE" "LAST MODIFIED"
|
|
echo "----------------------------------------------------------------"
|
|
|
|
for log in "${log_files[@]}"; do
|
|
if [ -f "$LOGS_DIR/$log" ]; then
|
|
local size=$(stat -c %s "$LOGS_DIR/$log" 2>/dev/null || echo "0")
|
|
local mtime=$(stat -c %Y "$LOGS_DIR/$log" 2>/dev/null || echo "0")
|
|
local date_str=$(date -d "@$mtime" "+%Y-%m-%d %H:%M:%S" 2>/dev/null || echo "unknown")
|
|
printf "%-30s %8s %s\n" "$log" "$size" "$date_str"
|
|
fi
|
|
done
|
|
|
|
echo ""
|
|
echo "Log Contents:"
|
|
echo "================================================================"
|
|
|
|
for log in "${log_files[@]}"; do
|
|
if [ -f "$LOGS_DIR/$log" ]; then
|
|
echo ""
|
|
echo ">>> $log <<<"
|
|
echo "----------------------------------------------------------------"
|
|
tail -20 "$LOGS_DIR/$log" | while read line; do
|
|
line=$(strip_ansi_codes "$line")
|
|
line=$(mask_sensitive_vars "$line")
|
|
|
|
if [[ "$line" =~ \[([0-9]{4}-[0-9]{2}-[0-9]{2}T[0-9]{2}:[0-9]{2}:[0-9]{2}[^\]]*)\]\ ([a-z]+)\ (.+) ]]; then
|
|
local ts="${BASH_REMATCH[1]}"
|
|
local level="${BASH_REMATCH[2]}"
|
|
local msg="${BASH_REMATCH[3]}"
|
|
|
|
local color=""
|
|
local level_str=""
|
|
case "$level" in
|
|
error) color="\033[0;31m"; level_str="[ERROR]" ;;
|
|
warn) color="\033[0;33m"; level_str="[WARN ]" ;;
|
|
info) color="\033[0;32m"; level_str="[INFO ]" ;;
|
|
debug) color="\033[0;36m"; level_str="[DEBUG]" ;;
|
|
*) color="\033[0;90m"; level_str="[$level]" ;;
|
|
esac
|
|
|
|
if [ -t 1 ]; then
|
|
echo -e " \033[0;90m$ts\033[0m ${color}${level_str}\033[0m $msg"
|
|
else
|
|
echo " $ts ${level_str} $msg"
|
|
fi
|
|
else
|
|
echo " $line"
|
|
fi
|
|
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
|
|
}
|