Filter Skill
filter-skill
Filter tasks by priority, status, tags, due dates, and other criteria. Use when implementing filtering functionality.
SKILL.md
Full skill instructions
Filter Skill
Purpose
Implement comprehensive filtering for task management.
Instructions
Filter by Priority
from typing import List, Optional
def filter_by_priority(self, priority: str) -> List[dict]:
"""Filter tasks by priority level."""
return self.db.search(self.db.query.priority == priority)
def filter_by_priorities(self, priorities: List[str]) -> List[dict]:
"""Filter tasks by multiple priority levels."""
return [t for t in self.get_all_tasks() if t.get('priority') in priorities]
def get_urgent_tasks(self) -> List[dict]:
"""Get only urgent and high priority tasks."""
return self.filter_by_priorities(['urgent', 'high'])
Filter by Status
def filter_by_status(self, status: str) -> List[dict]:
"""Filter tasks by status."""
return self.db.search(self.db.query.status == status)
def get_pending_tasks(self) -> List[dict]:
"""Get all pending tasks."""
return self.filter_by_status('pending')
def get_completed_tasks(self) -> List[dict]:
"""Get all completed tasks."""
return self.filter_by_status('completed')
def get_active_tasks(self) -> List[dict]:
"""Get all non-completed tasks."""
return self.db.search(self.db.query.status != 'completed')
Filter by Tags
def filter_by_tag(self, tag: str) -> List[dict]:
"""Filter tasks containing a specific tag."""
tag = tag.lower()
return self.db.search(
self.db.query.tags.test(
lambda tags: tag in [t.lower() for t in tags]
)
)
def filter_by_all_tags(self, tags: List[str]) -> List[dict]:
"""Filter tasks containing ALL specified tags."""
tags = [t.lower() for t in tags]
return self.db.search(
self.db.query.tags.test(
lambda task_tags: all(
tag in [t.lower() for t in task_tags]
for tag in tags
)
)
)
def filter_by_any_tag(self, tags: List[str]) -> List[dict]:
"""Filter tasks containing ANY specified tag."""
tags = [t.lower() for t in tags]
return self.db.search(
self.db.query.tags.test(
lambda task_tags: any(
tag in [t.lower() for t in task_tags]
for tag in tags
)
)
)
Filter by Due Date
from datetime import datetime, timedelta
def get_overdue_tasks(self) -> List[dict]:
"""Get tasks past their due date."""
now = datetime.now().isoformat()
return self.db.search(
(self.db.query.due_date.exists()) &
(self.db.query.due_date.test(lambda d: d < now)) &
(self.db.query.status != 'completed')
)
def get_due_today(self) -> List[dict]:
"""Get tasks due today."""
today = datetime.now().date().isoformat()
tomorrow = (datetime.now().date() + timedelta(days=1)).isoformat()
return self.db.search(
(self.db.query.due_date.exists()) &
(self.db.query.due_date.test(lambda d: today <= d[:10] < tomorrow))
)
def get_due_this_week(self) -> List[dict]:
"""Get tasks due within the next 7 days."""
today = datetime.now().date()
week_end = (today + timedelta(days=7)).isoformat()
return self.db.search(
(self.db.query.due_date.exists()) &
(self.db.query.due_date.test(
lambda d: today.isoformat() <= d[:10] <= week_end
))
)
def get_tasks_without_due_date(self) -> List[dict]:
"""Get tasks without a due date."""
return self.db.search(
~self.db.query.due_date.exists() |
(self.db.query.due_date == None)
)
Combined Filter Service
class FilterService:
"""Comprehensive filter service with chainable filters."""
def __init__(self, database):
self.db = database
def filter_tasks(
self,
priority: Optional[str] = None,
priorities: Optional[List[str]] = None,
status: Optional[str] = None,
tags: Optional[List[str]] = None,
tag_mode: str = 'any', # 'any' or 'all'
has_due_date: Optional[bool] = None,
is_overdue: Optional[bool] = None,
due_before: Optional[str] = None,
due_after: Optional[str] = None,
) -> List[dict]:
"""Apply multiple filters to tasks."""
tasks = self.db.get_all()
# Priority filter
if priority:
tasks = [t for t in tasks if t.get('priority') == priority]
elif priorities:
tasks = [t for t in tasks if t.get('priority') in priorities]
# Status filter
if status:
tasks = [t for t in tasks if t.get('status') == status]
# Tags filter
if tags:
tags = [tag.lower() for tag in tags]
if tag_mode == 'all':
tasks = [
t for t in tasks
if all(tag in [x.lower() for x in t.get('tags', [])] for tag in tags)
]
else: # 'any'
tasks = [
t for t in tasks
if any(tag in [x.lower() for x in t.get('tags', [])] for tag in tags)
]
# Due date presence filter
if has_due_date is not None:
if has_due_date:
tasks = [t for t in tasks if t.get('due_date')]
else:
tasks = [t for t in tasks if not t.get('due_date')]
# Overdue filter
if is_overdue is not None:
now = datetime.now().isoformat()
if is_overdue:
tasks = [
t for t in tasks
if t.get('due_date') and t['due_date'] < now and t.get('status') != 'completed'
]
else:
tasks = [
t for t in tasks
if not t.get('due_date') or t['due_date'] >= now
]
# Date range filters
if due_before:
tasks = [t for t in tasks if t.get('due_date') and t['due_date'] < due_before]
if due_after:
tasks = [t for t in tasks if t.get('due_date') and t['due_date'] > due_after]
return tasks
Best Practices
- Handle None/empty filter values gracefully
- Support both single and multiple value filters
- Provide sensible defaults for filter modes
- Combine filters efficiently (filter in memory when possible)
- Cache common filter results if performance is needed
- Normalize tags and other text-based filters
