From 7e563bd334ed6fac1a40bc89301dd53e80eafdfa Mon Sep 17 00:00:00 2001 From: OpenCode Test Date: Mon, 5 Jan 2026 13:15:15 -0800 Subject: [PATCH] Add /tasks skill for Google Tasks MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - New gtasks skill with thin wrapper around morning-report collector - Register /tasks command with /todo, /todos aliases - Design doc at docs/plans/2026-01-05-gtasks-skill-design.md 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 --- docs/plans/2026-01-05-gtasks-skill-design.md | 75 ++++++++++++++++++++ skills/gtasks/SKILL.md | 52 ++++++++++++++ skills/gtasks/scripts/list.py | 30 ++++++++ state/component-registry.json | 19 +++++ 4 files changed, 176 insertions(+) create mode 100644 docs/plans/2026-01-05-gtasks-skill-design.md create mode 100644 skills/gtasks/SKILL.md create mode 100755 skills/gtasks/scripts/list.py diff --git a/docs/plans/2026-01-05-gtasks-skill-design.md b/docs/plans/2026-01-05-gtasks-skill-design.md new file mode 100644 index 0000000..d862d40 --- /dev/null +++ b/docs/plans/2026-01-05-gtasks-skill-design.md @@ -0,0 +1,75 @@ +# Design: Google Tasks Skill + +## Summary + +Minimal `/tasks` skill to list Google Tasks. Thin wrapper around existing morning-report collector. + +## Scope + +- **In scope:** List pending tasks +- **Out of scope (for now):** Complete, add, delete, filter by list + +## Structure + +``` +skills/gtasks/ +├── SKILL.md +└── scripts/ + └── list.py +``` + +## SKILL.md + +```yaml +--- +name: gtasks +description: Google Tasks read access — list pending tasks. Use when asked about tasks, todos, or what needs to be done. +allowed-tools: + - Bash + - Read +--- +``` + +Quick command: `$GMAIL_PY ~/.claude/skills/gtasks/scripts/list.py` + +Request routing: +| User Request | Action | +|--------------|--------| +| "What are my tasks?" | `list.py` | +| "Show my todos" | `list.py` | +| "/tasks" | `list.py` | + +Policy: Read-only, summarize results. + +## list.py Script + +Thin wrapper that imports from `morning-report/scripts/collectors/gtasks.py`. + +- Default shows up to 10 tasks +- Optional arg for more: `list.py 20` +- Reuses existing auth and fetch logic + +## Registry Updates + +**skills:** +```json +"gtasks": { + "description": "Google Tasks read access - list pending tasks", + "triggers": ["tasks", "todo", "to do", "to-do", "pending"] +} +``` + +**commands:** +```json +"/tasks": { + "description": "List Google Tasks", + "aliases": ["/todo", "/todos"], + "invokes": "skill:gtasks" +} +``` + +## Future Expansion + +- Complete task by ID +- Filter by task list +- Show due dates diff --git a/skills/gtasks/SKILL.md b/skills/gtasks/SKILL.md new file mode 100644 index 0000000..f347382 --- /dev/null +++ b/skills/gtasks/SKILL.md @@ -0,0 +1,52 @@ +--- +name: gtasks +description: Google Tasks read access — list pending tasks. Use when asked about tasks, todos, or what needs to be done. +allowed-tools: + - Bash + - Read +--- + +# Google Tasks Skill + +List pending Google Tasks. Uses OAuth credentials at `~/.gmail-mcp/`. + +## Quick Commands + +```bash +GMAIL_PY=~/.claude/mcp/gmail/venv/bin/python +SCRIPTS=~/.claude/skills/gtasks/scripts + +# List tasks (default 10) +$GMAIL_PY $SCRIPTS/list.py + +# Show more tasks +$GMAIL_PY $SCRIPTS/list.py 20 +``` + +## Script Reference + +| Script | Purpose | Args | +|--------|---------|------| +| `list.py` | List pending tasks | `[max]` (default 10) | + +## Request Routing + +| User Request | Script | +|--------------|--------| +| "What are my tasks?" | `list.py` | +| "Show my todos" | `list.py` | +| "/tasks" | `list.py` | + +## Output Format + +``` +6 pending + • 5:00 PM - Dinner at Lecosho + • 3:00 PM - Snack at Le Panier + • 2:00 PM - Coffee at QED +``` + +## Policy + +- **Read-only** operations only +- **Summarize** results, don't dump raw data diff --git a/skills/gtasks/scripts/list.py b/skills/gtasks/scripts/list.py new file mode 100755 index 0000000..b8e0d34 --- /dev/null +++ b/skills/gtasks/scripts/list.py @@ -0,0 +1,30 @@ +#!/usr/bin/env python3 +"""List Google Tasks - thin wrapper around morning-report collector.""" + +import sys +from pathlib import Path + +# Import from morning-report collector +sys.path.insert(0, str(Path.home() / ".claude/skills/morning-report/scripts/collectors")) + +from gtasks import fetch_tasks, format_tasks + + +def main(): + max_display = int(sys.argv[1]) if len(sys.argv) > 1 else 10 + tasks = fetch_tasks(max_results=max_display + 5) + + if not tasks: + print("No pending tasks.") + return + + # Check for error response + if len(tasks) == 1 and "error" in tasks[0]: + print(f"Error: {tasks[0]['error']}") + return + + print(format_tasks(tasks, max_display)) + + +if __name__ == "__main__": + main() diff --git a/state/component-registry.json b/state/component-registry.json index b7ebfbc..273cc8f 100644 --- a/state/component-registry.json +++ b/state/component-registry.json @@ -121,6 +121,17 @@ "remember", "history" ] + }, + "gtasks": { + "description": "Google Tasks read access - list pending tasks", + "script": "~/.claude/skills/gtasks/scripts/list.py", + "triggers": [ + "tasks", + "todo", + "to do", + "to-do", + "pending" + ] } }, "commands": { @@ -145,6 +156,14 @@ ], "invokes": "skill:gcal" }, + "/tasks": { + "description": "List Google Tasks", + "aliases": [ + "/todo", + "/todos" + ], + "invokes": "skill:gtasks" + }, "/usage": { "description": "View usage statistics", "aliases": [