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
npm install -g @bumpyclock/tasque
tsq --versionFrom source:
cargo build --release
target/release/tsq --versiontsq 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-overwrite
tsq skills refresh # update existing managed installs onlySkill install updates agent skill directories. Sync worktree setup belongs to
plain tsq init, tsq migrate, or explicit --sync-branch.
tsq skills refresh updates skill files in target directories that already have
a managed install. It does not create missing installs — use tsq init --install-skill
for first-time setup. Managed installs are identified by the tsq-managed-skill:v1
marker in SKILL.md. Directories containing this marker will be overwritten by
refresh. Remove the marker to opt out of automatic updates.
tsq skills refresh is repo-independent: it does not require tsq init or a
.tasque/ directory.
The npm postinstall hook runs tsq skills refresh automatically after install.
It refreshes only existing managed tasque skill installs and does not create
missing ones. Refresh failures produce a warning but do not fail the install.
Set TSQ_SKIP_SKILL_REFRESH=1 to skip postinstall refresh entirely.
Canonical CLI and task contracts live in AGENTS-reference.md.
Use built-in help for the freshest syntax:
tsq --help
tsq <command> --helpThis README keeps install, quickstart, storage, and release guidance only, so command syntax is not maintained in multiple places.
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 --ensuretsq plan <parent> --from plan.md accepts the same bullet hierarchy plus
Markdown headings and inline labels:
# CLI ergonomics #cli
- [ ] Add strict root tests #testtsq plan <parent-id> --from plan.md
tsq plan <parent-id> --from plan.md --applycargo run -- --versioncargo build --releaseBinary output:
- Linux/macOS:
target/release/tsq - Windows:
target/release/tsq.exe
cargo fmt --check
cargo clippy --all-targets --all-features -- -D warnings
cargo test --quiet
npm run test:postinstall --prefix npmGitHub Actions CI (.github/workflows/ci.yml) runs:
cargo fmt --checkcargo clippy --all-targets --all-features -- -D warningscargo test --quietnpm run test:postinstall --prefix npm
All steps must pass before merging.
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)
- Uploads release artifacts + checksums
npm-publish(.github/workflows/npm-publish.yml)- On published GitHub release, builds platform npm packages
- Publishes platform packages, then
@bumpyclock/tasque
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