pi-todo
Persistent per-project todo tracker with live TUI widget for Pi
Package details
Install pi-todo from npm and Pi will load the resources declared by the package manifest.
$ pi install npm:pi-todo- Package
pi-todo- Version
1.2.0- Published
- Jul 5, 2026
- Downloads
- 475/mo · 28/wk
- Author
- mrg2400xx
- License
- MIT
- Types
- extension
- Size
- 30.4 KB
- Dependencies
- 1 dependency · 0 peers
Pi manifest JSON
{
"extensions": [
"./src/index.ts"
]
}Security note
Pi packages can execute code and influence agent behavior. Review the source before installing third-party packages.
README
pi-todo
Persistent per-project todo tracker with a live TUI widget for Pi.
What It Does
- Registers a
todotool the LLM can call to manage a task list - Stores tasks in
.pi/todo.jsonin the project root (per-project, persistent) - Shows a live widget above the editor with the current todo state
- Auto-loads existing todos on session start
Installation
Add the extension path to ~/.pi/agent/settings.json:
{
"extensions": ["~/.pi/agent/extensions/todo/src/index.ts"]
}
Or if you already have extensions:
{
"extensions": ["~/.pi/agent/extensions/todo/src/index.ts", "other/extension/path"]
}
Then restart Pi (or run /reload).
Tool: todo
Actions
| Action | Required Fields | Description |
|---|---|---|
add |
text |
Create a new todo item |
update |
id |
Modify an item's text/status/priority/assignee/blockedBy |
toggle |
id |
Cycle status: pending → in-progress → done → pending |
remove |
id |
Delete an item |
list |
— | List all items (optional: filter) |
clear |
— | Remove all completed items |
reorder |
id, direction |
Move an item up or down in the list |
Parameters
| Field | Type | Required | Description |
|---|---|---|---|
action |
string |
yes | One of: add, update, toggle, remove, list, clear, reorder |
id |
string |
conditional | Task ID (e.g. T-001) |
text |
string |
conditional | Task description |
status |
string |
no | pending, in-progress, done, blocked |
priority |
string |
no | low, medium, high, critical (default: medium) |
assignee |
string |
no | Who's doing it |
filter |
string |
no | Filter for list: all, pending, in-progress, done, blocked |
blockedBy |
string |
no | Task ID this is blocked by |
direction |
string |
no | Reorder direction: up or down |
Examples
todo({ action: "add", text: "Build StorefrontController", priority: "high", assignee: "Ultron" })
todo({ action: "toggle", id: "T-001" })
todo({ action: "list", filter: "pending" })
todo({ action: "reorder", id: "T-003", direction: "up" })
todo({ action: "clear" })
Slash Commands
/todo— List all todo items/todo clear— Clear completed items
Storage
Tasks are stored in .pi/todo.json in the project root:
{
"items": [
{
"id": "T-001",
"text": "Build StorefrontController",
"status": "in-progress",
"priority": "high",
"assignee": "Ultron",
"createdAt": "2026-07-05T19:02:00Z",
"updatedAt": "2026-07-05T19:02:00Z",
"blockedBy": null
}
],
"counter": 1
}
Widget
The live widget appears above the editor with a green border and shows:
┌──────────────────────────────────────────────────┐
│ TODO · 3 tasks │
│ 2 pending · 1 active │
│ [ ] T-001 [HIGH] Build StorefrontController · Ultron │
│ [ ] T-002 [MED] Port landing.html · Maya │
│ [•] T-003 [LOW] Verify storefront routes · Quinn │
└──────────────────────────────────────────────────┘
Status icons: [ ] pending, [•] in-progress, [x] done, [!] blocked
Changelog
v1.2.0
- ASCII status icons — Replaced emoji status icons with ASCII equivalents (
[ ],[•],[x],[!]) for universal terminal compatibility and cleaner rendering. - Removed clipboard emoji from widget header.
v1.1.0
- Bordered widget — The live widget now renders inside a green Unicode box border (uses
theme.fg("success")) for better visual separation from the chat area.
v1.0.0
- Initial release: todo tool, live widget, slash commands, per-project persistence.
Design Decisions
- Per-project, not global — Each project has its own todo list
- Main agent only — Subagents cannot call the todo tool
- Auto-generated IDs — T-001, T-002, T-003...
- Synchronous file I/O — Avoids race conditions (Node single-threaded)
- No external dependencies — Uses only Pi's built-in typebox