Expand AI intents for Snippets, RSS, WebClips, and Files plugins
Details
Snippets: +3 intents (search_snippets, delete_snippet, create_collection)
— 4 total
- search_snippets: search by title/content with language/collection filter
- delete_snippet: trash snippet by ID or title search
- create_collection: create snippet collection with description/color
RSS: +3 intents (remove_feed, mark_all_read, search_articles) — 4 total
- remove_feed: unsubscribe + delete articles by ID or name search
- mark_all_read: mark all articles read (optionally per-feed)
- search_articles: search by title/summary with feed/starred filter
WebClips: +2 intents (search_clips, update_clip_status) — 3 total
- search_clips: search by title/URL/content with status filter
- update_clip_status: set status (unread/reading/read/archived)
Files: +2 intents (search_files, delete_file) — 3 total
- search_files: search by file name with folder filter
- delete_file: soft-delete (trash) by ID or name search
Uses `with` expressions for init-only record properties (RssArticle.Read,
WebClip.StatusRaw). Reuses existing service search methods where available.
Expand AI intents for Email, Journal, and Habits plugins
Details
Email: +4 intents (search_email, mark_read, move_message, reply) — 5 total
- search_email: search by subject/sender with folder filter
- mark_read: mark messages read/unread by ID or subject search
- move_message: move to folder (trash/archive/junk/custom)
- reply: create reply draft (saves as draft, does not send)
Journal: +2 intents (search_entries, delete_entry) — 3 total
- search_entries: search by content with date/mood filters
- delete_entry: delete by ID or date search
Habits: +3 intents (update_habit, get_streak, get_today_status) — 6 total
- update_habit: modify name, frequency, target, category, active status
- get_streak: returns current/best streak and completion rate
- get_today_status: checklist of today's logged/pending habits
All plugins use ResolveEntityAsync pattern with ID-first/search-fallback.
Email uses `with` expressions for init-only record properties.
Expand AI intents for Calendar, Notes, and Contacts plugins
Details
Calendar: +3 intents (update_event, delete_event, list_events) — 4 total
- update_event: modify title, time, location, description, status, all-day
- delete_event: delete by ID or title search
- list_events: query events by date range (default next 7 days)
Notes: +3 intents (search_notes, create_sticky, delete_note) — 4 total
- search_notes: search pages by query, returns wiki-link summary
- create_sticky: create quick sticky note with color
- delete_note: trash page by ID or title search
Contacts: +4 intents (update_contact, search_contacts, create_company,
log_interaction) — 5 total
- update_contact: modify any contact field by ID/name search
- search_contacts: search contacts, returns wiki-link summary
- create_company: create company record with industry/website
- log_interaction: log call/email/meeting/note with a contact
All three plugins follow the Tasks gold-standard pattern with
ResolveEntityAsync helpers for ID-first/title-fallback resolution.
Round 4: complete AI intent inventory with full slot signatures
Details
The 10th-man audit: previous rounds listed intent names but not the full
slot signatures needed for the AI to construct proper natural-language-to-action
calls. The RAG-indexed descriptions now contain the complete actionable API
for every plugin, enabling voice/speech-to-intent routing.
Key findings and fixes:
- Tasks: was missing 3 of 4 intents — added tasks.create_project,
tasks.update_task (with all 12 updatable fields), tasks.add_link (with
6 relationship types). This is the biggest gap: users saying "mark my
task as done" or "link this task to that note" would have failed.
- Finance: had intent names but no slot details for 10 intents — users
asking "what's my checking balance?" or "how much did I spend on
groceries?" need the AI to know which params to fill
- Notes: was missing content and tags slots (only listed title)
- Journal: had wrong required slot (title doesn't exist, content is required)
- Files: was completely missing files.create_bookmark intent
- WebClips: was completely missing webclips.save_clip intent
- All plugins: standardized format with * for required slots, included
defaults and behavioral notes (e.g., email.draft_email saves as draft,
does not send; calendar defaults to +1hr; habits uses fuzzy name matching)
Round 3: add command palette entries to all plugins that expose them
Details
5 plugins register commands in the global command palette (Cmd+K) but none
of their DetailedDescriptions mentioned this. If a user asks Duncan "refresh
my feeds" or "check my mail", the AI needs to know these commands exist.
- RSS: Refresh All Feeds, Show Unread/Starred, Mark All Read, OPML import/export
- Email: Check Mail, Compose, Add Account, Mark All Read, Empty Trash
- Contacts: New Contact/Company/Group, filter by status, Import, Scan Duplicates
- Habits: New Habit, New Goal, Log Habit, View Analytics
- Files: Upload File, New Folder, Toggle View, Switch Storage Mode
Get notified about new releases