Coffee - Morning Briefing
Produces a formatted markdown briefing with sections for each category, followed by suggested actions.
Inputs
| Input |
Type |
Default |
Purpose |
full_email_scan |
bool |
false |
Process all unread emails vs summary |
auto_archive_email |
bool |
false |
Auto-archive low-priority emails |
days_back |
int |
1 |
Days to look back for Jira/activity |
slack_format |
bool |
false |
Use <URL|Text> link format for Slack |
Persona Switches
Load personas as needed for tool access:
- developer (default): GitLab, Git, Jira, Gmail, Calendar
- incident:
alertmanager_alerts
- devops:
bonfire_namespace_list
Workflow
1. Bootstrap
persona_load("developer")
- Load config and memory:
memory_read("state/current_work")
2. Check Known Issues (before each tool category)
check_known_issues("gitlab_mr_list")
check_known_issues("jira_search")
check_known_issues("bonfire")
3. Knowledge & Vector Stats
knowledge_query(project="automation-analytics-backend", section="metadata")
code_stats(project="automation-analytics-backend") — index health, files, chunks, searches
4. Calendar
google_calendar_list_events — today's events with Meet links (same OAuth as Gmail)
5. Email
gmail_unread_count — unread count
- If
full_email_scan: gmail_list_emails(unread_only=True) — fetch metadata (Subject, From, To, Cc), classify as:
- directed-at-me: in To (not CC), or Jira/GitLab assigned/mentioned
- newsletter: newsletter, digest, unsubscribe patterns
- notification: automated senders (noreply, notifications@)
- cc-only: in CC only, not mentioned in subject
- If
auto_archive_email: archive newsletters, notifications, cc-only
6. PRs (multi-project)
Get GitLab projects from config.json → repositories (exclude github: prefixed). For each:
gitlab_mr_list(project, author="@me") — open PRs
gitlab_mr_list(project, state="merged") — recent merges
gitlab_mr_list(project, reviewer="@me") — review requests
For each open PR (up to 5):
gitlab_mr_comments(project, mr_id) — feedback waiting
gitlab_ci_status(project, branch) — pipeline status
Pipeline failures: Parse .gitlab-ci.yml for allow_failure: true jobs; exclude those from "failed" count.
7. Jira
jira_search(jql="project = AAP AND updated >= -{days_back}d AND labels = 'automation-analytics' ORDER BY updated DESC", max_results=20)
8. Alerts
persona_load("incident")
alertmanager_alerts(environment="stage", filter_name="Automation Analytics", silenced=false)
alertmanager_alerts(environment="production", filter_name="Automation Analytics", silenced=false)
9. Ephemeral
persona_load("devops")
bonfire_namespace_list(mine_only=true)
10. Yesterday's Work
persona_load("developer")
git_log(repo="automation-analytics-backend", author="@me", since="yesterday", until="today", limit=10)
11. Output Format
# ☕ Good morning, {first_name}!
**{day_name}, {date}** | {time}
## 🎯 Current Work (from memory)
## 📅 Today's Calendar
## 📧 Email
## 🔀 Your PRs
- Open PRs, Feedback Waiting, Failed Pipelines (exclude allow_failure jobs)
## 👀 Review Requests
## 📋 Jira Activity
## 🚀 Recent Merges
## 🧪 Ephemeral Environments
## 📝 Yesterday's Work
## 🚨 Alerts
## 🧠 Knowledge & Search
## 🎯 Suggested Actions
12. Post-Briefing
memory_session_log("Morning coffee briefing", "PRs: X, Reviews: Y, Failed: Z")
- Update
state/current_work: sync open_mrs, feedback_waiting, reviews_assigned, last_coffee
- If network error (no such host):
learn_tool_fix("gitlab_mr_list", "no such host", "VPN not connected", "Run vpn_connect()")
- If pipeline failures: record in
learned/patterns → pipeline_failures
skill_run("standup_summary", "{}") — chain to standup
persona_load("developer") — restore
Key Details
- GitLab projects: automation-analytics-backend, pdf-generator, app-interface, konflux-release-data (from config)
- Jira JQL:
labels = 'automation-analytics'
- Link format:
slack_format → <url|text>, else [text](url)
- Network errors: Detect "no such host", "dial tcp" → suggest
vpn_connect()
1---2name: coffee3description: Morning briefing - calendar, email, PRs, reviews, Jira, merges, ephemeral envs, yesterday's commits, alerts, knowledge stats, and suggested actions. Use when user says "good morning", "start my day", "morning briefing", or "coffee".4---56# Coffee - Morning Briefing78Produces a formatted markdown briefing with sections for each category, followed by suggested actions.910## Inputs1112| Input | Type | Default | Purpose |13|-------|------|---------|---------|14| `full_email_scan` | bool | false | Process all unread emails vs summary |15| `auto_archive_email` | bool | false | Auto-archive low-priority emails |16| `days_back` | int | 1 | Days to look back for Jira/activity |17| `slack_format` | bool | false | Use `<URL\|Text>` link format for Slack |1819## Persona Switches2021Load personas as needed for tool access:22- **developer** (default): GitLab, Git, Jira, Gmail, Calendar23- **incident**: `alertmanager_alerts`24- **devops**: `bonfire_namespace_list`2526## Workflow2728### 1. Bootstrap29- `persona_load("developer")`30- Load config and memory: `memory_read("state/current_work")`3132### 2. Check Known Issues (before each tool category)33- `check_known_issues("gitlab_mr_list")`34- `check_known_issues("jira_search")`35- `check_known_issues("bonfire")`3637### 3. Knowledge & Vector Stats38- `knowledge_query(project="automation-analytics-backend", section="metadata")`39- `code_stats(project="automation-analytics-backend")` — index health, files, chunks, searches4041### 4. Calendar42- `google_calendar_list_events` — today's events with Meet links (same OAuth as Gmail)4344### 5. Email45- `gmail_unread_count` — unread count46- If `full_email_scan`: `gmail_list_emails(unread_only=True)` — fetch metadata (Subject, From, To, Cc), classify as:47 - **directed-at-me**: in To (not CC), or Jira/GitLab assigned/mentioned48 - **newsletter**: newsletter, digest, unsubscribe patterns49 - **notification**: automated senders (noreply, notifications@)50 - **cc-only**: in CC only, not mentioned in subject51- If `auto_archive_email`: archive newsletters, notifications, cc-only5253### 6. PRs (multi-project)54Get GitLab projects from `config.json` → `repositories` (exclude `github:` prefixed). For each:55- `gitlab_mr_list(project, author="@me")` — open PRs56- `gitlab_mr_list(project, state="merged")` — recent merges57- `gitlab_mr_list(project, reviewer="@me")` — review requests5859For each open PR (up to 5):60- `gitlab_mr_comments(project, mr_id)` — feedback waiting61- `gitlab_ci_status(project, branch)` — pipeline status6263**Pipeline failures**: Parse `.gitlab-ci.yml` for `allow_failure: true` jobs; exclude those from "failed" count.6465### 7. Jira66- `jira_search(jql="project = AAP AND updated >= -{days_back}d AND labels = 'automation-analytics' ORDER BY updated DESC", max_results=20)`6768### 8. Alerts69- `persona_load("incident")`70- `alertmanager_alerts(environment="stage", filter_name="Automation Analytics", silenced=false)`71- `alertmanager_alerts(environment="production", filter_name="Automation Analytics", silenced=false)`7273### 9. Ephemeral74- `persona_load("devops")`75- `bonfire_namespace_list(mine_only=true)`7677### 10. Yesterday's Work78- `persona_load("developer")`79- `git_log(repo="automation-analytics-backend", author="@me", since="yesterday", until="today", limit=10)`8081### 11. Output Format8283```markdown84# ☕ Good morning, {first_name}!85**{day_name}, {date}** | {time}8687## 🎯 Current Work (from memory)88## 📅 Today's Calendar89## 📧 Email90## 🔀 Your PRs91 - Open PRs, Feedback Waiting, Failed Pipelines (exclude allow_failure jobs)92## 👀 Review Requests93## 📋 Jira Activity94## 🚀 Recent Merges95## 🧪 Ephemeral Environments96## 📝 Yesterday's Work97## 🚨 Alerts98## 🧠 Knowledge & Search99## 🎯 Suggested Actions100```101102### 12. Post-Briefing103- `memory_session_log("Morning coffee briefing", "PRs: X, Reviews: Y, Failed: Z")`104- Update `state/current_work`: sync `open_mrs`, `feedback_waiting`, `reviews_assigned`, `last_coffee`105- If network error (no such host): `learn_tool_fix("gitlab_mr_list", "no such host", "VPN not connected", "Run vpn_connect()")`106- If pipeline failures: record in `learned/patterns` → `pipeline_failures`107- `skill_run("standup_summary", "{}")` — chain to standup108- `persona_load("developer")` — restore109110## Key Details111112- **GitLab projects**: automation-analytics-backend, pdf-generator, app-interface, konflux-release-data (from config)113- **Jira JQL**: `labels = 'automation-analytics'`114- **Link format**: `slack_format` → `<url|text>`, else `[text](url)`115- **Network errors**: Detect "no such host", "dial tcp" → suggest `vpn_connect()`