sq
sq is a lightweight task-list CLI with structured sources.
It manages tasks in a JSONL file. You can use it directly from the shell or instruct agents to manage them for you.
If you're coming from Beads, see sq vs. Beads for a comparison of the two tools and the trade-offs sq makes in favour of simplicity.
Installation
Homebrew
Cargo
Install sq agent skills
You can install this repo as a plugin source to get the sq skills.
Pi
Claude
Usage
Queue path
[!NOTE] There's no queue! See the FAQ section to see the origin of the name.
By default, sq uses .sift/issues.jsonl. You can override it with:
-q, --queue <PATH>SQ_QUEUE_PATH=<PATH>
Commands
sq add— create a single tasksq collect— create many tasks from piped stdinsq list— list taskssq show <id>— show task detailssq edit <id>— edit task fields/sourcessq close <id>— mark task as closedsq rm <id>— remove tasksq prime— outputsqworkflow context for AI agents
Use sq --help for a full list of options.
Examples
# Add task with title, description, priority, and pasted source text
# Add source-less task
# Add task with metadata
# Collect one task per file from ripgrep JSON
|
# Machine-readable output
|
# Merge metadata patch
# Mark task as closed
sq collect --by-file
sq collect --by-file is the bulk-ingestion command for turning search results into tasks. It reads rg --json output from stdin, groups results by file, and creates one task per file.
|
Plain-text rg output is not supported. Pass ripgrep context flags like -n, -C2, -A2, -B2 to include line numbers and surrounding context in each created text source.
What each collected task contains
For each file group, sq collect --by-file creates:
- a
filesource for the filepath - a
textsource containing the grouped ripgrep match/context lines
Title template variables
The default title template is {{match_count}}:{{filepath}}. Available variables in --title-template:
{{filepath}}— full grouped file path{{filename}}— basename of{{filepath}}{{match_count}}— number of ripgrepmatchevents collected for that file
Development
# Build and run
# Run all tests (unit + integration)
# Run only integration tests
FAQ
Where's the queue?
The initial design was meant to manage a queue for sift a Human-in-the-loop review tool I was building. That model stopped making sense pretty quickly as the tool evolved. The current tool is better understood as a lightweight task list with structured sources, filtering, and dependency state.
The name stuck because it was short, memorable, and already embedded in the CLI (sq, -q, --queue). Keeping the name does not mean sq is trying to be a literal FIFO queue.