| name | gtd-project |
| description | Use when reviewing GTD project status, adding actions or agent tasks to projects, completing or rescheduling actions, or completing projects tracked in macOS Reminders. |
Review and manage GTD projects with infer-and-confirm workflow. The agent analyzes project state, proposes actions, and the user confirms or overrides — minimizing back-and-forth.
CLI Tool
Run the Swift source directly (no build step required). <plugin-root> is the installed plugin directory — the directory that contains scripts/ and codex-skills/ (two levels above this skill's folder; in a repository checkout it is productivity-skills/). Resolve it to an absolute path and substitute it in every command:
swift <plugin-root>/scripts/productivity-cli.swift <command>
Step 1: Gather Data
-
Query overdue reminders (uses Apple's datetime-aware overdue detection):
swift <plugin-root>/scripts/productivity-cli.swift reminders overdue
-
Ensure required lists exist:
swift <plugin-root>/scripts/productivity-cli.swift reminders lists
If any required lists are missing, create them:
swift <plugin-root>/scripts/productivity-cli.swift reminders create-list "Projects"
swift <plugin-root>/scripts/productivity-cli.swift reminders create-list "@quick"
swift <plugin-root>/scripts/productivity-cli.swift reminders create-list "@1pomo"
swift <plugin-root>/scripts/productivity-cli.swift reminders create-list "@2pomo"
swift <plugin-root>/scripts/productivity-cli.swift reminders create-list "@deep"
swift <plugin-root>/scripts/productivity-cli.swift reminders create-list "@agent"
-
Query all open projects:
swift <plugin-root>/scripts/productivity-cli.swift reminders incomplete "Projects"
-
Query all context lists for actions:
for context in "@quick" "@1pomo" "@2pomo" "@deep" "@agent"; do
swift <plugin-root>/scripts/productivity-cli.swift reminders incomplete "$context"
done
-
For each project, find ALL linked actions by matching #{ProjectName} in the action's notes field:
- Parse the JSON output from context list queries
- Match the notes field against pattern
#{ProjectName}
- Collect ALL matching actions (not just one)
-
Extract project end goal from project's notes field (format: "Goal: [description]")
-
Determine project status:
- Healthy (✓): Has 1+ pending actions, none overdue
- Stalled (⚠️): Has 0 pending actions linked to this project
- Overdue (⚠️): Any action OR project appears in the overdue query results
Statuses evaluated in order of severity: Overdue > Stalled > Healthy.
Step 2: Display Projects Overview
Present all projects sorted by urgency (overdue first, then stalled, then healthy):
# Projects Overview
1. ⚠️ ClientProject-20260110 [Medium] — OVERDUE
- Goal: Invoice paid and project closed
- Actions (1):
• "Send invoice" (@quick) - OVERDUE (due 2026-01-10)
→ Suggested: Reschedule overdue action
2. ⚠️ ReviewQ1Roadmap-20260115 [High] — STALLED
- Goal: Roadmap approved by stakeholders
- No pending actions
→ Suggested: Add next action
3. ✓ VacationResearch-20260112 [High]
- Goal: Flights and hotel booked for Hawaii trip
- Actions (3):
• "Research flights to Hawaii" (@1pomo)
• "Email hotel for rates" (@quick)
• "Analyze flight price trends" (@agent) — due 2026-01-20
Which project to work on? [1/2/3/Done]
Ask the user: "Which project to work on?"
- Options: Numbered list of projects + "Done reviewing"
- Overdue and stalled projects are listed first with suggested actions shown inline
If no open projects, inform user: "No open projects. Use the gtd-process skill to create projects from inbox items."
Step 3: Auto-Infer Action
Based on the selected project's state, infer the most logical action automatically — do not ask "what would you like to do?":
| Project State | Auto-Inferred Action | Rationale |
|---|
| Overdue actions | Reschedule the specific overdue action(s) (Step 4c) | Overdue items need immediate attention |
| Stalled (0 actions) | Add next action (Step 4a) | Stalled projects need a next action to move forward |
| Healthy with actions | Present brief options | Multiple valid paths — ask user |
For overdue projects: Identify the specific overdue action(s) and announce:
"Project has overdue action 'Send invoice' (due 2026-01-10). Rescheduling — or would you rather mark the project complete / skip?"
If multiple actions are overdue, process each one sequentially. If the project also has non-overdue actions, only target the overdue ones.
For stalled projects: Announce:
"Project is stalled with no actions. Let's add the next action — or mark project complete / skip?"
For healthy projects: Ask the user: "What would you like to do?"
- Options: "Add action", "Mark action complete", "Edit action", "Mark project complete", "Skip"
In all cases, the user can override the suggestion by saying "complete project" or "skip".
Step 4a: Add Action
-
Ask the user: "What's the next action for [ProjectName]?"
- User provides action title
-
Infer all properties from the title text (same pattern as gtd-process):
- Task type: Infer human vs agent from text. Agent-centric indicators: "generate", "draft", "analyze", "research", "summarize", "review code", "run tests", "scan", "convert", "process". Default to human-centric when ambiguous.
- Time estimate (human only): Infer from complexity. "Email..." → @quick, "Research..." → @1pomo, "Write report..." → @2pomo, "Redesign..." → @deep. Skip for agent-centric tasks.
- Priority: Inherit from project priority by default
- Due date: No due date unless the title implies urgency ("today", "by Friday", "urgent"). For agent-centric tasks, default to one week from today if no date implied.
-
Present a single proposal for confirmation:
Human-centric example:
Action: "Email hotel for rates"
→ Type: Human
→ List: @quick (~15 min)
→ Priority: High (inherited from project)
→ Due: No due date
Confirm? [Yes / Modify / Skip]
Agent-centric example:
Action: "Analyze flight price trends"
→ Type: Agent
→ List: @agent
→ Priority: High (inherited from project)
→ Due: 2026-01-20
Confirm? [Yes / Modify / Skip]
Ask the user: "Confirm this action?"
- Options: "Yes", "Modify", "Skip"
- If "Modify": ask which property to change (includes "Task type"), then re-confirm
- If "Yes": create the action
- If "Skip": return to Step 2
-
Create the action:
swift <plugin-root>/scripts/productivity-cli.swift reminders create \
--title "Action title" \
--list "@quick" \
--notes "#{ProjectName-20260112}" \
--priority 1
Add --due "2026-01-20 17:00" only if a due date was inferred or confirmed.
-
Report: "Added action '[title]' to [ProjectName]"
-
Return to Step 2.
Step 4b: Complete Action
-
If project has multiple actions, ask the user: "Which action to complete?"
- Options: List of actions for this project
- If only one action, skip this question and complete it directly
-
Mark the selected action complete:
swift <plugin-root>/scripts/productivity-cli.swift reminders complete \
--title "Action title" \
--list "@1pomo"
-
Report: "Completed: '[action title]'"
-
Check remaining actions:
- If other actions remain: Report "Project [ProjectName] has N remaining actions." Return to Step 2.
- If no actions remain: Auto-suggest adding the next action:
"No remaining actions — project will become stalled. Let's add the next action."
Proceed to Step 4a. The user can select "Skip" in Step 4a's confirm prompt to decline and return to Step 2 (project becomes stalled).
Step 4c: Reschedule / Edit Action
-
If project has multiple actions, ask the user: "Which action to edit?"
- If only one action (or arrived here via auto-infer for overdue), skip this question
-
For overdue reschedule (arrived from auto-infer):
-
For general edit (user selected "Edit action"):
- Show current properties
- Ask the user: "What to edit?" (multiple selections allowed)
- Options: "Title", "Task type", "Time estimate", "Priority", "Due date", "Done editing"
- For each selected property, gather the new value:
- Title: ask for new title text
- Task type: options "Human", "Agent". Switching to agent moves task to @agent and removes time estimate. Switching to human requires selecting a time estimate.
- Time estimate (human only): options "Quick", "1 Pomodoro", "2 Pomodoros", "Deep" (maps to @quick, @1pomo, @2pomo, @deep)
- Priority: options "High", "Medium", "Low", "None" (maps to 1, 5, 9, 0)
- Due date: options "No due date", "Today", "Tomorrow", "This week", "Custom date"
-
To update, delete old action and create new one with updated properties:
swift <plugin-root>/scripts/productivity-cli.swift reminders delete \
--title "Old title" \
--list "@old-list"
swift <plugin-root>/scripts/productivity-cli.swift reminders create \
--title "New title" \
--list "@new-list" \
--notes "#{ProjectName}" \
--priority 5 \
--due "2026-01-15 17:00"
If the create command fails after deletion, immediately retry with the same parameters. Report the original action details to the user so they can manually recover if needed.
-
Report: "Updated action '[title]'"
-
Return to Step 2.
Step 5: Complete Project
-
Mark the project complete:
swift <plugin-root>/scripts/productivity-cli.swift reminders complete \
--title "ProjectName-20260112" \
--list "Projects"
-
Complete any remaining linked actions:
swift <plugin-root>/scripts/productivity-cli.swift reminders complete \
--title "Action title" \
--list "@1pomo"
-
Report: "Project '[ProjectName]' marked complete"
-
Return to Step 2.
Step 6: Exit
When user selects "Done reviewing" in Step 2:
# Review Complete
Projects reviewed: 3
Actions completed: 2
Actions added: 1
Projects completed: 1
Guidelines
- Prioritize overdue items — they always appear first in the overview
- Auto-infer actions for overdue/stalled projects to reduce questions
- Infer action properties from title text — only ask user to confirm
- Multiple actions per project: track all actionable tasks independently
- After completing an action, auto-suggest next action if project becomes stalled
- Create missing reminder lists automatically before creating reminders
- Handle CLI errors gracefully and report to user
- Match project names case-insensitively
- Use
yyyy-MM-dd HH:mm for due dates, default time 17:00
Reference: Context Lists
| List | Type | Time Estimate |
|---|
| @quick | Human | Quick tasks (< 25 min) |
| @1pomo | Human | 1 Pomodoro (25 min) |
| @2pomo | Human | 2 Pomodoros (50 min) |
| @deep | Human | Deep focus (3+ pomodoros) |
| @agent | Agent | N/A (async, monitor progress) |
Reference: Priority Values
| Display | Value |
|---|
| High | 1 |
| Medium | 5 |
| Low | 9 |
| None | 0 |