Best for
- Generate your daily plan with full context awareness. Automatically gathers information from your calendar, tasks, meetings, relationships, and weekly progress to create a focused plan with genuine situational awareness.
davekilleen/Dex/.claude/skills/daily-plan/SKILL.md
Build today's plan from calendar, tasks, priorities and commitments, with smart scheduling suggestions. Use when the user says 'plan my day', 'what's on today', 'help me focus', or starts the morning. Also use proactively at the first session of the day. Not for reviewing a finished day; use `daily-review`.
Decision brief
Generate your daily plan with full context awareness. Automatically gathers information from your calendar, tasks, meetings, relationships, and weekly progress to create a focused plan with genuine situational awareness.
Compatibility matrix
| Platform | Status | Evidence | What to check |
|---|---|---|---|
| Codex | Not declared | No explicit evidence | Portability before use |
| Claude Code | Not declared | No explicit evidence | Portability before use |
| Cursor | Not declared | No explicit evidence | Portability before use |
| Gemini CLI | Not declared | No explicit evidence | Portability before use |
Installation
The source command is displayed only when detected. A safe inspection prompt is always available so your agent can explain every action before execution.
npx skills add https://github.com/davekilleen/Dex --skill ".claude/skills/daily-plan"Inspect the Agent Skill "daily-plan" from https://github.com/davekilleen/Dex/blob/2aa1a433a3c8879dfe320902a976197dda3a2484/.claude/skills/daily-plan/SKILL.md at commit 2aa1a433a3c8879dfe320902a976197dda3a2484. List every install step, command, network request, credential, file read/write, external action, and rollback step. Explain whether it fits my task. Do not install or execute anything until I approve.
Workflow
/daily-plan — Create today's daily plan
Before gathering context, ensure recent meetings are in the vault by running /process-meetings. This pulls any unprocessed meetings from the meeting source (Otter.ai, Granola, etc.), creates meeting notes, updates person/company pages, and extracts tasks — so the daily plan has…
Check for tasks captured from phone that haven't been triaged:
Run these silently without user-facing output:
After background checks complete, check for noteworthy backlog activity:
Permission review
The documentation asks the agent to create, modify, or delete local files.
*ALWAYS generate and save a new plan file.** Never skip generation because a plan from a previous day exists in the conversation or vault. Even if context from a prior plan is visible, today is a new day and requires its own plan. If a planEvidence record
| Signal | Value | Evidence type | Meaning |
|---|---|---|---|
| Quality score | 84/100 | Computed | Documentation, specificity, maintenance, and trust rules |
| Repository stars | 456 | Source | Repository attention, not individual Skill quality |
| Compatibility | 0 platforms | Source | Declared in the catalog source record |
| Usage guide | automated source guide | Editorial | Generated or reviewed according to the visible evidence level |
Pinned source
Generate your daily plan with full context awareness. Automatically gathers information from your calendar, tasks, meetings, relationships, and weekly progress to create a focused plan with genuine situational awareness.
/daily-plan — Create today's daily plan/daily-plan tomorrow — Plan for tomorrow (evening planning)/daily-plan --setup — Re-run integration setupBefore executing this command, read System/user-profile.yaml → communication section and adapt tone accordingly (see CLAUDE.md → "Communication Adaptation").
Before gathering context, ensure recent meetings are in the vault by running /process-meetings. This pulls any unprocessed meetings from the meeting source (Otter.ai, Granola, etc.), creates meeting notes, updates person/company pages, and extracts tasks — so the daily plan has complete data from yesterday and any earlier gaps.
Check for tasks captured from phone that haven't been triaged:
Use: reminders_list_items(list_name="Dex Inbox")
If the tool is unavailable or errors (Apple Reminders phone-capture is optional and may not be set up on this machine): skip this step silently — do not surface an error for a feature the user never enabled.
If items found, triage them before building the plan so task counts are accurate. See Step 5.10a for the full triage flow.
If empty: Skip silently.
Run these silently without user-facing output:
release-appears-available-unverified notice,
verbatim. Keep no-newer-release-observed-unverified, offline, UNKNOWN, and skipped silent here.qmd update && qmd embed to refresh vault search index with any overnight changes (meetings processed, files edited, etc.). If qmd is not installed, skip silently.build_people_index from Work MCP. This keeps the People Directory current so person lookups throughout the day are fast. Takes <2 seconds.synthesize_changelog() and synthesize_learnings() from Improvements MCP. These run in background and populate the backlog — results are surfaced in Step 1.5 below.GRANOLA_API_KEY (environment or vault-root .env). If no key is configured, skip all Granola steps silently — an unconnected optional integration is not an error.System/.smoke-last-run.json when present and retain any broken-journey context for Step 5.10b.After background checks complete, check for noteworthy backlog activity:
list_ideas(status="active", min_score=70) from Improvements MCPSystem/.synthesis-state.json for recent synthesis activity (last 7 days)Surface as a brief spotlight in the plan output (1-2 lines max):
Innovation Spotlight: Claude Code shipped native memory (v2.1.32) — this could simplify idea-006 (Session Memory MCP). Run
/dex-improve idea-006to explore.
Rules:
If journaling.morning: true in user-profile.yaml, check for today's morning journal and prompt if missing.
If today is Monday and week isn't planned, offer to run /week-plan first.
Check for yesterday's review and extract context (open loops, tomorrow's focus, blocked items).
Gather context from all available sources. This is where the magic happens.
Use: get_week_progress()
This is critical for genuine situational awareness. Extract:
Surface this prominently:
"It's Wednesday. Here's where you are on this week's priorities:
- ✅ Ship pricing page — Complete (finished Monday)
- 🔄 Review proposal — In progress (2 of 5 tasks done)
- ⚠️ Customer interviews — Not started (no activity yet)
You have 2 days left this week. Priority 3 needs attention."
Use: analyze_calendar_capacity(days_ahead=1, events=[...from calendar MCP...])
Understand the shape of today:
Surface this:
"📅 Today's shape: Moderate (4 meetings, 3 hours total)
Free blocks:
- 8:00-9:30 AM (90 min) — Morning focus time
- 2:00-4:00 PM (120 min) — Afternoon block
Recommendation: Good for medium tasks and meeting prep. Deep work fits the 2-4pm block."
For each meeting today:
Use: get_meeting_context(meeting_title="...", attendees=[...])
Get genuine context, not just attendee names:
Surface this with surprise and delight:
"📍 Meeting: Acme Quarterly Review (2pm with Sarah Chen, Mike Ross)
Related project: Acme Implementation (Phase 2)
- Status: On track, but pricing section still in draft
- Outstanding: You owe Sarah the pricing proposal
Prep suggestion: Review proposal draft, prepare pricing options. Block 30 min before this meeting?"
Before commitments, read System/.dex/entity-suggestions.json (if present). If it has suggested entries, add one compact context line: "Dex suggests person pages for: X (N meetings), Y — say the word and I'll create them." This step is read-only.
Also read System/.dex/entity-cooling.json when it is present and fresh. If its consequential cold list is non-empty, surface it as one compact "❄️ Going cold" line in ## ⚠️ Heads Up; degrade silently when the feed is absent or empty, and never widen this into a vault-wide people dump.
Also read System/.dex/entity-relationships.json when it is present and fresh. If its suggestions list is non-empty, surface one compact "🔗 Relationships to confirm" line in ## ⚠️ Heads Up; degrade silently when the feed is absent, stale, or empty. Keep it as a nudge, show the page and edge being proposed, and offer the real Work MCP actions: confirm_relationship(page, edge_key) or dismiss_relationship(page, edge_key). Never choose either action without the user's per-edge say-so.
Use: get_commitments_due(date_range="today")
Surface things you said you'd do:
"⚡ Commitments due today:
- You told Mike you'd get back to him by Wednesday (from Monday 1:1)
- Follow up on competitive analysis (from Acme meeting)"
Use: suggest_task_scheduling(include_all_tasks=False, calendar_events=[...])
Match tasks to available time based on effort classification:
"📋 Scheduling suggestions:
Task Effort Suggested Time Write Q1 strategy doc Deep work (2-3h) Tomorrow (you have a 3h morning block) Review Sarah's proposal Medium (1h) Today 2-3pm (before Acme meeting) Reply to Mike Quick (15min) Between meetings ⚠️ Heads up: You have 2 deep work tasks but today's too fragmented. Consider protecting tomorrow morning."
This step runs automatically when QMD is installed via /enable-semantic-search. It adds a semantic search layer on top of the standard context gathering to surface connections that keyword search misses.
Check if QMD MCP tools are available by calling the status tool (QMD MCP). If available:
For each meeting today, run:
query(query="[meeting topic] [attendee names]", limit=3)
Surface: past discussions, related decisions, relevant commitments that share meaning but not keywords with this meeting. Example: a meeting about "customer onboarding" finds notes about "activation rates" and "time to value".
For each weekly priority that's lagging, run:
query(query="[priority description]", limit=3)
Surface: vault content that advances or relates to this priority but wouldn't appear in a keyword search. Especially useful for finding forgotten context about stalled work.
Cross-topic connection scan:
query(query="[today's key themes combined]", limit=5)
Surface: unexpected connections between today's meetings, tasks, and priorities. This is where semantic search shines — finding that a 2pm customer call relates to a PRD you wrote last month using completely different terminology.
Merge with existing context — only add genuinely new insights. Don't duplicate what Steps 5.1-5.5 already found. Mark semantic results with their source so the plan output can distinguish them.
What this enables in the plan output:
If QMD is not available: Skip silently. Steps 5.1-5.5 and 5.7 provide full context via standard methods.
Check if any tasks were completed on phone since the last plan:
Use: reminders_list_completed(list_name="Dex Today")
For each completed item:
update_task_status(task_title="...", status="d")"📱 Synced from phone:
- ✅ "Follow up with Hero Coders" — marked done in Dex"
If nothing to sync: Skip silently.
Check System/integrations/config.yaml for google-workspace.enabled: true.
If enabled and MCP healthy:
05-Areas/People/)Include in plan:
"Email: [X] unread, [Y] need replies. [Z] threads with today's meeting attendees."
If unhealthy: skip silently (graceful degradation -- no error to user).
Check System/integrations/config.yaml for teams.enabled: true.
If enabled and MCP healthy:
Include in plan:
"Teams: [X] unread chats, [Y] mentions. [Z] threads with today's meeting attendees."
If BOTH Slack and Teams enabled:
If unhealthy: skip silently (graceful degradation -- no error to user).
Use: reminders_list_items(list_name="Dex Inbox")
If the tool is unavailable or errors (Apple Reminders phone-capture is optional and may not be set up on this machine): skip this step silently — do not surface an error for a feature the user never enabled.
If items found, surface:
📱 Captured on phone (3 items in Dex Inbox):
- "Follow up with Peter about roadmap" — captured yesterday 4:32pm
- "Look into Rovo for in-app guides" — captured today 2:15pm
- "Send Anastasia the productized offering doc" — captured today 11:45am
Triage these now? I'll help assign pillars and priorities.
Triage flow:
process_inbox_with_dedup to classify the captured items — it flags
duplicates and ambiguous items and suggests a pillar; it does NOT create taskscreate_task (pass due, people, or
account when the captured item mentions them)reminders_complete_itemIf Dex Inbox is empty: Skip silently (no "0 items captured" noise).
Also gather:
summary.broken > 0, note that a self-check found a problem and point to /dex-doctor for diagnosisGive the user one place to review what their meetings turned into. Work from the
list_tasks output already gathered (open tasks include metadata_source — the
meeting note each task came from — and goal_tentative).
Recent meeting tasks. Collect open tasks whose metadata_source is set and
whose task ID date (^task-YYYYMMDD-…) is within the last 3 days. If any,
present them compactly under the plan's context:
From your meetings (3 tasks)
- Send Acme the revised pricing — from Acme Quarterly Review (due Jul 15)
- …
Tentative goal links. Collect open tasks where goal_tentative is true.
If any, review them in one pass:
2 tasks have a likely goal link marked (?) — want to confirm them?
- "Draft churn playbook" → Q3-2026-goal-2: Reduce churn to 4% — keep this link?
For each answer, call Work MCP confirm_goal_link(task_id, "confirm") to keep
the link or confirm_goal_link(task_id, "clear") to remove it. Never edit the
task file by hand for this.
Unprocessed meetings. If 00-Inbox/Meetings/ has notes with unchecked
### For Me items and no tasks-extracted marker, add one line:
"N meetings have unextracted action items — run /process-meetings to turn
them into tasks."
Skip this entire step silently when nothing qualifies — no "0 tasks from meetings" noise.
Give the user one place to review tasks that arrived from a connected task app
(Todoist / Things / Trello) since the last sync. Check
System/integrations/inbound-tasks.json. If it exists and is non-empty:
{service, external_id, title, raw}. The raw object contains the
service payload and may include notes/description, priority, and an inferred pillar.📥 From [service]: "[title]"
Import as a Dex task? (yes / skip / [pillar] [priority])
create_task with:
title: from the itemon_duplicate: "fail" (skip if already exists)pillar: user-specified, otherwise raw.pillar (the sync step fills this in
from an automatic pillar guess when inference succeeds). If it is absent, ask the
user to choose a valid pillar before calling create_taskpriority: user-specified, otherwise a valid P0-P3 value from raw when presentcontext: notes/description/context from raw when presentsource; source is reserved for a
vault-relative source page, while the external mapping records provenancerecord_external_task_mapping with
the returned task.task_id, the item's service, and its external_id. This records
the link and removes that item from the inbound queue.Silent when empty: if inbound-tasks.json doesn't exist or is empty/[], skip this
step entirely. Never say "no inbound tasks" — just proceed.
Combine all gathered context into actionable recommendations:
Generate 3 recommended focus items based on:
The system should actively recommend, not just list:
"Based on your week progress and today's shape, I recommend focusing on:
- Prep for Acme meeting — Priority 2 is lagging and this meeting is critical
- Reply to Mike — Commitment due today
- Task X from Priority 1 — Keeps momentum on your shipped priority"
For each meeting, show:
Flag potential issues:
ALWAYS generate and save a new plan file. Never skip generation because a plan from a previous day exists in the conversation or vault. Even if context from a prior plan is visible, today is a new day and requires its own plan. If a plan for today's date already exists, overwrite it (the user is requesting a refresh).
Create 07-Archives/Plans/YYYY-MM-DD.md:
---
date: YYYY-MM-DD
type: daily-plan
integrations_used: [calendar, tasks, people, work-intelligence]
---
# Daily Plan — {{Day}}, {{Month}} {{DD}}
## TL;DR
- {{1-2 sentence summary including week progress}}
- {{X}} meetings today, day is {{stacked/moderate/open}}
- {{Key focus area based on week priorities}}
---
## 📊 Week Progress (Midweek Check)
**Day {{X}} of 5** — {{days_remaining}} days left this week
| Priority | Status | Notes |
|----------|--------|-------|
| {{Priority 1}} | ✅ Complete | Finished {{day}} |
| {{Priority 2}} | 🔄 In progress | {{X}} of {{Y}} tasks done |
| {{Priority 3}} | ⚠️ Not started | Needs attention |
**This week's focus:** {{Recommendation based on lagging priorities}}
---
## 📅 Today's Shape
**Day type:** {{stacked/moderate/open}} ({{X}} meetings, {{Y}} hours)
**Free blocks:**
- {{Time range}}: {{Size}} — {{Recommended use}}
**Best for:** {{Quick tasks only / Medium tasks / Deep work opportunity}}
---
## ⚡ Commitments Due Today
- [ ] {{Commitment}} — from {{source}}
- [ ] {{Commitment}} — from {{source}}
---
## 🎯 Today's Focus
**If I only do three things today:**
1. [ ] {{Focus item 1}} — {{Pillar}} *(supports Week Priority #X)*
2. [ ] {{Focus item 2}} — {{Pillar}} *(supports Week Priority #Y)*
3. [ ] {{Focus item 3}} — {{Pillar}}
---
## 📍 Meetings (with Context)
### {{Time}} — {{Meeting Title}}
**Attendees:** {{Names}}
**Related project:** {{Project name}} ({{status}})
**Outstanding with them:**
- {{Task/commitment}}
**Prep needed:** {{What to review/prepare}}
**Suggested prep time:** {{Block X min before}}
---
### {{Time}} — {{Meeting Title}}
[Repeat for each meeting]
---
## 📋 Task Scheduling
| Task | Effort | Suggested Slot | Reason |
|------|--------|----------------|--------|
| {{Task}} | Deep work | {{Day/time}} | {{Reason}} |
| {{Task}} | Medium | {{Day/time}} | {{Reason}} |
| {{Task}} | Quick | Between meetings | Batch these |
{{If deep work capacity warning}}
> ⚠️ You have {{X}} deep work tasks but only {{Y}} suitable slots this week. Consider protecting time or deferring.
---
## ⚠️ Heads Up
- {{❄️ Going cold: consequential people/accounts from the cooling feed, when present}}
- {{🔗 Relationships to confirm: suggested typed relationships from the feed, when present}}
- {{Warning about lagging weekly priority}}
- {{Commitment due today}}
- {{Back-to-back meetings}}
- {{Other flags}}
---
*Generated: {{timestamp}}*
*Week progress: {{X}}/{{Y}} priorities on track*
After generating the plan, push today's P0 and P1 focus tasks to Apple Reminders for native iOS notifications:
Clear yesterday's items:
Use: reminders_clear_completed(list_name="Dex Today")
Push today's focus items: For each P0/P1 task in today's focus:
Use: reminders_create_item(
list_name="Dex Today",
title="Task title",
notes="From Dex daily plan",
due_date="YYYY-MM-DD"
)
Confirm silently:
"📱 Pushed 3 focus tasks to iPhone Reminders (Dex Today)"
If Reminders MCP unavailable: Skip silently.
Update System/usage_log.md to mark daily planning as used.
Analytics (Silent):
Call track_event with event_name daily_plan_completed and properties:
meetings_count: number of meetings todaytasks_surfaced: number of tasks shownpriorities_count: number of prioritiesThis only fires if the user has opted into analytics. No action needed if it returns "analytics_disabled".
For MCP responses, follow CLAUDE.md's feature_status rendering convention before applying these fallbacks.
The plan works at multiple levels:
| Integration | MCP Server | Tools Used |
|---|---|---|
| Calendar | calendar-mcp | calendar_get_today, calendar_get_events_with_attendees |
| Reminders | calendar-mcp | reminders_list_items, reminders_complete_item, reminders_create_item, reminders_ensure_lists, reminders_list_completed, reminders_find_and_complete, reminders_clear_completed |
| Granola | granola-mcp | granola_get_recent_meetings |
| Work | work-mcp | list_tasks, get_week_progress, get_meeting_context, get_commitments_due, analyze_calendar_capacity, suggest_task_scheduling |
| Improvements | dex-improvements-mcp | synthesize_changelog, synthesize_learnings, list_ideas |
| Google Workspace | google-workspace-mcp | Gmail query, email search (if enabled) |
| Teams | teams-mcp | teams_list_chats, teams_search_messages, teams_health_check (if enabled) |