A local-first CLI ticketing system for agents & solo work, written in Rust. It stores all data in .tik/, uses schema-first JSON/JSONL for deterministic automation, and keeps append-only history for traceability.
Implemented in this repo:
tik initrepo scaffold with schemas and config.tik statusrepo health summary.tik newcreate tickets.tik listlist tickets with optional status filter.tik showview a ticket.tik noteappend notes (JSONL + Markdown).tik editeditticket.jsonornotes.mdwith$EDITORand schema validation.tik logread ticket history.tik closeandtik reopenwith optional reason.tik relateandtik unrelateto manage dependencies.tik linkandtik unlinkto manage artifacts.tik assignto add/remove/set assignees.tik tagto add/remove/set tags.tik config show/get/setfor repo config.tik doctorandtik migratefor integrity checks and upgrades.tik project init/list/selectwith per-project isolation.tik milestone new/list/show/set/close.tik index rebuild/statusandtik searchwith query filters.tik stats,tik report --metric summary|burndown|throughput, andtik graphfor reporting.- Graph scoping with
--root,--depth,--relation, and--include-milestonesplus DOT export. tik exportandtik importfor repo data exchange.- Multi-format output:
table,compact,json,jsonl,yaml,md,csv.
Planned features are tracked in PLAN.md.
cargo run -p tik -- init
cargo run -p tik -- new "Initial setup" --tag mvp,cli
cargo run -p tik -- list --status openAll commands accept --format and --path (optional root path). Use --quiet to suppress output.
Running tik with no subcommand launches the TUI in a TTY.
Use --non-interactive to require explicit commands for scripting.
Key bindings: Up/Down select, n new, a note, c close, r reopen, f filter, g refresh, q quit.
tik inittik status --format jsontik new "Add CLI init command" --tag cli,mvpOptional fields:
--summaryfor a short summary.--descriptionfor full Markdown description.--actorto override author (defaults toTIK_ACTOR, thenUSER).
tik list --status open --format tabletik show T-01ARZ3NDEKTSV4RRFFQ69G5FAVtik note T-01ARZ3NDEKTSV4RRFFQ69G5FAV "Investigated schema options"tik log T-01ARZ3NDEKTSV4RRFFQ69G5FAV --format jsonltik edit T-01ARZ3NDEKTSV4RRFFQ69G5FAV
tik edit T-01ARZ3NDEKTSV4RRFFQ69G5FAV --notestik close T-01ARZ3NDEKTSV4RRFFQ69G5FAV --reason "merged"
tik reopen T-01ARZ3NDEKTSV4RRFFQ69G5FAV --reason "regression found"tik relate T-01ARZ3NDEKTSV4RRFFQ69G5FAV --relation blocks --target T-01ARZ3NDEKTSV4RRFFQ69G5FAA
tik unrelate T-01ARZ3NDEKTSV4RRFFQ69G5FAV --relation blocks --target T-01ARZ3NDEKTSV4RRFFQ69G5FAAtik link T-01ARZ3NDEKTSV4RRFFQ69G5FAV --artifact file --reference docs/design.md
tik unlink T-01ARZ3NDEKTSV4RRFFQ69G5FAV --artifact file --reference docs/design.mdArtifact types: file, url, commit, pr.
File artifacts must be relative paths and must not contain ...
tik assign T-01ARZ3NDEKTSV4RRFFQ69G5FAV --add alice,bob
tik assign T-01ARZ3NDEKTSV4RRFFQ69G5FAV --remove alice
tik assign T-01ARZ3NDEKTSV4RRFFQ69G5FAV --set alice,bob
tik assign T-01ARZ3NDEKTSV4RRFFQ69G5FAV --cleartik tag T-01ARZ3NDEKTSV4RRFFQ69G5FAV --add mvp,cli
tik tag T-01ARZ3NDEKTSV4RRFFQ69G5FAV --remove cli
tik tag T-01ARZ3NDEKTSV4RRFFQ69G5FAV --set mvp,cli
tik tag T-01ARZ3NDEKTSV4RRFFQ69G5FAV --cleartik config show
tik config get output_format
tik config set output_format json
tik config set ticket_types feature,bug
tik config bootstrapTicket option lists (ticket_types, ticket_severities, ticket_tags, ticket_assignees, etc.) define allowed values; empty lists mean "any".
tik milestone new "Phase 1" --tag mvp --due-at 2026-02-01T00:00:00Z
tik milestone list --status open
tik milestone show M-01ARZ3NDEKTSV4RRFFQ69G5FAV
tik milestone set T-01ARZ3NDEKTSV4RRFFQ69G5FAV M-01ARZ3NDEKTSV4RRFFQ69G5FAV
tik milestone close M-01ARZ3NDEKTSV4RRFFQ69G5FAV --reason "shipped"tik project list
tik project init "client-a" --description "Client A work"
tik project select "client-a"
tik --project client-a listtik index rebuild
tik index status
tik search "status:open tag:mvp login"
tik search "created:>=2026-01-01 due:2026-02-01..2026-03-01"Query filters:
status,tag,assignee,type,priority,severity,milestonecreated,updated,closed,duewith>=,<=, orstart..end
tik doctor
tik doctor --all-projects
tik migratetik stats
tik stats --status open --tag mvp --since 2026-01-01
tik report --metric summary --limit 5 --sort updated --status open
tik report --metric burndown --group-by week --since 2026-01-01 --until 2026-02-01
tik report --metric throughput --group-by month --since 2026-01-01
tik graph --root T-01ARZ3NDEKTSV4RRFFQ69G5FAV --depth 2 --relation blocks --include-milestones
tik graph --dot > graph.dottik export --format json > export.json
tik export --format csv --scope tickets > tickets.csv
tik import --input-format json --input export.json
tik import --input-format csv --scope tickets --input tickets.csvConfig keys:
output_format: table, compact, json, jsonl, yaml, md, csv.pager: auto, always, never.timezone: UTC, local.
Supported values for --format:
table(default)compactjsonjsonlyamlmdcsv
For CSV outputs, nested fields (tags, relations, artifacts, custom) are serialized as JSON strings.
.tik/
repo.json
config.json
workspace.json
schema/
ticket.schema.json
milestone.schema.json
event.schema.json
config.schema.json
projects/
default/
project.json
config.json
tickets/
T-.../
ticket.json
notes.jsonl
notes.md
milestones/
M-...json
M-...jsonl
index/
fts.sqlite
tickets.jsonl
locks/
tmp/
locks/
tmp/
Install tooling once:
cargo install cargo-deny cargo-audit cargo-llvm-covRun after every change:
cargo fmt --all -- --check
cargo clippy --workspace --all-targets --all-features -- -D warnings
cargo test --workspace --all-features
cargo deny check
cargo audit
cargo llvm-cov --workspace --all-features --fail-under-lines 100MIT