بنقرة واحدة
tasknotes
// Create, read, update, and query tasks managed by the TaskNotes plugin. Use when the user asks about their tasks, todos, due dates, priorities, projects, scheduling, time tracking, or recurring tasks.
// Create, read, update, and query tasks managed by the TaskNotes plugin. Use when the user asks about their tasks, todos, due dates, priorities, projects, scheduling, time tracking, or recurring tasks.
Run integration tests against a live Obsidian vault using the obsidian CLI. Use for: verifying plugin behavior end-to-end, checking DOM state after commands, asserting no runtime errors, creating/reading/deleting test fixtures in the vault, taking screenshots, inspecting console output. Do NOT use for unit tests or mocked environments.
Work with Obsidian Bases for structured data and database-like views. Use when user asks about creating bases, defining schemas, filtering data, or working with structured note collections.
Work with Obsidian Canvas files for visual note-taking and concept mapping. Use when user asks about creating, editing, or understanding canvas files, nodes, connections, or visual layouts.
Query and analyze notes using Dataview DQL language. Use when user needs tables, lists, or data analysis from vault metadata and frontmatter properties. Requires Dataview plugin.
Create charts and visualizations from note data using Chart.js via dataviewjs. Use when user wants bar charts, line graphs, pie charts, or any data visualization. Requires Obsidian Charts plugin.
| name | tasknotes |
| description | Create, read, update, and query tasks managed by the TaskNotes plugin. Use when the user asks about their tasks, todos, due dates, priorities, projects, scheduling, time tracking, or recurring tasks. |
| license | MIT |
| compatibility | Requires TaskNotes plugin to be installed and enabled in Obsidian |
| metadata | {"author":"Smart2Brain","version":"1.0","linkedPlugin":"tasknotes"} |
This skill enables you to work with tasks managed by the TaskNotes plugin. Each task is a Markdown file with YAML frontmatter stored in a configurable folder (default: TaskNotes/Tasks/).
Use the search_notes, read_content, get_properties, and manage_notes tools to read and write tasks.
Every task is a .md file. The full set of supported frontmatter fields is:
---
title: "Task title" # string, required
status: "open" # see Statuses below
priority: "normal" # see Priorities below
due: "2025-01-20" # YYYY-MM-DD or YYYY-MM-DDTHH:MM:SS
scheduled: "2025-01-15" # planned start date (when to work on it)
completed_date: "2025-01-20" # set automatically when status → completed
contexts: # list of @context strings
- "@work"
- "@computer"
projects: # list of [[wikilinks]] or plain strings
- "[[Website Redesign]]"
tags: # native Obsidian tags
- "important"
time_estimate: 60 # minutes (integer)
timeEntries: # work session log
- startTime: "2025-01-15T10:00:00Z"
endTime: "2025-01-15T10:45:00Z"
description: "Initial work"
recurrence: "FREQ=WEEKLY;BYDAY=MO" # RFC 5545 RRULE
recurrence_anchor: "scheduled" # "scheduled" or "completion"
complete_instances: # list of completed occurrence dates (recurring tasks)
- "2025-01-13"
skipped_instances: [] # list of skipped occurrence dates
blocked_by: # prerequisite tasks
- uid: "other-task-id"
reltype: "FINISHTOSTART" # FINISHTOSTART | FINISHTOFINISH | STARTTOSTART | STARTTOFINISH
gap: "1d" # optional delay after predecessor
reminders:
- type: "relative" # "relative" or "absolute"
value: "-1d" # "-1d" means 1 day before due/scheduled
archived: false # boolean
id: "task-uuid" # stable identifier (set by plugin)
date_created: "2025-01-10T09:00:00Z"
date_modified: "2025-01-15T14:30:00Z"
---
Optional markdown body with notes, checklists, context, etc.
Default values (the user may have customized these):
| Status | Meaning | Is completed? |
|---|---|---|
open | Not yet started | No |
in-progress | Actively being worked on | No |
done | Completed | Yes |
When a task reaches a "completed" status,
completed_dateis set automatically and the plugin may archive it after a configured delay.
Default values (the user may have customized these):
| Priority | Meaning |
|---|---|
none | No priority |
low | Low urgency |
normal | Default |
high | Urgent |
due — the hard deadline. Use this when the user says "due by", "deadline", "must finish by".scheduled — the planned start date. Use this when the user says "start on", "work on it on", "plan for". For recurring tasks, this holds the next concrete occurrence.Use search_notes with a property filter, or get_properties to inspect a file's frontmatter.
For structured queries across many tasks, use execute_dataview_query (if the Dataview skill is also enabled):
TABLE title, status, due, priority
FROM "TaskNotes/Tasks"
WHERE status != "done"
SORT due ASC
LIMIT 20
TABLE title, due, priority
FROM "TaskNotes/Tasks"
WHERE due AND date(due) < date(today) AND status != "done"
SORT priority DESC, due ASC
LIMIT 20
TABLE title, due, status
FROM "TaskNotes/Tasks"
WHERE due AND date(due) >= date(today) AND date(due) <= date(today) + dur(7 days)
SORT due ASC
LIMIT 20
TABLE title, status, due
FROM "TaskNotes/Tasks"
WHERE contains(projects, "[[Website Redesign]]")
SORT due ASC
LIMIT 20
TABLE title, status, due
FROM "TaskNotes/Tasks"
WHERE contains(contexts, "@work")
SORT priority DESC
LIMIT 20
TABLE title, due, scheduled
FROM "TaskNotes/Tasks"
WHERE priority = "high" AND status = "open"
SORT due ASC
LIMIT 20
Use manage_notes with type: "create". Always include at minimum title and status. Follow this template:
---
title: "Buy groceries"
status: "open"
priority: "normal"
scheduled: "2025-01-15"
due: ""
contexts:
- "@errands"
projects: []
tags: []
time_estimate: 30
---
Rules:
TaskNotes/Tasks/).Buy groceries.md).YYYY-MM-DD date format."") rather than omitting them — the plugin expects them.date_created, date_modified, or id — these are managed by the plugin.Update the status field to the completed value (usually "done") via manage_notes with type: "update".
{
"type": "update",
"path": "TaskNotes/Tasks/Buy groceries.md",
"edits": [
{ "oldText": "status: \"open\"", "newText": "status: \"done\"" }
]
}
Do NOT set
completed_datemanually — the plugin manages it automatically.
Update scheduled and/or due with the new date:
{
"type": "update",
"path": "TaskNotes/Tasks/Some task.md",
"edits": [
{ "oldText": "scheduled: \"2025-01-10\"", "newText": "scheduled: \"2025-01-17\"" }
]
}
Recurring tasks use RFC 5545 RRULE syntax in the recurrence field. The scheduled field holds the next occurrence — do not manually advance it; the plugin handles this on completion.
| Pattern | RRULE |
|---|---|
| Daily | FREQ=DAILY |
| Every weekday | FREQ=WEEKLY;BYDAY=MO,TU,WE,TH,FR |
| Every Monday | FREQ=WEEKLY;BYDAY=MO |
| Every Mon/Wed/Fri | FREQ=WEEKLY;BYDAY=MO,WE,FR |
| Weekly on a specific day | FREQ=WEEKLY;BYDAY=FR |
| Bi-weekly | FREQ=WEEKLY;INTERVAL=2;BYDAY=MO |
| Monthly on the 1st | FREQ=MONTHLY;BYMONTHDAY=1 |
recurrence_anchor controls whether the next recurrence is calculated from the scheduled date ("scheduled") or from the actual completion date ("completion").
To mark a single occurrence as done without creating a new manage_notes update, you'd normally use the plugin's UI. If the user asks to mark one occurrence done via the agent, append the date to complete_instances:
{ "oldText": "complete_instances: []", "newText": "complete_instances:\n - \"2025-01-13\"" }
time_estimate is an integer in minutes.timeEntries is a list of {startTime, endTime, description} objects with ISO 8601 UTC timestamps.timeEntries to summarise tracked time.Total minutes tracked = sum of (endTime - startTime) across all entries. When answering questions about time tracked, compute this from the timeEntries array.
The blocked_by field lists prerequisite tasks:
blocked_by:
- uid: "abc123" # the `id` of the blocking task
reltype: "FINISHTOSTART" # relationship type
gap: "1d" # optional gap after predecessor finishes
Relationship types:
FINISHTOSTART — this task can start after the predecessor finishes (most common)FINISHTOFINISH — this task must finish at/after the predecessor finishesSTARTTOSTART — this task can start after the predecessor startsSTARTTOFINISH — this task must finish after the predecessor startsIf the bases skill is enabled, you can create .base views over the task folder for rich UI. Example — open tasks by priority:
filters:
and:
- file.inFolder("TaskNotes/Tasks")
- 'status != "done"'
formulas:
days_until_due: 'if(due, (date(due) - today()).days, "")'
is_overdue: 'if(due, date(due) < today(), false)'
views:
- type: table
name: "Open Tasks"
order:
- file.name
- status
- priority
- due
- formula.days_until_due
groupBy:
property: priority
direction: DESC
read_content or get_properties to get the current frontmatter before constructing edits.edits — Obsidian's manage_notes tool does text replacement, so the oldText must exactly match what's in the file, including indentation and quotes.id, date_created, date_modified, completed_date — these are plugin-managed fields.status in their frontmatter to locate the tasks folder.