@bumpyclock/tasque
v0.6.4
Published
Simple local-first task tracker. Git-friendly. No DB.
Readme
tasque
Local-first task tracker for coding agents.
- JSONL source of truth
- Git worktree-backed
.tasque/storage by default in git repos - No DB/service
- Durable restart + replay
Install
npm install -g @bumpyclock/tasque
tsq --versionQuickstart
tsq init --no-wizard
tsq create "First task" --kind task -p 1
tsq find open
tsq find ready --lane coding --format jsonInstall or refresh the bundled agent skill:
tsq init --install-skill --force-skill-overwriteSkill install updates agent skill directories. Sync worktree setup belongs to
plain tsq init, tsq migrate, or explicit --sync-branch.
Command List
Global options:
--format human|json: output format (humandefault)--json: shorthand for--format json--exact-id: disable partial ID resolution
Commands:
tsq(no args, TTY): open read-only TUI (List/Board views)tsq init [--wizard|--no-wizard] [--yes] [--preset <name>] [--sync-branch|--worktree-name <name>]tsq init --install-skill|--uninstall-skill [--skill-targets ...] [--skill-name <name>] [--force-skill-overwrite]tsq create <title...> [--kind ...] [-p ...] [--parent <id>] [--from-file tasks.md] [--description <text>] [--external-ref <ref>] [--discovered-from <id>] [--planned|--needs-plan] [--ensure] [--id <tsq-xxxxxxxx>] [--body-file <path|->]tsq show <id> [--with-spec]tsq find ready [--lane <planning|coding>] [--assignee <name>] [--unassigned] [--kind ...] [--label ...] [--planning <needs_planning|planned>] [--tree [--full]]tsq find <blocked|open|in-progress|deferred|done|canceled> [filters...] [--tree [--full]]tsq find search <query> [--full]
Note: for find ready and status-based find commands, --full is only valid with --tree. --tree --full keeps the full status set instead of applying the default tree status narrowing. find search --full remains valid without --tree.
tsq watch [--once] [--interval <seconds>] [--status <csv>] [--assignee <name>] [--tree]tsq tui [--once] [--interval <seconds>] [--status <csv>] [--assignee <name>] [--board|--epics]tsq stale [--days <n>] [--status <status>] [--assignee <name>] [--limit <n>]tsq doctortsq repair [--fix] [--force-unlock]tsq edit <id> [--title ...] [--description ...] [--clear-description] [--priority ...] [--external-ref <ref>] [--clear-external-ref] [--discovered-from <id>] [--clear-discovered-from]tsq claim <id> [--assignee <a>] [--start] [--require-spec]tsq assign <id> --assignee <a>tsq start <id>tsq planned <id>tsq needs-plan <id>tsq open <id>tsq blocked <id>tsq defer <id> [--note <text>]tsq done <id...> [--note <text>]tsq reopen <id...> [--note <text>]tsq cancel <id...> [--note <text>]tsq orphanstsq spec <id> [--file <path> | --stdin | --text <markdown> | --show | --check] [--force]tsq block <task> by <blocker>tsq unblock <task> by <blocker>tsq order <later> after <earlier>tsq unorder <later> after <earlier>tsq deps <id> [--direction <up|down|both>] [--depth <n>]tsq relate <src> <dst>tsq unrelate <src> <dst>tsq duplicate <id> of <canonical-id> [--note <text>]tsq duplicates [--limit <n>]tsq merge <source-id...> --into <target-id> [--reason <text>] [--force] [--dry-run]tsq supersede <old-id> with <new-id> [--note <text>]tsq note <id> <text>tsq note <id> --stdintsq notes <id>tsq label <id> <label>tsq unlabel <id> <label>tsq labelstsq history <id> [--limit <n>] [--type <event-type>] [--actor <name>] [--since <iso>]tsq sync [--no-push]tsq hooks install [--force]tsq hooks uninstalltsq migrate [--sync-branch|--worktree-name <name>]tsq merge-driver <ancestor> <ours> <theirs>
Git repos default to worktree mode: tsq init creates/configures the tsq-sync
branch and stores task data in a dedicated git worktree. Use --sync-branch <name>
or --worktree-name <name> to choose a different branch/worktree name. Existing git repos with main-tree .tasque
data and no sync_branch migrate automatically on the next tsq command. Fresh clones fetch
the configured sync branch and create the worktree on first use. tsq sync pushes
the sync branch to origin and sets upstream automatically when needed.
Non-git directories use local .tasque/ storage.
tasks.md Batch Format
Use tasks.md when a plan naturally reads as a checklist. Each bullet creates
one task. Two-space indentation creates parent/child hierarchy. Checkbox bullets
are accepted. Tabs, odd indentation, indentation jumps, and indented first
bullets are rejected with line-numbered validation errors.
- Parent task
- Child task
- Grandchild task
- [ ] Another parent tasktsq create --from-file tasks.md
tsq create --parent <id> --from-file tasks.md
tsq create --from-file tasks.md --ensureVersion
cargo run -- --versionBuild
cargo build --releaseBinary output:
- Linux/macOS:
target/release/tsq - Windows:
target/release/tsq.exe
Release and npm packages also include a bundled OpenTUI executable:
- Linux/macOS:
tsq-tui - Windows:
tsq-tui.exe
Test + Lint + Format
cargo fmt --check
cargo clippy --all-targets --all-features -- -D warnings
cargo test --quietCI
GitHub Actions CI (.github/workflows/ci.yml) runs:
cargo fmt --checkcargo clippy --all-targets --all-features -- -D warningscargo test --quiet
All steps must pass before merging.
Release Workflows
Release Please(.github/workflows/release-please.yml)- Runs Rust quality checks
- Opens/updates release PRs using Rust release type
Release From Cargo(.github/workflows/release-from-package.yml)- Manual release creation from
Cargo.tomlversion - Optional
versioninput must match Cargo version
- Manual release creation from
Release(.github/workflows/release.yml)- On published GitHub release, builds matrix binaries (Linux/macOS/Windows)
- Bundles the OpenTUI frontend as a standalone executable next to
tsq - Uploads release artifacts + checksums
npm-publish(.github/workflows/npm-publish.yml)- On published GitHub release, builds platform npm packages
- Packages
tsqandtsq-tuitogether for each platform - Publishes platform packages, then
@bumpyclock/tasque
Storage Layout
Git repos default to a dedicated sync worktree:
tsq initconfigurestsq-syncby default and redirects data operations there.- Fresh clones fetch the configured sync branch and create the worktree on first use.
tsq syncpushes the sync branch tooriginand sets upstream automatically when needed.- Existing git repos with main-tree
.tasquedata migrate automatically whentsqnext resolves the project root. - The main worktree keeps
.tasque/config.jsonsotsqcan find the sync branch. - The sync worktree owns the canonical
.tasque/events.jsonl, specs, snapshots, and cache.
Non-git directories use repo-local .tasque/:
events.jsonl: canonical append-only event logstate.json: derived projection cache (rebuildable, gitignored)snapshots/: periodic checkpoints (gitignored by default)specs/<task-id>/spec.md: canonical markdown specs attached to tasksconfig.json: config (snapshot_everydefault200).lock: ephemeral write lock.gitignore: local-only artifacts (state.json,.lock,snapshots/, temp files)tasks.jsonl: legacy state-cache name; read-only fallback whenstate.jsonis absent, removal target
Recommended commit policy:
- Commit
.tasque/events.jsonland.tasque/config.json - Do not commit
.tasque/state.json - Do not create or edit
.tasque/tasks.jsonl
