[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6HY86C4R8ZMSSQ47CNFJRTC":3,"skill-same:01M6HY86C4R8ZMSSQ47CNFJRTC":88},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":16,"categories":17,"keywords":34,"publishedAt":55,"linkOnly":56,"markdownContent":57,"markdownBody":58,"frontMatter":59,"refName":60,"commitSha":61,"skillDirectory":62,"forksCount":63,"repositoryHtmlUrl":64,"repositoryHomepageUrl":6,"ownerHtmlUrl":65,"ownerBlogUrl":66,"ownerDescription":6,"updatedAt":67,"install":68,"resources":81},"01M6HY86C4R8ZMSSQ47CNFJRTC","personal-monitor-domain",null,"Domain specification for a personal daily monitoring dashboard. Defines all target panels (email, Feishu, Office, social, news, Twitter, code status, schedule, stock market, daily finance), their data sources, APIs, and priority ordering for incremental development.","HKUDS\u002FAgentPilot","HKUDS","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F118165258?v=4","01M6HW8VRNZP64G0P4MVJW2KKQ","✨Data Intelligence Lab@HKU✨","01M6HW8VWZVHBRHYH3T330PFWV",7989,"MIT","https:\u002F\u002Fgithub.com\u002FHKUDS\u002FAgentPilot\u002Fblob\u002Fmain\u002Fopenspace\u002Flegacy\u002Fv1\u002Fshowcase\u002Fskills\u002Fpersonal-monitor-domain\u002FSKILL.md",[18,23,28,31],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000005","邮件与沟通","SCENARIO","使用场景",{"categoryNo":24,"categoryName":25,"taxonomyType":26,"taxonomyTypeDesc":27},"01JBSEEDCAT000000000000030","开发工程师","PROFESSION","适用职业",{"categoryNo":29,"categoryName":30,"taxonomyType":26,"taxonomyTypeDesc":27},"01JBSEEDCAT000000000000033","数据分析师",{"categoryNo":32,"categoryName":33,"taxonomyType":26,"taxonomyTypeDesc":27},"01JBSEEDCAT000000000000040","财务",[35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54],"monitor","personal monitor domain","domain","personal","specification","for","sources","panels","stock","news","development","social","code","feishu","Market","daily","twitter","schedule","email","monitoring","2026-11-10 10:12:30",false,"---\nname: personal-monitor-domain\ndescription: Domain specification for a personal daily monitoring dashboard. Defines all target panels (email, Feishu, Office, social, news, Twitter, code status, schedule, stock market, daily finance), their data sources, APIs, and priority ordering for incremental development.\n---\n\n# Personal Monitor Domain Specification\n\nThis skill defines WHAT the my-daily-monitor dashboard should do — the panels, data sources, APIs, and features that make up a personal daily monitoring system. Use this as a reference when creating new panels or deciding what to build next.\n\n## When to Use\n\n- You are planning which panel to build next\n- You need API details for a specific data source\n- You are composing multiple panels into an integrated dashboard\n- You need to understand the priority ordering for incremental development\n\n## Target Panels Overview\n\n| # | Panel | Data Source | Priority | Status |\n|---|-------|-------------|----------|--------|\n| 1 | Schedule \u002F Calendar | Google Calendar API | P0 — Core | Implemented |\n| 2 | Email Inbox | Gmail API (OAuth) | P0 — Core | Implemented |\n| 3 | Feishu Messages | Feishu\u002FLark Open API | P0 — Core | Implemented |\n| 4 | Stock Market | Finnhub API | P0 — Core | Implemented |\n| 5 | News Feed | GNews \u002F HackerNews | P0 — Core | Implemented |\n| 6 | Code Status (CI\u002FCD) | GitHub Actions API | P1 — Important | Implemented |\n| 7 | Office Documents | Microsoft Graph API | P1 — Important | Implemented |\n| 8 | Social Feed (Twitter) | Twitter API v2 | P1 — Important | Implemented |\n| 9 | Daily Finance | Manual \u002F Spreadsheet | P1 — Important | Implemented |\n| 10 | Weather | OpenWeatherMap \u002F wttr.in | P1 — Important | Implemented |\n| 11 | World Clock | Built-in (no API) | P2 — Nice to Have | Implemented |\n| 12 | Map | MapLibre GL | P2 — Nice to Have | Implemented |\n| 13 | AI Insights | LLM API (Groq\u002FOllama) | P2 — Nice to Have | Implemented |\n| 14 | Xiaohongshu | Web scraping \u002F API | P2 — Nice to Have | Partial |\n| 15 | DevOps | Server probes | P2 — Nice to Have | Implemented |\n| 16 | Quick Links | Static config | P3 — Extra | Implemented |\n| 17 | Live News | YouTube embed | P3 — Extra | Implemented |\n| 18 | My Monitors | Custom keywords | P3 — Extra | Implemented |\n\n## Panel Details\n\n### 1. Schedule \u002F Calendar\n\n**Purpose**: Show today's meetings, upcoming events, and agenda\n\n**API**: Google Calendar API v3\n- Auth: OAuth 2.0 (reuses Gmail credentials)\n- Endpoint: `GET \u002Fapi\u002Fcalendar?calendarId=primary`\n- Headers: `X-Gmail-Client-Id`, `X-Gmail-Client-Secret`, `X-Gmail-Token`\n\n**Data shape**:\n```typescript\ninterface CalendarEvent {\n  id: string;\n  title: string;\n  startTime: string;      \u002F\u002F ISO 8601\n  endTime: string;\n  location?: string;\n  isAllDay?: boolean;\n  color?: string;\n  meetingLink?: string;    \u002F\u002F Zoom\u002FMeet URL\n}\n```\n\n**Refresh interval**: 5 minutes\n\n### 2. Email Inbox\n\n**Purpose**: Show unread emails, sender, subject, snippet\n\n**API**: Gmail API v1\n- Auth: OAuth 2.0 (Client ID + Client Secret + Refresh Token)\n- Endpoint: `GET \u002Fapi\u002Femails?maxResults=15&q=is:unread`\n- Headers: `X-Gmail-Client-Id`, `X-Gmail-Client-Secret`, `X-Gmail-Token`\n- Server-side: Exchange refresh token for access token, call Gmail API\n\n**Data shape**:\n```typescript\ninterface EmailMessage {\n  id: string;\n  from: string;\n  subject: string;\n  snippet: string;\n  receivedAt: string;\n  unread: boolean;\n  labels?: string[];\n}\n```\n\n**Refresh interval**: 2 minutes\n\n### 3. Feishu Messages\n\n**Purpose**: Show recent Feishu\u002FLark chat messages across all conversations\n\n**API**: Feishu Open Platform API\n- Auth: App ID + App Secret → tenant access token\n- Endpoint: `GET \u002Fapi\u002Ffeishu`\n- Headers: `X-Feishu-App-Id`, `X-Feishu-App-Secret`\n- Server-side: Get tenant_access_token, fetch chat list, fetch recent messages\n\n**Data shape**:\n```typescript\ninterface FeishuMessage {\n  id: string;\n  chatName: string;\n  chatType: string;        \u002F\u002F 'group' | 'p2p'\n  avatar: string;\n  senderName: string;\n  content: string;\n  imageUrl: string;\n  timestamp: string;\n  unread: boolean;\n  chatId: string;\n  recentMessages: FeishuRecentMsg[];\n}\n```\n\n**Refresh interval**: 1 minute\n\n### 4. Stock Market\n\n**Purpose**: Track personal stock watchlist with prices, changes, sparklines\n\n**API**: Finnhub Stock API\n- Auth: Query param `token=API_KEY`\n- Endpoint: `GET \u002Fapi\u002Fstocks?symbols=AAPL,MSFT,...`\n- Free tier: 60 requests\u002Fminute\n- Server-side: Batch fetch quotes, return unified format\n\n**Data shape**:\n```typescript\ninterface StockQuote {\n  symbol: string;\n  name: string;\n  price: number | null;\n  change: number | null;\n  changePercent: number | null;\n  high: number | null;\n  low: number | null;\n  sparkline?: number[];\n}\n```\n\n**Default watchlist**: AAPL, MSFT, GOOGL, AMZN, TSLA, NVDA, META\n\n**Refresh interval**: 1 minute\n\n### 5. News Feed\n\n**Purpose**: Aggregated headlines from multiple sources with threat classification\n\n**APIs**:\n- GNews (primary): `https:\u002F\u002Fgnews.io\u002Fapi\u002Fv4` — 100 req\u002Fday free\n- HackerNews (tech): `https:\u002F\u002Fhacker-news.firebaseio.com\u002Fv0\u002F` — unlimited, no key\n- RSS feeds (fallback): Direct XML parsing\n\n**Data shape**:\n```typescript\ninterface NewsArticle {\n  title: string;\n  description: string;\n  url: string;\n  source: string;\n  publishedAt: string;\n  image?: string;\n  threatLevel?: 'critical' | 'high' | 'medium' | 'low';\n}\n```\n\n**Refresh interval**: 5 minutes\n\n### 6. Code Status (CI\u002FCD)\n\n**Purpose**: Show GitHub Actions workflow runs — passed, failed, in-progress\n\n**API**: GitHub REST API v3\n- Auth: Personal Access Token (PAT) in `GITHUB_TOKEN`\n- Endpoint: `GET \u002Fapi\u002Fgithub?action=runs&owner=...&repo=...`\n- Server-side: Fetch `\u002Frepos\u002F{owner}\u002F{repo}\u002Factions\u002Fruns`\n\n**Data shape**:\n```typescript\ninterface WorkflowRun {\n  id: number;\n  name: string;\n  status: string;\n  conclusion: string | null;   \u002F\u002F 'success' | 'failure' | 'cancelled'\n  branch: string;\n  createdAt: string;\n  url: string;\n}\n```\n\n**Refresh interval**: 2 minutes\n\n### 7. Office Documents\n\n**Purpose**: Recent Office document activity (PPT, DOC, XLSX, PDF)\n\n**API**: Microsoft Graph API\n- Auth: OAuth 2.0 (Azure AD app registration)\n- Endpoint: `GET \u002Fapi\u002Foffice`\n- Server-side: Call Graph API `\u002Fme\u002Fdrive\u002Frecent`\n\n**Data shape**:\n```typescript\ninterface OfficeDocument {\n  id: string;\n  name: string;\n  type: 'doc' | 'xlsx' | 'ppt' | 'pdf';\n  modifiedAt: string;\n  modifiedBy: string;\n  url?: string;\n}\n```\n\n**Refresh interval**: 5 minutes\n\n**Note**: Currently uses demo data. Full implementation requires Azure AD app registration with `Files.Read` permission.\n\n### 8. Social Feed\n\n**Purpose**: Twitter timeline + Xiaohongshu content\n\n**Twitter API v2**:\n- Auth: Bearer Token\n- Endpoint: `GET \u002Fapi\u002Fsocial?action=search&q=...` or `action=list&listId=...`\n- Server-side: Forward to Twitter search\u002Flist endpoint\n\n**Xiaohongshu**:\n- No official API; requires web scraping or reverse-engineered endpoints\n- Potential approach: headless browser scraping via server-side proxy\n\n**Data shape**:\n```typescript\ninterface SocialPost {\n  id: string;\n  platform: 'twitter' | 'xiaohongshu';\n  author: string;\n  username?: string;\n  content: string;\n  timestamp: string;\n  likes?: number;\n  retweets?: number;\n  comments?: number;\n  url?: string;\n}\n```\n\n**Refresh interval**: 3 minutes\n\n### 9. Daily Finance\n\n**Purpose**: Track daily income and expenses, show balance\n\n**Data source options**:\n- Google Sheets API (personal budget spreadsheet)\n- YNAB API (budgeting app)\n- Local JSON file \u002F localStorage\n- Custom bookkeeping endpoint\n\n**Data shape**:\n```typescript\ninterface DailySummary {\n  totalIncome: number;\n  totalExpense: number;\n  balance: number;\n  transactions: FinanceTransaction[];\n}\n\ninterface FinanceTransaction {\n  id: string;\n  description: string;\n  amount: number;\n  type: 'income' | 'expense';\n  category: string;\n  date: string;\n}\n```\n\n**Refresh interval**: 10 minutes\n\n## Composition: Today Focus Sidebar\n\nThe sidebar aggregates highlights from multiple panels into a single glanceable view:\n\n```typescript\ninterface TodayFocusData {\n  nextEvent?: { title: string; startTime: string; minutesUntil: number };\n  unreadEmails: number;\n  unreadFeishu: number;\n  stockAlerts: Array\u003C{ symbol: string; changePercent: number }>;\n  ciFailures: number;\n  dailyBriefing?: string;   \u002F\u002F AI-generated summary\n}\n```\n\n**Dependencies**: schedule, email, feishu, stock-market, code-status, ai-summary\n\n## Composition: AI Daily Briefing\n\nUses an LLM to synthesize a morning briefing from all data sources:\n\n**Input**: Unread emails, today's events, top news headlines, stock movers\n**Output**: 2-3 paragraph natural language summary\n**API**: Groq (free, fast) or local Ollama\n\n## API Key Configuration\n\nAll API keys are stored in browser localStorage via a Settings modal:\n\n| Key | Required For | How to Get |\n|-----|-------------|-----------|\n| `FINNHUB_API_KEY` | Stock Market | https:\u002F\u002Ffinnhub.io\u002F (free) |\n| `GNEWS_API_KEY` | News | https:\u002F\u002Fgnews.io\u002F (free, 100\u002Fday) |\n| `GMAIL_CLIENT_ID` | Email + Calendar | Google Cloud Console OAuth |\n| `GMAIL_CLIENT_SECRET` | Email + Calendar | Google Cloud Console OAuth |\n| `GMAIL_REFRESH_TOKEN` | Email + Calendar | OAuth flow |\n| `FEISHU_APP_ID` | Feishu | Feishu Open Platform |\n| `FEISHU_APP_SECRET` | Feishu | Feishu Open Platform |\n| `GITHUB_TOKEN` | Code Status | GitHub → Settings → PAT |\n| `TWITTER_BEARER_TOKEN` | Social Feed | Twitter Developer Portal |\n| `GROQ_API_KEY` | AI Insights | https:\u002F\u002Fconsole.groq.com\u002F |\n\nKeys are passed to the server via request headers (never in query params), and the server-side proxy uses them to call external APIs.\n\n## Personal Data Sensitivity\n\nThis dashboard handles personal data. Key considerations:\n\n1. **API keys** — stored in localStorage, never sent to third parties\n2. **Email content** — proxied through your own server, not cached\n3. **Calendar events** — may contain sensitive meeting details\n4. **Finance data** — keep local, never expose to external APIs\n5. **Social accounts** — use read-only tokens, never write access\n6. **No analytics** — unlike WorldMonitor, no Sentry\u002FVercel Analytics needed\n7. **Self-hosted** — run on localhost or personal server, not public deployment\n\n## Development Priority\n\n**Phase 1** (MVP): Schedule + Email + Feishu + Stock + News — the daily essentials\n**Phase 2** (Complete): Code Status + Office + Social + Finance + Weather\n**Phase 3** (Enhanced): Map + AI Insights + World Clock + Xiaohongshu\n**Phase 4** (Polish): DevOps + Live News + Quick Links + My Monitors + Command Palette\n\n","# Personal Monitor Domain Specification\n\nThis skill defines WHAT the my-daily-monitor dashboard should do — the panels, data sources, APIs, and features that make up a personal daily monitoring system. Use this as a reference when creating new panels or deciding what to build next.\n\n## When to Use\n\n- You are planning which panel to build next\n- You need API details for a specific data source\n- You are composing multiple panels into an integrated dashboard\n- You need to understand the priority ordering for incremental development\n\n## Target Panels Overview\n\n| # | Panel | Data Source | Priority | Status |\n|---|-------|-------------|----------|--------|\n| 1 | Schedule \u002F Calendar | Google Calendar API | P0 — Core | Implemented |\n| 2 | Email Inbox | Gmail API (OAuth) | P0 — Core | Implemented |\n| 3 | Feishu Messages | Feishu\u002FLark Open API | P0 — Core | Implemented |\n| 4 | Stock Market | Finnhub API | P0 — Core | Implemented |\n| 5 | News Feed | GNews \u002F HackerNews | P0 — Core | Implemented |\n| 6 | Code Status (CI\u002FCD) | GitHub Actions API | P1 — Important | Implemented |\n| 7 | Office Documents | Microsoft Graph API | P1 — Important | Implemented |\n| 8 | Social Feed (Twitter) | Twitter API v2 | P1 — Important | Implemented |\n| 9 | Daily Finance | Manual \u002F Spreadsheet | P1 — Important | Implemented |\n| 10 | Weather | OpenWeatherMap \u002F wttr.in | P1 — Important | Implemented |\n| 11 | World Clock | Built-in (no API) | P2 — Nice to Have | Implemented |\n| 12 | Map | MapLibre GL | P2 — Nice to Have | Implemented |\n| 13 | AI Insights | LLM API (Groq\u002FOllama) | P2 — Nice to Have | Implemented |\n| 14 | Xiaohongshu | Web scraping \u002F API | P2 — Nice to Have | Partial |\n| 15 | DevOps | Server probes | P2 — Nice to Have | Implemented |\n| 16 | Quick Links | Static config | P3 — Extra | Implemented |\n| 17 | Live News | YouTube embed | P3 — Extra | Implemented |\n| 18 | My Monitors | Custom keywords | P3 — Extra | Implemented |\n\n## Panel Details\n\n### 1. Schedule \u002F Calendar\n\n**Purpose**: Show today's meetings, upcoming events, and agenda\n\n**API**: Google Calendar API v3\n- Auth: OAuth 2.0 (reuses Gmail credentials)\n- Endpoint: `GET \u002Fapi\u002Fcalendar?calendarId=primary`\n- Headers: `X-Gmail-Client-Id`, `X-Gmail-Client-Secret`, `X-Gmail-Token`\n\n**Data shape**:\n```typescript\ninterface CalendarEvent {\n  id: string;\n  title: string;\n  startTime: string;      \u002F\u002F ISO 8601\n  endTime: string;\n  location?: string;\n  isAllDay?: boolean;\n  color?: string;\n  meetingLink?: string;    \u002F\u002F Zoom\u002FMeet URL\n}\n```\n\n**Refresh interval**: 5 minutes\n\n### 2. Email Inbox\n\n**Purpose**: Show unread emails, sender, subject, snippet\n\n**API**: Gmail API v1\n- Auth: OAuth 2.0 (Client ID + Client Secret + Refresh Token)\n- Endpoint: `GET \u002Fapi\u002Femails?maxResults=15&q=is:unread`\n- Headers: `X-Gmail-Client-Id`, `X-Gmail-Client-Secret`, `X-Gmail-Token`\n- Server-side: Exchange refresh token for access token, call Gmail API\n\n**Data shape**:\n```typescript\ninterface EmailMessage {\n  id: string;\n  from: string;\n  subject: string;\n  snippet: string;\n  receivedAt: string;\n  unread: boolean;\n  labels?: string[];\n}\n```\n\n**Refresh interval**: 2 minutes\n\n### 3. Feishu Messages\n\n**Purpose**: Show recent Feishu\u002FLark chat messages across all conversations\n\n**API**: Feishu Open Platform API\n- Auth: App ID + App Secret → tenant access token\n- Endpoint: `GET \u002Fapi\u002Ffeishu`\n- Headers: `X-Feishu-App-Id`, `X-Feishu-App-Secret`\n- Server-side: Get tenant_access_token, fetch chat list, fetch recent messages\n\n**Data shape**:\n```typescript\ninterface FeishuMessage {\n  id: string;\n  chatName: string;\n  chatType: string;        \u002F\u002F 'group' | 'p2p'\n  avatar: string;\n  senderName: string;\n  content: string;\n  imageUrl: string;\n  timestamp: string;\n  unread: boolean;\n  chatId: string;\n  recentMessages: FeishuRecentMsg[];\n}\n```\n\n**Refresh interval**: 1 minute\n\n### 4. Stock Market\n\n**Purpose**: Track personal stock watchlist with prices, changes, sparklines\n\n**API**: Finnhub Stock API\n- Auth: Query param `token=API_KEY`\n- Endpoint: `GET \u002Fapi\u002Fstocks?symbols=AAPL,MSFT,...`\n- Free tier: 60 requests\u002Fminute\n- Server-side: Batch fetch quotes, return unified format\n\n**Data shape**:\n```typescript\ninterface StockQuote {\n  symbol: string;\n  name: string;\n  price: number | null;\n  change: number | null;\n  changePercent: number | null;\n  high: number | null;\n  low: number | null;\n  sparkline?: number[];\n}\n```\n\n**Default watchlist**: AAPL, MSFT, GOOGL, AMZN, TSLA, NVDA, META\n\n**Refresh interval**: 1 minute\n\n### 5. News Feed\n\n**Purpose**: Aggregated headlines from multiple sources with threat classification\n\n**APIs**:\n- GNews (primary): `https:\u002F\u002Fgnews.io\u002Fapi\u002Fv4` — 100 req\u002Fday free\n- HackerNews (tech): `https:\u002F\u002Fhacker-news.firebaseio.com\u002Fv0\u002F` — unlimited, no key\n- RSS feeds (fallback): Direct XML parsing\n\n**Data shape**:\n```typescript\ninterface NewsArticle {\n  title: string;\n  description: string;\n  url: string;\n  source: string;\n  publishedAt: string;\n  image?: string;\n  threatLevel?: 'critical' | 'high' | 'medium' | 'low';\n}\n```\n\n**Refresh interval**: 5 minutes\n\n### 6. Code Status (CI\u002FCD)\n\n**Purpose**: Show GitHub Actions workflow runs — passed, failed, in-progress\n\n**API**: GitHub REST API v3\n- Auth: Personal Access Token (PAT) in `GITHUB_TOKEN`\n- Endpoint: `GET \u002Fapi\u002Fgithub?action=runs&owner=...&repo=...`\n- Server-side: Fetch `\u002Frepos\u002F{owner}\u002F{repo}\u002Factions\u002Fruns`\n\n**Data shape**:\n```typescript\ninterface WorkflowRun {\n  id: number;\n  name: string;\n  status: string;\n  conclusion: string | null;   \u002F\u002F 'success' | 'failure' | 'cancelled'\n  branch: string;\n  createdAt: string;\n  url: string;\n}\n```\n\n**Refresh interval**: 2 minutes\n\n### 7. Office Documents\n\n**Purpose**: Recent Office document activity (PPT, DOC, XLSX, PDF)\n\n**API**: Microsoft Graph API\n- Auth: OAuth 2.0 (Azure AD app registration)\n- Endpoint: `GET \u002Fapi\u002Foffice`\n- Server-side: Call Graph API `\u002Fme\u002Fdrive\u002Frecent`\n\n**Data shape**:\n```typescript\ninterface OfficeDocument {\n  id: string;\n  name: string;\n  type: 'doc' | 'xlsx' | 'ppt' | 'pdf';\n  modifiedAt: string;\n  modifiedBy: string;\n  url?: string;\n}\n```\n\n**Refresh interval**: 5 minutes\n\n**Note**: Currently uses demo data. Full implementation requires Azure AD app registration with `Files.Read` permission.\n\n### 8. Social Feed\n\n**Purpose**: Twitter timeline + Xiaohongshu content\n\n**Twitter API v2**:\n- Auth: Bearer Token\n- Endpoint: `GET \u002Fapi\u002Fsocial?action=search&q=...` or `action=list&listId=...`\n- Server-side: Forward to Twitter search\u002Flist endpoint\n\n**Xiaohongshu**:\n- No official API; requires web scraping or reverse-engineered endpoints\n- Potential approach: headless browser scraping via server-side proxy\n\n**Data shape**:\n```typescript\ninterface SocialPost {\n  id: string;\n  platform: 'twitter' | 'xiaohongshu';\n  author: string;\n  username?: string;\n  content: string;\n  timestamp: string;\n  likes?: number;\n  retweets?: number;\n  comments?: number;\n  url?: string;\n}\n```\n\n**Refresh interval**: 3 minutes\n\n### 9. Daily Finance\n\n**Purpose**: Track daily income and expenses, show balance\n\n**Data source options**:\n- Google Sheets API (personal budget spreadsheet)\n- YNAB API (budgeting app)\n- Local JSON file \u002F localStorage\n- Custom bookkeeping endpoint\n\n**Data shape**:\n```typescript\ninterface DailySummary {\n  totalIncome: number;\n  totalExpense: number;\n  balance: number;\n  transactions: FinanceTransaction[];\n}\n\ninterface FinanceTransaction {\n  id: string;\n  description: string;\n  amount: number;\n  type: 'income' | 'expense';\n  category: string;\n  date: string;\n}\n```\n\n**Refresh interval**: 10 minutes\n\n## Composition: Today Focus Sidebar\n\nThe sidebar aggregates highlights from multiple panels into a single glanceable view:\n\n```typescript\ninterface TodayFocusData {\n  nextEvent?: { title: string; startTime: string; minutesUntil: number };\n  unreadEmails: number;\n  unreadFeishu: number;\n  stockAlerts: Array\u003C{ symbol: string; changePercent: number }>;\n  ciFailures: number;\n  dailyBriefing?: string;   \u002F\u002F AI-generated summary\n}\n```\n\n**Dependencies**: schedule, email, feishu, stock-market, code-status, ai-summary\n\n## Composition: AI Daily Briefing\n\nUses an LLM to synthesize a morning briefing from all data sources:\n\n**Input**: Unread emails, today's events, top news headlines, stock movers\n**Output**: 2-3 paragraph natural language summary\n**API**: Groq (free, fast) or local Ollama\n\n## API Key Configuration\n\nAll API keys are stored in browser localStorage via a Settings modal:\n\n| Key | Required For | How to Get |\n|-----|-------------|-----------|\n| `FINNHUB_API_KEY` | Stock Market | https:\u002F\u002Ffinnhub.io\u002F (free) |\n| `GNEWS_API_KEY` | News | https:\u002F\u002Fgnews.io\u002F (free, 100\u002Fday) |\n| `GMAIL_CLIENT_ID` | Email + Calendar | Google Cloud Console OAuth |\n| `GMAIL_CLIENT_SECRET` | Email + Calendar | Google Cloud Console OAuth |\n| `GMAIL_REFRESH_TOKEN` | Email + Calendar | OAuth flow |\n| `FEISHU_APP_ID` | Feishu | Feishu Open Platform |\n| `FEISHU_APP_SECRET` | Feishu | Feishu Open Platform |\n| `GITHUB_TOKEN` | Code Status | GitHub → Settings → PAT |\n| `TWITTER_BEARER_TOKEN` | Social Feed | Twitter Developer Portal |\n| `GROQ_API_KEY` | AI Insights | https:\u002F\u002Fconsole.groq.com\u002F |\n\nKeys are passed to the server via request headers (never in query params), and the server-side proxy uses them to call external APIs.\n\n## Personal Data Sensitivity\n\nThis dashboard handles personal data. Key considerations:\n\n1. **API keys** — stored in localStorage, never sent to third parties\n2. **Email content** — proxied through your own server, not cached\n3. **Calendar events** — may contain sensitive meeting details\n4. **Finance data** — keep local, never expose to external APIs\n5. **Social accounts** — use read-only tokens, never write access\n6. **No analytics** — unlike WorldMonitor, no Sentry\u002FVercel Analytics needed\n7. **Self-hosted** — run on localhost or personal server, not public deployment\n\n## Development Priority\n\n**Phase 1** (MVP): Schedule + Email + Feishu + Stock + News — the daily essentials\n**Phase 2** (Complete): Code Status + Office + Social + Finance + Weather\n**Phase 3** (Enhanced): Map + AI Insights + World Clock + Xiaohongshu\n**Phase 4** (Polish): DevOps + Live News + Quick Links + My Monitors + Command Palette\n\n",{"name":5,"description":7},"main","6b84b0689ca0d9e7b1e4061188ff6b60758e0f8a","openspace\u002Flegacy\u002Fv1\u002Fshowcase\u002Fskills\u002Fpersonal-monitor-domain",938,"https:\u002F\u002Fgithub.com\u002FHKUDS\u002FAgentPilot","https:\u002F\u002Fgithub.com\u002FHKUDS","https:\u002F\u002Fsites.google.com\u002Fview\u002Fchaoh","2026-11-06 23:04:01",{"source":8,"skillName":5,"commands":69,"prompt":79,"zipAvailable":80},[70,73,76],{"tool":71,"command":72},"npx","npx skills add HKUDS\u002FAgentPilot --skill personal-monitor-domain",{"tool":74,"command":75},"bunx","bunx skills add HKUDS\u002FAgentPilot --skill personal-monitor-domain",{"tool":77,"command":78},"pnpm","pnpm dlx skills add HKUDS\u002FAgentPilot --skill personal-monitor-domain","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002FHKUDS\u002FAgentPilot\u002Fblob\u002Fmain\u002Fopenspace\u002Flegacy\u002Fv1\u002Fshowcase\u002Fskills\u002Fpersonal-monitor-domain\u002FSKILL.md",true,[82],{"path":83,"resourceType":84,"resourceTypeDesc":85,"sizeBytes":86,"sourceHtmlUrl":87},".skill_id","OTHER","其他",38,"https:\u002F\u002Fgithub.com\u002FHKUDS\u002FAgentPilot\u002Fblob\u002Fmain\u002Fopenspace\u002Flegacy\u002Fv1\u002Fshowcase\u002Fskills\u002Fpersonal-monitor-domain\u002F.skill_id",[89,109,128,151,174,197],{"skillNo":90,"name":91,"nameZh":6,"description":92,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":93,"categories":94,"keywords":95,"publishedAt":55},"01M6HYB297NDABRERJRVG0K8R0","agentpilot","Set up AgentPilot and use its single entry to prepare missing inputs and run configured RSI experiments. Use when the user requests AgentPilot installation or work with AgentPilot.","https:\u002F\u002Fgithub.com\u002FHKUDS\u002FAgentPilot\u002Fblob\u002Fmain\u002Fplugins\u002Fagentpilot\u002Fskills\u002Fagentpilot\u002FSKILL.md",[],[91,96,97,98,99,100,101,102,103,104,105,106,107,108],"prepare","requests","with","missing","installation","rsi","up","use","user","work","SET","run","experiments",{"skillNo":110,"name":111,"nameZh":6,"description":112,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":113,"categories":114,"keywords":115,"publishedAt":55},"01M6HYAYWXTTE1J7DJM0MFNQ4H","remember","Review auto-memory entries and propose promotions to OPENSPACE.md, OPENSPACE.local.md, or retained auto-memory topics; detect duplicates, stale facts, conflicts, and ambiguous entries before making changes.","https:\u002F\u002Fgithub.com\u002FHKUDS\u002FAgentPilot\u002Fblob\u002Fmain\u002Fopenspace\u002Fopenspace\u002Fskills\u002Fremember\u002FSKILL.md",[],[111,116,117,118,119,120,121,122,123,124,125,126,127],"memory","review","auto","openspace","changes","facts","detect","entries","local","conflicts","stale","duplicates",{"skillNo":129,"name":130,"nameZh":6,"description":131,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":132,"categories":133,"keywords":137,"publishedAt":55},"01M6HYAVMPM4SBDV60R2B5HPV8","skill-discovery","Search reusable OpenSpace skills locally, and browse cloud packages step by step when a cloud skill may help. Reusing proven skills saves tokens, improves reliability, and extends your capabilities beyond built-in tools.","https:\u002F\u002Fgithub.com\u002FHKUDS\u002FAgentPilot\u002Fblob\u002Fmain\u002Fopenspace\u002Fopenspace\u002Fhost_skills\u002Fskill-discovery\u002FSKILL.md",[134],{"categoryNo":135,"categoryName":136,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000023","Skill与智能体开发",[138,139,140,119,141,142,143,144,145,146,147,148,149,150],"skill discovery","discovery","reusable","step by step","tokens","packages","help","cloud","reliability","capabilities","browse","search","Tools",{"skillNo":152,"name":153,"nameZh":6,"description":154,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":155,"categories":156,"keywords":158,"publishedAt":55},"01M6HYAR811B3RB0M50RBEDGN6","delegate-task","Delegate tasks to OpenSpace — a full-stack autonomous worker for coding, DevOps, web research, and desktop automation, backed by an extensive MCP tool and skill library. Skills auto-improve through use, reducing token consumption over time. A cloud community lets agents share and collectively evolve reusable skills.","https:\u002F\u002Fgithub.com\u002FHKUDS\u002FAgentPilot\u002Fblob\u002Fmain\u002Fopenspace\u002Fopenspace\u002Fhost_skills\u002Fdelegate-task\u002FSKILL.md",[157],{"categoryNo":135,"categoryName":136,"taxonomyType":21,"taxonomyTypeDesc":22},[159,160,161,119,162,163,164,165,166,140,118,103,167,168,169,40,170,171,172,173],"delegate","task","delegate task","time","improve","desktop automation","worker","community","autonomous","tool","stack","share","tasks","automation","MCP",{"skillNo":175,"name":176,"nameZh":6,"description":177,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":178,"categories":179,"keywords":180,"publishedAt":55},"01M6HYAM9FSGV6E52AYENDQXYH","write-special-chars-ts-check","Workaround for write_file failures caused by special characters (apostrophes, backticks, template literals) using a Python heredoc script, plus a reliable TypeScript type-checking step that filters output to only the newly-written files to avoid being misled by pre-existing errors.","https:\u002F\u002Fgithub.com\u002FHKUDS\u002FAgentPilot\u002Fblob\u002Fmain\u002Fopenspace\u002Flegacy\u002Fv1\u002Fshowcase\u002Fskills\u002Fwrite-special-chars-ts-check\u002FSKILL.md",[],[181,182,183,184,185,186,187,188,189,190,191,192,193,194,40,195,196],"write special chars ts check","write","check","type","files","filters","only","template","file","python","typescript","output","Existing","type-checking","errors","script",{"skillNo":198,"name":199,"nameZh":6,"description":200,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":201,"categories":202,"keywords":203,"publishedAt":55},"01M6HYAH05HGV7SVWSVR8PJRQD","write-special-chars-readback","Workaround for write_file failures caused by special characters (apostrophes, backticks, template literals) using a Python heredoc script, with mandatory post-write verification via read_file and cleanup of \u002Ftmp helper scripts.","https:\u002F\u002Fgithub.com\u002FHKUDS\u002FAgentPilot\u002Fblob\u002Fmain\u002Fopenspace\u002Flegacy\u002Fv1\u002Fshowcase\u002Fskills\u002Fwrite-special-chars-readback\u002FSKILL.md",[],[204,205,182,98,40,196,206,207,208,209,210,188,189,211,212,190],"write special chars readback","readback","helper","post","via","scripts","read","verification","cleanup"]