A backlog and wiki you can query — CLI, TUI and MCP over one SQLite database. Serves tasks, design docs, and commit mappings as MCP tools over stdio.
25 tools with complete schemas and descriptions. Naming is verb-noun consistent (todo_*, doc_*, task_*, sync_*). Descriptions are detailed (100-200 chars typical) and explain WHEN to use each tool. Parameters have types and descriptions. However, several tools lack output schema documentation, parameter constraints (enums for status/priority/kind), and error recovery guidance. No tool annotations (readOnlyHint/destructiveHint). Some parameter relationships undocumented (e.g., todo_list's 'all' vs 'status' interaction). Risk classifications present but not integrated into descriptions.
Create or replace a wiki page. path and body are required; title and kind (design|threat-model|note|adr|reference) optional. The id is derived from the path and returned, so a later doc_link can find it.
Change named fields of a wiki page: title, kind, body. Only the fields given are touched.
Link (or with del=true unlink) a wiki page to another, so doc_show can report the relation.
Wiki pages, narrowed by a full-text search over title and body, or by section (the path prefix before '/', e.g. 'threat-model'; its README comes first). Returns metadata only — id, path, title, kind — because a list is for choosing; doc_show returns the body.
One wiki page in full, by id, with the pages related to it (linked either way) as metadata.
Index a repository's commit history into the cache, extracting trailers (task ids in the message) so task_commit can link them. A second call re-indexes: new commits are added, old ones are kept (the cache is append-only for shas).
No tool annotations (readOnlyHint, destructiveHint, idempotentHint). Tools marked READ_ONLY, WRITE, REVERSIBLE in metadata but not exposed to LLM via MCP annotations. LLM cannot infer safety/idempotency without explicit hints.
Output schemas not documented. Tools return structured data (tasks, docs, commits) but LLM has no schema to understand response fields. Forces LLM to infer structure from examples.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 60 | 2025-06-18+ | v2 |
Link a task to a commit sha (full or a 7+ char prefix), so the task → commit → code trail works. The sha must be known: in the repo at the given path, or a trailer in the cache.
The commit shas linked to a task, so you can read the code at each (git show <sha>).
Link (or with del=true unlink) a task to a wiki page, so task_docs can report the relation.
The wiki pages linked to a task (either direction), so you can read the design docs that cover it.
Create a task. text is required; epic defaults to the project's root epic (the first of the TODO_EPICS install wrote); tags, priority, slug, dep, touchpoints optional. The id is minted and returned.
Soft-delete a task: it is stamped deleted_at and moved to the trash, never removed, so it can be restored.
Link (or with del=true unlink) a dependency edge, so ready/next can act on it.
Mark a task done.
Change named fields of a task: priority, epic, slug, text, dep, tags (comma-separated), touch (comma-separated file touchpoints), status. Only the fields given are touched.
Open tasks that directly depend on the given id — what unblocks if it is done.
List tasks. Filters: tag (comma = AND), epic (substring), priority (P0..P5), search (full-text), status (open|done, default open), all (both), ready (only tasks whose deps are done).
The single most urgent ready task (lowest priority rank), optionally under a tag.
Open tasks whose every dependency is already done — the ones that can be started now. Optional tag filter.
Reopen a done task.
Restore a soft-deleted task from the trash.
One task in full, by id, with its comment thread.
Open and done counts per epic.
Dependency candidates for a task, resolved from its free-text dep line via full-text search. With apply=true, links the top candidate for each fragment.
The soft-deleted tasks, for review before they are restored.
Parameter constraints missing enums. 'status' accepts 'open|done' but not declared as enum. 'priority' accepts 'P0..P5' but no enum. 'kind' accepts 'design|threat-model|note|adr|reference' but no enum. LLM may hallucinate invalid values.
No error recovery guidance. Tools lack descriptions of failure modes and recovery steps. E.g., 'task not found' should suggest search_tasks() or list available tasks. Agents cannot self-correct.
Parameter relationships undocumented. todo_list's 'all' and 'status' params interact (all=true overrides status filter) but interaction not stated. todo_edit's 'tags' and 'touch' accept comma-separated strings but format not formally specified.