{"id":49696703,"url":"https://github.com/slaveoftime/tasks-cli","last_synced_at":"2026-05-08T01:08:54.601Z","repository":{"id":356305884,"uuid":"1231363500","full_name":"slaveOftime/tasks-cli","owner":"slaveOftime","description":null,"archived":false,"fork":false,"pushed_at":"2026-05-07T14:08:13.000Z","size":71,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-05-07T14:39:24.257Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Rust","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/slaveOftime.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-05-06T22:24:47.000Z","updated_at":"2026-05-07T14:02:14.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/slaveOftime/tasks-cli","commit_stats":null,"previous_names":["slaveoftime/tasks-cli"],"tags_count":3,"template":false,"template_full_name":null,"purl":"pkg:github/slaveOftime/tasks-cli","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/slaveOftime%2Ftasks-cli","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/slaveOftime%2Ftasks-cli/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/slaveOftime%2Ftasks-cli/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/slaveOftime%2Ftasks-cli/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/slaveOftime","download_url":"https://codeload.github.com/slaveOftime/tasks-cli/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/slaveOftime%2Ftasks-cli/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":32761026,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-07T02:14:30.463Z","status":"ssl_error","status_checked_at":"2026-05-07T02:14:29.405Z","response_time":62,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.6:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2026-05-08T01:08:54.040Z","updated_at":"2026-05-08T01:08:54.591Z","avatar_url":"https://github.com/slaveOftime.png","language":"Rust","funding_links":[],"categories":[],"sub_categories":[],"readme":"# `tli` - repo-local task tracking for humans and agents\n\n[![crates.io](https://img.shields.io/crates/v/tli.svg)](https://crates.io/crates/tli)\n[![npm](https://img.shields.io/npm/v/@slaveoftime/tli.svg)](https://www.npmjs.com/package/@slaveoftime/tli)\n[![Release](https://github.com/slaveoftime/tasks-cli/actions/workflows/release.yml/badge.svg)](https://github.com/slaveoftime/tasks-cli/actions/workflows/release.yml)\n[![License: MIT](https://img.shields.io/badge/license-MIT-blue.svg)](LICENSE)\n\n`tli` is a fast file-backed task tracker that keeps work state inside your repository instead of in a hosted service. It is designed to be comfortable in a terminal, cheap to query from hooks and agents, and reliable enough to use as local working memory during day-to-day development.\n\nUse it when you want:\n\n- repo-local task state under versioned project context\n- compact terminal output for humans\n- machine-readable JSON for hooks, scripts, and agents\n- pause/resume and handoff flows without opening another app\n\n## Why `tli`\n\nMost task tools optimize for shared remote dashboards. `tli` optimizes for the working loop inside a codebase:\n\n1. capture work as soon as you notice it\n2. ask what is actionable now\n3. checkpoint or hand off without losing the thread\n4. resume cheaply from the terminal or an AI prompt\n\nThe store lives in `.tli/`, so it stays close to the repo and is easy to inspect, back up, or automate.\n\n## Install\n\n### crates.io\n\n```bash\ncargo install tli\n```\n\n### npm\n\n```bash\nnpm install -g @slaveoftime/tli\n```\n\nThe npm package ships the compiled `tli` binary for supported release targets and exposes the same `tli` command.\n\n### From source\n\n```bash\ngit clone git@github.com:slaveoftime/tasks-cli.git\ncd tasks-cli\ncargo install --path . --force\n```\n\n## Quick start\n\nCreate a store in the repository you want to track:\n\n```bash\nmkdir .tli\n```\n\nThen start using it:\n\n```bash\ntli add \"Ship first public release\" --summary \"Finalize docs and publication flow\" --label release\ntli add \"Nightly maintenance\" --cron \"0 22 * * *\"\ntli state\ntli ready\ntli start ship-first-public-release --note \"Picking this up now\"\ntli checkpoint ship-first-public-release --next-step \"Verify npm release assets\"\ntli next\n```\n\n## Core command flow\n\n### 1. Start with compact state\n\n```bash\ntli state\ntli ready\ntli next\n```\n\nThese commands are the fastest way to answer:\n\n- what is ready right now\n- what is due but blocked by dependencies\n- what is already in flight\n- what should continue after a checkpoint or handoff\n\n### 2. Create and inspect tasks\n\n```bash\ntli add \"Implement parser cache\" --summary \"Cache parsed plans by workspace\" --label rust\ntli add \"Nightly cleanup\" --every-minutes 1440\ntli list\ntli show \u003ctask-id\u003e\ntli --verbose show \u003ctask-id\u003e\ntli --json show \u003ctask-id\u003e\n```\n\nMost commands that take a task id also accept a unique prefix, so you usually do not need to type the full stored id.\n\n### 3. Move work through the lifecycle\n\n```bash\ntli start \u003ctask-id\u003e --note \"Picked up after triage\"\ntli checkpoint \u003ctask-id\u003e --note \"Pause here\" --next-step \"Resume benchmark wiring\"\ntli block \u003ctask-id\u003e --reason \"Waiting on upstream API\"\ntli review \u003ctask-id\u003e --note \"Ready for review\"\ntli done \u003ctask-id\u003e --note \"Merged and verified\"\ntli note \u003ctask-id\u003e \"Need benchmark follow-up\"\ntli log \u003ctask-id\u003e --limit 20\n```\n\n### 4. Model prerequisites and decomposition\n\n```bash\ntli dep add \u003ctask-id\u003e \u003cdependency-id\u003e\ntli dep remove \u003ctask-id\u003e \u003cdependency-id\u003e\ntli subtask add \u003cparent-id\u003e \u003cchild-id\u003e\ntli subtask remove \u003cparent-id\u003e \u003cchild-id\u003e\n```\n\n- dependencies gate readiness\n- subtasks model structure\n- a parent is not blocked by a child unless you also add a dependency\n\n## Output modes\n\n`tli` keeps the default terminal view compact, then expands only when you ask:\n\n```bash\ntli state\ntli --verbose state\ntli --json state --limit 6\n```\n\n- default output is optimized for terminal scanning\n- `--verbose` adds richer human-readable detail\n- `--json` keeps the command contract stable for hooks, scripts, and agents\n\n## Agent and hook usage\n\nFor automation, the recommended first call is:\n\n```bash\ntli --json state --limit 6\n```\n\nThat payload is meant to stay cheap and actionable. A good pattern for agents is:\n\n1. read `state`\n2. surface `ready`, `pending_dependencies`, and `active`\n3. drill into `show`, `next`, or `log` only for the task that actually needs detail\n\nUseful follow-up commands:\n\n```bash\ntli --json show \u003ctask-id\u003e\ntli --json next \u003ctask-id\u003e\ntli --json log \u003ctask-id\u003e --limit 20\ntli skill\ntli --json skill\n```\n\nThe embedded skill guide is compiled into the binary so prompts and hooks can fetch current usage guidance without reading repository files directly.\n\n## Storage model\n\nBy default `tli` looks upward from the current working directory until it finds an existing `.tli/` directory. You can also target one directly with `--root`.\n\n```text\n.tli/\n  index.json\n  events.ndjson\n  task-events/\n    \u003ctask-id\u003e.ndjson\n  tasks/\n    \u003ctask-id\u003e.json\n```\n\n- `index.json` is the cheap summary file used for fast state queries\n- `events.ndjson` is the append-only activity log\n- `task-events/\u003cid\u003e.ndjson` speeds up task-specific log reads\n- `tasks/\u003cid\u003e.json` stores the canonical task detail\n\n## Contributor setup\n\n```bash\ngit clone git@github.com:slaveoftime/tasks-cli.git\ncd tasks-cli\ncargo test\ncargo fmt -- --check\ncargo clippy --all-targets --all-features\n```\n\nThe project is intentionally small and file-based. If you are changing behavior, prefer updating the Rust tests in `src/store/tests.rs` and `tests/cli.rs` alongside the implementation.\n\n## Release and publication\n\nGitHub Actions publishes releases from version tags matching `v*`.\n\nWhen you push a tag such as `v0.2.0`, the release workflow will:\n\n1. validate the repo with `cargo test`, `cargo fmt -- --check`, and `cargo clippy --all-targets --all-features`\n2. build release binaries for Linux x64, macOS arm64, and Windows x64\n3. upload zipped binaries to the GitHub Release\n4. publish the crate `tli` to crates.io\n5. publish the npm package `@slaveoftime/tli`\n\nCreate a release like this:\n\n```bash\ngit tag v0.2.0\ngit push origin v0.2.0\n```\n\nRequired repository secrets:\n\n| Secret | Purpose |\n| --- | --- |\n| `CARGO_REGISTRY_TOKEN` | publish `tli` to crates.io |\n| `NPM_TOKEN` | publish `@slaveoftime/tli` to npm |\n\nThe workflow copies the root `README.md` and `LICENSE` into the npm package during publication so the package page stays aligned with the repo.\n\n## Command summary\n\n| Need | Command |\n| --- | --- |\n| Print embedded usage help | `tli skill` |\n| Create a task | `tli add \"Title\" [--id id] [--summary text] [--ready-at RFC3339] [--cron expr \\| --every-minutes n] [--label tag]` |\n| Add or change a schedule | `tli schedule \u003ctask-id\u003e [--cron expr \\| --every-minutes n] [--ready-at RFC3339]` |\n| List tasks | `tli list [--status todo] [--ready] [--query text] [--limit n] [--all]` |\n| Show actionable work | `tli ready [--query text] [--limit n]` |\n| Show compact repo state | `tli state [--query text] [--limit n]` |\n| Show continuation hints | `tli next [task-id]` |\n| Inspect a task | `tli show \u003ctask-id\u003e` |\n| Start work | `tli start \u003ctask-id\u003e` |\n| Save a checkpoint | `tli checkpoint \u003ctask-id\u003e` |\n| Block work | `tli block \u003ctask-id\u003e --reason \"...\"` |\n| Request review | `tli review \u003ctask-id\u003e` |\n| Finish work | `tli done \u003ctask-id\u003e` |\n| Add note | `tli note \u003ctask-id\u003e \"...\"` |\n| View history | `tli log [task-id]` |\n| Add dependency | `tli dep add \u003ctask-id\u003e \u003cdependency-id\u003e` |\n| Add subtask | `tli subtask add \u003cparent-id\u003e \u003cchild-id\u003e` |\n\n## License\n\nMIT. See [LICENSE](LICENSE).\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fslaveoftime%2Ftasks-cli","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fslaveoftime%2Ftasks-cli","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fslaveoftime%2Ftasks-cli/lists"}