Manage OmniFocus tasks, projects, and inbox with proper tagging and organization
Manages OmniFocus tasks, projects, and inbox with proper tagging and organization. Activates when users want to add tasks, triage inbox, or organize projects. Uses JXA for individual tasks and AppleScript for folder/project creation to avoid nesting failures.
/plugin marketplace add krishagel/geoffrey/plugin install geoffrey@geoffreyThis skill is limited to using the following tools:
scripts/add_task.jsscripts/create_projects_in_folder.applescriptscripts/create_tag.jsscripts/get_inbox.jsscripts/get_projects.jsscripts/get_tags.jsscripts/update_task.jsManage OmniFocus tasks with proper project assignment, tagging, and organization based on user preferences.
Use this skill when user wants to:
Task Creation Philosophy:
Use JXA (JavaScript for Automation) for:
Use AppleScript for:
CRITICAL DIFFERENCE:
osascript -l JavaScript) have limitationsnew Project(name, folder) work in OmniJS but NOT in external JXA scripts| Pitfall | Why It Happens | Solution |
|---|---|---|
| Projects created at root instead of in folder | JXA parentFolder property doesn't work externally | Use AppleScript with tell folder blocks |
| Duplicate empty folders | Script creates folder but projects fail to nest | Always verify count of projects of folder after creation |
| "Can't convert types" errors | JXA type mismatch between app objects and JavaScript | Use AppleScript for complex operations |
| Projects appear created but aren't | Script reports success but verification shows 0 projects | Always verify after creation, never trust script output alone |
| Can't delete folders via script | Folders don't support deletion commands | Manual cleanup in OmniFocus UI required |
ALWAYS verify operations that modify structure:
# After creating projects in folder
tell application "OmniFocus"
tell default document
set projectCount to count of projects of folder "Folder Name"
if projectCount is 0 then
return "ERROR: Projects not in folder!"
else
return "SUCCESS: " & projectCount & " projects created"
end if
end tell
end tell
NEVER assume success based on:
ALWAYS verify by:
If you create projects incorrectly:
projects of folder "X"mark dropped projScripts are in ./scripts/ directory.
For JXA scripts:
osascript -l JavaScript ./scripts/script-name.js
For AppleScript:
osascript ./scripts/script-name.applescript
IMPORTANT: Always use pure JXA/AppleScript, NOT Omni Automation URL scheme. The URL scheme triggers security popups for every unique script. Direct scripting runs silently.
doc.inboxTasks.push(task) - create new tasksapp.add(tag, {to: task.tags}) - add existing tags (not push!)task.assignedContainer = project - move to projectReturns remaining inbox tasks (matches OmniFocus Inbox perspective).
Filter logic: Tasks with no project + not completed + not dropped + not deferred to future
Output: JSON with count and task array (id, name, note, tags, dueDate)
Use when: Starting inbox triage
Returns full tag hierarchy with groupings.
Output: JSON with all 129 tags organized by parent/children
Use when: Need to find correct tags for a task
Returns full project/folder structure.
Output: JSON with projects and folder paths
Use when: Need to find correct project for a task
Creates a new task with proper tags and project.
Parameters: name, project, tags[], dueDate, deferDate, note, flagged
Use when: Creating new tasks
Updates any existing task (not just inbox).
Parameters: name or id, project, tags[], dueDate, deferDate
Use when: Triaging/moving tasks, adding tags
Creates a new tag, optionally under a parent.
Parameters: name, parent (optional)
Use when: Tag doesn't exist for a person or category
CRITICAL: Creates projects INSIDE folders (not at root level).
WHY APPLESCRIPT, NOT JXA: External JXA scripts (osascript -l JavaScript) cannot reliably create projects in folders. Projects appear created but end up at root level, not in the folder. This creates duplicate folders and organizational mess.
CORRECT PATTERN (AppleScript):
tell application "OmniFocus"
tell default document
set myFolder to make new folder with properties {name:"Folder Name"}
tell myFolder
set proj to make new project with properties {name:"Project Name", note:"Description"}
tell proj
make new task with properties {name:"Task Name"}
end tell
end tell
end tell
end tell
WRONG PATTERNS (DO NOT USE):
new Project(name, folderNamed('X')) - only works in OmniJS, not external scriptsproject.folder = folder - sets property but doesn't moveproject.parentFolder = folder - projects still at root levelfolder.projects.push(project) - fails silentlyDELETION NOTES:
mark dropped proj commandUse when: Creating multiple projects organized in folders (annual planning, strategic priorities, etc.)
If another skill needs to create OmniFocus projects/tasks, use these patterns:
Call directly from other skill:
osascript -l JavaScript /path/to/omnifocus-manager/scripts/add_task.js '{
"name": "Task name",
"project": "Project Name",
"tags": ["Tag1", "Tag2"],
"dueDate": "2026-01-15",
"note": "Optional note"
}'
Build AppleScript dynamically:
/tmp/create_projects_TIMESTAMP.applescriptosascript /tmp/create_projects_TIMESTAMP.applescriptcount of projects of folder "Folder Name" returns expected countExample structure:
tell application "OmniFocus"
tell default document
set targetFolder to make new folder with properties {name:"FOLDER_NAME"}
tell targetFolder
# Repeat for each project:
set proj to make new project with properties {name:"PROJECT_NAME", note:"NOTE"}
tell proj
# Repeat for each task:
make new task with properties {name:"TASK_NAME"}
end tell
end tell
end tell
end tell
CRITICAL: Always verify after creation. Don't trust return values.
BEFORE creating projects in folders:
Check for existing folders:
tell application "OmniFocus"
tell default document
set folderNames to name of every folder
return folderNames
end tell
end tell
Verify folder doesn't already exist to avoid duplicates
Plan the complete structure - folder name, all project names, all tasks
CRITICAL RULES:
make new foldertell folder block for all project creationtell project blocks for task creationALWAYS verify projects are in folder:
tell application "OmniFocus"
tell default document
set folderProjects to projects of folder "Folder Name"
return "Found " & (count of folderProjects) & " projects"
end tell
end tell
If count is 0:
If you create projects incorrectly:
mark dropped proj for each wrong project# Build AppleScript dynamically
cat > /tmp/create_folder_projects.applescript << 'EOF'
tell application "OmniFocus"
tell default document
set myFolder to make new folder with properties {name:"Project Folder"}
tell myFolder
set proj1 to make new project with properties {name:"Project 1", note:"Description"}
tell proj1
make new task with properties {name:"Task 1"}
make new task with properties {name:"Task 2"}
end tell
end tell
end tell
end tell
EOF
# Execute
osascript /tmp/create_folder_projects.applescript
# Verify
osascript << 'VERIFY'
tell application "OmniFocus"
tell default document
set projectCount to count of projects of folder "Project Folder"
return "Created " & projectCount & " projects in folder"
end tell
end tell
VERIFY
Top-level categories:
People → PSD breakdown:
Special tags:
| Task Type | Project | Default Due |
|---|---|---|
| Discussions with people | Meetings | 7 days |
| Phone calls | Meetings | 7 days |
| CoSN-related | CoSN Work | 7 days |
| Digital Promise work | Digital Promise | 7 days |
| AI/automation projects | AI Studio | 7 days |
| Coding/development | Coding Projects | 7 days |
| Research/learning | Research for Future Plans | 7 days |
| SOP/process development | Standard Operating Procedures | 14 days |
| Form/procedure updates | Department Procedures | 7 days |
| District reimbursements | Purchasing & Acquisitions | 7 days |
| Travel approvals | (appropriate project) | 14 days |
| Data governance | Data Governance | 14 days |
| Tech support issues | → Freshservice ticket | N/A |
| Task Type | Tags |
|---|---|
| Discussion with person | [Person name], Follow Up |
| Phone call | Phone, Follow Up |
| Research tasks | Research |
| AI-assistable tasks | Geoffrey |
| Focus time needed | Full Focus |
| Admin/organizational | Organization |
| Safety/security related | (relevant ESC person) |
Goes to Meetings project:
Goes to Research for Future Plans:
Goes to Coding Projects or AI Studio:
Needs Freshservice (skip for now):
Parse user request for: task name, person (if any), context clues
Apply routing rules above to determine:
If tag doesn't exist, create it with create_tag.js
Run add_task.js with parameters
Return standardized output
Example:
User: "Follow up with Mel about the drone program"
Actions:
- Task: "Follow up with Mel about the drone program"
- Project: PSD > General Technology > Digital Innovation Leads
- Tags: Mel, Follow Up
- Due: Next 1:1 date or 7 days
Get inbox tasks:
osascript -l JavaScript ./scripts/get_inbox.js
This returns only remaining tasks (no project, not completed, not dropped, not deferred)
Present assumptions in batches (10-15 tasks):
Ask clarifying questions:
Batch update confirmed tasks:
osascript -l JavaScript ./scripts/update_task.js '{"name":"...", "project":"...", "tags":[...], "dueDate":"..."}'
Create missing tags/projects as needed:
osascript -l JavaScript ./scripts/create_tag.js '{"name":"PersonName", "parent":"ESC"}'
Skip tasks that need:
Triage output format:
## My assumptions on remaining tasks:
| # | Task | Project | Tags | Notes |
|---|------|---------|------|-------|
| 1 | task name | Meetings | Person, Follow Up | context |
**Questions:**
- #X: Who is [person]?
- #Y: Which project for this?
Which numbers need correction?
If OmniFocus not running:
Status: ❌ Failed
Error: OmniFocus is not running. Please open OmniFocus and try again.
If tag not found:
If project not found:
Always use standardized format:
## Summary
Created task with proper tags and project assignment
## Actions
- Created task: "[task name]"
- Project: [full project path]
- Tags: [tag1, tag2, tag3]
- Due: [date]
- Notes: [if any]
## Status
✅ Complete
## Next Steps
- Task appears in [relevant perspective]
- Follow up scheduled for [date if applicable]
Applies Anthropic's official brand colors and typography to any sort of artifact that may benefit from having Anthropic's look-and-feel. Use it when brand colors or style guidelines, visual formatting, or company design standards apply.
Creating algorithmic art using p5.js with seeded randomness and interactive parameter exploration. Use this when users request creating art using code, generative art, algorithmic art, flow fields, or particle systems. Create original algorithmic art rather than copying existing artists' work to avoid copyright violations.
Create beautiful visual art in .png and .pdf documents using design philosophy. You should use this skill when the user asks to create a poster, piece of art, design, or other static piece. Create original visual designs, never copying existing artists' work to avoid copyright violations.