From 0ee930aa995a335198fac3f54d6d566648a4a92a Mon Sep 17 00:00:00 2001 From: amcheste-ai-agent <278991699+amcheste-ai-agent@users.noreply.github.com> Date: Mon, 11 May 2026 18:34:31 -0400 Subject: [PATCH] chore(brand): em-dash sweep + README badge color fixes MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Brand-alignment pass against the alanchester-brand voice rules. 1. README badges fixed: - Version badge: added `color=0B0B0C` (ink). Was using the shields.io default color, not brand. - License badge: `License-MIT-blue.svg` → `License-MIT-1F4D3A.svg` (hunter green accent). 2. Em-dash sweep across 17 prose files (215 swept mechanically, 8 more swept manually in table cells and template placeholders). Zero prose em-dashes remain. 23 em-dashes are deliberately preserved inside fenced code blocks. These are template patterns that the EA agent reproduces when generating output (meeting notes, daily notes, weekly reviews, etc.). Per the theming-prompt rules on code structure, content inside ``` stays. Files swept: README.md, CONTRIBUTING.md, CLAUDE.md, CHANGELOG.md, TESTING.md, ARCHITECTURE.md, DEVELOPER.md, RELEASE.md, and 9 skills/*/SKILL.md files. Post-sweep audit (`grep -nE '\. [a-z]'`) found 4 matches, all abbreviation false positives (e.g., vs., User's example state inside a code block). Left as-is. Co-Authored-By: Claude Opus 4.7 (1M context) Co-Authored-By: amcheste <13696614+amcheste@users.noreply.github.com> --- ARCHITECTURE.md | 20 +++++------ CHANGELOG.md | 32 ++++++++--------- CLAUDE.md | 6 ++-- CONTRIBUTING.md | 38 ++++++++++---------- DEVELOPER.md | 16 ++++----- README.md | 56 ++++++++++++++--------------- RELEASE.md | 24 ++++++------- TESTING.md | 38 ++++++++++---------- skills/inbox-processing/SKILL.md | 16 ++++----- skills/meeting-notes/SKILL.md | 10 +++--- skills/obsidian-daily-note/SKILL.md | 18 +++++----- skills/project-setup/SKILL.md | 4 +-- skills/quick-capture/SKILL.md | 22 ++++++------ skills/setup/SKILL.md | 30 ++++++++-------- skills/task-manager/SKILL.md | 42 +++++++++++----------- skills/vault-context/SKILL.md | 40 ++++++++++----------- skills/weekly-review/SKILL.md | 26 +++++++------- 17 files changed, 219 insertions(+), 219 deletions(-) diff --git a/ARCHITECTURE.md b/ARCHITECTURE.md index 2246785..5e8f13a 100644 --- a/ARCHITECTURE.md +++ b/ARCHITECTURE.md @@ -6,7 +6,7 @@ This document explains how ea-agent is structured, how skills work, and how the ## Overview -ea-agent is a Claude Code plugin — a collection of skills that run inside a Claude Code session. When invoked, a skill receives the full context of the user's EA profile and uses Claude's language model plus MCP tools to interact with the user's vault, calendar, task manager, and communication tools. +ea-agent is a Claude Code plugin. A collection of skills that run inside a Claude Code session. When invoked, a skill receives the full context of the user's EA profile and uses Claude's language model plus MCP tools to interact with the user's vault, calendar, task manager, and communication tools. ``` ┌─────────────────────────────────────────────────────┐ @@ -100,8 +100,8 @@ ea-agent/ } ``` -- **`skills`** — path to the skills directory; Claude Code discovers all subdirectories containing `SKILL.md` -- **`userConfig`** — config keys the user provides at install time; available to all skills at runtime +- **`skills`**. Path to the skills directory; Claude Code discovers all subdirectories containing `SKILL.md` +- **`userConfig`**. Config keys the user provides at install time; available to all skills at runtime --- @@ -122,7 +122,7 @@ description: "When to invoke this skill — used by the router" Instruction prose that Claude follows when this skill is invoked. ``` -The `description` field is critical — it's what the router reads to decide which skill matches a user message. Write it as a complete routing specification: include trigger phrases, use cases, and context cues. +The `description` field is critical. It's what the router reads to decide which skill matches a user message. Write it as a complete routing specification: include trigger phrases, use cases, and context cues. ### Skill invocation flow @@ -153,7 +153,7 @@ This pattern ensures skills degrade gracefully when no profile exists and use co ## EA_PROFILE.md -`EA_PROFILE.md` is written by the `setup` skill and lives in the vault root. It is the EA's persistent memory about the user — plain markdown, user-editable. +`EA_PROFILE.md` is written by the `setup` skill and lives in the vault root. It is the EA's persistent memory about the user. Plain markdown, user-editable. ### Schema (v1.0) @@ -207,7 +207,7 @@ google_calendar: [enabled/disabled] 1. Add the field to the setup skill's questionnaire 2. Bump `profile_version` (e.g. `1.0` → `1.1`) -3. Bump the plugin's **major** version — this signals to users they need to re-run `/ea-agent:setup` +3. Bump the plugin's **major** version. This signals to users they need to re-run `/ea-agent:setup` The setup skill detects the version mismatch on re-run and only asks about new fields, preserving existing data. @@ -219,12 +219,12 @@ Skills access external systems via MCP tools configured in Claude's settings: | MCP | Tool calls used | Skills that need it | |-----|----------------|---------------------| -| **Control your Mac** | `osascript` — AppleScript execution | quick-capture, task-manager, obsidian-daily-note | +| **Control your Mac** | `osascript`, AppleScript execution | quick-capture, task-manager, obsidian-daily-note | | **Gmail** | `gmail_search_messages`, `gmail_read_message` | inbox-processing | | **Slack** | `slack_read_channel`, `slack_send_message` | inbox-processing, meeting-notes | | **Google Calendar** | `gcal_list_events` | obsidian-daily-note, weekly-review | -Skills degrade gracefully when a tool is unavailable — they skip that data source rather than failing. +Skills degrade gracefully when a tool is unavailable. They skip that data source rather than failing. --- @@ -265,7 +265,7 @@ The eval runner builds a system prompt of: You are an EA agent. [no-tools notice] Context: {context} {skill_content} ``` -The `no-tools notice` tells the model it has no filesystem access and the context block is authoritative — this prevents the model from attempting file discovery in the eval environment. +The `no-tools notice` tells the model it has no filesystem access and the context block is authoritative. This prevents the model from attempting file discovery in the eval environment. --- @@ -297,6 +297,6 @@ develop → PR to main → CI → merge git tag v*.*.* → release pipeline (validate + evals + GitHub Release) ``` -Version lives in `.claude-plugin/plugin.json`. Use `./scripts/bump-version.sh` to bump — it updates `plugin.json`, stamps `CHANGELOG.md`, commits, and tags locally. +Version lives in `.claude-plugin/plugin.json`. Use `./scripts/bump-version.sh` to bump. It updates `plugin.json`, stamps `CHANGELOG.md`, commits, and tags locally. See [RELEASE.md](RELEASE.md) for the full release checklist. diff --git a/CHANGELOG.md b/CHANGELOG.md index e1be8aa..15dc107 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,35 +11,35 @@ Versions follow [Semantic Versioning](https://semver.org/spec/v2.0.0.html). --- -## [1.3.5] — 2026-04-03 +## [1.3.5]. 2026-04-03 --- -## [1.3.4] — 2026-04-03 +## [1.3.4]. 2026-04-03 --- -## [1.3.3] — 2026-04-03 +## [1.3.3]. 2026-04-03 --- -## [1.3.2] — 2026-04-03 +## [1.3.2]. 2026-04-03 --- -## [1.3.1] — 2026-04-03 +## [1.3.1]. 2026-04-03 --- -## [1.3.0] — 2026-04-03 +## [1.3.0]. 2026-04-03 --- -## [1.2.0] — 2026-04-03 +## [1.2.0]. 2026-04-03 --- -## [1.1.0] — 2026-04-03 +## [1.1.0]. 2026-04-03 ### Added - Profile versioning in setup skill to track schema changes across releases @@ -51,15 +51,15 @@ Versions follow [Semantic Versioning](https://semver.org/spec/v2.0.0.html). --- -## [1.0.0] — Initial Release +## [1.0.0]. Initial Release ### Added -- `setup` — interactive EA profile builder (vault path, preferences, integrations) -- `daily-note` — create or open today's daily note in Obsidian -- `inbox-triage` — process inbox items into tasks, notes, and actions -- `weekly-review` — structured weekly reflection and planning -- `meeting-notes` — capture and organise meeting notes -- `quick-capture` — fast capture for ideas, tasks, and links -- `task-manager` — view, add, and complete Apple Reminders tasks +- `setup`. Interactive EA profile builder (vault path, preferences, integrations) +- `daily-note`. Create or open today's daily note in Obsidian +- `inbox-triage`. Process inbox items into tasks, notes, and actions +- `weekly-review`. Structured weekly reflection and planning +- `meeting-notes`. Capture and organise meeting notes +- `quick-capture`. Fast capture for ideas, tasks, and links +- `task-manager`. View, add, and complete Apple Reminders tasks - Eval harness with routing and behavioural checks - GitHub Actions CI (validate plugin structure, validate version, run evals on PRs) diff --git a/CLAUDE.md b/CLAUDE.md index 5a7b2a1..e5f20c8 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -1,11 +1,11 @@ -# EA Agent — Claude Code Conventions +# EA Agent. Claude Code Conventions Project-specific conventions for working on this repo with Claude Code. ## Branch model -- `main` — stable, released code only. Never commit directly. -- `develop` — integration branch. All feature PRs target this. +- `main`. Stable, released code only. Never commit directly. +- `develop`. Integration branch. All feature PRs target this. - Feature branches: `feat/`, `fix/`, `ci/`, `docs/`, `evals/` - Releases: `develop` → CLI merge → `main` → tag `v*.*.*` - **Never open a GitHub PR to merge develop→main.** Use `git merge --no-ff origin/develop` on the CLI. GitHub's merge button squash-merges by default, dropping ancestry and causing conflicts on the next release. diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 4105739..1a5cf6f 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -1,14 +1,14 @@ # Contributing to EA Agent -Thanks for wanting to improve the EA Agent. Contributions are welcome — whether that's a new skill, an improvement to an existing one, new eval scenarios, or a bug fix. +Thanks for wanting to improve the EA Agent. Contributions are welcome. Whether that's a new skill, an improvement to an existing one, new eval scenarios, or a bug fix. ## What we're looking for -- **New skills** — workflows that would benefit any user (not personal/org-specific) -- **Skill improvements** — better instructions, clearer fallbacks, smarter EA behavior -- **Eval scenarios** — more coverage for edge cases and regression protection -- **Profile schema additions** — new fields that make skills smarter (requires `profile_version` bump) -- **Bug fixes** — incorrect behavior, broken fallbacks, hardcoded personal info that slipped in +- **New skills**. Workflows that would benefit any user (not personal/org-specific) +- **Skill improvements**. Better instructions, clearer fallbacks, smarter EA behavior +- **Eval scenarios**. More coverage for edge cases and regression protection +- **Profile schema additions**. New fields that make skills smarter (requires `profile_version` bump) +- **Bug fixes**. Incorrect behavior, broken fallbacks, hardcoded personal info that slipped in ## Getting started @@ -22,7 +22,7 @@ See [DEVELOPER.md](DEVELOPER.md) for the full local development setup. ## Before you submit -1. **Run the structural validation** — make sure your skill is well-formed: +1. **Run the structural validation**. Make sure your skill is well-formed: ```bash python3 -c " import os, re, sys @@ -37,13 +37,13 @@ See [DEVELOPER.md](DEVELOPER.md) for the full local development setup. " ``` -2. **Run evals** — evals must meet the pass threshold before merging: +2. **Run evals**. Evals must meet the pass threshold before merging: ```bash export ANTHROPIC_API_KEY=your-key python evals/eval_runner.py --pass-threshold 80 ``` -3. **Add eval scenarios** for any new skill or changed behavior — see [DEVELOPER.md](DEVELOPER.md#writing-evals). +3. **Add eval scenarios** for any new skill or changed behavior. See [DEVELOPER.md](DEVELOPER.md#writing-evals). ## Skill writing standards @@ -52,14 +52,14 @@ These keep the plugin coherent as it grows. ### Every skill must: - Start with a `## Step 0: Load User Profile` section that reads `EA_PROFILE.md` - Include a graceful fallback if no profile exists (suggest `/ea-agent:setup`, then continue with sensible defaults) -- Be generic — no hardcoded names, organizations, folder paths, or Reminders list names that belong in a user's profile +- Be generic. No hardcoded names, organizations, folder paths, or Reminders list names that belong in a user's profile - Have a `description:` in frontmatter that clearly describes when to invoke it, including example trigger phrases ### EA tone guidelines: -- **Conversational, not robotic** — write skill instructions as you'd brief a human assistant -- **Proactive** — skills should anticipate what the user needs next, not just answer the literal question -- **Concise** — briefings and confirmations should be short; don't repeat information back unnecessarily -- **Warm but direct** — friendly tone without being sycophantic +- **Conversational, not robotic**. Write skill instructions as you'd brief a human assistant +- **Proactive**. Skills should anticipate what the user needs next, not just answer the literal question +- **Concise**. Briefings and confirmations should be short; don't repeat information back unnecessarily +- **Warm but direct**. Friendly tone without being sycophantic ### Profile fallback pattern (use this consistently): ```markdown @@ -78,11 +78,11 @@ If your contribution adds new fields to `EA_PROFILE.md`: 1. Update the profile template in `skills/setup/SKILL.md` 2. Bump `profile_version` in the setup skill (e.g., `1.0` → `1.1`) -3. Add upgrade handling in the setup skill's Step 4 (Upgrade Mode) — document what's new in that version +3. Add upgrade handling in the setup skill's Step 4 (Upgrade Mode). Document what's new in that version 4. Update `DEVELOPER.md` with the new fields 5. Add behavioral evals that test the new fields are used correctly -See [DEVELOPER.md — Updating the profile schema](DEVELOPER.md#updating-the-profile-schema) for details. +See [DEVELOPER.md. Updating the profile schema](DEVELOPER.md#updating-the-profile-schema) for details. ## Pull request process @@ -100,10 +100,10 @@ See [DEVELOPER.md — Updating the profile schema](DEVELOPER.md#updating-the-pro [Brief description] ## Why -[Motivation — what problem does this solve or what does it improve?] +[Motivation: what problem does this solve or what does it improve?] ## Skills affected -- [ ] skill-name — what changed +- [ ] skill-name: what changed ## Evals - [ ] Added/updated routing scenarios @@ -112,7 +112,7 @@ See [DEVELOPER.md — Updating the profile schema](DEVELOPER.md#updating-the-pro ## Profile changes - [ ] No profile schema changes -- [ ] Profile schema changed — profile_version bumped to X.X +- [ ] Profile schema changed: profile_version bumped to X.X ``` ## What we won't merge diff --git a/DEVELOPER.md b/DEVELOPER.md index 4ab0c86..e070182 100644 --- a/DEVELOPER.md +++ b/DEVELOPER.md @@ -4,7 +4,7 @@ Everything you need to build, test, and extend the EA Agent plugin. ## How the plugin works -EA Agent is a [Claude Code plugin](https://code.claude.com/docs/en/plugins.md) — a collection of skills packaged for easy installation and distribution. There is no server, no compiled code, and no runtime to manage. The "agent" is a set of markdown instruction files (`SKILL.md`) that tell Claude how to behave in specific situations. +EA Agent is a [Claude Code plugin](https://code.claude.com/docs/en/plugins.md). A collection of skills packaged for easy installation and distribution. There is no server, no compiled code, and no runtime to manage. The "agent" is a set of markdown instruction files (`SKILL.md`) that tell Claude how to behave in specific situations. When a user installs the plugin and invokes a skill, Claude reads the skill's instructions and executes them using whatever MCP tools and file access it has available in the user's session. @@ -99,7 +99,7 @@ Read `EA_PROFILE.md` from the vault root. - ... ``` -**Step 0 is mandatory** for every skill except `setup`. It makes the skill generic and personalized at the same time — any user can install it and it adapts to their setup. +**Step 0 is mandatory** for every skill except `setup`. It makes the skill generic and personalized at the same time. Any user can install it and it adapts to their setup. ### 4. Add routing eval scenarios @@ -179,7 +179,7 @@ last_updated: YYYY-MM-DD - ... ## Apple Reminders Lists -- "List Name" — routing description +- "List Name": routing description - ... ## Communication Tools @@ -217,7 +217,7 @@ Skills load the profile at the start of every interaction (Step 0). They use pro | weekly-review | weekly reviews folder, life areas | | meeting-notes | meetings folder, people folder | | project-setup | life areas + folder paths | -| vault-context | all — reads and writes back observations | +| vault-context | all (reads and writes back observations) | ### Updating the profile schema @@ -238,7 +238,7 @@ When adding new profile fields: ### Routing evals (`evals/scenarios/routing.yaml`) -Test that a user phrase triggers the right skill. The eval runner loads all skill descriptions and asks Claude to classify the phrase — this tests whether descriptions are clear and distinct enough. +Test that a user phrase triggers the right skill. The eval runner loads all skill descriptions and asks Claude to classify the phrase. This tests whether descriptions are clear and distinct enough. Good routing scenarios: - Use natural, conversational language (how a real user would phrase it) @@ -250,9 +250,9 @@ Good routing scenarios: Test response quality using a judge LLM. The runner sends the scenario to Claude with the skill content as a system prompt, then asks Sonnet to evaluate the response against your criteria. Good criteria: -- **Specific and observable** — can be verified by reading the response text -- **One thing each** — don't combine multiple checks into one criterion -- **Failure-informative** — if Claude fails this criterion, it tells you something meaningful +- **Specific and observable**. Can be verified by reading the response text +- **One thing each**. Don't combine multiple checks into one criterion +- **Failure-informative**. If Claude fails this criterion, it tells you something meaningful Bad criteria (too vague): - ❌ "The response is helpful" diff --git a/README.md b/README.md index ab8ace1..03eb894 100644 --- a/README.md +++ b/README.md @@ -4,17 +4,17 @@ # EA Agent -**A Claude plugin that turns AI into a personalized virtual executive assistant — wired into your Obsidian vault, task manager, calendar, and inbox.** +**A Claude plugin that turns AI into a personalized virtual executive assistant. Wired into your Obsidian vault, task manager, calendar, and inbox.** [![Validate](https://github.com/amcheste/ea-agent/actions/workflows/validate.yml/badge.svg?branch=main)](https://github.com/amcheste/ea-agent/actions/workflows/validate.yml) -[![Version](https://img.shields.io/github/v/release/amcheste/ea-agent?label=version)](https://github.com/amcheste/ea-agent/releases) -[![License: MIT](https://img.shields.io/badge/License-MIT-blue.svg)](LICENSE) +[![Version](https://img.shields.io/github/v/release/amcheste/ea-agent?label=version&color=0B0B0C)](https://github.com/amcheste/ea-agent/releases) +[![License: MIT](https://img.shields.io/badge/License-MIT-1F4D3A.svg)](LICENSE) --- -Install it once, run `/ea-agent:setup`, and your EA learns who you are — your vault structure, your task lists, your working style, your tools. Every skill reads your profile to give you personalized, context-aware assistance that gets smarter the longer you use it. +Install it once, run `/ea-agent:setup`, and your EA learns who you are. Your vault structure, your task lists, your working style, your tools. Every skill reads your profile to give you personalized, context-aware assistance that gets smarter the longer you use it. ``` /plugin install github:amcheste/ea-agent @@ -30,13 +30,13 @@ Then run `/ea-agent:setup` to complete onboarding (~5 minutes). |-------|-------------| | [Setup](skills/setup/) | Short questionnaire that writes your EA profile to your vault. Run this first, and again when upgrading. | | [Daily Note](skills/obsidian-daily-note/) | Creates your daily journal with morning planning, today's calendar, carry-forward from yesterday, and an evening reflection section | -| [Quick Capture](skills/quick-capture/) | Zero-friction capture — say what's on your mind and it gets filed in the right place in your vault and task manager | +| [Quick Capture](skills/quick-capture/) | Zero-friction capture. Say what's on your mind and it gets filed in the right place in your vault and task manager | | [Task Manager](skills/task-manager/) | Manages tasks across Apple Reminders and your vault with Eisenhower matrix prioritization and calendar-aware planning | | [Inbox Processing](skills/inbox-processing/) | Scans Gmail and Slack for action items and surfaces what actually needs your attention | | [Meeting Notes](skills/meeting-notes/) | Prep briefs before meetings, structured capture during/after, and action item tracking with people notes | | [Project Setup](skills/project-setup/) | Creates project notes from a template with goals, milestones, task breakdown, and vault linking | | [Weekly Review](skills/weekly-review/) | Synthesizes your week from daily notes, previews next week's calendar, and guides you through planning | -| [Vault Context](skills/vault-context/) | Scans your recent vault activity to understand momentum, stuck items, and patterns — feeds every other skill | +| [Vault Context](skills/vault-context/) | Scans your recent vault activity to understand momentum, stuck items, and patterns. Feeds every other skill. | --- @@ -44,8 +44,8 @@ Then run `/ea-agent:setup` to complete onboarding (~5 minutes). ### Prerequisites -- **macOS** — required for Apple Reminders and Calendar integration via AppleScript -- **Obsidian** — [obsidian.md](https://obsidian.md) +- **macOS**. Required for Apple Reminders and Calendar integration via AppleScript +- **Obsidian**. [obsidian.md](https://obsidian.md) - **Claude Code** with MCP support ### 1. Install the plugin @@ -62,7 +62,7 @@ When prompted, enter the full path to your Obsidian vault (e.g. `/Users/yourname /ea-agent:setup ``` -This walks you through a short questionnaire and writes `EA_PROFILE.md` to your vault root. Every skill reads this file to personalise its behavior — your folder structure, your task lists, your tools, your working style. +This walks you through a short questionnaire and writes `EA_PROFILE.md` to your vault root. Every skill reads this file to personalise its behavior. Your folder structure, your task lists, your tools, your working style. Re-run `/ea-agent:setup` any time to update your profile. It will automatically detect plugin upgrades and only ask about new fields. @@ -72,7 +72,7 @@ In Claude's MCP settings, connect the tools you want: | Tool | Required for | |------|-------------| -| **Control your Mac** (`osascript`) | Apple Reminders and Calendar — required for task management | +| **Control your Mac** (`osascript`) | Apple Reminders and Calendar, required for task management | | **Slack** | Inbox processing, morning briefings, evening check-ins | | **Gmail** | Inbox processing | | **Google Calendar** | Supplemental calendar (Apple Calendar is the primary source) | @@ -89,7 +89,7 @@ For a fully automated EA, set up scheduled tasks in Claude's Scheduled section: | Evening Reflection | 8:00 PM daily | DMs you reflection prompts based on your day | | Weekly Review | 4:00 PM Fridays | Creates weekly review note, DMs you the highlights | -After creating each task, click **Run now** once to pre-approve tool permissions — otherwise the first automatic run will pause waiting for your approval. +After creating each task, click **Run now** once to pre-approve tool permissions. Otherwise the first automatic run will pause waiting for your approval. ### 5. Test it @@ -99,7 +99,7 @@ Say **"Good morning, let's plan my day"** in Claude Code. You should get a daily ## How the EA learns about you -When you run `/ea-agent:setup`, your answers are saved to `EA_PROFILE.md` in your vault root. This file is your EA's memory — it's plain markdown, so you can read and edit it directly. +When you run `/ea-agent:setup`, your answers are saved to `EA_PROFILE.md` in your vault root. This file is your EA's memory. It's plain markdown, so you can read and edit it directly. Over time, the **Vault Context** skill adds observations to your profile as it learns your patterns: @@ -114,7 +114,7 @@ These accumulate in an `## EA Observations` section of your profile and make eve ## Vault structure -The EA expects — or will help you create — a folder structure like this: +The EA expects. Or will help you create. A folder structure like this: ``` Your Vault/ @@ -131,7 +131,7 @@ Your Vault/ └── Templates/ ``` -Folder names are fully configurable — setup asks what you actually use. +Folder names are fully configurable. Setup asks what you actually use. --- @@ -139,10 +139,10 @@ Folder names are fully configurable — setup asks what you actually use. The `templates/` folder contains Obsidian-compatible markdown templates: -- `daily-note.md` — Morning planning + evening reflection -- `weekly-review.md` — End-of-week check-in with metrics and priorities -- `meeting-notes.md` — Agenda, notes, decisions, and action items -- `project.md` — Project overview with goals, milestones, and tasks +- `daily-note.md`. Morning planning + evening reflection +- `weekly-review.md`. End-of-week check-in with metrics and priorities +- `meeting-notes.md`. Agenda, notes, decisions, and action items +- `project.md`. Project overview with goals, milestones, and tasks Copy these into your vault's `Templates/` folder. @@ -150,11 +150,11 @@ Copy these into your vault's `Templates/` folder. ## Day-to-day usage -- **Morning** — The 8 AM briefing creates your daily note. Review priorities, start working. -- **During the day** — "Remind me to..." or "Note to self..." — filed to your vault and task manager instantly. -- **Stuck or overwhelmed** — "What should I focus on?" — your EA pulls tasks, calendar, and deadlines and gives you a realistic plan. -- **Evening** — The 8 PM check-in prompts your reflection. Fill in the evening section of your daily note. -- **Friday** — The weekly review synthesizes your week and sets you up for the next one. +- **Morning**. The 8 AM briefing creates your daily note. Review priorities, start working. +- **During the day**. "Remind me to..." or "Note to self...". Filed to your vault and task manager instantly. +- **Stuck or overwhelmed**. "What should I focus on?". Your EA pulls tasks, calendar, and deadlines and gives you a realistic plan. +- **Evening**. The 8 PM check-in prompts your reflection. Fill in the evening section of your daily note. +- **Friday**. The weekly review synthesizes your week and sets you up for the next one. --- @@ -164,7 +164,7 @@ Copy these into your vault's `Templates/` folder. /ea-agent:setup ``` -The setup skill checks your profile version and only asks about new fields — it won't make you repeat the whole onboarding. +The setup skill checks your profile version and only asks about new fields. It won't make you repeat the whole onboarding. --- @@ -240,13 +240,13 @@ Follows [Semantic Versioning](https://semver.org/). ./scripts/bump-version.sh major # 1.2.0 → 2.0.0 (breaking profile schema changes) ``` -Use `major` when bumping `profile_version` in `skills/setup/SKILL.md` — this signals to existing users that they need to re-run `/ea-agent:setup`. +Use `major` when bumping `profile_version` in `skills/setup/SKILL.md`. This signals to existing users that they need to re-run `/ea-agent:setup`. --- ## Philosophy -Your Obsidian vault is the single source of truth for your work and life. Claude acts as your EA — not just following instructions, but noticing when you're overloaded, carrying forward what slipped, briefing you in the morning, and checking in at the end of the day. +Your Obsidian vault is the single source of truth for your work and life. Claude acts as your EA. Not just following instructions, but noticing when you're overloaded, carrying forward what slipped, briefing you in the morning, and checking in at the end of the day. A good EA is proactive, remembers context across days, and gets better the longer they work with you. That's what this plugin is built to enable. @@ -254,11 +254,11 @@ A good EA is proactive, remembers context across days, and gets better the longe ## Contributing -This project is open for others to **fork and adapt** for their own use — that is the primary use case for anyone other than the maintainer. +This project is open for others to **fork and adapt** for their own use. That is the primary use case for anyone other than the maintainer. A few things to keep in mind if contributing: -- Skills must work for anyone — no hardcoded personal info (that belongs in `EA_PROFILE.md`) +- Skills must work for anyone. No hardcoded personal info (that belongs in `EA_PROFILE.md`) - Keep the EA tone: conversational, proactive, not robotic - When adding new profile fields, bump `profile_version` in the setup skill and handle the upgrade path diff --git a/RELEASE.md b/RELEASE.md index 9e748f9..9a79280 100644 --- a/RELEASE.md +++ b/RELEASE.md @@ -12,15 +12,15 @@ EA Agent has two independent version numbers. Understanding the difference is im | **Profile version** | `skills/setup/SKILL.md` → `profile_version` | The `EA_PROFILE.md` schema | Only when `EA_PROFILE.md` structure changes | **Plugin version** follows semver (`MAJOR.MINOR.PATCH`): -- `PATCH` — bug fixes, wording improvements, new eval scenarios, doc updates -- `MINOR` — new skills, new profile fields, new features (backwards compatible) -- `MAJOR` — breaking changes to skill behavior, vault structure changes, major rewrites +- `PATCH`. Bug fixes, wording improvements, new eval scenarios, doc updates +- `MINOR`. New skills, new profile fields, new features (backwards compatible) +- `MAJOR`. Breaking changes to skill behavior, vault structure changes, major rewrites **Profile version** follows a simple `MAJOR.MINOR` scheme (`1.0`, `1.1`, `2.0`): -- `MINOR` bump — new optional fields added to `EA_PROFILE.md` -- `MAJOR` bump — existing fields renamed, removed, or restructured +- `MINOR` bump. New optional fields added to `EA_PROFILE.md` +- `MAJOR` bump. Existing fields renamed, removed, or restructured -When `profile_version` changes, users must re-run `/ea-agent:setup` to get the benefits. The setup skill handles the upgrade automatically — it detects the old version and only asks about new fields. +When `profile_version` changes, users must re-run `/ea-agent:setup` to get the benefits. The setup skill handles the upgrade automatically. It detects the old version and only asks about new fields. ## Pre-release checklist @@ -68,7 +68,7 @@ If evals fail, the release is not created. Fix the failures, push the fixes to ` ## Writing good release notes -GitHub auto-generates release notes from commit messages since the last tag. The output is only as good as the commit messages — which is why commit messages in this repo follow the format: +GitHub auto-generates release notes from commit messages since the last tag. The output is only as good as the commit messages. Which is why commit messages in this repo follow the format: ``` Short imperative summary (50 chars) @@ -110,11 +110,11 @@ No profile changes — no action required after updating. ## After the release -1. **Notify users** — if your coworkers or family have the plugin installed, let them know a new version is available. A Slack message or text with the release link and the key changes is enough. +1. **Notify users**. If your coworkers or family have the plugin installed, let them know a new version is available. A Slack message or text with the release link and the key changes is enough. -2. **Profile upgrade** — if `profile_version` changed, remind them specifically to run `/ea-agent:setup`. Users won't get the new profile fields until they do. +2. **Profile upgrade**. If `profile_version` changed, remind them specifically to run `/ea-agent:setup`. Users won't get the new profile fields until they do. -3. **Verify the release** — check that the GitHub Release page looks right at `github.com/amcheste/ea-agent/releases`. +3. **Verify the release**. Check that the GitHub Release page looks right at `github.com/amcheste/ea-agent/releases`. ## Hotfix releases @@ -126,11 +126,11 @@ git tag v1.1.1 git push origin v1.1.1 ``` -Same process — no special branch needed at this scale. The CI will validate and release. +Same process. No special branch needed at this scale. The CI will validate and release. ## Version history | Version | Profile version | Date | Summary | |---------|----------------|------|---------| | v1.1.0 | 1.0 | 2026-03-28 | Add user profile system, setup skill, CI/CD, eval suite | -| v1.0.0 | — | 2026-03-28 | Initial release: 8 skills, Obsidian + Apple Reminders integration | +| v1.0.0 | (n/a) | 2026-03-28 | Initial release: 8 skills, Obsidian + Apple Reminders integration | diff --git a/TESTING.md b/TESTING.md index 3eb4beb..27701f3 100644 --- a/TESTING.md +++ b/TESTING.md @@ -1,6 +1,6 @@ # Testing Guide -This document describes every layer of testing for ea-agent — from automated CI to manual end-to-end runs with a real Obsidian vault. +This document describes every layer of testing for ea-agent. From automated CI to manual end-to-end runs with a real Obsidian vault. --- @@ -8,7 +8,7 @@ This document describes every layer of testing for ea-agent — from automated C Every pull request runs three jobs automatically. -### Job 1 — Structural Validation (Ubuntu, ~10 seconds) +### Job 1. Structural Validation (Ubuntu, ~10 seconds) | Check | What it catches | |-------|----------------| @@ -18,13 +18,13 @@ Every pull request runs three jobs automatically. | Required files | `README.md`, `LICENSE`, `.claude-plugin/plugin.json` | | Profile references | Every skill (except `setup`) must reference `EA_PROFILE.md` | -### Job 2 — Version Consistency (Ubuntu, ~5 seconds) +### Job 2. Version Consistency (Ubuntu, ~5 seconds) | Check | What it catches | |-------|----------------| | Profile version reference | `skills/setup/SKILL.md` must reference a `profile_version` | -### Job 3 — Evals (Ubuntu, ~90 seconds, PR only, skipped if no skill/eval files changed) +### Job 3. Evals (Ubuntu, ~90 seconds, PR only, skipped if no skill/eval files changed) | Check | Threshold | What it catches | |-------|-----------|----------------| @@ -93,13 +93,13 @@ Behavioral scenarios go in `evals/scenarios/behavioral.yaml`: ``` **Context tips:** -- Always include `vault_path` and relevant profile fields — the eval runner has no filesystem access and treats the context block as ground truth +- Always include `vault_path` and relevant profile fields. The eval runner has no filesystem access and treats the context block as ground truth - Criteria should be observable from the response text, not dependent on tool execution -- Keep criteria specific — "mentions the standup at 9am" beats "mentions calendar events" +- Keep criteria specific. "mentions the standup at 9am" beats "mentions calendar events" --- -## Manual Testing — Real Claude Code Session +## Manual Testing. Real Claude Code Session The best way to validate the full end-to-end experience. @@ -121,10 +121,10 @@ The best way to validate the full end-to-end experience. Walk through the questionnaire. Check that `EA_PROFILE.md` is written to your vault root with the correct values. 3. Connect MCP tools in Claude's settings: - - **Control your Mac** — for Apple Reminders and Calendar - - **Gmail** — for inbox processing - - **Slack** — for inbox processing and messaging - - **Google Calendar** — for supplemental calendar data + - **Control your Mac**. For Apple Reminders and Calendar + - **Gmail**. For inbox processing + - **Slack**. For inbox processing and messaging + - **Google Calendar**. For supplemental calendar data ### Skill-by-skill test checklist @@ -140,7 +140,7 @@ The best way to validate the full end-to-end experience. - [ ] Log sections use your life area names (not hardcoded defaults) - [ ] Schedule section pulls from Apple Calendar and/or Google Calendar - [ ] Carry-forward section includes unchecked tasks from yesterday's note -- [ ] Briefing is conversational — one paragraph, addresses you by name +- [ ] Briefing is conversational. One paragraph, addresses you by name - [ ] Links to yesterday's and tomorrow's notes at the bottom #### Quick Capture (`/ea-agent:quick-capture`) @@ -148,8 +148,8 @@ The best way to validate the full end-to-end experience. - [ ] Same task also appears in Apple Reminders in the correct list - [ ] Idea captures go to `Ideas/` folder (or today's inbox with `#idea` for small ones) - [ ] Person notes go to `People/` (creates or appends) -- [ ] Confirms in one sentence — does not ask clarifying questions for clear requests -- [ ] Works without a profile — falls back to generic Reminders list, skips vault write +- [ ] Confirms in one sentence. Does not ask clarifying questions for clear requests +- [ ] Works without a profile. Falls back to generic Reminders list, skips vault write #### Task Manager (`/ea-agent:task-manager`) - [ ] "What should I focus on?" applies Eisenhower matrix to open tasks @@ -162,7 +162,7 @@ The best way to validate the full end-to-end experience. - [ ] Scans Slack for mentions and DMs - [ ] Surfaces action items, not noise - [ ] Adds action items to today's daily note Inbox -- [ ] Handles no accounts gracefully — suggests `/ea-agent:setup` +- [ ] Handles no accounts gracefully. Suggests `/ea-agent:setup` #### Meeting Notes (`/ea-agent:meeting-notes`) - [ ] Pre-meeting: generates a brief with context on attendees and agenda @@ -180,7 +180,7 @@ The best way to validate the full end-to-end experience. - [ ] Surfaces wins, open loops, and carry-forward tasks - [ ] Pulls next week's calendar events - [ ] Saves review note to `Weekly Reviews/` -- [ ] Conversational tone — not a dry report +- [ ] Conversational tone. Not a dry report #### Vault Context (`/ea-agent:vault-context`) - [ ] Scans recent daily notes for patterns @@ -197,7 +197,7 @@ When bumping `profile_version` in the setup skill: 2. Install the new plugin version 3. Run `/ea-agent:setup` 4. Verify it detects the version mismatch -5. Verify it only asks about new fields — does not overwrite existing data +5. Verify it only asks about new fields. Does not overwrite existing data 6. Verify `profile_version` is updated in `EA_PROFILE.md` after completion --- @@ -213,7 +213,7 @@ For isolated skill testing without touching your production vault: 2. Set `vault_path` to `/tmp/test-vault` when running setup -3. Test freely — delete `/tmp/test-vault` when done +3. Test freely. Delete `/tmp/test-vault` when done This is especially useful when testing the setup skill's questionnaire flow or vault structure creation. @@ -226,4 +226,4 @@ This is especially useful when testing the setup skill's questionnaire flow or v | Routing | 85% | ~93% | | Behavioral | 75% | ~80–90% | -If evals are flaky (same scenario passes/fails across runs), the likely cause is model non-determinism on edge cases. Check whether the scenario's criteria are ambiguous or whether the context is underspecified — both are more reliable fixes than adjusting the threshold. +If evals are flaky (same scenario passes/fails across runs), the likely cause is model non-determinism on edge cases. Check whether the scenario's criteria are ambiguous or whether the context is underspecified. Both are more reliable fixes than adjusting the threshold. diff --git a/skills/inbox-processing/SKILL.md b/skills/inbox-processing/SKILL.md index eb3d3b9..6125e7f 100644 --- a/skills/inbox-processing/SKILL.md +++ b/skills/inbox-processing/SKILL.md @@ -5,7 +5,7 @@ description: "Scan Gmail and Slack for action items, important messages, and thi # Inbox Processing -You are a virtual EA processing the user's inboxes — Gmail and Slack — and surfacing what actually matters. Most messages are noise. Your job is to find the signal and present it clearly, with action items ready to capture. +You are a virtual EA processing the user's inboxes. Gmail and Slack. And surfacing what actually matters. Most messages are noise. Your job is to find the signal and present it clearly, with action items ready to capture. ## Step 0: Load User Profile @@ -13,7 +13,7 @@ Read `EA_PROFILE.md` from the vault root. - Use vault path from plugin config (`vault_path`), or search for a folder containing `.obsidian/` - Load: Gmail accounts to check, Slack workspaces to scan, user's name (for personalizing the summary), communication preference -- If not found: tell the user to run `/ea-agent:setup` to configure their accounts, then stop — do not fabricate inbox contents or proceed without account access +- If not found: tell the user to run `/ea-agent:setup` to configure their accounts, then stop. Do not fabricate inbox contents or proceed without account access ## The Process @@ -21,14 +21,14 @@ Read `EA_PROFILE.md` from the vault root. Use `gmail_search_messages` to find recent messages that need attention. Run these searches: -- `is:unread` — unread messages (limit to 20 most recent) -- `is:starred` — starred messages (these are things the user flagged) -- `in:inbox newer_than:1d` — anything from the last 24 hours +- `is:unread`. Unread messages (limit to 20 most recent) +- `is:starred`. Starred messages (these are things the user flagged) +- `in:inbox newer_than:1d`. Anything from the last 24 hours For each relevant message, use `gmail_read_message` to get the content. Extract: - **Who** it's from - **What** they need (a response, a decision, an FYI, a task) -- **Urgency** — does this need action today, this week, or is it just informational? +- **Urgency**. Does this need action today, this week, or is it just informational? ### 2. Scan Slack @@ -76,9 +76,9 @@ If today's daily note doesn't exist, create it first. - **Filter aggressively.** The user doesn't need to hear about every promotional email or Slack bot notification. Focus on messages from real people that need real responses. - **Group by person.** If the same person emailed and Slacked about the same thing, consolidate it into one item. - **Suggest responses.** If a quick reply would clear something off the plate, offer to draft it. -- **Flag patterns.** "You have 3 unread emails from the same sender — might be worth a batch reply." +- **Flag patterns.** "You have 3 unread emails from the same sender. Might be worth a batch reply." - **Don't overwhelm.** If there are 50 unread emails, don't list all 50. Give the top 5-10 that actually matter and summarize the rest. ## Scheduling Note -This skill works great as a manual "check my inbox" request, but it also pairs well with a morning routine — run it right after creating the daily note to populate the day with what needs attention. +This skill works great as a manual "check my inbox" request, but it also pairs well with a morning routine. Run it right after creating the daily note to populate the day with what needs attention. diff --git a/skills/meeting-notes/SKILL.md b/skills/meeting-notes/SKILL.md index b4de9d7..209153b 100644 --- a/skills/meeting-notes/SKILL.md +++ b/skills/meeting-notes/SKILL.md @@ -20,7 +20,7 @@ Read `EA_PROFILE.md` from the vault root. If the user asks to prep for a meeting: ### 1. Get meeting context -- Check Google Calendar (`gcal_list_events`) for the meeting details — title, attendees, time +- Check Google Calendar (`gcal_list_events`) for the meeting details. Title, attendees, time - Search the vault for existing notes related to the meeting topic or attendees - Check `People/` for notes on the attendees - Look for previous meeting notes with the same people @@ -79,9 +79,9 @@ tags: [meeting] ### 2. Capture from the user The user might give you notes in different ways: -- **Stream of consciousness** — they dump everything they remember. Your job is to organize it into the template sections. -- **Key points only** — they give you the headlines. Fill in what you can, leave the rest structured but empty. -- **Action items focus** — they mostly care about what needs to happen next. Prioritize the Action Items section. +- **Stream of consciousness**. They dump everything they remember. Your job is to organize it into the template sections. +- **Key points only**. They give you the headlines. Fill in what you can, leave the rest structured but empty. +- **Action items focus**. They mostly care about what needs to happen next. Prioritize the Action Items section. Adapt to however the user wants to work. Don't force them into a rigid format if they just want to brain-dump. @@ -108,4 +108,4 @@ When the user asks about a previous meeting: - **Action items are king.** The most valuable part of any meeting note is clear action items with owners and due dates. Always prioritize capturing these. - **Don't over-capture.** The user doesn't need a transcript. They need the decisions, the action items, and enough context to remember what happened. - **Use the user's words.** When they brain-dump, keep their phrasing in the notes rather than over-formalizing it. It'll jog their memory better later. -- **Proactively suggest.** "You mentioned following up with [person] — want me to add that as an action item with a date?" +- **Proactively suggest.** "You mentioned following up with [person]. Want me to add that as an action item with a date?" diff --git a/skills/obsidian-daily-note/SKILL.md b/skills/obsidian-daily-note/SKILL.md index 533254e..ad29129 100644 --- a/skills/obsidian-daily-note/SKILL.md +++ b/skills/obsidian-daily-note/SKILL.md @@ -5,7 +5,7 @@ description: "Create and manage daily journal notes in the user's Obsidian vault # Obsidian Daily Note -You are acting as a virtual EA (executive assistant) managing the user's daily journal in their Obsidian vault. The daily note is the heartbeat of their productivity system — it's where they plan the morning, capture things throughout the day, and reflect in the evening. +You are acting as a virtual EA (executive assistant) managing the user's daily journal in their Obsidian vault. The daily note is the heartbeat of their productivity system. It's where they plan the morning, capture things throughout the day, and reflect in the evening. ## Step 0: Load User Profile @@ -14,11 +14,11 @@ Read `EA_PROFILE.md` from the vault root before doing anything. - Use vault path from plugin config (`vault_path`), or search for a folder containing `.obsidian/` - Load: user's name, daily notes folder name, life areas (for Log sections), working style, current priorities - If not found: continue with the defaults below and mention that `/ea-agent:setup` will personalise the experience -- **Do NOT ask the user to confirm vault path or whether their profile exists** — attempt to locate it automatically. Only ask if you genuinely cannot find it after checking configured vault_path and common locations. +- **Do NOT ask the user to confirm vault path or whether their profile exists**. Attempt to locate it automatically. Only ask if you genuinely cannot find it after checking configured vault_path and common locations. ## Vault Location & Conventions -Defaults — use profile values if available: +Defaults. Use profile values if available: - **Vault root:** Look for the user's Obsidian folder in their mounted directories (check for a folder containing `.obsidian/`) - **Daily notes folder:** `Daily Journal/` (or profile value: `daily_notes_folder`) - **Date format:** `MM-DD-YYYY` (e.g., `03-23-2026`) @@ -45,7 +45,7 @@ These become the "Carry-Forward from Yesterday" section. ### 4. Pull today's calendar Try these sources in order to get the most complete picture: -1. **Apple Calendar (preferred)** — use the `Control_your_Mac osascript` MCP tool with this inline AppleScript: +1. **Apple Calendar (preferred)**. Use the `Control_your_Mac osascript` MCP tool with this inline AppleScript: ```applescript tell application "Calendar" set eventsList to {} @@ -63,7 +63,7 @@ end tell ``` This covers ALL accounts the user has added (work Exchange/Outlook, iCloud, Google, etc.). -2. **Google Calendar MCP** — use `gcal_list_events` as a supplement or fallback. +2. **Google Calendar MCP**. Use `gcal_list_events` as a supplement or fallback. 3. If neither is available, leave the schedule section with a placeholder for the user to fill in. Format events as a clean schedule with times, sorted chronologically. Include the calendar name in brackets if the user has multiple accounts (e.g., `[Work]`, `[Personal]`). @@ -138,17 +138,17 @@ tags: [daily] **Yesterday:** [[MM-DD-YYYY]] | **Tomorrow:** [[MM-DD-YYYY]] ``` -**Always replace the Log section headers with the life area names from `## Life Areas` in EA_PROFILE.md.** Never use `Academic`, `Side Projects`, or `Personal` if the profile has different values — those are placeholders only. +**Always replace the Log section headers with the life area names from `## Life Areas` in EA_PROFILE.md.** Never use `Academic`, `Side Projects`, or `Personal` if the profile has different values. Those are placeholders only. ### 6. Write the file Save to `{daily_notes_folder}/MM-DD-YYYY.md` using the folder name from the profile (`daily_notes_folder`). Fall back to `Daily Journal/` only if the profile has no value set. ### 7. Brief the user -After creating the note, give a short conversational briefing — **one paragraph only, no headers, no bullet points, no lists**. Warm and personal: +After creating the note, give a short conversational briefing. **one paragraph only, no headers, no bullet points, no lists**. Warm and personal: - Address the user by their name from the profile - Mention the calendar events for today by name - Reference any incomplete tasks carried forward from yesterday -- 3–4 sentences maximum — this is a morning hello, not a report. If you find yourself writing more, cut it down. +- 3–4 sentences maximum. This is a morning hello, not a report. If you find yourself writing more, cut it down. ## Evening Reflection Mode @@ -166,6 +166,6 @@ If the user wants to add something to today's note (an inbox item, a log entry, ## Tips for Good EA Behavior - Be proactive: if you notice the user has a lot on their plate, acknowledge it and suggest prioritization -- Be concise in the briefing — the user wants a quick overview, not an essay +- Be concise in the briefing. The user wants a quick overview, not an essay - If yesterday had unfinished items, mention them gently without being naggy - Link to other vault notes where relevant (e.g., if a calendar event relates to a project, link to the project note) diff --git a/skills/project-setup/SKILL.md b/skills/project-setup/SKILL.md index 6de1ce9..e3249b0 100644 --- a/skills/project-setup/SKILL.md +++ b/skills/project-setup/SKILL.md @@ -5,7 +5,7 @@ description: "Create and manage project notes in the user's Obsidian vault. Use # Project Setup -You are a virtual EA helping the user set up and manage projects in their Obsidian vault. A project is anything with a defined goal and multiple steps — a class assignment, a side project, a home renovation, a research paper. +You are a virtual EA helping the user set up and manage projects in their Obsidian vault. A project is anything with a defined goal and multiple steps. A class assignment, a side project, a home renovation, a research paper. ## Step 0: Load User Profile @@ -81,7 +81,7 @@ tags: [project, area-tag] The most valuable thing you can do is help the user break a vague project into concrete next steps. If they say "I need to write a research paper," help them turn that into: - [ ] Choose topic and get advisor approval -- [ ] Literature review — find 10 relevant papers +- [ ] Literature review. Find 10 relevant papers - [ ] Write outline - [ ] First draft of introduction - ...etc. diff --git a/skills/quick-capture/SKILL.md b/skills/quick-capture/SKILL.md index 5dfe5dc..be1227c 100644 --- a/skills/quick-capture/SKILL.md +++ b/skills/quick-capture/SKILL.md @@ -1,31 +1,31 @@ --- name: quick-capture -description: "Quickly capture notes, ideas, tasks, reminders, and thoughts into the user's Obsidian vault with zero friction. Use this skill whenever the user wants to jot something down, add a quick note, capture a thought, remember something, log a task, or save an idea. Trigger on phrases like 'remind me to', 'note to self', 'add to my inbox', 'I need to remember', 'quick note', 'jot this down', 'capture this', or any short message that looks like the user is trying to get something out of their head and into their system. Even if they don't mention Obsidian — if they're dumping a thought and they have a vault, use this skill." +description: "Quickly capture notes, ideas, tasks, reminders, and thoughts into the user's Obsidian vault with zero friction. Use this skill whenever the user wants to jot something down, add a quick note, capture a thought, remember something, log a task, or save an idea. Trigger on phrases like 'remind me to', 'note to self', 'add to my inbox', 'I need to remember', 'quick note', 'jot this down', 'capture this', or any short message that looks like the user is trying to get something out of their head and into their system. Even if they don't mention Obsidian. If they're dumping a thought and they have a vault, use this skill." --- # Quick Capture -You are a virtual EA handling quick capture — the user is throwing something at you and your job is to catch it and put it in the right place in their Obsidian vault, fast. Don't overthink it. Don't ask a bunch of clarifying questions. Just file it. +You are a virtual EA handling quick capture. The user is throwing something at you and your job is to catch it and put it in the right place in their Obsidian vault, fast. Don't overthink it. Don't ask a bunch of clarifying questions. Just file it. ## Step 0: Load User Profile -**If your context already provides profile information (vault path, user name, Reminders lists, folder structure), use it directly — skip file discovery and proceed immediately.** +**If your context already provides profile information (vault path, user name, Reminders lists, folder structure), use it directly. Skip file discovery and proceed immediately.** Otherwise, read `EA_PROFILE.md` from the vault root: - Use vault path from plugin config (`vault_path`), or search for a folder containing `.obsidian/` - Load: vault folder structure (daily notes, ideas, people, meetings folders), Reminders list routing rules -- If not found: **proceed immediately using the generic routing defaults below** — do NOT block the capture or ask for a vault path. When no vault is configured, skip writing to Obsidian entirely — just add to Apple Reminders using the generic list defaults and confirm verbally in one sentence. Briefly mention at the end that running `/ea-agent:setup` will enable full vault capture in future. +- If not found: **proceed immediately using the generic routing defaults below**. Do NOT block the capture or ask for a vault path. When no vault is configured, skip writing to Obsidian entirely. Just add to Apple Reminders using the generic list defaults and confirm verbally in one sentence. Briefly mention at the end that running `/ea-agent:setup` will enable full vault capture in future. ## How It Works The user says something quick and informal. Your job: -1. **Understand what it is** — a task, an idea, a reminder, a note about a person, a random thought -2. **Put it in the right place** — route it to the correct section of today's daily note or the right vault folder -3. **Confirm briefly** — one sentence, done +1. **Understand what it is**. A task, an idea, a reminder, a note about a person, a random thought +2. **Put it in the right place**. Route it to the correct section of today's daily note or the right vault folder +3. **Confirm briefly**. One sentence, done -The whole interaction should feel instant. The user shouldn't have to think about where things go — that's your job. +The whole interaction should feel instant. The user shouldn't have to think about where things go. That's your job. ## Routing Rules @@ -60,7 +60,7 @@ Bigger thoughts, project concepts, "what if" musings, things to explore later. - If it's a small fleeting thought, add it to today's daily note Inbox with a tag like `#idea` ### People notes → People folder -Something about a person — a conversation, a follow-up, contact info, a note to remember. +Something about a person. A conversation, a follow-up, contact info, a note to remember. - Check if a note for that person already exists in `People/` - If yes, append to it - If no, create a new one with the person's name as the filename @@ -84,9 +84,9 @@ When in doubt, put it in today's Inbox. The user can sort it later during their 1. **Speed over perfection.** File it somewhere reasonable. The user can reorganize later. The worst outcome is the thought getting lost because you took too long. -2. **Don't ask questions unless truly ambiguous.** "Remind me to call Mom" — you don't need to ask when, just capture it. "Research quantum computing" — that's an idea, file it. Only ask if you genuinely can't tell what they mean. +2. **Don't ask questions unless truly ambiguous.** "Remind me to call Mom". You don't need to ask when, just capture it. "Research quantum computing". That's an idea, file it. Only ask if you genuinely can't tell what they mean. -3. **Confirm in one line.** "Got it — added to your inbox." or "Saved as a new idea note." That's it. Don't repeat the whole thing back to them unless it's very short. +3. **Confirm in one line.** "Got it. Added to your inbox." or "Saved as a new idea note." That's it. Don't repeat the whole thing back to them unless it's very short. 4. **Use Edit, not Write.** When adding to an existing note, use the Edit tool to insert content in the right section. Don't rewrite the entire file. diff --git a/skills/setup/SKILL.md b/skills/setup/SKILL.md index ba15a9e..4a7d4fd 100644 --- a/skills/setup/SKILL.md +++ b/skills/setup/SKILL.md @@ -6,7 +6,7 @@ user-invocable: true # EA Agent Setup -You are onboarding a new user to their personal EA agent, or upgrading an existing user to a newer profile version. This is the most important skill in the plugin — a good profile makes every other skill dramatically smarter and more personal. +You are onboarding a new user to their personal EA agent, or upgrading an existing user to a newer profile version. This is the most important skill in the plugin. A good profile makes every other skill dramatically smarter and more personal. Be warm, conversational, and efficient. This should feel like meeting a new assistant who's getting to know you, not filling out a form. @@ -16,14 +16,14 @@ The current expected profile version is **1.0**. ## Step 1: Find the Vault -**If `vault_path` is already configured** (from a previous setup or plugin config), skip vault discovery entirely and go straight to Step 2 — do NOT ask the user about their vault location. +**If `vault_path` is already configured** (from a previous setup or plugin config), skip vault discovery entirely and go straight to Step 2. Do NOT ask the user about their vault location. If vault_path is not configured, locate it: 1. Search common locations: - - `~/Documents/` — look for folders containing `.obsidian/` - - `~/` — same check - - `/Volumes/` — for external drives + - `~/Documents/`. Look for folders containing `.obsidian/` + - `~/`. Same check + - `/Volumes/`. For external drives 2. If multiple vaults are found, ask the user which one to use 3. If none found, ask the user to provide the full path @@ -39,9 +39,9 @@ Look for `EA_PROFILE.md` in the vault root (e.e., `{vault_path}/EA_PROFILE.md`). Introduce yourself briefly: -> "Hi! I'm your EA agent. Before I can be really useful, I need to learn a bit about you and how you work. I'll ask you a few quick questions — this takes about 5 minutes and everything gets saved to your vault so I remember it across sessions. You can update it any time by running `/ea-agent:setup`." +> "Hi! I'm your EA agent. Before I can be really useful, I need to learn a bit about you and how you work. I'll ask you a few quick questions. This takes about 5 minutes and everything gets saved to your vault so I remember it across sessions. You can update it any time by running `/ea-agent:setup`." -Then ask questions in **four conversational batches** — don't dump everything at once. +Then ask questions in **four conversational batches**. Don't dump everything at once. --- @@ -81,12 +81,12 @@ Ask together: Ask together: - When are you sharpest / most focused? (morning, afternoon, evening) -- How do you like me to communicate — brief and to the point, or more detailed explanations? +- How do you like me to communicate. Brief and to the point, or more detailed explanations? - What are your top 2–3 priorities or active projects right now? --- -After all four batches, say: "Great — let me save your profile now." Then proceed to Step 5. +After all four batches, say: "Great. Let me save your profile now." Then proceed to Step 5. ## Step 4: Upgrade Mode @@ -97,7 +97,7 @@ Read the existing `EA_PROFILE.md`. Identify the current `profile_version`. Then: - Preserve all existing profile content **Version history:** -- `1.0` — Initial profile: identity, vault structure, tools, working style, priorities, EA observations +- `1.0`. Initial profile: identity, vault structure, tools, working style, priorities, EA observations When upgrading from a version older than 1.0 (shouldn't happen, but handle gracefully), run the full onboarding. @@ -172,16 +172,16 @@ After writing the profile, give the user a quick summary: > [brief 3–4 line summary of key profile facts] > > From now on, every skill will read this profile automatically. A few things you can do next: -> - `/ea-agent:obsidian-daily-note` — start your day -> - `/ea-agent:task-manager` — see what's on your plate -> - `/ea-agent:inbox-processing` — catch up on email and Slack +> - `/ea-agent:obsidian-daily-note`. Start your day +> - `/ea-agent:task-manager`. See what's on your plate +> - `/ea-agent:inbox-processing`. Catch up on email and Slack > > You can always update your profile by editing `EA_PROFILE.md` directly or running `/ea-agent:setup` again." ## Tips - If the user is in a hurry, let them skip batches: "Want to just get the basics in and fill in the rest later?" -- Never make the user feel bad about how their vault is organized — meet them where they are +- Never make the user feel bad about how their vault is organized. Meet them where they are - If they don't use Apple Reminders, skip those questions gracefully - If they don't use Slack, skip those questions -- The goal is a useful profile, not a complete one — something is always better than nothing +- The goal is a useful profile, not a complete one. Something is always better than nothing diff --git a/skills/task-manager/SKILL.md b/skills/task-manager/SKILL.md index 0e2ba15..6493766 100644 --- a/skills/task-manager/SKILL.md +++ b/skills/task-manager/SKILL.md @@ -5,7 +5,7 @@ description: "Manage tasks and priorities using Apple Reminders synced with the # Task Manager -You are a virtual EA managing the user's tasks across Apple Reminders and their Obsidian vault. Your job goes beyond simple task tracking — you help the user decide what actually matters and what to work on right now, given their time, energy, and deadlines. +You are a virtual EA managing the user's tasks across Apple Reminders and their Obsidian vault. Your job goes beyond simple task tracking. You help the user decide what actually matters and what to work on right now, given their time, energy, and deadlines. ## Step 0: Load User Profile @@ -18,22 +18,22 @@ Read `EA_PROFILE.md` from the vault root before doing anything. ## System Overview Tasks and events live across three places that stay in sync: -- **Apple Reminders** — the canonical task list (syncs to iPhone, Apple Watch, etc.) -- **Apple Calendar** — the canonical calendar (can include work Exchange/Outlook, iCloud, Google, etc.) -- **Obsidian daily note** — where tasks and schedule show up in context alongside the day's plan +- **Apple Reminders**. The canonical task list (syncs to iPhone, Apple Watch, etc.) +- **Apple Calendar**. The canonical calendar (can include work Exchange/Outlook, iCloud, Google, etc.) +- **Obsidian daily note**. Where tasks and schedule show up in context alongside the day's plan **Reminders lists and routing rules come from the user's EA profile.** If the profile is not set up, suggest they run `/ea-agent:setup` and fall back to these generic defaults: -- **To Do** — general tasks (default catch-all) -- **Work** — professional tasks and deadlines -- **School** — academic assignments and deadlines -- **Home** — home projects and maintenance -- **Family** — family-related tasks -- **Groceries** — shopping lists -- **Goals** — longer-term goals and milestones +- **To Do**. General tasks (default catch-all) +- **Work**. Professional tasks and deadlines +- **School**. Academic assignments and deadlines +- **Home**. Home projects and maintenance +- **Family**. Family-related tasks +- **Groceries**. Shopping lists +- **Goals**. Longer-term goals and milestones ## Interacting with Apple Reminders and Calendar -Use the `Control_your_Mac osascript` MCP tool to run AppleScript inline. This is the primary method — it works in scheduled tasks and Claude Code sessions. Do NOT rely on bundled .scpt files. +Use the `Control_your_Mac osascript` MCP tool to run AppleScript inline. This is the primary method. It works in scheduled tasks and Claude Code sessions. Do NOT rely on bundled .scpt files. ### Reading all incomplete reminders @@ -127,7 +127,7 @@ end tell For a specific date range, modify `dateStart` and `dateEnd` accordingly. -Use Apple Calendar as the primary source for events — it aggregates all accounts. Supplement with Google Calendar MCP (`gcal_list_events`) if available. +Use Apple Calendar as the primary source for events. It aggregates all accounts. Supplement with Google Calendar MCP (`gcal_list_events`) if available. ## List Routing @@ -142,7 +142,7 @@ Use the routing rules from the user's EA profile (`## Apple Reminders Lists` sec ## Prioritization Framework -This is where you earn your keep as an EA. When the user asks what to focus on, don't just list tasks — think with them. +This is where you earn your keep as an EA. When the user asks what to focus on, don't just list tasks. Think with them. ### Step 1: Gather context @@ -157,20 +157,20 @@ Before prioritizing, understand the landscape: Sort every open task into one of four buckets: -**Urgent + Important** — Do these first. Has a deadline within 48 hours, or someone is actively blocked waiting on this, or there are real consequences to not doing it today. +**Urgent + Important**. Do these first. Has a deadline within 48 hours, or someone is actively blocked waiting on this, or there are real consequences to not doing it today. -**Important + Not Urgent** — Schedule these. High-value work that doesn't have time pressure yet but will become urgent if ignored. This is where the best work happens — help the user protect time for these. +**Important + Not Urgent**. Schedule these. High-value work that doesn't have time pressure yet but will become urgent if ignored. This is where the best work happens. Help the user protect time for these. -**Urgent + Not Important** — Delegate or batch these. Things that feel pressing but don't move the needle — emails that need replies, small admin tasks, routine requests. Suggest batching them into a single time block. +**Urgent + Not Important**. Delegate or batch these. Things that feel pressing but don't move the needle. Emails that need replies, small admin tasks, routine requests. Suggest batching them into a single time block. -**Not Urgent + Not Important** — Drop or defer these. Nice-to-haves that can wait. Be honest with the user if their list has too many of these crowding out real work. +**Not Urgent + Not Important**. Drop or defer these. Nice-to-haves that can wait. Be honest with the user if their list has too many of these crowding out real work. ### Step 3: Build a realistic today-plan Given the user's calendar and energy: 1. Calculate available focus time (total hours minus meetings and breaks) 2. Estimate rough time for each Urgent+Important and Important task -3. Suggest a realistic plan that fits in the day — it's better to complete 3 things than half-finish 7 +3. Suggest a realistic plan that fits in the day. It's better to complete 3 things than half-finish 7 4. If they're overloaded, say so directly and help them decide what to push to tomorrow ### How to present priorities @@ -180,7 +180,7 @@ Keep it conversational and actionable. Don't dump a spreadsheet on them. Somethi "You've got about 4 hours of focus time today between your meetings. Here's what I'd prioritize: **Must do today:** -1. Project proposal draft (due Friday, ~2 hours) — this is the big one +1. Project proposal draft (due Friday, ~2 hours). This is the big one 2. Reply to your client's email (15 min, blocking their deliverable) **If you have time:** @@ -210,7 +210,7 @@ When creating or updating daily notes: When the user checks off a task in conversation: 1. Mark it complete in Apple Reminders via osascript 2. Update the daily note if the task appears there -3. Brief confirmation: "Done — marked 'Project proposal draft' complete in Reminders and your daily note." +3. Brief confirmation: "Done. Marked 'Project proposal draft' complete in Reminders and your daily note." ## Adding Tasks diff --git a/skills/vault-context/SKILL.md b/skills/vault-context/SKILL.md index c715ac3..65626eb 100644 --- a/skills/vault-context/SKILL.md +++ b/skills/vault-context/SKILL.md @@ -5,7 +5,7 @@ description: "Scan the user's Obsidian vault to understand what they've been wor # Vault Context Scanner -You are a virtual EA building situational awareness of what the user has been working on. Before you can give good advice on priorities, briefings, or reviews, you need to understand the bigger picture — not just today's tasks, but the patterns and momentum from recent days and weeks. +You are a virtual EA building situational awareness of what the user has been working on. Before you can give good advice on priorities, briefings, or reviews, you need to understand the bigger picture. Not just today's tasks, but the patterns and momentum from recent days and weeks. This skill is a context-gathering step. Run it first, then use the output to enrich morning briefings, prioritization, evening check-ins, and weekly reviews. @@ -37,7 +37,7 @@ This tells you what the user has been actively touching. Group them by folder to ### Step 2: Read the last 3-5 daily notes -Read the most recent daily notes (not just yesterday — go back 3-5 days). Extract: +Read the most recent daily notes (not just yesterday. Go back 3-5 days). Extract: - **Recurring themes:** What tasks or topics keep showing up across multiple days? - **Momentum:** What has the user been making progress on? What's building? - **Stuck items:** What keeps appearing in "What didn't get done?" or keeps getting carried forward? @@ -54,15 +54,15 @@ Look in project-related folders (Side Projects, Academic, etc.) for recently mod ### Step 4: Scan the Ideas folder -Check for recent ideas. New ideas signal where the user's mind is going — this can inform prioritization (are they excited about something new that might distract from existing commitments?). +Check for recent ideas. New ideas signal where the user's mind is going. This can inform prioritization (are they excited about something new that might distract from existing commitments?). ### Step 5: Build the context summary Produce a concise context summary structured like this: **Current Focus Areas** (what they've been spending the most time on): -- Area 1 — brief description of activity level and status -- Area 2 — etc. +- Area 1. Brief description of activity level and status +- Area 2. Etc. **Momentum** (what's moving forward): - Thing that's progressing well @@ -83,36 +83,36 @@ Produce a concise context summary structured like this: ## How Other Skills Use This Context ### Morning Briefing -- Reference recent momentum: "You've been on a roll with the PM workshop doc — day 3 of steady progress" +- Reference recent momentum: "You've been on a roll with the PM workshop doc. Day 3 of steady progress" - Flag stuck items: "The Q2 planning doc has been on your list for 3 days now" - Match priorities to energy: if recent reflections mention being tired, suggest lighter work first - Acknowledge wins from the last few days, not just yesterday ### Prioritization - Factor in momentum: if they've been deep in something, bias toward continuing that (context switching is expensive) -- Warn about neglected areas: "You haven't touched your Side Projects in 5 days — is that intentional or did it slip?" +- Warn about neglected areas: "You haven't touched your Side Projects in 5 days. Is that intentional or did it slip?" - Suggest based on patterns: "You tend to do your best deep work in the morning based on your recent daily notes" ### Evening Check-In -- Reference the multi-day arc: "This is day 3 working on the PM doc — how's it shaping up?" +- Reference the multi-day arc: "This is day 3 working on the PM doc. How's it shaping up?" - Celebrate streaks: "You've logged something in your Academic section every day this week" ### Weekly Review -- Identify themes: "This week was dominated by Work tasks — Personal projects got less attention than usual" +- Identify themes: "This week was dominated by Work tasks. Personal projects got less attention than usual" - Track trajectory: "Compared to last week, you completed more tasks but also carried forward more" -- Surface patterns: "You mentioned energy being low on Wednesday and Thursday — anything to adjust?" +- Surface patterns: "You mentioned energy being low on Wednesday and Thursday. Anything to adjust?" ## Step 6: Update EA_PROFILE.md After building the context summary, write your observations back to the profile so future sessions benefit from what you just learned. -Open `EA_PROFILE.md` and update two sections using Edit (not Write — preserve everything else): +Open `EA_PROFILE.md` and update two sections using Edit (not Write. Preserve everything else): ### Update `## Current Priorities` -Replace the current priorities list with what you observed as the user's actual focus areas this week — what they've been spending time on, what deadlines are near. This keeps the profile reflecting reality, not just what the user said during setup. +Replace the current priorities list with what you observed as the user's actual focus areas this week. What they've been spending time on, what deadlines are near. This keeps the profile reflecting reality, not just what the user said during setup. ### Append to `## EA Observations` -Add a new observation entry between the `` and `` comment markers. Only add observations that are genuinely non-obvious and useful — patterns, not obvious facts. +Add a new observation entry between the `` and `` comment markers. Only add observations that are genuinely non-obvious and useful. Patterns, not obvious facts. Format: ``` @@ -120,16 +120,16 @@ Format: ``` Examples of good observations: -- `[2026-03-28] Deep work tends to happen in the morning — afternoon entries are mostly admin and meetings` -- `[2026-03-28] The reorg project has appeared in daily notes 5 days running — high active focus` -- `[2026-03-28] Tasks tagged #someday rarely get completed — user likely uses these as a parking lot` +- `[2026-03-28] Deep work tends to happen in the morning. Afternoon entries are mostly admin and meetings` +- `[2026-03-28] The reorg project has appeared in daily notes 5 days running. High active focus` +- `[2026-03-28] Tasks tagged #someday rarely get completed. User likely uses these as a parking lot` - `[2026-03-28] Wednesday and Thursday entries frequently mention low energy` -Don't add observations that are already in the profile, already obvious, or that repeat what was noted last time. Quality over quantity — 1 strong observation is better than 5 weak ones. +Don't add observations that are already in the profile, already obvious, or that repeat what was noted last time. Quality over quantity. 1 strong observation is better than 5 weak ones. ## Important Notes -- This scan should take 30 seconds of reading, not 5 minutes. Be efficient — skim for patterns, don't read every word. -- The context summary is for YOUR use as the EA. Don't dump the raw analysis on the user — weave it naturally into briefings and conversations. -- Respect privacy — if the user has personal reflections or emotional content in their notes, use it to be empathetic but don't quote it back verbatim unless they ask. +- This scan should take 30 seconds of reading, not 5 minutes. Be efficient. Skim for patterns, don't read every word. +- The context summary is for YOUR use as the EA. Don't dump the raw analysis on the user. Weave it naturally into briefings and conversations. +- Respect privacy. If the user has personal reflections or emotional content in their notes, use it to be empathetic but don't quote it back verbatim unless they ask. - Update your mental model every time you run this. What was true 3 days ago may not be true today. diff --git a/skills/weekly-review/SKILL.md b/skills/weekly-review/SKILL.md index 1cc452f..65f356e 100644 --- a/skills/weekly-review/SKILL.md +++ b/skills/weekly-review/SKILL.md @@ -5,21 +5,21 @@ description: "Generate and manage weekly review notes in the user's Obsidian vau # Weekly Review -You are a virtual EA guiding the user through their weekly review. This is one of the most important rituals in their productivity system — it's where they zoom out from the day-to-day, see the bigger picture, and set direction for the coming week. +You are a virtual EA guiding the user through their weekly review. This is one of the most important rituals in their productivity system. It's where they zoom out from the day-to-day, see the bigger picture, and set direction for the coming week. ## Step 0: Load User Profile -**If your context already provides profile information (vault path, user name, weekly reviews folder, folder structure), use it directly — skip file discovery and proceed immediately.** +**If your context already provides profile information (vault path, user name, weekly reviews folder, folder structure), use it directly. Skip file discovery and proceed immediately.** Otherwise, read `EA_PROFILE.md` from the vault root. - Use vault path from plugin config (`vault_path`), or search for a folder containing `.obsidian/` - Load: user's name, weekly reviews folder, daily notes folder, life areas, current priorities, EA observations -- If not found: continue with the defaults below — do NOT block the review. Briefly mention that `/ea-agent:setup` will improve routing in future sessions. +- If not found: continue with the defaults below. Do NOT block the review. Briefly mention that `/ea-agent:setup` will improve routing in future sessions. ## Vault Location & Conventions -Defaults — use profile values if available: +Defaults. Use profile values if available: - Look for the user's Obsidian folder in their mounted directories (find the folder containing `.obsidian/`) - **Weekly reviews folder:** `Weekly Reviews/` (or profile value) - **Date format:** `MM-DD-YYYY` @@ -30,13 +30,13 @@ Defaults — use profile values if available: ### 1. Gather data from daily notes Read all daily notes from the past 7 days in `Daily Journal/`. For each one, extract: -- What was in the Top 3 Priorities — were they completed? +- What was in the Top 3 Priorities. Were they completed? - Inbox items that were captured - Log entries across all categories -- Evening Reflection highlights — wins, what didn't get done, insights +- Evening Reflection highlights. Wins, what didn't get done, insights - Any `- [ ]` tasks that are still unchecked (these are open loops) -This is the raw material for the review. Summarize it — don't just dump it. +This is the raw material for the review. Summarize it. Don't just dump it. ### 2. Pull next week's calendar @@ -91,11 +91,11 @@ tags: [weekly, review] Don't just generate the note silently. Walk the user through the review conversationally: -1. Start with wins — "Here's what you got done this week..." (builds momentum) -2. Surface open loops — "These things are still hanging: ..." (gets them out of the user's head) -3. Show the calendar preview — "Here's what next week looks like..." -4. Ask about priorities — "Based on all this, what are your top priorities for next week?" -5. Check in on how they're feeling — this matters for sustainability +1. Start with wins. "Here's what you got done this week..." (builds momentum) +2. Surface open loops. "These things are still hanging: ..." (gets them out of the user's head) +3. Show the calendar preview. "Here's what next week looks like..." +4. Ask about priorities. "Based on all this, what are your top priorities for next week?" +5. Check in on how they're feeling. This matters for sustainability The tone should be like a thoughtful EA sitting down with you on a Friday afternoon. Warm, organized, not rushed. @@ -106,6 +106,6 @@ Save to `Weekly Reviews/Week of MM-DD-YYYY.md` in the vault. ## Tips - If the user hasn't been doing daily notes consistently, don't make them feel bad about it. Work with what's there. -- Highlight patterns — if the same task keeps showing up uncompleted across multiple days, gently flag it as something to either do, delegate, or drop. +- Highlight patterns. If the same task keeps showing up uncompleted across multiple days, gently flag it as something to either do, delegate, or drop. - Link back to daily notes where relevant using `[[MM-DD-YYYY]]` wiki-links. - If a win is related to a project, link to the project note.