Files

145 lines
3.7 KiB
Bash

#!/bin/bash
# 퇴근 브리핑 스크립트
# 작성: 2026-02-07 (크론 간소화)
set -euo pipefail
# Load self-review library (V5.0.1 AOP)
# shellcheck source=/dev/null
source "$(dirname "$0")/../lib/self-review-lib.sh"
# Self-review metrics
START_TIME=$(date +%s)
# Main briefing logic
main() {
# 1. 관훈 여부 체크
OFFICE_LOC="사조"
if [ -f ~/openclaw/memory/gwanhun-state.json ]; then
TODAY=$(date +%Y-%m-%d)
STATE_DATE=$(jq -r '.date // ""' ~/openclaw/memory/gwanhun-state.json)
if [ "$STATE_DATE" = "$TODAY" ]; then
OFFICE_LOC="관훈"
fi
fi
# 2. 좌표 설정
EX="126.9616"
EY="37.60277"
if [ "$OFFICE_LOC" = "관훈" ]; then
SX="126.9857"
SY="37.5707"
else
SX="127.0644732"
SY="37.5075404"
fi
# 3. 귀가 경로 (Odsay API)
echo "## 🏠 귀가 경로 (${OFFICE_LOC} →)"
echo ""
ROUTES=$(curl -s -H "Referer: http://localhost/" \
"https://api.odsay.com/v1/api/searchPubTransPathT?SX=${SX}&SY=${SY}&EX=${EX}&EY=${EY}&apiKey=4%2FoBienvoQ%2BufPGJf9lqlg" \
| jq -r '.result.path[0:3] | to_entries | map(
"\n### 경로 \(.key + 1)\n" +
"⏱️ **\(.value.info.totalTime)분** | 💰 \(.value.info.payment)원 | 🔄 환승 \(.value.info.busTransitCount + .value.info.subwayTransitCount)회\n\n" +
(.value.subPath | map(
if .trafficType == 1 then
"🚇 \(.lane[0].name) (\(.startName) → \(.endName), \(.stationCount)정거장)"
elif .trafficType == 2 then
"🚌 \(.lane[0].busNo) (\(.startName) → \(.endName), \(.stationCount)정거장)"
elif .trafficType == 3 then
"🚶 도보 \(.distance)m (\(.sectionTime)분)"
else ""
end
) | join("\n"))
) | join("\n")' 2>/dev/null || echo "경로 조회 실패")
echo "$ROUTES"
echo ""
# 4. 현재 날씨
echo "## 🌡️ 현재 날씨"
echo ""
curl -s "https://wttr.in/Seoul?format=j1" | jq -r '
.current_condition[0] |
"🌡️ 기온: \(.temp_C)°C (체감 \(.FeelsLikeC)°C)\n" +
"☁️ 날씨: \(.weatherDesc[0].value)\n" +
"💨 바람: \(.windspeedKmph)km/h\n" +
"💧 습도: \(.humidity)%"
' 2>/dev/null || echo "날씨 조회 실패"
echo ""
# 5. TQQQ 종가
echo "## 📈 TQQQ 종가"
echo ""
python3 ~/openclaw/scripts/tqqq-yahoo-monitor.py 2>/dev/null | grep -E "현재가|변동|평가금액|수익" || echo "시세 조회 실패"
echo ""
# 6. 내일 일정
echo "## 📅 내일 일정"
echo ""
gog cal tomorrow 2>/dev/null || echo "일정 없음"
echo ""
# 7. 시스템 상태
echo "## 💻 시스템 상태"
echo ""
echo "**Mac mini:**"
MEM_INFO=$(top -l 1 | grep PhysMem)
MEM_USED=$(echo "$MEM_INFO" | awk '{print $2}')
MEM_UNUSED=$(echo "$MEM_INFO" | awk '{print $6}')
echo "- CPU: $(top -l 1 | grep 'CPU usage' | awk '{print $3}')"
echo "- 메모리: $MEM_USED 사용 / $MEM_UNUSED 여유"
echo "- 디스크: $(df -h / | tail -1 | awk '{print $5}')"
echo ""
# 8. Claude 한도
echo "**Claude 한도:**"
bash ~/openclaw/scripts/claude-weekly-usage.sh 2>/dev/null || echo "체크 실패"
echo ""
return 0
}
# Run main function
main
MAIN_EXIT_CODE=$?
# ============================================
# Self-Review (V5.0.1)
# ============================================
END_TIME=$(date +%s)
DURATION=$((END_TIME - START_TIME))
# Non-AI cron (script-based briefing) → tokens=0
INPUT_TOKENS=0
OUTPUT_TOKENS=0
# Determine status
if [ $MAIN_EXIT_CODE -eq 0 ]; then
STATUS="ok"
WHAT_WENT_WRONG="없음"
WHY="브리핑 생성 성공"
NEXT_ACTION="없음"
else
STATUS="fail"
WHAT_WENT_WRONG="브리핑 실패 (exit code: $MAIN_EXIT_CODE)"
WHY="스크립트 에러"
NEXT_ACTION="로그 확인 필요"
fi
# Log self-review
sr_log_review \
"Evening Briefing" \
"$DURATION" \
"$INPUT_TOKENS" \
"$OUTPUT_TOKENS" \
"$STATUS" \
"$WHAT_WENT_WRONG" \
"$WHY" \
"$NEXT_ACTION"
exit $MAIN_EXIT_CODE