| name | things3-cli-wrapper |
| description | Manage Things 3 tasks, projects, and areas using the thangs CLI. Supports listing, adding, editing, completing, and canceling tasks with intelligent filtering and organization. |
| allowed-tools | Bash |
Things3 CLI Wrapper Skill
Overview
This skill teaches you how to use the thangs CLI tool to manage tasks in Things 3, a popular task management application for macOS. Things 3 must be installed and running on the user's system for these commands to work.
When to use this skill:
- Managing personal or professional tasks
- Creating, updating, or completing to-do items
- Organizing work into projects and areas
- Filtering and viewing tasks by various criteria
Prerequisites:
- Things 3 must be installed on macOS
- The
thangsCLI must be installed globally (npm install -g @dougskinner/thangs) - Things 3 must be running (or will launch automatically when commands execute)
Key Capabilities:
- List and filter tasks by list, project, area, or tag
- Create new tasks with rich metadata (notes, due dates, tags, assignments)
- Update existing tasks (rename, change dates, move between projects/areas)
- Complete or cancel tasks
- Create projects and areas for organization
- Machine-readable JSON output for scripting
Core Concepts
Things 3 Hierarchy
Things 3 organizes tasks in a three-level hierarchy:
- Areas (top level) - Major life domains like "Work", "Personal", "Health"
- Projects (middle level) - Specific initiatives within areas like "Q1 Planning", "Website Redesign"
- Tasks (bottom level) - Individual actionable items
Important relationships:
- Tasks can belong to a project OR an area, but not both
- Projects can belong to an area
- Tasks without a project or area go to the Inbox
Built-in Lists
Things 3 provides smart lists that dynamically filter tasks:
- Today - Tasks scheduled for today
- Upcoming - Tasks scheduled for future dates
- Anytime - Tasks without specific dates
- Someday - Tasks deferred for later consideration
Task Lifecycle
Tasks progress through states:
- Created - New task in Inbox or assigned location
- Scheduled - Task assigned to a date (appears in Today/Upcoming)
- Completed - Task marked as done
- Canceled - Task moved to trash
Tags
Tasks can have multiple tags for cross-cutting organization (e.g., "urgent", "waiting", "quick-win"). Tags are comma-separated in commands.
Commands Quick Reference
Decision Tree: Which Command to Use?
Want to VIEW tasks? → Use list
- Filter by list:
--list Today - Filter by project:
--project "Website Redesign" - Filter by area:
--area Work - Filter by tag:
--tag urgent
Want to CREATE something?
- New task → Use
add <name> - New project → Use
add-project <name> - New area → Use
add-area <name>
Want to MODIFY a task?
- Update properties → Use
edit <task> - Mark as done → Use
complete <task> - Move to trash → Use
cancel <task>
Command Syntax Patterns
list - View Tasks
thangs list [--list <name>] [--project <name>] [--area <name>] [--tag <name>] [--json]
Options:
--list- Filter by built-in list: Today, Upcoming, Anytime, Someday--project- Filter by project name (case-insensitive partial match)--area- Filter by area name (case-insensitive partial match)--tag- Filter by tag name (case-insensitive partial match)--json- Output JSON array instead of formatted table
Examples:
thangs list # All tasks
thangs list --list Today # Today's tasks
thangs list --project "Marketing" # Tasks in Marketing project
thangs list --area Work --json # Work area tasks as JSON
add - Create Task
thangs add <name> [--notes <text>] [--due <YYYY-MM-DD>] [--tags <tag1,tag2>] [--project <name>] [--area <name>] [--json]
Required:
<name>- Task name (positional argument)
Options:
--notes- Task notes/description--due- Due date in YYYY-MM-DD format--tags- Comma-separated tags--project- Assign to project by name--area- Assign to area by name--json- Output JSON response
Examples:
thangs add "Review budget"
thangs add "Call client" --due 2025-12-15 --tags urgent,phone
thangs add "Design mockups" --project "Website Redesign" --notes "Focus on mobile-first"
edit - Update Task
thangs edit <task> [--name <newName>] [--notes <text>] [--due <YYYY-MM-DD>] [--tags <tag1,tag2>] [--project <name>] [--area <name>] [--json]
Required:
<task>- Current task name (must be unique)
Options:
--name- Rename the task--notes- Update task notes--due- Change due date (YYYY-MM-DD format)--tags- Replace all tags (comma-separated, empty string clears tags)--project- Move to different project--area- Move to different area--json- Output JSON response
Examples:
thangs edit "Review budget" --due 2025-12-20
thangs edit "Call client" --tags urgent,follow-up
thangs edit "Old name" --name "New name" --project "Different Project"
complete - Mark Task Done
thangs complete <task> [--json]
Required:
<task>- Task name to complete (must be unique)
Examples:
thangs complete "Review budget"
thangs complete "Call client" --json
cancel - Move Task to Trash
thangs cancel <task> [--json]
Required:
<task>- Task name to cancel (must be unique)
Examples:
thangs cancel "Outdated task"
thangs cancel "Duplicate item" --json
add-project - Create Project
thangs add-project <name> [--area <name>] [--notes <text>] [--deadline <YYYY-MM-DD>] [--json]
Required:
<name>- Project name
Options:
--area- Create project within specific area--notes- Project notes--deadline- Project deadline (YYYY-MM-DD format)--json- Output JSON response
Examples:
thangs add-project "Q1 Planning"
thangs add-project "Website Redesign" --area Work --deadline 2025-03-31
add-area - Create Area
thangs add-area <name> [--json]
Required:
<name>- Area name
Examples:
thangs add-area "Work"
thangs add-area "Health" --json
Common Workflows
Basic Operations
Daily Task Review
# See what's due today
thangs list --list Today
# Complete a task
thangs complete "Morning standup"
# Add a new task for today
thangs add "Review pull requests" --due 2025-12-09
Quick Task Capture
# Add task to Inbox (default)
thangs add "Call dentist"
# Add task with context
thangs add "Prepare presentation" --notes "Include Q4 metrics" --tags work,urgent
Task Completion
# Mark task as done
thangs complete "Write report"
# Cancel task that's no longer needed
thangs cancel "Old meeting prep"
Intermediate Operations
Project-Based Task Management
# Create a new project
thangs add-project "Website Redesign" --area Work
# Add tasks to the project
thangs add "Create wireframes" --project "Website Redesign"
thangs add "Review designs" --project "Website Redesign" --tags review
# View all project tasks
thangs list --project "Website Redesign"
# Complete project tasks
thangs complete "Create wireframes"
Area-Based Organization
# Create areas for life domains
thangs add-area "Work"
thangs add-area "Personal"
thangs add-area "Health"
# Add tasks directly to areas (without projects)
thangs add "Schedule doctor visit" --area Health
thangs add "Update resume" --area Personal
# View all tasks in an area
thangs list --area Work
Tag-Based Filtering
# Add tasks with tags
thangs add "Review contracts" --tags urgent,legal
thangs add "Quick email replies" --tags quick-win
# Filter by tag
thangs list --tag urgent
thangs list --tag quick-win
Advanced Operations
Batch Operations with JSON Output
# Get all Today tasks as JSON for processing
thangs list --list Today --json > today.json
# Parse JSON with jq (if available)
thangs list --area Work --json | jq '.[] | select(.tags | contains("urgent"))'
Task Migration Between Projects
# Move task to different project
thangs edit "Update documentation" --project "New Project"
# Move task from project to area directly
thangs edit "General task" --area Work
Due Date Management
# Set due date for task
thangs edit "Submit report" --due 2025-12-15
# View upcoming tasks
thangs list --list Upcoming
# Reschedule task
thangs edit "Submit report" --due 2025-12-20
Complex Task Updates
# Update multiple properties at once
thangs edit "Research competitors" \
--name "Competitive analysis report" \
--due 2025-12-31 \
--tags research,high-priority \
--project "Market Research" \
--notes "Focus on pricing and features"
Important Notes
Task Name Uniqueness
Critical: For complete, cancel, and edit commands, task names must be unique. If multiple tasks have the same name, you'll receive an error listing all matching tasks. In this case:
- Rename one of the tasks to make them unique
- Use the full task name with more specific identifiers
- View the list of tasks to identify which one to update
Example Error:
thangs complete "Meeting"
# Error: Multiple tasks found with name "Meeting":
# - "Meeting" (Project: Q1 Planning, Due: 2025-12-10)
# - "Meeting" (Project: Weekly Sync, Due: 2025-12-11)
Solution:
# Make names unique first
thangs edit "Meeting" --name "Q1 Planning Meeting" # Edit the first one
thangs complete "Q1 Planning Meeting"
Date Format
All date inputs must use YYYY-MM-DD format:
- ✅ Correct:
--due 2025-12-31 - ❌ Wrong:
--due 12/31/2025 - ❌ Wrong:
--due Dec 31, 2025
Things 3 Must Be Running
The CLI interacts with Things 3 via AppleScript, which requires Things 3 to be running. If Things 3 is not running, it will launch automatically, but there may be a brief delay on the first command.
JSON Output for Scripting
Use --json flag for machine-readable output when:
- Building automation scripts
- Parsing output with tools like
jq - Integrating with other systems
JSON Output Format:
{
"success": true,
"data": { ... }
}
or on error:
{
"success": false,
"error": "Error message"
}
Error Handling Patterns
Common errors and solutions:
- Task not found - Verify task name is correct (case-sensitive)
- Multiple tasks found - Make task names unique (see above)
- Invalid date format - Use YYYY-MM-DD format
- Project/Area not found - Create the project/area first, or check spelling
- Things 3 not accessible - Ensure Things 3 is installed and permissions are granted
Performance Considerations
- Listing all tasks can be slow with large task databases (1000+ tasks)
- Use filters (--list, --project, --area) to narrow results
- JSON output is faster than table formatting for large result sets
See Also
For complete command reference with all options and examples, see:
- reference.md - Detailed documentation for every command, flag, and option
- examples.md - Real-world usage scenarios and workflows
For developers modifying or contributing to this skill:
- README.md - Skill structure, testing workflow, and contribution guidelines