Skip to content

Commit ca313af

Browse files
muqsitnawazclaude
andcommitted
docs: document v0.3.0 — pagination, cycle scopes, --assignee, states, relations
Update README usage + comparison sizes (76 KB / ~2,100 lines), skill.md agent reference (new filters + relations + states), and add the 0.3.0 CHANGELOG entry. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
1 parent 0b4da02 commit ca313af

3 files changed

Lines changed: 60 additions & 7 deletions

File tree

CHANGELOG.md

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,34 @@ All notable changes to this project will be documented in this file.
55
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
66
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
77

8+
## [0.3.0] - 2026-06-24
9+
10+
Closes the load-bearing read gaps for agent workflows. The headline is
11+
pagination: lists no longer silently truncate at Linear's 50-issue page cap —
12+
on a real cycle this surfaced 137 tasks where the old code showed 50, the exact
13+
cause of "search before you create" missing existing tickets and filing
14+
duplicates.
15+
16+
### Added
17+
- Full pagination on every issue list (`tasks`, `--query`, `--board`) — follows
18+
`pageInfo` to the end instead of stopping at the first 50 results
19+
- `tasks --cycle all` (whole team: every cycle + backlog) and `--cycle none`
20+
(backlog only) — previously listing was locked to the active/next cycle
21+
- `tasks --assignee me|none|<email>` — filter by real assignee, not just the
22+
`agent:` label lane
23+
- `linear states` — list the team's workflow states, so agents stop guessing
24+
status names and learning they were wrong only when a mutation fails
25+
- `update --blocks`, `--blocked-by`, `--relates` (repeatable) — create issue
26+
relations via `issueRelationCreate`
27+
- Detail view (`tasks ANT-N`) now shows relations (Blocks / Blocked by / Related
28+
to / Duplicate of), plus project, cycle, parent, url, estimate, and due date
29+
30+
### Changed
31+
- `tasks --json` shape: `{ scope, cycle, count, issues }` (the `issues` array is
32+
unchanged; `cycle` is null for `all`/`none` scopes)
33+
- Detail-view query enriched — `--json` no longer drops project/cycle/parent/
34+
url/estimate/dueDate/relations
35+
836
## [0.2.0] - 2026-06-07
937

1038
Broad expansion of the create/update surface to cover the fields agents actually

README.md

