用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
直接命令不会经过审查 Prompt;运行前请先检查来源。
npx skills add https://github.com/krishagel/geoffrey --skill omnifocus-manager命令会保持在同一行。复制前请横向滚动并检查完整内容。
想先保存到本地?可下载 SkillsMP 当前能够提供的文件。
Unified Google Workspace integration for managing email, calendar, files, and communication across multiple accounts
Create new skills, modify and improve existing skills, and measure skill performance. Use when users want to create a skill from scratch, update or optimize an existing skill, run evals to test a skill, benchmark skill performance with variance analysis, or optimize a skill's description for better triggering accuracy. Make sure to use this skill whenever the user mentions creating, building, designing, or improving skills, even if they don't explicitly say "skill-creator".
Generate Peninsula School District Standard Operating Procedures using the official PSD SOP template and conventions. Conducts a structured interview to gather all required information before drafting. Use when creating new SOPs, updating existing procedures, or drafting operational documentation for any district department. Triggers on requests to create SOPs, standard operating procedures, operational procedures, process documentation, or procedural guides for PSD.
基于 SOC 职业分类
正在显示 SKILL.md
| name | omnifocus-manager |
| description | Manage OmniFocus tasks, projects, and inbox with proper tagging and organization |
| triggers | ["add task","create task","new task","follow up with","triage omnifocus","triage my omnifocus","omnifocus inbox","clean up omnifocus","check omnifocus","show tasks","what's due","omnifocus review"] |
| allowed-tools | Read, Bash |
| version | 0.1.0 |
Manage 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]