434 lines
13 KiB
Markdown
434 lines
13 KiB
Markdown
---
|
|
name: drafts-manager
|
|
description: Triage Drafts inbox and route notes to OmniFocus tasks or Obsidian documents
|
|
triggers:
|
|
- "triage drafts"
|
|
- "process drafts"
|
|
- "check drafts"
|
|
- "what's in drafts"
|
|
- "drafts inbox"
|
|
- "clean up drafts"
|
|
- "export drafts"
|
|
allowed-tools: Read, Bash, Write
|
|
version: 0.1.0
|
|
---
|
|
|
|
# Drafts Manager Skill
|
|
|
|
Triage the Drafts inbox using a hybrid AI + human confirmation workflow. Routes content to OmniFocus (tasks) or Obsidian (notes) based on content analysis.
|
|
|
|
## When to Activate
|
|
|
|
Use this skill when user wants to:
|
|
- Triage or process their Drafts inbox
|
|
- Route notes to OmniFocus or Obsidian
|
|
- Check what's captured in Drafts
|
|
- Clean up old drafts
|
|
|
|
## Architecture
|
|
|
|
**Two-Phase Hybrid Triage:**
|
|
|
|
1. **Export & Analyze** - Drafts exports inbox → Geoffrey analyzes → presents suggestions
|
|
2. **Confirm & Process** - User confirms routing → Drafts processes each draft → archives
|
|
|
|
```
|
|
┌─────────┐ URL ┌─────────┐ JSON ┌─────────┐ Table ┌──────┐
|
|
│Geoffrey │ ────► │ Drafts │ ─────► │Geoffrey │ ──────► │ User │
|
|
│ trigger │ │ export │ │ analyze │ │review│
|
|
└─────────┘ └─────────┘ └─────────┘ └──┬───┘
|
|
│
|
|
Confirmed
|
|
│
|
|
┌─────────┐ URL ┌─────────┐ Routes ┌──────────┐ ┌───▼────┐
|
|
│Geoffrey │ ────► │ Drafts │ ───────► │OmniFocus │ │Process │
|
|
│ trigger │ │ process │ │ Obsidian │ │ list │
|
|
└─────────┘ └────┬────┘ └──────────┘ └────────┘
|
|
│
|
|
Archives
|
|
```
|
|
|
|
## Available Scripts
|
|
|
|
Scripts are in `./scripts/` directory. Run via:
|
|
```bash
|
|
bun ./scripts/script-name.js
|
|
```
|
|
|
|
### trigger_export.js
|
|
|
|
Triggers the Drafts "Geoffrey Export Inbox" action via URL scheme.
|
|
|
|
**Output:** Path to exported JSON file
|
|
|
|
**Use when:** Starting triage
|
|
|
|
### trigger_process.js
|
|
|
|
Triggers the Drafts "Geoffrey Process Draft" action with routing instructions.
|
|
|
|
**Parameters:** uuid, destination, project, tags, folder
|
|
|
|
**Use when:** Processing confirmed drafts
|
|
|
|
## Required Drafts Actions
|
|
|
|
**IMPORTANT:** User must install these Drafts actions (found in `./actions/`):
|
|
|
|
### Geoffrey Export Inbox
|
|
|
|
Exports all inbox drafts to a JSON file for Geoffrey to analyze.
|
|
|
|
**Location:** `~/Library/Mobile Documents/iCloud~com~agiletortoise~Drafts5/Documents/geoffrey-export.json`
|
|
|
|
**Output format:**
|
|
```json
|
|
{
|
|
"exported": "2025-11-23T10:30:00Z",
|
|
"count": 5,
|
|
"drafts": [
|
|
{
|
|
"uuid": "ABC123",
|
|
"title": "First line of draft",
|
|
"content": "Full content...",
|
|
"tags": ["inbox"],
|
|
"createdAt": "2025-11-22T14:00:00Z",
|
|
"modifiedAt": "2025-11-22T14:00:00Z",
|
|
"isFlagged": false
|
|
}
|
|
]
|
|
}
|
|
```
|
|
|
|
### Geoffrey Process Draft
|
|
|
|
Processes a single draft based on routing instructions from URL parameters.
|
|
|
|
**URL Parameters:**
|
|
- `uuid` - Draft to process
|
|
- `destination` - "omnifocus", "obsidian", "archive", or "trash"
|
|
- `project` - OmniFocus project (if destination=omnifocus)
|
|
- `tags` - Comma-separated tags (if destination=omnifocus)
|
|
- `dueDate` - Due date (if destination=omnifocus)
|
|
- `folder` - Obsidian folder (if destination=obsidian)
|
|
|
|
## Content Analysis Rules
|
|
|
|
When analyzing drafts, look for these signals:
|
|
|
|
### Route to OmniFocus (Task)
|
|
|
|
**Signals:**
|
|
- Starts with action verb: "call", "email", "buy", "schedule", "review", "check"
|
|
- Contains: "todo", "task", "@due", "@defer"
|
|
- Short (< 50 words)
|
|
- Contains person names
|
|
- Shopping lists or errands
|
|
|
|
**Apply omnifocus-manager routing rules for project/tag assignment**
|
|
|
|
### Route to Obsidian (Note)
|
|
|
|
**Signals:**
|
|
- Longer content (> 100 words)
|
|
- Meeting notes: "meeting with", "discussed", "attendees"
|
|
- Ideas/brainstorms: "idea:", "thought:", "what if"
|
|
- Reference material: links, quotes, research
|
|
- Journal entries: "today I", feelings, reflections
|
|
|
|
### Archive in Drafts
|
|
|
|
**Signals:**
|
|
- Reference that may be needed again
|
|
- Snippets of code or text
|
|
- Temporary notes that are now done
|
|
|
|
### Delete (Trash)
|
|
|
|
**Signals:**
|
|
- Empty or nearly empty
|
|
- Test/scratch content
|
|
- Duplicates
|
|
- Outdated info no longer needed
|
|
|
|
## Obsidian Routing Rules
|
|
|
|
| Content Type | Folder | Frontmatter |
|
|
|--------------|--------|-------------|
|
|
| Meeting notes | `Meetings/` | date, attendees, topics |
|
|
| Ideas/brainstorms | `Geoffrey/Inbox/` | tags, created |
|
|
| Research | `Reference/` | source, tags, related |
|
|
| Journal | `Journal/` | date |
|
|
| General notes | `Geoffrey/Inbox/` | tags, created |
|
|
|
|
**Frontmatter template:**
|
|
```yaml
|
|
---
|
|
created: {{date}}
|
|
source: drafts
|
|
tags: [from-drafts]
|
|
related: []
|
|
---
|
|
```
|
|
|
|
## Main Workflow: Triage Drafts
|
|
|
|
### Phase 1: Export & Analyze
|
|
|
|
1. **Trigger export:**
|
|
```bash
|
|
open "drafts://x-callback-url/runAction?action=Geoffrey%20Export%20Inbox"
|
|
```
|
|
|
|
2. **Wait for export file** (2-3 seconds)
|
|
|
|
3. **Read exported JSON:**
|
|
```bash
|
|
cat ~/Library/Mobile\ Documents/iCloud~com~agiletortoise~Drafts5/Documents/geoffrey-export.json
|
|
```
|
|
|
|
4. **Analyze each draft** using content signals above
|
|
|
|
5. **Present suggestions table:**
|
|
```markdown
|
|
## Drafts Inbox Triage
|
|
|
|
Found **5 drafts** to process:
|
|
|
|
| # | Title | Suggestion | Destination | Details |
|
|
|---|-------|------------|-------------|---------|
|
|
| 1 | Call John about... | Task | OmniFocus | Project: Meetings, Tags: John, Follow Up |
|
|
| 2 | Meeting notes 11/22 | Note | Obsidian | Folder: Meetings/ |
|
|
| 3 | [empty] | Delete | Trash | Empty draft |
|
|
| 4 | Shopping list | Task | OmniFocus | Project: Single Actions, Tags: Chores |
|
|
| 5 | Idea for app... | Note | Obsidian | Folder: Geoffrey/Inbox/ |
|
|
|
|
**Questions:**
|
|
- #4: Should this go to a specific store location tag?
|
|
|
|
Which numbers need changes? (Or type "process all" to confirm)
|
|
```
|
|
|
|
### Phase 2: Process & Archive
|
|
|
|
1. **For each confirmed draft**, trigger process action:
|
|
```bash
|
|
# OmniFocus task
|
|
open "drafts://x-callback-url/runAction?action=Geoffrey%20Process%20Draft&uuid=ABC123&destination=omnifocus&project=Meetings&tags=John,Follow%20Up&dueDate=2025-11-30"
|
|
|
|
# Obsidian note
|
|
open "drafts://x-callback-url/runAction?action=Geoffrey%20Process%20Draft&uuid=DEF456&destination=obsidian&folder=Meetings"
|
|
|
|
# Archive
|
|
open "drafts://x-callback-url/runAction?action=Geoffrey%20Process%20Draft&uuid=GHI789&destination=archive"
|
|
|
|
# Delete
|
|
open "drafts://x-callback-url/runAction?action=Geoffrey%20Process%20Draft&uuid=JKL012&destination=trash"
|
|
```
|
|
|
|
2. **Report results:**
|
|
```markdown
|
|
## Summary
|
|
Processed 5 drafts from inbox
|
|
|
|
## Actions
|
|
- 2 tasks created in OmniFocus
|
|
- 2 notes saved to Obsidian
|
|
- 1 draft deleted
|
|
|
|
## Status
|
|
✅ Complete
|
|
|
|
## Next Steps
|
|
- Review tasks in OmniFocus inbox
|
|
- Check Obsidian notes in Geoffrey/Inbox/
|
|
```
|
|
|
|
## Error Handling
|
|
|
|
**Drafts not running:**
|
|
```
|
|
Status: ❌ Failed
|
|
Error: Drafts app is not running. Please open Drafts and try again.
|
|
```
|
|
|
|
**Action not installed:**
|
|
```
|
|
Status: ❌ Failed
|
|
Error: Drafts action "Geoffrey Export Inbox" not found.
|
|
Please install from: skills/drafts-manager/actions/
|
|
```
|
|
|
|
**Export file not found:**
|
|
```
|
|
Status: ⚠️ Partial
|
|
Error: Export file not created. Drafts may have timed out.
|
|
Try running the action manually in Drafts.
|
|
```
|
|
|
|
**OmniFocus not running:**
|
|
```
|
|
Status: ⚠️ Partial
|
|
Warning: OmniFocus not running. Task creation may have failed.
|
|
Please verify tasks were created.
|
|
```
|
|
|
|
## Installation
|
|
|
|
### 1. Install Drafts Actions
|
|
|
|
Import the action files from `./actions/`:
|
|
|
|
**Option A: Import from file**
|
|
1. Open Drafts
|
|
2. Go to Actions → Manage Actions
|
|
3. Import from `actions/geoffrey-export-inbox.draftsAction`
|
|
4. Import from `actions/geoffrey-process-draft.draftsAction`
|
|
|
|
**Option B: Create manually**
|
|
1. Open Drafts
|
|
2. Create new action "Geoffrey Export Inbox"
|
|
3. Add Script step with code from `actions/geoffrey-export-inbox.js`
|
|
4. Repeat for "Geoffrey Process Draft"
|
|
|
|
### 2. Verify Installation
|
|
|
|
Run: `open "drafts://x-callback-url/runAction?action=Geoffrey%20Export%20Inbox"`
|
|
|
|
Check for export file at:
|
|
`~/Library/Mobile Documents/iCloud~com~agiletortoise~Drafts5/Documents/geoffrey-export.json`
|
|
|
|
## Tips for Best Results
|
|
|
|
### Tagging in Drafts
|
|
|
|
Use these tags for manual pre-routing:
|
|
- `task` - Force route to OmniFocus
|
|
- `note` - Force route to Obsidian
|
|
- `archive` - Keep in Drafts archive
|
|
- `delete` - Trash without review
|
|
|
|
### Quick Capture Patterns
|
|
|
|
When capturing to Drafts, these patterns help AI routing:
|
|
- Start tasks with verbs: "Call", "Email", "Buy"
|
|
- Start notes with context: "Meeting:", "Idea:", "Note:"
|
|
- Use @ for OmniFocus hints: "@due(tomorrow)", "@project(Work)"
|
|
|
|
### Regular Triage
|
|
|
|
Best practice: Triage Drafts daily to keep inbox small
|
|
- Morning: Process yesterday's captures
|
|
- Evening: Quick review of day's notes
|
|
|
|
## Learned Routing Patterns
|
|
|
|
These patterns were learned through actual triage sessions with the user.
|
|
|
|
### Content Type → Destination
|
|
|
|
| Content Type | Destination | Obsidian Folder | OmniFocus Details |
|
|
|--------------|-------------|-----------------|-------------------|
|
|
| Meeting notes | Obsidian | `Meetings/2025/` | - |
|
|
| Conference notes | Obsidian | `Meetings/2025/` | - |
|
|
| Development roadmap | Obsidian | `Work/[Project]/Roadmap.md` | Format as checklist |
|
|
| API keys/credentials | **Delete** | - | Security risk |
|
|
| Error logs/JSON junk | **Delete** | - | Cruft |
|
|
| Random passwords | **Delete** | - | Cruft |
|
|
| Contact info | Contacts app | - | Also create follow-up task |
|
|
| Book recommendations | OmniFocus | - | Tags: Reading |
|
|
| Gift ideas | OmniFocus | - | Tags: Chores, Shopping |
|
|
| Action items from meetings | OmniFocus | - | Tags: Follow Up |
|
|
| Reference links (AI, UDL) | Obsidian | `Reference/` | - |
|
|
| Personal project ideas | OmniFocus | - | Tags: Coding |
|
|
| Presentation schedules | Obsidian | `Work/Presentations/` | Future dates → tasks |
|
|
| Survey links | OmniFocus | - | Include links in notes |
|
|
|
|
### Signals for Each Destination
|
|
|
|
**→ OmniFocus Task:**
|
|
- Starts with action verbs: "Submit", "Call", "Email", "Build", "Add"
|
|
- Contains due date context: "first week of December", "by end of year"
|
|
- Travel approvals, surveys to send, podcasts to record
|
|
- Book to read, thing to buy, project to build
|
|
- Multiple action items → single task with checklist in notes
|
|
|
|
**→ Obsidian Note:**
|
|
- Meeting notes (look for date, attendees, discussion points)
|
|
- Conference notes (look for session titles, speakers, links)
|
|
- Development docs with code/commands (wrap in code blocks)
|
|
- Reference material with links to external resources
|
|
- Topic brainstorms and idea lists
|
|
|
|
**→ Contacts App:**
|
|
- Contains name + phone/email
|
|
- Create contact AND follow-up task if there's an action
|
|
|
|
**→ Delete:**
|
|
- Empty or nearly empty
|
|
- JSON/error logs
|
|
- API keys (security)
|
|
- Random strings/passwords
|
|
- Test data that's no longer needed
|
|
|
|
**→ Archive in Drafts:**
|
|
- Outdated but potentially useful later
|
|
- Reference that may be needed again
|
|
|
|
### Project/Folder Mappings
|
|
|
|
**Obsidian Folders:**
|
|
- `Meetings/2025/` - All meeting and conference notes
|
|
- `Work/AI-Studio/` - AI Studio development docs
|
|
- `Work/Jocular-Kangaroo/` - Jocular Kangaroo project
|
|
- `Work/Presentations/` - Presentation archives
|
|
- `Geoffrey/` - Geoffrey roadmap and ideas
|
|
- `Reference/` - Reference materials and links
|
|
|
|
**OmniFocus Projects (go to Inbox if not found):**
|
|
- CoSN Work - CoSN-related tasks
|
|
- Meetings - Follow-ups with people
|
|
- Research for Future Plans - Books, research tasks
|
|
|
|
**OmniFocus Tags:**
|
|
- Follow Up - Tasks requiring follow-up
|
|
- Reading - Books to read
|
|
- Chores - Shopping, errands
|
|
- Coding - Development tasks
|
|
- Geoffrey - AI-assistable tasks
|
|
- Email - Tasks requiring email
|
|
|
|
### Special Handling
|
|
|
|
**Multi-item notes:**
|
|
- If note contains multiple distinct items, either:
|
|
- Create single task with items as checklist in notes
|
|
- Split into separate tasks (ask user preference)
|
|
|
|
**Development roadmaps:**
|
|
- Format as Obsidian file with checkboxes
|
|
- Use `- [ ]` for pending items
|
|
- Use `- [x]` for completed items
|
|
- Include code blocks for commands
|
|
|
|
**Sensitive data:**
|
|
- API keys → Delete immediately
|
|
- Student investigation data → Archive carefully, don't expose
|
|
- Credentials → Delete or move to secure storage
|
|
|
|
**Contact + Task pattern:**
|
|
- Add to Contacts app via add_contact.js
|
|
- Create follow-up task with contact details in notes
|
|
- Example: "Send maps to Kim Crowder" with email in notes
|
|
|
|
## Future Enhancements
|
|
|
|
- [ ] Batch processing without confirmation for tagged drafts
|
|
- [ ] Smart date extraction from draft content
|
|
- [ ] Template matching for common note types
|
|
- [ ] Sync with omnifocus-manager tag hierarchy
|
|
- [ ] Obsidian template application
|
|
- [ ] Draft content search/query
|
|
- [ ] Auto-detect project roadmaps and format as checklists
|
|
- [ ] Recognize CoSN, ACPE, Kiwanis contexts for project routing
|