Hey
basecamp/hey-cli
Interact with HEY via the HEY CLI. An agent skill from basecamp/hey-cli.
Build today's plan from calendar, tasks, priorities and commitments, with smart scheduling suggestions.
$ npx skills add davekilleen/Dex --skill daily-plan -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install davekilleen/Dex daily-plan --agent claude-codeProject scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).
$ git clone --depth 1 https://github.com/davekilleen/Dex.git skills-src && mkdir -p .claude/skills && cp -r skills-src/.agents/skills/daily-plan .claude/skills/daily-plan && rm -rf skills-srcUse ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.
Claude Code skills documentation · loads skills from .claude/skills/
Install the "daily-plan" agent skill from https://github.com/davekilleen/Dex/tree/main/.agents/skills/daily-plan into .claude/skills/daily-plan/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "daily-plan", then confirm the skill loads.Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$skill-installer install https://github.com/davekilleen/Dex/tree/main/.agents/skills/daily-planType this inside Codex. $skill-installer <name> installs a curated skill from openai/skills. The installer writes to $CODEX_HOME/skills (default ~/.codex/skills). Restart Codex if the skill does not show up.
$ npx skills add davekilleen/Dex --skill daily-plan -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install davekilleen/Dex daily-plan --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/davekilleen/Dex.git skills-src && mkdir -p .agents/skills && cp -r skills-src/.agents/skills/daily-plan .agents/skills/daily-plan && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "daily-plan" agent skill from https://github.com/davekilleen/Dex/tree/main/.agents/skills/daily-plan into .agents/skills/daily-plan/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "daily-plan", then confirm the skill loads.Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add davekilleen/Dex --skill daily-plan -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install davekilleen/Dex daily-plan --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/davekilleen/Dex.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/.agents/skills/daily-plan .cursor/skills/daily-plan && rm -rf skills-srcUse ~/.cursor/skills/ instead of .cursor/skills for a personal install.
Cursor skills documentation · loads skills from .cursor/skills/, .agents/skills/, .claude/skills/, .codex/skills/
Install the "daily-plan" agent skill from https://github.com/davekilleen/Dex/tree/main/.agents/skills/daily-plan into .cursor/skills/daily-plan/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "daily-plan", then confirm the skill loads.Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gemini skills install https://github.com/davekilleen/Dex.git --path .agents/skills/daily-plan--scope user (default) or --scope workspace; --path is the subfolder of the repo that holds the skill; --consent skips the security confirmation prompt.
$ npx skills add davekilleen/Dex --skill daily-plan -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install davekilleen/Dex daily-plan --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/davekilleen/Dex.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/.agents/skills/daily-plan .gemini/skills/daily-plan && rm -rf skills-srcUse ~/.gemini/skills/ instead of .gemini/skills for a personal install, then run /skills reload.
Gemini CLI skills documentation · loads skills from .gemini/skills/, .agents/skills/
Install the "daily-plan" agent skill from https://github.com/davekilleen/Dex/tree/main/.agents/skills/daily-plan into .gemini/skills/daily-plan/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "daily-plan", then confirm the skill loads.Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gh skill install davekilleen/Dex daily-planInstalls for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
$ npx skills add davekilleen/Dex --skill daily-plan -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/davekilleen/Dex.git skills-src && mkdir -p .github/skills && cp -r skills-src/.agents/skills/daily-plan .github/skills/daily-plan && rm -rf skills-srcUse ~/.copilot/skills/ instead of .github/skills for a personal install. Commit .github/skills so cloud agent and code review can use it.
GitHub Copilot skills documentation · loads skills from .github/skills/, .claude/skills/, .agents/skills/
Install the "daily-plan" agent skill from https://github.com/davekilleen/Dex/tree/main/.agents/skills/daily-plan into .github/skills/daily-plan/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "daily-plan", then confirm the skill loads.GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add davekilleen/Dex --skill daily-plan -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install davekilleen/Dex daily-plan --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/davekilleen/Dex.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/.agents/skills/daily-plan .opencode/skills/daily-plan && rm -rf skills-srcUse ~/.config/opencode/skills/ instead of .opencode/skills for a personal install.
OpenCode skills documentation · loads skills from .opencode/skills/, .claude/skills/, .agents/skills/
Install the "daily-plan" agent skill from https://github.com/davekilleen/Dex/tree/main/.agents/skills/daily-plan into .opencode/skills/daily-plan/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "daily-plan", then confirm the skill loads.OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
daily-planBuild today's plan from calendar, tasks, priorities and commitments, with smart scheduling suggestions.
Daily Plan is an agent skill from davekilleen/Dex. 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.
Its SKILL.md is about 9k tokens, which your agent loads only when the skill is triggered. The skill folder holds 1 other file (for example `AGENT_INSTRUCTIONS.md`).
It sits in Productivity & Automation, covering Time tracking and reporting. The repository describes itself as: Your AI Chief of Staff — a personal operating system starter kit that adapts to your role. No coding required. The licence is MIT.
12 steps, taken from the step headings in SKILL.md.
Read from SKILL.md and the folder at commit d0ffc6b. It shows what the files ask for, not the result of running them.
Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.
From allowed-tools in the SKILL.md frontmatter.
Shell commands in SKILL.md call:
python3From the folder's file list and the shell code blocks in SKILL.md.
No URLs in SKILL.md.
From URLs in SKILL.md, links to its own repository left out.
Names these keys or tokens, usually read from environment variables:
GRANOLA_API_KEYFrom names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
Daily Plan loads about 9k tokens when it runs. Until then it costs about 80 tokens; SKILL.md has 4,441 words of instructions outside code blocks.
Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.
The automated check noted patterns worth knowing about, such as sudo or a known installer.
OLA_API_KEY` (environment or vault-root `.env`). If no key is configured, skip all Granola steps silently — an unconnectAutomated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.
The full file from davekilleen/Dex at commit d0ffc6b, republished under its MIT licence (© davekilleen). 4,441 words, ~9,029 tokens.
.claude/skills/daily-plan/SKILL.md (or your agent's skills folder). This skill also uses 1 other file; get the full folder from GitHub.<!-- Generated from `.claude/skills/daily-plan/SKILL.md` by `scripts/generate-agents-skills.py`. Do not edit. -->
Run inline in the current conversation by default, so this work can see what the user has already discussed, decided, or settled this session. Do not fork merely because this skill was selected. Only run in the background when the user explicitly asks for a background run or the host has already obtained a specific background-work approval for this run.
This skill stays inline as described above: it keeps session awareness, it asks the user the questions, and it owns every interactive step. What it does NOT do inline is the bulk read-gathering, which on a mature vault (hundreds of notes, thousands of indexed messages, a live calendar and multiple integrations) can be large enough to exhaust the main conversation before the useful work starts.
So the gathering phase is delegated to one general-purpose subagent via the
Agent tool, using the self-contained prompt in this skill's
AGENT_INSTRUCTIONS.md:
.agents/skills/daily-plan/AGENT_INSTRUCTIONS.md.{{TARGET_DATE}}, {{TARGET_DATE_PLUS_1}},
{{DAY_NAME}}, {{MONTH}}, {{DD}}).subagent_type: "general-purpose",
model: "sonnet", that prompt, and a short description. The brief is
mechanical gathering, so it runs on the fast tier declared by this skill's
model_routing.steps.data-gathering; the judgement calls stay in this
conversation on the default model.<!-- NEEDS TASK --> line in the draft. The subagent
never creates tasks, so a focus candidate with no existing task is written
without a checkbox and marked. For each one: confirm it with the user per
Step 6, create the task with create_task, then rewrite that line as a
- [ ] checkbox carrying the returned ^task-YYYYMMDD-XXX anchor and
remove the marker. If the user declines, remove the marker and leave the
line checkbox-free. Never leave the marker in the saved plan, and never turn
one of these lines into a checkbox without an anchor — an anchorless
checkbox is invisible to completion sync forever (Step 6).The subagent inherits MCP connections, runs in its own context, and that context is freed when it completes, so only its findings reach this conversation.
Use AGENT_INSTRUCTIONS.md verbatim. Read the file and pass its content as
the subagent prompt, substituting only the placeholders. Do NOT hand-write a
replacement brief from what you already know about the day: that is how steps get
silently dropped, and the omission looks complete because nothing errors. If
context from this conversation is worth adding, APPEND it to the file's content;
never substitute for it.
Two caveats that are load-bearing:
the host's lifecycle settings reach a
subagent's tool calls is not something a skill should assume either way.
Nothing in this skill's gathering depends on a hook; the subagent's writes
must stand on their own.AGENT_INSTRUCTIONS.md. A missing subagent must never mean a missing result.Stays inline: the journal and Monday week-planning gates, the yesterday's review check, Dex Inbox triage, the meeting-task review and goal-link confirmations, inbound external task review, pushing focus tasks to Reminders, and usage tracking. These need the user, so they must not be delegated.
Previous-working-day notes (Step 5.10c) are gathering, not the yesterday's
review check. That step lives in AGENT_INSTRUCTIONS.md so a customization of
it reaches the subagent. The written plan must show the post-condition: notes
found for a named date/file, or none.
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, ask the session-start sweep how many meeting records are still waiting, without re-scanning the vault yourself. The count mode prints one integer, bypasses the sweep's once-per-30-minutes notice throttle, and writes nothing, so it is safe to call every morning:
Ask the host for its count of waiting meeting records if it keeps one; if it does not, treat the count as unknown and run the meeting pass.
Branch on the answer:
0: skip this step entirely and say nothing. Yesterday evening's review
already ran the catch-up pass, so on most mornings this is the answer, and
re-running a full seven-day /process-meetings here found nothing new while
costing minutes.0: run /process-meetings. This creates meeting notes, updates
person/company pages, and extracts tasks, so the plan has complete data.
Note the count and use the extracted context in the plan. Do NOT ask for a
skill rating after this sub-step — save that for the end of the full plan./process-meetings as before.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."
Calendar events come from the delegated gatherer. That gatherer reads
calendar.provider in System/user-profile.yaml and uses Google Workspace MCP
when the provider is google, or calendar-mcp when it is not.
Use: analyze_calendar_capacity(days_ahead=1, events=[...from the configured calendar source...])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")If the tool is unavailable or errors (Apple Reminders sync 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. Note: Reminders access never works when Claude Code runs inside the VS Code extension (macOS never shows the permission dialog to that process) — see the known limitation in 06-Resources/Dex_System/Calendar_Setup.md. Do not advise reinstalling or reconfiguring; skip silently.
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. Also treat a
registered apple-mail-mcp server as a connected source. Before querying Apple Mail, run
python3 core/utils/doctor.py --deep --only mail.apple-search; Apple Mail search is usable
only when the mail.apple-search check reports OK / feature_status: ok. --only runs
that one probe instead of the whole live checkup (smoke journeys, search index, connected
tools), which is what a full --deep run does and what made this step slow every morning.
Google Workspace needs no local probe: its own tool response carries the health status.
If connected and healthy:
is:unread category:primary. If that returns 0, confirm with is:unread in:inbox
and whether any mail has the Primary label (category:primary, not only unread).
When inbox tabs are off, category:primary is empty even though the inbox has
unread mail — use the inbox count. When Primary exists but has no unread, report 0.
Never use a provider-wide is:unread total. Use monitored labels separately to
find priority messages. For Apple Mail, count unread messages in Inbox
mailboxes. If the source cannot scope this reliably, omit the headline unread count.05-Areas/People/)Include in plan:
"Email: [X] unread in Primary/Inbox, [Y] need replies. [Z] threads with today's meeting attendees."
For Apple Mail, never interpret an empty search as "no matching mail" unless that health check
is OK. If a connected source is broken or could not be checked, do not silently skip:
include one calm "Email context omitted" line with Doctor's user_message or fix path. If the
source is not connected (OFF), omit it without noise.
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:
Due: dates only)i_owe_date can be overdue. waiting_on_date is a wait/nudge, never overdue. A leftover next_action_date has no direction — do not mark it overdue.summary.broken > 0, note that a self-check found a problem and point to /dex-doctor for diagnosisRead working_week.days in System/user-profile.yaml. Compute the previous
working day strictly before the target date (skip non-working days). If the
profile is missing or working_week.days is unusable, treat Monday-Friday as
the working week.
Look for notes dated that previous working day in 00-Inbox/Meetings/
(including 00-Inbox/Meetings/{date}/) and, when present, the valid configured
notes_folder from meeting_sources. Name the date and every file found. If
none, record that as none for that named date. Do not skip this step silently.
Person-page updates. For people mentioned in those notes, call
lookup_person. If a page exists, add the note under Recent Interactions
inside the existing <!-- dex:auto:recent-interactions --> block using:
- [{Meeting Title}]({actual vault-relative note path}) — {date}If that path is already listed, change nothing. Do not create person pages here; list people with no page for the conversation to handle. The written plan must include the post-condition: previous-working-day notes found for a named date/file, or none for that date.
Give 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 presentexternal_service: the item's serviceexternal_id: the item's external_idsource; source is reserved for a
vault-relative source page, while the external mapping records provenanceSilent 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"
Task IDs are mandatory on focus items (completion sync depends on them):
Completion sync (Work MCP update_task_status, which updates every file the task
appears in) only finds a line if that single line contains BOTH a - [ ] / - [x]
checkbox AND the task's ^task-YYYYMMDD-XXX anchor. A focus item written without the ID — or with the ID on
a different line — is invisible to sync: ticking the task done in Tasks.md never
updates the plan, and marking the plan item done never updates Tasks.md.
So, for each recommended focus item:
- [ ] checkbox line with that task's ^task-YYYYMMDD-XXX
anchor at the end of the same line. Never omit the ID, never put it on its own line.create_task, then embed the returned task ID the same way.Format notes that matter: use - [ ] (dash checkbox), not 1. [ ] — numbered
checkboxes do not contain the literal - [ ] string the sync matcher looks for, so
they never sync even with an ID present.
For each meeting, show:
Flag potential issues:
is_organizer: true,
Google organizer: true / organizer.email matching that person, and the user
themselves when they organised the meeting (is_current_user / self plus
organiser) as having accepted. Do not write "has not accepted" for them.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).
Filling in {{^task-id}} in Today's Focus: replace it with the item's real
^task-YYYYMMDD-XXX anchor per the Task IDs rule in Step 6 (mandatory whenever the
item maps to a Tasks.md task — create the task first if needed). If the item is not a
task at all, drop both the placeholder and the - [ ] checkbox for that line.
Daily plan folder. Default for a new vault is 00-Inbox/Daily_Plans/. If System/folder-paths.yaml has daily_plans:, write there. If dated YYYY-MM-DD.md daily plans already live in one other folder, keep using that folder — do not move those files and do not start a second copy in the inbox. New vaults with no existing plans use 00-Inbox/Daily_Plans/.
Create {daily-plan-folder}/YYYY-MM-DD.md (default 00-Inbox/Daily_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:**
- [ ] {{Focus item 1}} — {{Pillar}} *(supports Week Priority #X)* {{^task-id}}
- [ ] {{Focus item 2}} — {{Pillar}} *(supports Week Priority #Y)* {{^task-id}}
- [ ] {{Focus item 3}} — {{Pillar}} {{^task-id}}
---
## 📍 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
- {{Previous-working-day notes: found YYYY-MM-DD `path` / none for YYYY-MM-DD}}
- {{❄️ 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 the tool is unavailable or errors: Skip silently — do not surface an error for a feature the user never enabled. (This includes Claude Code running inside the VS Code extension, where macOS never grants Reminders access — see 06-Resources/Dex_System/Calendar_Setup.md.)
Call the mark_feature_used tool on the dex-analytics MCP server with daily-plan. This ticks the feature's box in System/usage_log.md, which is what /dex-level-up reads to recommend features that have not been tried. It writes locally and sends nothing, so it runs whether or not analytics is enabled.
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, or google-workspace-mcp when calendar.provider is google | Apple: calendar_get_today, calendar_get_events_with_attendees. Google: list_calendars, get_events |
| 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) |
| Apple Mail | apple-mail-mcp | Local full-text mail search (only after mail.apple-search is healthy) |
| Teams | teams-mcp | teams_list_chats, teams_search_messages, teams_health_check (if enabled) |
© davekilleen, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
SKILL.md and 1 other file in .agents/skills/daily-plan of davekilleen/Dex.
Open the folder on GitHubat commit d0ffc6b
Daily Plan next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.
| Skill | Stars | Used in | Tokens | Auto-check | Licence | Repo updated |
|---|---|---|---|---|---|---|
| Daily Plan this skilldavekilleen/Dex | 494 | — | ~9k | Automated safety check: Notes | MIT | |
| Heybasecamp/hey-cli | 410 | — | ~20k | Automated safety check: Pass | MIT | |
| Lark Todoautumnseasonism/lark-todo | 138 | — | ~5.5k | Automated safety check: Pass | MIT | |
| At Zentaokairyou/agent-tools | 178 | — | ~4k | Automated safety check: Pass | MIT | |
| Capture Triagenicepkg/ai-workflow | 285 | — | ~3k | Automated safety check: Pass | MIT | |
| Tracking Backend WorkerCorrectRoadH/OpenTickly | 307 | — | ~1.2k | Automated safety check: Pass | AGPL-3.0 |
basecamp/hey-cli
Interact with HEY via the HEY CLI. An agent skill from basecamp/hey-cli.
autumnseasonism/lark-todo
飞书全平台待办扫描:IM 消息、会议纪要、日程、文档评论、待办审批、我发起的审批、邮件、已有任务八源并行采集,按优先级排序后支持直接处理或建任务。多企业账号自动发现并并行扫描,跨企业合并。用户说'有啥待办'、'@我的消息'、'扫一圈'、'收工检查'、'今天还差啥'、'morning standup'、'daily review' 时触发,连随口'忙不忙'、'有人找我吗'也应触发。同时覆盖多企业…
kairyou/agent-tools
Handle ZenTao (禅道) Bugs and Tasks end to end, including updating or writing back an item after code changes, managing Task status and hours, and reading linked Stories.
nicepkg/ai-workflow
Processes Drafts Pro captures from the Inbox folder. An agent skill from nicepkg/ai-workflow.
CorrectRoadH/OpenTickly
Update backend timer/time-entry contracts, regressions, and source docs for the timer refactor mission.
getsentry/skills
Go back through the previous year of work and create a Notion doc that groups relevant links into projects that can then be documented as SRED projects.
davekilleen/Dex
This skill should be used when working with DSPy.rb, a Ruby framework for building type-safe, composable LLM applications.
davekilleen/Dex
Adopt a full published Heydex profile by handle ('set me up like @davekilleen').
davekilleen/Dex
Package one workflow — how you use Dex for a specific job — into a shareable DexDiff methodology doc.
davekilleen/Dex
Expert guidance for creating, writing, and refining Claude Code Skills.
davekilleen/Dex
Report a Dex bug to the Dex team with zero homework — Dex investigates locally, builds a privacy-safe report, shows it to you (or auto-sends if you've chosen that), and tracks the ticket until it's…
davekilleen/Dex
This skill should be used when writing Ruby and Rails code in DHH's distinctive 37signals style.
Categories
Build today's plan from calendar, tasks, priorities and commitments, with smart scheduling suggestions. Daily Plan is an agent skill from davekilleen/Dex. Build today's plan from calendar, tasks, priorities and commitments, with smart scheduling suggestions.
Daily Plan fits situations like: the user says plan my day; starts the morning.
Run `npx skills add davekilleen/Dex --skill daily-plan -a claude-code`. Or copy the skill folder (.agents/skills/daily-plan in davekilleen/Dex) into .claude/skills/daily-plan in your project. Claude Code loads it when a task matches its description.
Run `npx skills add davekilleen/Dex --skill daily-plan -a codex`. Or copy the skill folder (.agents/skills/daily-plan in davekilleen/Dex) into .agents/skills/daily-plan in your project. Codex loads it when a task matches its description.
Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add davekilleen/Dex --skill daily-plan -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/daily-plan, .gemini/skills/daily-plan, .github/skills/daily-plan and .opencode/skills/daily-plan in your project.
Going by SKILL.md and its folder, Daily Plan needs the command-line tools its instructions call (python3) and credentials named GRANOLA_API_KEY. Our summary lists: A credential in GRANOLA_API_KEY.
SKILL.md contains no URLs. Any network use would come from the scripts or tools the agent runs. This is read from the text; nothing was executed.
Our automated static check of SKILL.md found notes only (mentions a .env file), nothing it rates as a warning. It is not a guarantee. Review the folder before installing.
Daily Plan is published under the MIT licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.
About 9k tokens (SKILL.md is roughly 36k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.
Skills that share tags, products or a category with Daily Plan: Hey (basecamp/hey-cli, 410 stars), Lark Todo (autumnseasonism/lark-todo, 138 stars), At Zentao (kairyou/agent-tools, 178 stars) and Capture Triage (nicepkg/ai-workflow, 285 stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
davekilleen (a GitHub user) maintains it in davekilleen/Dex, which has 494 GitHub stars. The repository holds 61 skills in this directory. The repository was last updated on October 9, 2026.
Source: davekilleen/Dex on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.