3 Commits

2 changed files with 38 additions and 35 deletions

View File

@@ -17,51 +17,51 @@ tools:
## 功能說明 ## 功能說明
每日自動(或手動觸發)生成早安簡報,包含 每日自動(或手動觸發)生成早安簡報,讓您一早就能快速掌握今日要務
1. 🌤️ 今日天氣(台灣地區) 1. 🌤️ **今日天氣**:提供氣溫、降雨機率與貼心穿著建議(台灣地區)
2. 📅 今日行程(來自 workspace/SCHEDULE.md 或 Google Calendar 2. 📅 **今日行程**:條列即將到來的會議或活動(來自 `workspace/SCHEDULE.md` 或 Google Calendar
3. ✅ 待辦事項(來自 workspace/TODO.md 3.**待辦事項**:列出尚未完成的重要任務(來自 `workspace/TODO.md`)。
4. 💡 今日重點提醒 4. 💡 **今日重點提醒**:標示到期專案或重要事項。
5. 📊 昨日工作回顧(選配) 5. 📊 **昨日工作回顧**(選配):簡單總結昨日進度。
## 設定 ## 設定與個人化
`workspace/USER.md` 設定: 為獲得最佳體驗,請`workspace/USER.md` 設定您的偏好
```markdown ```markdown
## 個人設定 ## 個人設定
- 城市:台北 - 城市:台北(用於精準天氣預報)
- 時區Asia/Taipei - 時區Asia/Taipei
- 簡報語言:繁體中文 - 簡報語言:繁體中文
- 天氣 API Key<openweathermap-api-key>(選配) - 天氣 API Key<openweathermap-api-key>(選配,可提升預報準確度
``` ```
## 輸出格式範例 ## 輸出格式範例
``` ```markdown
☀️ **早安2026-02-20 週五** # ☀️ 早安2026-02-20 週五
🌤️ **今日天氣(台北)** ## 🌤️ 今日天氣(台北)
氣溫 16-22°C多雲偶晴東北風 2-3 級 **氣溫:** 16-22°C多雲偶晴東北風 2-3 級
穿著建議:可帶薄外套 💡 **穿著建議:** 早晚微涼,建議帶件薄外套
📅 **今日行程** ## 📅 今日行程
09:00 - 週會(視訊) - 09:00 - 📈 週會(視訊)
14:00 - 客戶簡報 - 14:00 - 🤝 客戶簡報
16:30 - Code Review - 16:30 - 💻 Code Review
**待辦事項3 項)** ## ✅ 待辦事項3 項)
[ ] 完成 API 文件 - [ ] 完成 API 文件
[ ] 回覆客戶 email - [ ] 回覆客戶 email
[ ] 更新 deploy 腳本 - [ ] 更新 deploy 腳本
💡 **今日提醒** ## 💡 今日提醒
SSL 憑證 90 天後到期2026-05-20 - ⚠️ SSL 憑證 90 天後到期2026-05-20
本週 sprint 截止日2026-02-21 - 🎯 本週 sprint 截止日2026-02-21
有什麼想先處理的嗎? *新的一天準備好開始了嗎?有什麼想先處理的任務嗎?*
``` ```
## Cron 設定 ## 自動化 Cron 設定
```bash ```bash
# 每日 08:00 自動觸發 # 每日 08:00 自動觸發
@@ -75,11 +75,11 @@ sudo openclaw cron add \
## 擴充Google Calendar 整合 ## 擴充Google Calendar 整合
要連接 Google Calendarworkspace/TOOLS.md 記錄 希望行事曆更即時同步,請在 `workspace/TOOLS.md` 加上
``` ```
Google Calendar API: Google Calendar API:
- Service Account: <path-to-credentials.json> - Service Account: <path-to-credentials.json>
- Calendar ID: primary - Calendar ID: primary
``` ```
然後 agent 可透過 Google Calendar API 抓取今日事件 設定完成後,agent 可透過 Google Calendar API 為您抓取最新行程

View File

@@ -76,6 +76,9 @@ export async function handler(ctx: any) {
const now = new Date(); const now = new Date();
const dateStr = formatDate(now); const dateStr = formatDate(now);
const weekday = getWeekday(now); const weekday = getWeekday(now);
const yesterday = new Date(now);
yesterday.setDate(yesterday.getDate() - 1);
const yesterdayStr = formatDate(yesterday);
// 讀取設定 // 讀取設定
const userMd = readWorkspaceFile(workspace, 'USER.md'); const userMd = readWorkspaceFile(workspace, 'USER.md');
@@ -87,7 +90,7 @@ export async function handler(ctx: any) {
// 讀取待辦與行程 // 讀取待辦與行程
const todoContent = readWorkspaceFile(workspace, 'TODO.md'); const todoContent = readWorkspaceFile(workspace, 'TODO.md');
const scheduleContent = readWorkspaceFile(workspace, 'SCHEDULE.md'); const scheduleContent = readWorkspaceFile(workspace, 'SCHEDULE.md');
const memoryContent = readWorkspaceFile(workspace, `memory/${dateStr}.md`); const memoryContent = readWorkspaceFile(workspace, `memory/${yesterdayStr}.md`);
const todos = parseTodos(todoContent); const todos = parseTodos(todoContent);
const schedule = parseTodaySchedule(scheduleContent, dateStr); const schedule = parseTodaySchedule(scheduleContent, dateStr);
@@ -103,20 +106,20 @@ export async function handler(ctx: any) {
if (schedule.length > 0) { if (schedule.length > 0) {
sections.push(`📅 **今日行程**\n${schedule.map(s => `${s}`).join('\n')}`); sections.push(`📅 **今日行程**\n${schedule.map(s => `${s}`).join('\n')}`);
} else { } else {
sections.push(`📅 **今日行程**\n• 無排程`); sections.push(`📅 **今日行程**\n• 今日無排程,享受自由時光!`);
} }
if (todos.length > 0) { if (todos.length > 0) {
sections.push(`✅ **待辦事項(${todos.length} 項)**\n${todos.map(t => `${t}`).join('\n')}`); sections.push(`✅ **待辦事項(${todos.length} 項)**\n${todos.map(t => `${t}`).join('\n')}`);
} else { } else {
sections.push(`✅ **待辦事項**\n• 今日無待辦,保持輕鬆`); sections.push(`✅ **待辦事項**\n• 目前無待辦,繼續保持!`);
} }
if (memoryContent) { if (memoryContent) {
sections.push(`📝 **昨日記錄**\n${memoryContent.slice(0, 200)}...`); sections.push(`📝 **昨日回顧**\n${memoryContent.slice(0, 200)}...`);
} }
sections.push(`\n有什麼想先處理的嗎`); sections.push(`\n💡 *有什麼想先處理的嗎?我隨時為您服務。*`);
return { return {
reply: sections.join('\n\n'), reply: sections.join('\n\n'),