{"id":49700863,"url":"https://github.com/amcheste/ea-agent","last_synced_at":"2026-05-08T07:13:41.935Z","repository":{"id":346588576,"uuid":"1189922459","full_name":"amcheste/ea-agent","owner":"amcheste","description":"A Claude plugin that turns AI into a personalized virtual executive assistant — built around your Obsidian vault, with skills for daily planning, task management, inbox processing, and more.","archived":false,"fork":false,"pushed_at":"2026-04-29T22:45:34.000Z","size":546,"stargazers_count":0,"open_issues_count":2,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-04-30T00:33:21.069Z","etag":null,"topics":["ai-agent","claude","claude-code","executive-assistant","obsidian","productivity"],"latest_commit_sha":null,"homepage":null,"language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/amcheste.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":".github/CODEOWNERS","security":"SECURITY.md","support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-03-23T19:54:03.000Z","updated_at":"2026-04-29T22:45:37.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/amcheste/ea-agent","commit_stats":null,"previous_names":["amcheste/ea-skills","amcheste/ea-agent"],"tags_count":8,"template":false,"template_full_name":null,"purl":"pkg:github/amcheste/ea-agent","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/amcheste%2Fea-agent","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/amcheste%2Fea-agent/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/amcheste%2Fea-agent/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/amcheste%2Fea-agent/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/amcheste","download_url":"https://codeload.github.com/amcheste/ea-agent/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/amcheste%2Fea-agent/sbom","scorecard":{"id":1246743,"data":{"date":"2026-04-03T13:57:27Z","repo":{"name":"github.com/amcheste/ea-agent","commit":"8be23922294d432585a10bf5f6293275d8936f4e"},"scorecard":{"version":"v5.3.0","commit":"c22063e786c11f9dd714d777a687ff7c4599b600"},"score":5.3,"checks":[{"name":"Token-Permissions","score":-1,"reason":"internal error: internal error: invalid GitHub workflow:\n:107:0: could not parse as YAML: yaml: line 107: could not find expected ':' [syntax-check]","details":null,"documentation":{"short":"Determines if the project's workflows follow the principle of least privilege.","url":"https://github.com/ossf/scorecard/blob/c22063e786c11f9dd714d777a687ff7c4599b600/docs/checks.md#token-permissions"}},{"name":"Pinned-Dependencies","score":-1,"reason":"internal error: internal error: invalid GitHub workflow:\n:107:0: could not parse as YAML: yaml: line 107: could not find expected ':' [syntax-check]","details":null,"documentation":{"short":"Determines if the project has declared and pinned the dependencies of its build process.","url":"https://github.com/ossf/scorecard/blob/c22063e786c11f9dd714d777a687ff7c4599b600/docs/checks.md#pinned-dependencies"}},{"name":"Maintained","score":0,"reason":"project was created within the last 90 days. Please review its contents carefully","details":["Warn: Repository was created within the last 90 days."],"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/c22063e786c11f9dd714d777a687ff7c4599b600/docs/checks.md#maintained"}},{"name":"Security-Policy","score":10,"reason":"security policy file detected","details":["Info: security policy file detected: SECURITY.md:1","Info: Found linked content: SECURITY.md:1","Info: Found disclosure, vulnerability, and/or timelines in security policy: SECURITY.md:1","Info: Found text in security policy: SECURITY.md:1"],"documentation":{"short":"Determines if the project has published a security policy.","url":"https://github.com/ossf/scorecard/blob/c22063e786c11f9dd714d777a687ff7c4599b600/docs/checks.md#security-policy"}},{"name":"Code-Review","score":0,"reason":"Found 0/17 approved changesets -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project requires human code review before pull requests (aka merge requests) are merged.","url":"https://github.com/ossf/scorecard/blob/c22063e786c11f9dd714d777a687ff7c4599b600/docs/checks.md#code-review"}},{"name":"Packaging","score":-1,"reason":"internal error: internal error: invalid GitHub workflow:\n:107:0: could not parse as YAML: yaml: line 107: could not find expected ':' [syntax-check]","details":null,"documentation":{"short":"Determines if the project is published as a package that others can easily download, install, easily update, and uninstall.","url":"https://github.com/ossf/scorecard/blob/c22063e786c11f9dd714d777a687ff7c4599b600/docs/checks.md#packaging"}},{"name":"Dependency-Update-Tool","score":10,"reason":"update tool detected","details":["Info: detected update tool: Dependabot: .github/dependabot.yml:1"],"documentation":{"short":"Determines if the project uses a dependency update tool.","url":"https://github.com/ossf/scorecard/blob/c22063e786c11f9dd714d777a687ff7c4599b600/docs/checks.md#dependency-update-tool"}},{"name":"Binary-Artifacts","score":10,"reason":"no binaries found in the repo","details":null,"documentation":{"short":"Determines if the project has generated executable (binary) artifacts in the source repository.","url":"https://github.com/ossf/scorecard/blob/c22063e786c11f9dd714d777a687ff7c4599b600/docs/checks.md#binary-artifacts"}},{"name":"Dangerous-Workflow","score":-1,"reason":"internal error: internal error: invalid GitHub workflow:\n:107:0: could not parse as YAML: yaml: line 107: could not find expected ':' [syntax-check]","details":null,"documentation":{"short":"Determines if the project's GitHub Action workflows avoid dangerous patterns.","url":"https://github.com/ossf/scorecard/blob/c22063e786c11f9dd714d777a687ff7c4599b600/docs/checks.md#dangerous-workflow"}},{"name":"CII-Best-Practices","score":0,"reason":"no effort to earn an OpenSSF best practices badge detected","details":null,"documentation":{"short":"Determines if the project has an OpenSSF (formerly CII) Best Practices Badge.","url":"https://github.com/ossf/scorecard/blob/c22063e786c11f9dd714d777a687ff7c4599b600/docs/checks.md#cii-best-practices"}},{"name":"Vulnerabilities","score":10,"reason":"0 existing vulnerabilities detected","details":null,"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/c22063e786c11f9dd714d777a687ff7c4599b600/docs/checks.md#vulnerabilities"}},{"name":"SAST","score":-1,"reason":"internal error: internal error: invalid GitHub workflow:\n:107:0: could not parse as YAML: yaml: line 107: could not find expected ':' [syntax-check]","details":null,"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/c22063e786c11f9dd714d777a687ff7c4599b600/docs/checks.md#sast"}},{"name":"Fuzzing","score":0,"reason":"project is not fuzzed","details":["Warn: no fuzzer integrations found"],"documentation":{"short":"Determines if the project uses fuzzing.","url":"https://github.com/ossf/scorecard/blob/c22063e786c11f9dd714d777a687ff7c4599b600/docs/checks.md#fuzzing"}},{"name":"Branch-Protection","score":3,"reason":"branch protection is not maximal on development and all release branches","details":["Info: 'allow deletion' disabled on branch 'main'","Info: 'force pushes' disabled on branch 'main'","Warn: branch 'main' does not require approvers","Warn: codeowners review is not required on branch 'main'","Info: status check found to merge onto on branch 'main'"],"documentation":{"short":"Determines if the default and release branches are protected with GitHub's branch protection settings.","url":"https://github.com/ossf/scorecard/blob/c22063e786c11f9dd714d777a687ff7c4599b600/docs/checks.md#branch-protection"}},{"name":"Signed-Releases","score":-1,"reason":"no releases found","details":null,"documentation":{"short":"Determines if the project cryptographically signs release artifacts.","url":"https://github.com/ossf/scorecard/blob/c22063e786c11f9dd714d777a687ff7c4599b600/docs/checks.md#signed-releases"}},{"name":"License","score":10,"reason":"license file detected","details":["Info: project has a license file: LICENSE:0","Info: FSF or OSI recognized license: MIT License: LICENSE:0"],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/c22063e786c11f9dd714d777a687ff7c4599b600/docs/checks.md#license"}},{"name":"Contributors","score":0,"reason":"project has 0 contributing companies or organizations -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project has a set of contributors from multiple organizations (e.g., companies).","url":"https://github.com/ossf/scorecard/blob/c22063e786c11f9dd714d777a687ff7c4599b600/docs/checks.md#contributors"}},{"name":"CI-Tests","score":10,"reason":"3 out of 3 merged PRs checked by a CI test -- score normalized to 10","details":null,"documentation":{"short":"Determines if the project runs tests before pull requests are merged.","url":"https://github.com/ossf/scorecard/blob/c22063e786c11f9dd714d777a687ff7c4599b600/docs/checks.md#ci-tests"}}]},"last_synced_at":"2026-04-30T00:33:26.437Z","repository_id":346588576,"created_at":"2026-04-30T00:33:26.437Z","updated_at":"2026-04-30T00:33:26.437Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":32770622,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-08T02:36:36.067Z","status":"ssl_error","status_checked_at":"2026-05-08T02:36:07.210Z","response_time":54,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["ai-agent","claude","claude-code","executive-assistant","obsidian","productivity"],"created_at":"2026-05-08T07:13:34.351Z","updated_at":"2026-05-08T07:13:40.294Z","avatar_url":"https://github.com/amcheste.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cdiv align=\"center\"\u003e\n\n\u003cimg src=\"assets/logo.png\" alt=\"EA Agent mascot\" width=\"200\" /\u003e\n\n# EA Agent\n\n**A Claude plugin that turns AI into a personalized virtual executive assistant — wired into your Obsidian vault, task manager, calendar, and inbox.**\n\n[![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)\n[![Version](https://img.shields.io/github/v/release/amcheste/ea-agent?label=version\u0026color=0B0B0C)](https://github.com/amcheste/ea-agent/releases)\n[![License: MIT](https://img.shields.io/badge/License-MIT-1F4D3A.svg)](LICENSE)\n\n\u003c/div\u003e\n\n---\n\nInstall 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.\n\n```\n/plugin install github:amcheste/ea-agent\n```\n\nThen run `/ea-agent:setup` to complete onboarding (~5 minutes).\n\n---\n\n## Skills\n\n| Skill | What it does |\n|-------|-------------|\n| [Setup](skills/setup/) | Short questionnaire that writes your EA profile to your vault. Run this first, and again when upgrading. |\n| [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 |\n| [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 |\n| [Task Manager](skills/task-manager/) | Manages tasks across Apple Reminders and your vault with Eisenhower matrix prioritization and calendar-aware planning |\n| [Inbox Processing](skills/inbox-processing/) | Scans Gmail and Slack for action items and surfaces what actually needs your attention |\n| [Meeting Notes](skills/meeting-notes/) | Prep briefs before meetings, structured capture during/after, and action item tracking with people notes |\n| [Project Setup](skills/project-setup/) | Creates project notes from a template with goals, milestones, task breakdown, and vault linking |\n| [Weekly Review](skills/weekly-review/) | Synthesizes your week from daily notes, previews next week's calendar, and guides you through planning |\n| [Vault Context](skills/vault-context/) | Scans your recent vault activity to understand momentum, stuck items, and patterns — feeds every other skill |\n\n---\n\n## Install\n\n### Prerequisites\n\n- **macOS** — required for Apple Reminders and Calendar integration via AppleScript\n- **Obsidian** — [obsidian.md](https://obsidian.md)\n- **Claude Code** with MCP support\n\n### 1. Install the plugin\n\n```\n/plugin install github:amcheste/ea-agent\n```\n\nWhen prompted, enter the full path to your Obsidian vault (e.g. `/Users/yourname/Documents/Obsidian/MyVault`).\n\n### 2. Run setup\n\n```\n/ea-agent:setup\n```\n\nThis 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.\n\nRe-run `/ea-agent:setup` any time to update your profile. It will automatically detect plugin upgrades and only ask about new fields.\n\n### 3. Connect your tools\n\nIn Claude's MCP settings, connect the tools you want:\n\n| Tool | Required for |\n|------|-------------|\n| **Control your Mac** (`osascript`) | Apple Reminders and Calendar — required for task management |\n| **Slack** | Inbox processing, morning briefings, evening check-ins |\n| **Gmail** | Inbox processing |\n| **Google Calendar** | Supplemental calendar (Apple Calendar is the primary source) |\n\n### 4. Set up scheduled tasks (optional)\n\nFor a fully automated EA, set up scheduled tasks in Claude's Scheduled section:\n\n| Task | Suggested schedule | What it does |\n|------|-------------------|--------------|\n| Morning Briefing | 8:00 AM daily | Creates daily note, syncs tasks, DMs you a summary on Slack |\n| Inbox Processing | 8:30 AM weekdays | Scans Gmail and Slack, adds action items to daily note |\n| Slack Capture | 9 AM, 12 PM, 3 PM, 6 PM | Sweeps your Slack self-DMs into your vault inbox |\n| Evening Reflection | 8:00 PM daily | DMs you reflection prompts based on your day |\n| Weekly Review | 4:00 PM Fridays | Creates weekly review note, DMs you the highlights |\n\nAfter creating each task, click **Run now** once to pre-approve tool permissions — otherwise the first automatic run will pause waiting for your approval.\n\n### 5. Test it\n\nSay **\"Good morning, let's plan my day\"** in Claude Code. You should get a daily note in your vault with today's calendar and carry-forward items, tasks synced to Apple Reminders, and a morning briefing DM on Slack (if connected).\n\n---\n\n## How the EA learns about you\n\nWhen 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.\n\nOver time, the **Vault Context** skill adds observations to your profile as it learns your patterns:\n\n- Which times of day you do your best work\n- Which tasks you tend to carry forward or drop\n- Which projects are gaining or losing momentum\n- How your energy and focus vary across the week\n\nThese accumulate in an `## EA Observations` section of your profile and make every skill smarter the longer you use it.\n\n---\n\n## Vault structure\n\nThe EA expects — or will help you create — a folder structure like this:\n\n```\nYour Vault/\n├── EA_PROFILE.md          ← written by /ea-agent:setup\n├── Daily Journal/\n├── Weekly Reviews/\n├── Meetings/\n├── Projects/\n│   ├── Work/\n│   ├── Personal/\n│   └── (your areas)\n├── Ideas/\n├── People/\n└── Templates/\n```\n\nFolder names are fully configurable — setup asks what you actually use.\n\n---\n\n## Templates\n\nThe `templates/` folder contains Obsidian-compatible markdown templates:\n\n- `daily-note.md` — Morning planning + evening reflection\n- `weekly-review.md` — End-of-week check-in with metrics and priorities\n- `meeting-notes.md` — Agenda, notes, decisions, and action items\n- `project.md` — Project overview with goals, milestones, and tasks\n\nCopy these into your vault's `Templates/` folder.\n\n---\n\n## Day-to-day usage\n\n- **Morning** — The 8 AM briefing creates your daily note. Review priorities, start working.\n- **During the day** — \"Remind me to...\" or \"Note to self...\" — filed to your vault and task manager instantly.\n- **Stuck or overwhelmed** — \"What should I focus on?\" — your EA pulls tasks, calendar, and deadlines and gives you a realistic plan.\n- **Evening** — The 8 PM check-in prompts your reflection. Fill in the evening section of your daily note.\n- **Friday** — The weekly review synthesizes your week and sets you up for the next one.\n\n---\n\n## Upgrading\n\n```\n/ea-agent:setup\n```\n\nThe setup skill checks your profile version and only asks about new fields — it won't make you repeat the whole onboarding.\n\n---\n\n## CI/CD Pipeline\n\n| Workflow | Trigger | Purpose |\n|----------|---------|---------|\n| **Validate** | Every PR + push to `main`/`develop` | Plugin structure, skill frontmatter, version consistency, eval quality gate |\n| **Release** | `v*.*.*` tags | Validate → evals → publish GitHub Release |\n| **SAST** | Every PR + weekly | Semgrep secret scanning |\n| **Release Drafter** | Push to `develop` | Auto-drafts release notes from PR titles |\n| **Monthly Dep Release** | 1st of each month | Opens a patch release PR if Dependabot has merged updates |\n| **Stale** | Daily | Closes inactive issues and PRs after 60 + 7 days |\n\n### Validate pipeline (every PR)\n\n```\n┌─────────────────────────┐   ┌──────────────────────────┐\n│  Validate Structure     │   │  Validate Version        │\n│                         │   │                          │\n│ • plugin.json fields    │   │ • setup skill references │\n│ • SKILL.md frontmatter  │   │   a profile version      │\n│ • required files        │   │                          │\n│ • EA_PROFILE.md refs    │   └────────────┬─────────────┘\n└────────────┬────────────┘                │\n             └──────────────┬──────────────┘\n                            ▼\n             ┌──────────────────────────────┐\n             │  Run Evals  (PR only,        │\n             │  skipped if no skill/eval    │\n             │  files changed)              │\n             │                              │\n             │ • routing accuracy ≥ 85%     │\n             │ • behavioral quality ≥ 75%   │\n             └──────────────────────────────┘\n```\n\n### Running evals locally\n\n```bash\ncd ea-agent\npip install -r evals/requirements.txt\nexport ANTHROPIC_API_KEY=your-key-here\n\n# Run everything\npython evals/eval_runner.py\n\n# Routing only (fast, ~$0.02)\npython evals/eval_runner.py --routing-only\n\n# Behavioral only\npython evals/eval_runner.py --behavioral-only\n\n# Custom threshold\npython evals/eval_runner.py --pass-threshold 90\n```\n\nEach full run costs roughly **$0.08** (routing + behavioral agent on Haiku, judge on Sonnet).\n\nTo run evals in CI, add your Anthropic API key as a GitHub Actions secret named `ANTHROPIC_API_KEY`:\n\n\u003e **Settings** → **Secrets and variables** → **Actions** → **New repository secret**\n\n---\n\n## Versioning\n\nFollows [Semantic Versioning](https://semver.org/).\n\n```bash\n./scripts/bump-version.sh patch    # 1.2.0 → 1.2.1  (bug fixes)\n./scripts/bump-version.sh minor    # 1.2.0 → 1.3.0  (new skills or features)\n./scripts/bump-version.sh major    # 1.2.0 → 2.0.0  (breaking profile schema changes)\n```\n\nUse `major` when bumping `profile_version` in `skills/setup/SKILL.md` — this signals to existing users that they need to re-run `/ea-agent:setup`.\n\n---\n\n## Philosophy\n\nYour 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.\n\nA 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.\n\n---\n\n## Contributing\n\nThis 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.\n\nA few things to keep in mind if contributing:\n\n- Skills must work for anyone — no hardcoded personal info (that belongs in `EA_PROFILE.md`)\n- Keep the EA tone: conversational, proactive, not robotic\n- When adding new profile fields, bump `profile_version` in the setup skill and handle the upgrade path\n\nSee [CONTRIBUTING.md](CONTRIBUTING.md) for the full contribution guide, development workflow, and release process.\n\n---\n\n## License\n\nReleased under the [MIT License](LICENSE).\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Famcheste%2Fea-agent","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Famcheste%2Fea-agent","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Famcheste%2Fea-agent/lists"}