Skills linear-todos
A CLI tool that executes Python source code to manage todos via Linear's API. Creates tasks with natural language dates, priorities, and scheduling. This is a source-execution skill - code in src/linear_todos/ runs when commands are invoked.
git clone https://github.com/openclaw/skills
T=$(mktemp -d) && git clone --depth=1 https://github.com/openclaw/skills "$T" && mkdir -p ~/.claude/skills && cp -r "$T/skills/avegancafe/linear-todos" ~/.claude/skills/openclaw-skills-linear-todos && rm -rf "$T"
T=$(mktemp -d) && git clone --depth=1 https://github.com/openclaw/skills "$T" && mkdir -p ~/.openclaw/skills && cp -r "$T/skills/avegancafe/linear-todos" ~/.openclaw/skills/openclaw-skills-linear-todos && rm -rf "$T"
skills/avegancafe/linear-todos/SKILL.mdLinear Todos
⚠️ This is a SOURCE-EXECUTION skill. The agent runs Python code from
when you invoke CLI commands. This is not instruction-only. Reviewsrc/linear_todos/before first use.src/linear_todos/api.py🔐 Security Note: This skill stores your Linear API key in plaintext JSON at
only if you run the~/.config/linear-todos/config.jsoncommand. Use a dedicated API key with minimal scope. The key is only used for Linear API calls and is never transmitted elsewhere. Prefer environment variables (setup) to avoid persisted state.LINEAR_API_KEYAudit Info: This skill makes HTTPS requests only to
(Linear's official GraphQL API). No data is sent elsewhere. Seeapi.linear.appfor the API client implementation.src/linear_todos/api.py
Credentials
| Variable | Required | Description |
|---|---|---|
| Yes | Your Linear API key from linear.app/settings/api |
| No | Default team ID for todos |
| No | Default state for new todos |
| No | State for completed todos |
| No | Your local timezone (e.g., , ). Used for "end of day" calculations. Falls back to OpenClaw timezone if available. |
Config Path:
~/.config/linear-todos/config.json (created by setup, permissions 0o600)
Security & Auditing
What This Skill Does
- HTTP Requests: Makes HTTPS requests only to
(Linear's official API). No telemetry, no third-party services.https://api.linear.app/graphql - Data Storage: Stores your API key and config in
(plaintext, permissions 0o600) only if you run the~/.config/linear-todos/config.json
command. Team/issue data is fetched fresh each run — nothing is cached locally except your config.setup - Runtime Behavior: This skill runs from bundled Python source code (not preinstalled system tools). The agent executes
and code inmain.py
when you run CLI commands.src/linear_todos/ - Setup Behavior: During interactive setup, the wizard temporarily sets
in the process environment to test the key. This is only during the setup session and is not persisted.LINEAR_API_KEY - No Auto-Enable: Does not request platform privileges (
). Will not auto-enable itself for all agents.always: false - Code Locations:
— All HTTP requests to Linearsrc/linear_todos/api.py
— Config file handlingsrc/linear_todos/config.py
— Interactive setupsrc/linear_todos/setup_wizard.py
— CLI commandssrc/linear_todos/cli.py
Recommended Security Practices
- Use a dedicated API key: Create a separate Linear API token with minimal scope for this skill. Revoke it if you uninstall or stop using the skill.
- Prefer environment variables: Set
in your shell instead of runningLINEAR_API_KEY
— no plaintext file is created.setup - Audit the code: Review
to verify HTTP destinations before first use.src/linear_todos/api.py - Run initial setup in isolation: If unsure, run the skill in a container/VM for the first setup to inspect behavior.
Cron Jobs (Optional)
The file
cron-jobs.txt contains example cron entries for daily digests. It does NOT automatically install them. Adding cron jobs requires manual action:
# Review the examples first: cat cron-jobs.txt # If you want to use them, edit your crontab: crontab -e
Preferred alternative: Use OpenClaw's built-in cron instead of system crontab:
openclaw cron add --name "morning-digest" --schedule "0 8 * * *" \ --payload "linear-todos digest" --session-target isolated
A powerful todo management system built on Linear with smart date parsing, priorities, and a complete CLI workflow.
Quick Start
# Setup (run once) uv run python main.py setup # Create todos uv run python main.py create "Call mom" --when day uv run python main.py create "Pay taxes" --date 2025-04-15 uv run python main.py create "Review PR" --priority high --when week # Natural language dates uv run python main.py create "Meeting prep" --date "tomorrow" uv run python main.py create "Weekly report" --date "next Monday" uv run python main.py create "Dentist" --date "in 3 days" # Manage todos uv run python main.py list uv run python main.py done ABC-123 uv run python main.py snooze ABC-123 "next week" # Daily review uv run python main.py review
Setup
1. Get API Key
Get your API key from linear.app/settings/api. Recommendation: Create a dedicated API key with minimal scope for this skill.
2. Run Setup
uv run python main.py setup
This interactive wizard will:
- Verify your API key
- List your Linear teams
- Let you select your todo team
- Configure initial and done states
- Save settings to
(plaintext JSON)~/.config/linear-todos/config.json
3. Manual Configuration (optional)
Instead of running setup, you can use environment variables:
export LINEAR_API_KEY="lin_api_..." export LINEAR_TEAM_ID="your-team-id" export LINEAR_STATE_ID="your-todo-state-id" export LINEAR_DONE_STATE_ID="your-done-state-id"
Or create
~/.config/linear-todos/config.json:
{ "apiKey": "lin_api_...", "teamId": "team-uuid", "stateId": "todo-state-uuid", "doneStateId": "done-state-uuid", "timezone": "America/New_York" }
Commands
create
Create a new todo with optional timing, priority, and description.
uv run python main.py create "Title" [options] Options: --when day|week|month Relative due date --date DATE Specific due date (supports natural language) --priority LEVEL urgent, high, normal, low, none --desc "Description" Add description
Natural Date Examples:
uv run python main.py create "Task" --date "tomorrow" uv run python main.py create "Task" --date "Friday" uv run python main.py create "Task" --date "next Monday" uv run python main.py create "Task" --date "in 3 days" uv run python main.py create "Task" --date "in 2 weeks" uv run python main.py create "Task" --date "2025-04-15"
Complete Examples:
# Due by end of today uv run python main.py create "Call mom" --when day # Due in 7 days uv run python main.py create "Submit report" --when week # Specific date with high priority uv run python main.py create "Launch feature" --date 2025-03-15 --priority high # Natural language date with description uv run python main.py create "Team meeting prep" --date "next Monday" --desc "Prepare slides" # Urgent priority, due tomorrow uv run python main.py create "Fix production bug" --priority urgent --date tomorrow
list
List all your todos.
uv run python main.py list [options] Options: --all Include completed todos --json Output as JSON
done
Mark a todo as completed.
uv run python main.py done ISSUE_ID # Examples uv run python main.py done TODO-123 uv run python main.py done ABC-456
snooze
Reschedule a todo to a later date.
uv run python main.py snooze ISSUE_ID [when] # Examples uv run python main.py snooze TODO-123 "tomorrow" uv run python main.py snooze TODO-123 "next Friday" uv run python main.py snooze TODO-123 "in 1 week"
review
Daily review command that organizes todos by urgency.
uv run python main.py review
Output sections:
- 🚨 OVERDUE - Past due date
- 📅 Due Today - Due today
- ⚡ High Priority - Urgent/high priority items
- 📊 This Week - Due within 7 days
- 📅 This Month - Due within 28 days
- 📝 No Due Date - Items without dates
setup
Interactive setup wizard to configure your Linear integration.
uv run python main.py setup
This will guide you through:
- Verifying your API key
- Selecting your Linear team
- Configuring initial and done states
- Saving settings to
~/.config/linear-todos/config.json
For Agents
When the user asks for reminders or todos:
1. Parse Natural Language Dates
Convert user input to specific dates:
# "remind me Friday to call mom" uv run python main.py create "Call mom" --date "2025-02-21" # "remind me to pay taxes by April 15" uv run python main.py create "Pay taxes" --date "2025-04-15" # "remind me next week about the meeting" uv run python main.py create "Meeting" --date "next Monday"
2. Determine Priority
Ask if not specified:
- Urgent (🔥) - Critical, do immediately
- High (⚡) - Important, do soon
- Normal (📌) - Standard priority (default)
- Low (💤) - Can wait
3. Daily Briefing
When asked "what do I have to do today", run:
uv run python main.py review
Present the output exactly as formatted - don't reformat or summarize.
4. Complete Todos
When user says they completed something, mark it done:
uv run python main.py done ISSUE-123
Date Parsing Reference
| Input | Result |
|---|---|
| Today |
| Next day |
| Next occurrence of Friday |
| Monday of next week |
| Friday of current week (or next if passed) |
| 3 days from now |
| 14 days from now |
| Specific date |
Priority Levels
| Level | Number | Icon | Use For |
|---|---|---|---|
| Urgent | 1 | 🔥 | Critical, blocking issues |
| High | 2 | ⚡ | Important, time-sensitive |
| Normal | 3 | 📌 | Standard tasks (default) |
| Low | 4 | 💤 | Nice-to-have, can wait |
| None | 0 | 📋 | No priority set |
Timezone Support
By default, due dates are calculated in UTC (end of day = 23:59:59 UTC). To use your local timezone for "end of day" calculations:
# Set via environment variable export LINEAR_TIMEZONE="America/New_York" # Or add to config.json { "timezone": "America/New_York" }
OpenClaw Integration: If running inside an OpenClaw workspace, the skill will automatically detect your timezone from
USER.md (e.g., timezone: America/New_York). No manual configuration needed!
When a timezone is configured:
sets due date to end of today in your timezone (converted to UTC for Linear)--when day
sets due date to 7 days from now, end of day in your timezone--when week
sets due date to end of tomorrow in your timezone--date "tomorrow"
Common timezone values:
America/New_York, America/Los_Angeles, Europe/London, Europe/Paris, Asia/Tokyo
Configuration Precedence
Settings are loaded in this order (later overrides earlier):
- Default values (none)
- Config file:
~/.config/linear-todos/config.json - Environment variables:
LINEAR_* - Command-line flags:
,--team--state
Files
| File | Purpose |
|---|---|
| Main entry point for the CLI |
| CLI implementation with all commands |
| Linear API client |
| Configuration management |
| Date parsing utilities |
| Interactive setup wizard |