Skip to content

Local‑first task manager CLI that stores tasks as Markdown files (no DB). Agent‑friendly, filesystem Kanban.

License

Notifications You must be signed in to change notification settings

amirbrooks/tasker-docstore-framework

tasker (Docstore) — lightweight task manager (no DB)

One binary. Local‑first tasks in Markdown. Works great with agents.

This is a framework + scaffolding for a local-first task manager that stores tasks as Markdown files with YAML frontmatter, organized in a filesystem Kanban layout (projects + columns).

Why tasker

  • Local‑first: tasks live as plain Markdown files.
  • Agent‑friendly: human summaries by default, machine exports on demand.
  • Simple: one binary, no database, easy backup with Git.

30‑second quickstart

# after install
tasker init --project "Work"
tasker add "First task" --project Work --today
tasker tasks --project Work

Setup (CLI + OpenClaw)

  1. Bootstrap OpenClaw (recommended):
openclaw onboard
# or
openclaw configure

OpenClaw stores config at ~/.openclaw/openclaw.json by default (override with OPENCLAW_CONFIG_PATH). The default workspace is ~/.openclaw/workspace.

  1. Install the CLI (pick one):

npm (recommended for non‑Go users)

npm install -g @amirbrooks/tasker-docstore

Go (recommended for Go users)

go install github.com/amirbrooks/tasker-docstore-framework/cmd/tasker@latest
  1. Install the OpenClaw plugin (registers tasker_cmd):

Copy extensions/tasker/ to one of:

  • <workspace>/.openclaw/extensions/tasker/
  • ~/.openclaw/extensions/tasker/

Or install via the CLI (copy or link):

openclaw plugins install ./extensions/tasker
openclaw plugins install -l ./extensions/tasker
  1. Configure the OpenClaw plugin:
{
  "plugins": {
    "entries": {
      "tasker": {
        "enabled": true,
        "config": {
          "binary": "tasker",
          "rootPath": "~/.tasker",
          "timeoutMs": 15000,
          "allowWrite": true
        }
      }
    }
  }
}
  1. Allowlist the tool (required):
{
  "agents": {
    "list": [
      {
        "id": "main",
        "tools": { "allow": ["tasker_cmd"] }
      }
    ]
  }
}
  1. Install the unified skill to:
  • <workspace>/skills/task/ (preferred)
  • ~/.openclaw/skills/task/

Skill:

  • Unified skill: skills/task/
  • Optional helper: ./scripts/install-skill.sh --dest ~/.openclaw/skills

Full docs:

  • docs/OPENCLAW_INTEGRATION.md
  • docs/AGENT_WORKFLOW.md
  • docs/CLI_SPEC.md
  • docs/STORAGE_SPEC.md
  • docs/SECURITY.md

It is designed to integrate with OpenClaw via:

  • a plugin tool (tasker_cmd) that safely spawns the tasker CLI with shell:false
  • a unified skill that maps natural language or /task to tasker_cmd

OpenClaw helpers:

  • TASKER_BIN=/path/to/tasker (env fallback if binary is not on PATH)
  • ./scripts/install-skill.sh --dest ~/.openclaw/skills

Explicit-only mode (optional):

{
  "agent": {
    "require_explicit": true
  }
}

Workflow setup (optional):

tasker workflow init
tasker workflow prompts init
tasker workflow schedule init --window 24h --heartbeat-every 2h

Workflow config lives at management/tasker/workflow.md in the OpenClaw workspace by default.

Install

See Setup above for npm/Go install. Additional options:

Build from source

go build -o tasker ./cmd/tasker

Local install script

./scripts/install.sh

Quickstart

  1. Initialize store (defaults to ~/.tasker):
tasker init --project "Work"

Optional onboarding:

tasker onboarding

View config (human summary):

tasker config show

Update config (agent defaults):

tasker config set agent.default_project Work
tasker config set agent.default_view week
tasker config set agent.open_only true
  1. Create another project (optional):
tasker project add "Side"
  1. Add tasks:
