Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
20 changes: 10 additions & 10 deletions ARCHITECTURE.md
Original file line number Diff line number Diff line change
Expand Up @@ -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.

```
┌─────────────────────────────────────────────────────┐
Expand Down Expand Up @@ -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

---

Expand All @@ -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

Expand Down Expand Up @@ -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)

Expand Down Expand Up @@ -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.

Expand All @@ -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.

---

Expand Down Expand Up @@ -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.

---

Expand Down Expand Up @@ -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.
32 changes: 16 additions & 16 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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)
6 changes: 3 additions & 3 deletions CLAUDE.md
Original file line number Diff line number Diff line change
@@ -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/<name>`, `fix/<name>`, `ci/<name>`, `docs/<name>`, `evals/<name>`
- 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.
Expand Down
38 changes: 19 additions & 19 deletions CONTRIBUTING.md
Original file line number Diff line number Diff line change
@@ -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

Expand All @@ -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
Expand All @@ -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

Expand All @@ -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
Expand All @@ -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

Expand All @@ -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
Expand All @@ -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
Expand Down
16 changes: 8 additions & 8 deletions DEVELOPER.md
Original file line number Diff line number Diff line change
Expand Up @@ -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.

Expand Down Expand Up @@ -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

Expand Down Expand Up @@ -179,7 +179,7 @@ last_updated: YYYY-MM-DD
- ...

## Apple Reminders Lists
- "List Name" routing description
- "List Name": routing description
- ...

## Communication Tools
Expand Down Expand Up @@ -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

Expand All @@ -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)
Expand All @@ -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"
Expand Down
Loading
Loading