AI Newsletter Digest improvements: fixed QP soft line break decoding, URL extraction, and content cleaning
This commit is contained in:
144
skills/openclaw-self-healing/scripts/evening-briefing.sh
Normal file
144
skills/openclaw-self-healing/scripts/evening-briefing.sh
Normal file
@@ -0,0 +1,144 @@
|
||||
#!/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
|
||||
Reference in New Issue
Block a user