tasker add "Draft proposal" --project Work --column todo --today --priority high --tag client
tasker add "Send recap" --project Work --tomorrow
tasker add "Plan next sprint" --project Work --next-week
tasker add "Fix auth bug" --project Work --column doing
tasker add --text "Draft proposal | outline scope | due 2026-01-23" --project Work
tasker capture "Quick note | due 2026-01-23"
  1. Capture ideas (plain text):
tasker idea add "Draft onboarding flow"
tasker idea capture "Pricing experiment | explore enterprise tier | #pricing"
tasker idea capture "Prototype +Work @design"
cat notes.txt | tasker idea add --stdin
tasker idea note add "Draft onboarding flow" -- "share with design"
tasker idea promote "Pricing experiment" --project Work --column todo
  1. List tasks:
tasker ls --project Work
tasker ls --project Work --json   # writes JSON to <root>/exports
  1. Due today + overdue:
tasker tasks --project Work
  1. Board view:
tasker board --project Work --ascii
  1. Week view:
tasker week --project Work --days 7

Optional agent defaults (<root>/config.json):

{
  "agent": {
    "default_project": "work",
    "default_view": "today",
    "week_days": 7,
    "open_only": true,
    "require_explicit": false,
    "summary_group": "project",
    "summary_totals": true
  }
}

Defaults & UX

Set defaults to reduce flags:

  • TASKER_ROOT=/path/to/store (env) or --root <path> (flag)
  • TASKER_PROJECT=work (env) or agent.default_project (config)
  • TASKER_VIEW=week (env) or agent.default_view=week (config)
  • TASKER_WEEK_DAYS=7 (env) or agent.week_days=7 (config)
  • TASKER_OPEN_ONLY=true (env) or agent.open_only=true (config)
  • TASKER_GROUP=project + TASKER_TOTALS=true (env) for grouped summaries

Output options:

  • Human‑readable summaries by default
  • --plain for stable tab‑separated output
  • --json / --ndjson write to <root>/exports (stdout JSON disabled by default)
  • --ascii for board rendering
  • --format telegram for lean chat output (plain text)

Agent helpers:

  • tasker resolve "<selector>" returns JSON to stdout with matching IDs

FAQ

Why use tasker instead of a plain Markdown list?
Tasker keeps tasks as Markdown but adds structured metadata (due/status/tags), deterministic views (today/week/board), and agent‑safe IDs without cluttering human output.

Codex / agent usage

  • Natural language: “tasks today for Work” → tasker tasks --project Work
  • Natural language: “what’s our week looking like?” → tasker week --project Work
  • Natural language: “capture Draft proposal | due 2026-01-23” → tasker capture "Draft proposal | due 2026-01-23"
  • Onboarding: tasker onboarding

JSON/NDJSON exports write to <root>/exports and are not printed to stdout unless --stdout-json or --stdout-ndjson is used.

Storage model (no DB)

Everything lives under a root folder (default: ~/.tasker):

  • .tasker/config.json (store config)
  • .tasker/projects/<project-slug>/project.json
  • .tasker/projects/<project-slug>/columns/<column-dir>/*.md (tasks)

See docs/STORAGE_SPEC.md.

OpenClaw integration

See docs/OPENCLAW_INTEGRATION.md.

Contributing

See CONTRIBUTING.md.

Security

See SECURITY.md and docs/SECURITY.md.

Support

See SUPPORT.md.

Release (maintainers)

  1. Tag a release (triggers GoReleaser):
git tag v0.1.0
git push origin v0.1.0
  1. Publish npm wrapper (requires 2FA-enabled npm token):
cd npm
npm publish --access public

Notes:

  • The npm wrapper downloads binaries from GitHub Releases, so the tag must exist before npm publish.

License

MIT (see LICENSE).

About

Local‑first task manager CLI that stores tasks as Markdown files (no DB). Agent‑friendly, filesystem Kanban.

Topics

Resources

License

Code of conduct

Contributing

Security policy

Stars

Watchers

Forks

Packages

 
 
 

Contributors