145 lines
3.7 KiB
Bash
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
|