Releases: alexgrais/lin
Release list
v0.1.1
Two fixes, both found by driving a real QA card end to end against a production
Linear workspace. Neither was reachable from the test suite.
--fields no longer fails silently
An unknown field name was dropped without a word, so this returned exit 0 and
no milestone:
lin issue get ENG-123 --fields identifier,milestone # the real key is projectMilestoneNothing distinguished that from a genuinely unset value, which invites a caller
to conclude the milestone was empty when it had simply mistyped the field. Since
--fields is the flag agents shape their context with, a silent miss is worse
than a loud one. It now fails with exit 65 and lists what was available:
lin: unknown --fields milestone (available: …, projectMilestone, …): validation error
Validation runs against the union of a page's keys, so a field that is null on
the first record is still accepted, and an empty page is not validated at all
since it cannot describe its own shape.
Teams resolve by name, not only by key
--team KTM returned exit 66 on create while --project "API Experience"
worked, making teams the one reference in the CLI that refused a human value.
List commands had a nastier version of the same bug: they filter server-side to
save a round-trip and matched on the key alone, so lin issue list --team KTM
returned an empty page rather than an error - a wrong answer wearing the shape
of an ordinary empty result. That affected issue, cycle, state, label
and project listings.
Both paths now accept a key or a name. The key is still tried first, so a value
that is one team's key can never resolve to another team's name, and listing
still costs no extra round-trip.
Install
brew install alexgrais/tap/lincli # or brew upgrade lincli
go install github.com/alexgrais/lin/cmd/lin@v0.1.1Full changelog: CHANGELOG.md
v0.1.0
The first release of lin - the Linear CLI for humans and AI agents. One fast
native binary over the Linear GraphQL API, JSON-first and headless-friendly.
Docs: https://lin.alexgrais.dev
Added
- Full-spectrum command surface (MCP parity + staged waves): issue (CRUD, relations,
sub-issues, archive lifecycle), comment, label, team, state, project (+ labels),
milestone, initiative (+ labels, project linking), cycle, user, status-update,
document, attachment (3-step signed upload dance), release / release-note /
release-pipeline, customer / customer-need, whoami, version, describe. - Agent-friendly contract: JSON-first output (
--output json|ndjson|table),
--fieldsmasking,--dry-runon every mutation, raw--jsonpayloads,
cursor pagination (--limit/--cursor/--all), sysexits exit codes,
lin describeruntime introspection, input hardening,--confirmon deletes. lin authwith named profiles (login,status,logout,switch), stored in
~/.config/lin/config.jsonat mode 0600 and selected with--profile. Secrets
are read from stdin, a hidden TTY prompt, or--from-env, never from a flag, and
are validated against the API before being written.- Retrying GraphQL transport (Authorization without Bearer, backoff + jitter,
Retry-After, mutation-safe retry policy, null pruning to avoid field clears). - Vendored Linear GraphQL schema with genqlient codegen and refresh tool.
- Documentation site generated from
lin describe, so the command reference
cannot drift from the binary. - Token benchmark against the Linear MCP under
bench/: ~8,300 tokens for a
40-turn agent session, against ~69,800 through a lazy MCP client. Methodology,
raw payloads, and scripts are reproducible.
Install
go install github.com/alexgrais/lin/cmd/lin@v0.1.0Or download a binary for your platform from the assets below. Verify with
checksums.txt.
A Homebrew tap is not published yet; it will land as alexgrais/tap/lincli.
Getting started
lin auth login # store a Linear API key, validated before saving
lin issue list --team ENG --fields identifier,title,state
lin issue create --team ENG --title "Fix login" --labels bug --assignee me