Lines changed: 15 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
[![Python 3.9+](https://img.shields.io/badge/python-3.9%2B-blue.svg)](https://www.python.org/downloads/)
77
[![Dependencies: 0](https://img.shields.io/badge/dependencies-0-brightgreen.svg)](#zero-dependencies-literally)
88
[![Supply chain: 0 attack surface](https://img.shields.io/badge/supply%20chain-0%20attack%20surface-brightgreen.svg)](#zero-supply-chain-attack-surface)
9-
[![Single file](https://img.shields.io/badge/single%20file-67%20KB-brightgreen.svg)](./linear)
9+
[![Single file](https://img.shields.io/badge/single%20file-76%20KB-brightgreen.svg)](./linear)
1010
[![Team CLI](https://img.shields.io/badge/team-CLI-a3e635.svg)](#why-the-mcp-server-isnt-always-the-answer)
1111

1212
Issue tracking from the shell — for humans and their agents. Query your queue, claim tasks, report progress, close with proof. Works the same whether you're typing or a subagent is.
@@ -57,6 +57,9 @@ linear tasks # your queue in the active cycle
5757
linear tasks --board # whole team board
5858
linear tasks ANT-42 # detail view
5959
linear tasks --query "auth refresh" # search title + description
60+
linear tasks --cycle all # whole team: every cycle + backlog
61+
linear tasks --cycle none # the backlog (issues in no cycle)
62+
linear tasks --assignee me # by assignee: me | none | someone@x.com
6063
linear tasks --json | jq # machine-readable
6164

6265
linear update ANT-42 --pickup # claim (In Progress)
@@ -65,6 +68,7 @@ linear update ANT-42 --done --proof https://pr/123 --proof "deployed"
6568
linear update ANT-42 --priority urgent --assign someone@x.com
6669
linear update ANT-42 --title "Renamed" --description "Rewritten body"
6770
linear update ANT-42 --project "Foo" --milestone "v1.0"
71+
linear update ANT-42 --blocked-by ANT-7 --blocks ANT-9 # relations
6872
linear update ANT-42 --unlabel agent:claude --label agent:codex # hand off
6973

7074
linear create "Fix auth bug" --label security --priority high
@@ -77,18 +81,23 @@ linear projects # list projects + progress
7781
linear projects "Phoenix" # detail view with milestones
7882
linear labels # available labels
7983
linear users # assignable users (for --assign lookup)
84+
linear states # the team's workflow states (valid --status values)
8085
linear cycles
8186

8287
linear --team ENG tasks # one-shot override (multi-team workspace)
8388
```
8489

90+
> Every list is fully paginated — no silent truncation at Linear's 50-issue
91+
> page cap, so `linear tasks` and `--query` see the *whole* cycle/team before
92+
> you create a duplicate.
93+
8594
Full help: `linear <command> --help`.
8695

8796
## For humans and agents
8897

8998
The same CLI works whether you're typing or a subagent is. Driving Linear from either shouldn't require shelling out to `@linear/sdk`, hand-rolling GraphQL, or parsing HTML.
9099

91-
- **Assignee-as-queue.** `linear tasks` returns what *you* own, filtered to the active cycle. No dashboards, no saved views.
100+
- **Assignee-as-queue.** `linear tasks` returns what *you* own in the active cycle. Widen with `--cycle all` (whole team) or `--cycle none` (backlog), or filter by `--assignee me|none|<email>`. No dashboards, no saved views.
92101
- **Agent-lane labels.** Set `--agent claude` at setup and `linear tasks` filters to issues labeled for that agent. Multiple agents can share a team without stepping on each other.
93102
- **Proof-first completion.** `--done --proof <file|url|text>` uploads attachments, records links, and appends notes in one call — so reviewers see evidence without digging.
94103
- **JSON everywhere.** `--json` on every read command. Pipe to `jq` or hand to a subagent.
@@ -129,13 +138,13 @@ import subprocess
129138
import sys
130139
```
131140

132-
Every symbol is in the Python standard library. No `pip install`. No `npm install`. No `cargo build`. No Deno. The whole tool is one ~43 KB file you can read top-to-bottom in an hour.
141+
Every symbol is in the Python standard library. No `pip install`. No `npm install`. No `cargo build`. No Deno. The whole tool is one ~76 KB file you can read top-to-bottom in an hour.
133142

134143
### How it compares
135144

136145
| Tool | Runtime | Deps | Install footprint | Last published |
137146
|------|---------|------|-------------------|----------------|
138-
| **linear-cli** (this) | Python 3.9+ stdlib | **0** | 67 KB, 1 file | active |
147+
| **linear-cli** (this) | Python 3.9+ stdlib | **0** | 76 KB, 1 file | active |
139148
| [`@linear/cli`](https://www.npmjs.com/package/@linear/cli) (official) | Node | 0 | 5 MB npm pkg | Nov 2021 (abandoned) |
140149
| [Linearis](https://github.com/czottmann/linearis) | Node | `@linear/sdk` + `commander` | 27 MB `node_modules` | 2025 |
141150
| [schpet/linear-cli](https://github.com/schpet/linear-cli) | Deno | 25+ imports (cliffy, graphql-codegen, unified, valibot…) | Deno + codegen | active |
@@ -152,7 +161,7 @@ This is the boring superpower of having no dependencies.
152161

153162
Every notable CLI supply chain attack of the last few years — `event-stream`, `colors`/`faker`, `ua-parser-js`, `node-ipc`, the `xz` backdoor, `polyfill.io`, the dozens of [npm typosquats](https://socket.dev) caught monthly — happened through a compromised dependency, not the tool itself. linear-cli has none. The full audit surface is:
154163

155-
- The ~1700 lines of Python in this repo (read it: [`linear`](./linear))
164+
- The ~2,100 lines of Python in this repo (read it: [`linear`](./linear))
156165
- Python's standard library
157166
- Linear's own GraphQL API at `api.linear.app`
158167

@@ -181,7 +190,7 @@ If you want the MCP, use it. If you want a subagent to burn through 50 tickets w
181190

182191
Yes. If your agent has its own Linear account (many teams provision one seat per agent — e.g. `claude@yourcompany.com`, `codex@yourcompany.com`), run `linear setup --api-key <agent's own key>` without `--agent`. Then `linear tasks` returns tickets assigned *directly to the agent's user*. No labels, no filtering — the assignee IS the lane.
183192

184-
Use `--agent <label>` when you want multiple agents to share one Linear seat; skip it when each agent has its own.
193+
Use `--agent <label>` when you want multiple agents to share one Linear seat; skip it when each agent has its own. To query any assignee on demand, `linear tasks --assignee me|none|<email>`.
185194

186195
### How do I rotate the API key?
187196

skill.md

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,19 +21,28 @@ linear cycles # list cycles
2121
linear projects # list projects (with milestones via `linear projects "Name"`)
2222
linear labels # list available labels
2323
linear users # list assignable users
24+
linear states # the team's workflow states (valid --status values)
2425
```
2526

2627
## Filters
2728

29+
Lists are fully paginated — `linear tasks` returns the *whole* cycle/team, not a
30+
truncated first page. Always search before creating, to avoid duplicates.
31+
2832
```
2933
linear tasks --status todo # backlog | todo | progress | done | open
3034
linear tasks --label security # by any label
31-
linear tasks --cycle next # active | next
35+
linear tasks --cycle active # active (default) | next | all | none
36+
linear tasks --cycle all # whole team: every cycle + backlog
37+
linear tasks --cycle none # backlog only (issues in no cycle)
38+
linear tasks --assignee me # by assignee: me | none | someone@x.com
3239
linear tasks --query "auth" # search title + description
3340
linear tasks --json # machine-readable
3441
linear tasks --all # ignore default agent filter
3542
```
3643

44+
If unsure of a status name, run `linear states` instead of guessing.
45+
3746
## Editing existing issues
3847

3948
Everything you can set on `create` can be changed on `update` with the same flag. Examples:
@@ -43,10 +52,16 @@ linear update ANT-42 --priority urgent --assign someone@x.com
4352
linear update ANT-42 --title "Renamed" --description "Rewritten body"
4453
linear update ANT-42 --project "Phoenix" --milestone "v1.0"
4554
linear update ANT-42 --estimate 3 --parent ANT-10
55+
linear update ANT-42 --blocked-by ANT-7 --blocks ANT-9 # relations
56+
linear update ANT-42 --relates ANT-5 # non-blocking link
4657
linear update ANT-42 --label agent:codex --unlabel agent:claude # hand off
4758
linear update ANT-42 --project none # detach
4859
```
4960

61+
Relations are read back in the detail view (`linear tasks ANT-42`) as
62+
Blocks / Blocked by / Related to. Use `--blocked-by` before picking up a task to
63+
record what it depends on.
64+
5065
## Creating issues — what's required
5166

5267
Only one thing: a title OR a description. Everything else has a sensible default.
@@ -87,6 +102,7 @@ linear tasks --json | jq '.issues[] | {id: .identifier, title, state: .state.nam
87102

88103
- `linear tasks` without flags returns issues assigned to the identity that owns the API key.
89104
- If `cfg.agent` is set at setup time (e.g. `claude`, `codex`), `linear tasks` additionally filters by a matching label — the "agent lane" pattern. Override with `--all`.
105+
- Default scope is the active cycle. Use `--cycle all` to search the whole team (e.g. before creating, to avoid duplicates), `--cycle none` for the backlog, or `--assignee <email>` to query someone else's queue.
90106
- `linear update <id> --pickup` = claim the task. Follow with `--done --proof` when shipped.
91107

92108
## Proof-of-completion

0 commit comments

Comments
 (0)