linear-cli
Linear CLI
Interact with the Linear issue tracker from the command line. The primary use cases are:
- Starting tasks from issues -- fetch an issue by ID, read its description, and begin work
- Searching/listing issues -- find issues by state, assignee, team, or free-text search
- Viewing issue details -- read full descriptions, comments, and metadata
- Updating issue state -- mark issues as started, add comments with progress
Setup
Install
brew install schpet/tap/linear
Authenticate
- Create an API key at https://linear.app/settings/account/security (requires member access, not guest)
- Run
linear auth loginand paste the key when prompted - Verify:
linear auth whoami
Configure for this repo
linear config
This writes a .linear.toml in the repo root with the team ID and workspace slug. The file is checked into git so all agents and developers share the same config.
Starting a Task from an Issue
When given an issue ID (e.g. ENG-123):
# Read the full issue -- description, state, assignee, labels, comments
linear issue view ENG-123
# Get just the title (useful for branch names or commit messages)
linear issue title ENG-123
# Get the Linear URL
linear issue url ENG-123
The agent should read the issue description to understand requirements before starting implementation.
Task Lifecycle
On start: Move the issue to "In Progress" immediately when beginning implementation.
linear issue update ENG-123 -s started
# or via GraphQL if CLI fails (see Updating Issues below)
On deploy to production: Move to "In Review" only after the deploy has fully completed and the change is live on production. Never update Linear state speculatively or immediately after pushing — a reviewer loading the issue will open the production site, which must already reflect the change.
The required sequence:
- Push to telecine main (or merge PR)
- Block on
scripts/wait-for-telecine-actionuntil the deploy job completes successfully - Only then move to "In Review" and add a comment
# From monorepo/ — MUST complete before touching Linear
scripts/wait-for-telecine-action
# Then move to In Review
linear api <<'GRAPHQL'
mutation {
issueUpdate(id: "EF2-123", input: { stateId: "2717b5fe-9ea0-429f-8edd-cf8eabe0551d" }) { success }
}
GRAPHQL
linear issue comment add EF2-123 -b "Deployed to production. <one-line summary of what changed>"
The comment should be a single sentence describing what was implemented or fixed, not a list of commits.
Searching and Listing Issues
# List unstarted issues assigned to you (default)
# --sort is required: manual or priority (NOT "updated")
linear issue list --sort priority
# List issues in a specific state
linear issue list -s started --sort priority
linear issue list -s backlog --sort priority
linear issue list --all-states --sort priority
# List issues for all assignees
linear issue list -A --sort priority
# List unassigned issues
linear issue list -U --sort priority
# Filter by project -- requires exact name match; use GraphQL if not found
linear issue list --project "Project Name" --sort priority --team ENG
# Filter by team (required if no .linear.toml in repo)
linear issue list --team ENG --sort priority
# Limit results
linear issue list --limit 10 --sort priority
List issues in a project via GraphQL (preferred for project browsing)
The CLI --project filter is fragile (exact name match, requires team). Use GraphQL instead:
# First find the project ID
linear api <<'GRAPHQL'
query {
projects(first: 50) {
nodes { id name }
}
}
GRAPHQL
# Then fetch its issues
linear api <<'GRAPHQL'
query {
project(id: "<id>") {
issues(first: 50) {
nodes { identifier title state { name } assignee { name } priority }
}
}
}
GRAPHQL
Free-text search via GraphQL
The CLI doesn't have a built-in search command, but the api subcommand exposes the full GraphQL API:
linear api --variable term="onboarding" <<'GRAPHQL'
query($term: String!) {
searchIssues(term: $term, first: 20) {
nodes { identifier title state { name } assignee { name } }
}
}
GRAPHQL
Pipe to jq for filtering:
linear api --variable term="bug" <<'GRAPHQL'
query($term: String!) {
searchIssues(term: $term, first: 20) {
nodes { identifier title state { name } }
}
}
GRAPHQL
Updating Issues
# Mark as started (sets state to "In Progress")
# NOTE: linear issue update fails with "Could not determine team key from issue ID"
# for non-standard prefixes (e.g. EF2-123). Use GraphQL mutation instead (see below).
linear issue update ENG-123 -s started
# Update title or description
linear issue update ENG-123 -t "New title"
linear issue update ENG-123 --description-file /tmp/desc.md
# Add a comment
linear issue comment add ENG-123 -b "Started implementation"
# For multi-line markdown comments, use a file
linear issue comment add ENG-123 --body-file /tmp/comment.md
Update issue state via GraphQL (when CLI update fails)
# Find the state ID first
linear api <<'GRAPHQL'
query {
workflowStates(filter: { name: { eq: "Done" } }) {
nodes { id name team { key } }
}
}
GRAPHQL
# Then update one or more issues in a single mutation
linear api <<'GRAPHQL'
mutation {
issueUpdate(id: "EF2-123", input: { stateId: "<state-id>" }) { success }
}
GRAPHQL
# Batch update multiple issues
linear api <<'GRAPHQL'
mutation {
a: issueUpdate(id: "EF2-436", input: { stateId: "<state-id>" }) { success }
b: issueUpdate(id: "EF2-435", input: { stateId: "<state-id>" }) { success }
}
GRAPHQL
Creating Issues
# Interactive (prompts for details)
linear issue create
# Non-interactive
linear issue create -t "Fix rendering bug" --description-file /tmp/desc.md -a self -s unstarted
# Create and immediately start working
linear issue create -t "Investigate flaky test" --start
Always use --description-file or --body-file for multi-line markdown content to avoid shell escaping issues.
Discovering CLI Options
Every command supports --help:
linear --help
linear issue --help
linear issue list --help
linear issue create --help
The CLI has extensive subcommands beyond issues -- linear team, linear project, linear document, linear label, linear milestone. Run --help on any of them.
Workspace Reference
Use these IDs directly in mutations — no need to query for them first.
Users
| Name | ID |
|---|---|
| Collin Miller | 7fa0b8f1-b1d2-462a-8edd-5365fb5e1d4a |
| Jeremy Yudkin | 12ae7fdb-6af1-45fd-b656-a1052b387605 |
Workflow States (team: EF2)
| State | ID | Type |
|---|---|---|
| Backlog | deceb52d-a969-493a-974c-228d0e595e08 |
backlog |
| Todo | fb95e2be-9938-42bf-8248-276d4b1af951 |
unstarted |
| In Progress | ac7b4c8f-d2a9-4e74-a9ff-392506703bd2 |
started |
| In Review | 2717b5fe-9ea0-429f-8edd-cf8eabe0551d |
started |
| Done | 5fcec8c5-d69d-4cf4-bcad-e73654b2fae2 |
completed |
| Canceled | 1fbe9606-44eb-486c-8521-daf848673435 |
canceled |
| Duplicate | ec2113c9-0b49-407a-82e1-3d1f39c7037a |
canceled |
Projects
| Name | ID | State |
|---|---|---|
| Editframe 2026 Launch / Bug Fixes | b43b5d1d-8431-4e19-b4ae-c05760c02996 |
planned |
| App and Dashboard For Launch | 5fbea590-482f-4fcd-89f3-b0e581e43546 |
started |
| Demo Improvements (Pre Launch) | 6c616f08-8bc9-4f8c-9109-26863099ffc3 |
started |
| Dev Rel Catnip | 90b4643c-9b09-43fc-8fd8-9e78de7669a5 |
started |
| Bug Fixes | 9c2beb23-32c3-4c24-a896-ca69eb99da49 |
started |
| Clean Slate Task Collection | 12e632b9-6ce7-4a06-8403-46b419e3f649 |
started |
| Docs/Site Feedback (2025) | 4ccf4054-9b6a-4ccf-85e6-088fe60851e4 |
started |
| EF - Rendering Improvements | fd8a3df6-e174-41ee-a7f2-b7d49bca6094 |
backlog |
| EF - Preview Improvements | 4772c169-6f0f-4c01-b408-801ebd49bb3a |
backlog |
| Launch Documentation Beta | f8babb39-f732-4611-999e-f7db4d0aa48c |
backlog |
| Stack Trace Project | e2f37910-6a4f-4f45-a877-889c62526e6b |
planned |
When to Use This Skill
- User provides a Linear issue ID and wants to begin work on it
- User asks to find or search for Linear issues
- User wants to see what's assigned to them or what's in a specific state
- User asks to update an issue's status or add a comment
- Agent needs to read issue requirements before starting implementation
More from editframe/skills
video-analysis
Analyze video files using ffprobe, mp4dump, and jq. Use when investigating video samples, keyframes, MP4 box structure, codec info, packet timing, or debugging video playback issues.
75visual-thinking
Create visual analogies by mapping relational structure from familiar domains onto unfamiliar concepts using spatial relationships to make abstract patterns concrete. Covers static diagrams AND animated video storytelling (camera choreography, race comparisons, pacing). Use when explaining complex concepts, creating analogies, designing diagrams, creating explainer animations, or revealing system structure.
71css-animations
CSS animation fill-mode requirements for Editframe timeline system. Use when creating CSS animations, debugging flashing/flickering issues, or when user mentions animation problems, fade effects, slide effects, or sequential animations.
69threejs-compositions
Integrate Three.js 3D scenes into Editframe compositions via addFrameTask. Scenes are pure functions of time, fully scrubable, and renderable to MP4. Use when creating 3D animations, WebGL content in compositions, or integrating Three.js with Editframe's timeline system.
66editor-gui
Build video editing interfaces using Editframe's GUI web components. Assemble timeline, scrubber, filmstrip, preview, and playback controls like lego bricks. Use when creating video editors, editing tools, or when user mentions timeline, scrubber, preview, playback controls, trim handles, or wants to build editing UIs.
64elements-new-package
Create a new @editframe/* workspace package in the elements monorepo and publish it to npm.
64