
Linear Cli
- 7.1k installs
- 878 repo stars
- Updated July 23, 2026
- schpet/linear-cli
linear-cli is an agent skill for Manage Linear issues from the command line using the linear cli. This skill allows automating linear management.
About
Manage Linear issues from the command line using the linear cli This skill allows automating linear management name linear-cli description Manage Linear issues from the command line using the linear cli This skill allows automating linear management allowed-tools Bash linear Bash curl Linear CLI A CLI to manage Linear issues from the command line with git and jj integration Prerequisites The linear command must be available on PATH To check bash linear version If not installed globally you can run it without installing via npx bash npx schpet linear-cli version All subsequent commands can be prefixed with npx schpet linear-cli in place of linear Otherwise follow the install instructions at https github com schpet linear-cli tab readme-ov-file install Best Practices for Markdown Content When working with issue descriptions or comment bodies that contain markdown always prefer using file-based flags instead of passing content as command-line arguments Use description-file for issue create and issue update commands Use body-file for comment add and comment update commands Why use file-based flags Ensures proper
- Use `--description-file` for `issue create` and `issue update` commands
- Use `--body-file` for `comment add` and `comment update` commands
- Ensures proper formatting in the Linear web UI
- Avoids shell escaping issues with newlines and special characters
- Prevents literal `\n` sequences from appearing in markdown
Linear Cli by the numbers
- 7,069 all-time installs (skills.sh)
- +372 installs in the week ending Jul 28, 2026 (Skillselion tracking)
- Ranked #89 of 2,209 Security skills by installs in the Skillselion catalog
- Security screen: LOW risk (skills.sh audit)
- Data as of Jul 28, 2026 (Skillselion catalog sync)
linear-cli capabilities & compatibility
- Capabilities
- use ` description file` for `issue create` and · use ` body file` for `comment add` and `comment · ensures proper formatting in the linear web ui · avoids shell escaping issues with newlines and s · prevents literal `\n` sequences from appearing i
- Use cases
- documentation
What linear-cli says it does
--- name: linear-cli description: Manage Linear issues from the command line using the linear cli.
This skill allows automating linear management.
allowed-tools: Bash(linear:*), Bash(curl:*) --- # Linear CLI A CLI to manage Linear issues from the command line, with git and jj integration.
npx skills add https://github.com/schpet/linear-cli --skill linear-cliAdd your badge
Show developers this skill is listed on Skillselion. Paste this into your README.
| Installs | 7.1k |
|---|---|
| repo stars | ★ 878 |
| Security audit | 3 / 3 scanners passed |
| Last updated | July 23, 2026 |
| Repository | schpet/linear-cli ↗ |
When should developers use linear-cli and what problem does it solve?
Manage Linear issues from the command line using the linear cli. This skill allows automating linear management.
Who is it for?
Developers working with linear-cli patterns described in the skill documentation.
Skip if: Skip when cached docs are empty or the task is outside the skill's documented scope.
When should I use this skill?
Manage Linear issues from the command line using the linear cli. This skill allows automating linear management.
What you get
Grounded guidance and workflows from SKILL.md for linear-cli.
- Linear issue
- issue comment
- state transition
Files
Linear CLI
A CLI to manage Linear issues from the command line, with git and jj integration.
Prerequisites
The linear command must be available on PATH. To check:
linear --versionIf not installed globally, you can run it without installing via npx:
npx @schpet/linear-cli --versionAll subsequent commands can be prefixed with npx @schpet/linear-cli in place of linear. Otherwise, follow the install instructions at:\ https://github.com/schpet/linear-cli?tab=readme-ov-file#install
Best Practices for Markdown Content
When working with issue descriptions or comment bodies that contain markdown, always prefer using file-based flags instead of passing content as command-line arguments:
- Use
--description-fileforissue createandissue updatecommands - Use
--body-fileforcomment addandcomment updatecommands
Why use file-based flags:
- Ensures proper formatting in the Linear web UI
- Avoids shell escaping issues with newlines and special characters
- Prevents literal
\nsequences from appearing in markdown - Makes it easier to work with multi-line content
Example workflow:
# Write markdown to a temporary file
cat > /tmp/description.md <<'EOF'
## Summary
- First item
- Second item
## Details
This is a detailed description with proper formatting.
EOF
# Create issue using the file
linear issue create --title "My Issue" --description-file /tmp/description.md
# Or for comments
linear issue comment add ENG-123 --body-file /tmp/comment.mdOnly use inline flags (--description, --body) for simple, single-line content.
Available Commands
Compact command list, generated from linear --help:
linear auth
linear auth login
linear auth logout
linear auth list
linear auth default
linear auth token
linear auth whoami
linear auth migrate
linear issue
linear issue id
linear issue mine
linear issue query
linear issue title
linear issue start
linear issue view
linear issue url
linear issue describe
linear issue commits
linear issue pull-request
linear issue delete
linear issue create
linear issue update
linear issue comment
linear issue comment add
linear issue comment delete
linear issue comment update
linear issue comment list
linear issue attach
linear issue link
linear issue relation
linear issue relation add
linear issue relation delete
linear issue relation list
linear issue agent-session
linear issue agent-session list
linear issue agent-session view
linear team
linear team create
linear team delete
linear team list
linear team id
linear team autolinks
linear team members
linear project
linear project list
linear project view
linear project create
linear project update
linear project delete
linear project-update
linear project-update create
linear project-update list
linear cycle
linear cycle list
linear cycle view
linear milestone
linear milestone list
linear milestone view
linear milestone create
linear milestone update
linear milestone delete
linear initiative
linear initiative list
linear initiative view
linear initiative create
linear initiative archive
linear initiative update
linear initiative unarchive
linear initiative delete
linear initiative add-project
linear initiative remove-project
linear initiative-update
linear initiative-update create
linear initiative-update list
linear label
linear label list
linear label create
linear label delete
linear document
linear document list
linear document view
linear document create
linear document update
linear document delete
linear config
linear schema
linear apiReference Documentation
- auth - Manage Linear authentication
- issue - Manage Linear issues
- team - Manage Linear teams
- project - Manage Linear projects
- project-update - Manage project status updates
- cycle - Manage Linear team cycles
- milestone - Manage Linear project milestones
- initiative - Manage Linear initiatives
- initiative-update - Manage initiative status updates (timeline posts)
- label - Manage Linear issue labels
- document - Manage Linear documents
- config - Interactively generate .linear.toml configuration
- schema - Print the GraphQL schema to stdout
- api - Make a raw GraphQL API request
For curated examples of organization features (initiatives, labels, projects, bulk operations), see organization-features.
Discovering Options
To see available subcommands and flags, run --help on any command:
linear --help
linear issue --help
linear issue list --help
linear issue create --helpEach command has detailed help output describing all available flags and options.
Some commands have required flags that aren't obvious. Notable examples:
issue listrequires a sort order — provide it via--sort(valid values:manual,priority), theissue_sortconfig option, or theLINEAR_ISSUE_SORTenv var. Also requires--team <key>unless the team can be inferred from the directory — if unknown, runlinear team listfirst.--no-pageris only supported onissue list— passing it to other commands likeproject listwill error.
Using the Linear GraphQL API Directly
Prefer the CLI for all supported operations. The api command should only be used as a fallback for queries not covered by the CLI.
Check the schema for available types and fields
Write the schema to a tempfile, then search it:
linear schema -o "${TMPDIR:-/tmp}/linear-schema.graphql"
grep -i "cycle" "${TMPDIR:-/tmp}/linear-schema.graphql"
grep -A 30 "^type Issue " "${TMPDIR:-/tmp}/linear-schema.graphql"Make a GraphQL request
Important: GraphQL queries containing non-null type markers (e.g. String followed by an exclamation mark) must be passed via heredoc stdin to avoid escaping issues. Simple queries without those markers can be passed inline.
# Simple query (no type markers, so inline is fine)
linear api '{ viewer { id name email } }'
# Query with variables — use heredoc to avoid escaping issues
linear api --variable teamId=abc123 <<'GRAPHQL'
query($teamId: String!) { team(id: $teamId) { name } }
GRAPHQL
# Search issues by text
linear api --variable term=onboarding <<'GRAPHQL'
query($term: String!) { searchIssues(term: $term, first: 20) { nodes { identifier title state { name } } } }
GRAPHQL
# Numeric and boolean variables
linear api --variable first=5 <<'GRAPHQL'
query($first: Int!) { issues(first: $first) { nodes { title } } }
GRAPHQL
# Complex variables via JSON
linear api --variables-json '{"filter": {"state": {"name": {"eq": "In Progress"}}}}' <<'GRAPHQL'
query($filter: IssueFilter!) { issues(filter: $filter) { nodes { title } } }
GRAPHQL
# Pipe to jq for filtering
linear api '{ issues(first: 5) { nodes { identifier title } } }' | jq '.data.issues.nodes[].title'Advanced: Using curl directly
For cases where you need full HTTP control, use linear auth token:
curl -s -X POST https://api.linear.app/graphql \
-H "Content-Type: application/json" \
-H "Authorization: $(linear auth token)" \
-d '{"query": "{ viewer { id } }"}'api
Make a raw GraphQL API request
Usage
Usage: linear api [query]
Description:
Make a raw GraphQL API request
Options:
-h, --help - Show this help.
--workspace <slug> - Target workspace (uses credentials)
--variable <variable> - Variable in key=value format (coerces booleans, numbers, null; @file reads from
path)
--variables-json <json> - JSON object of variables (merged with --variable, which takes precedence)
--paginate - Auto-paginate a single connection field using cursor pagination
--silent - Suppress response output (exit code still reflects errors)auth
Manage Linear authentication
Usage
Usage: linear auth
Description:
Manage Linear authentication
Options:
-h, --help - Show this help.
--workspace <slug> - Target workspace (uses credentials)
Commands:
login - Add a workspace credential
logout [workspace] - Remove a workspace credential
list - List configured workspaces
default [workspace] - Set the default workspace
token - Print the configured API token
whoami - Print information about the authenticated user
migrate - Migrate plaintext credentials to system keyringSubcommands
login
Add a workspace credential
Usage: linear auth login
Description:
Add a workspace credential
Options:
-h, --help - Show this help.
--workspace <slug> - Target workspace (uses credentials)
-k, --key <key> - API key (prompted if not provided)
--plaintext - Store API key in credentials file instead of system keyringlogout
Remove a workspace credential
Usage: linear auth logout [workspace]
Description:
Remove a workspace credential
Options:
-h, --help - Show this help.
--workspace <slug> - Target workspace (uses credentials)
-f, --force - Skip confirmation promptlist
List configured workspaces
Usage: linear auth list
Description:
List configured workspaces
Options:
-h, --help - Show this help.
--workspace <slug> - Target workspace (uses credentials)default
Set the default workspace
Usage: linear auth default [workspace]
Description:
Set the default workspace
Options:
-h, --help - Show this help.
--workspace <slug> - Target workspace (uses credentials)token
Print the configured API token
Usage: linear auth token
Description:
Print the configured API token
Options:
-h, --help - Show this help.
--workspace <slug> - Target workspace (uses credentials)whoami
Print information about the authenticated user
Usage: linear auth whoami
Description:
Print information about the authenticated user
Options:
-h, --help - Show this help.
--workspace <slug> - Target workspace (uses credentials)migrate
Migrate plaintext credentials to system keyring
Usage: linear auth migrate
Description:
Migrate plaintext credentials to system keyring
Options:
-h, --help - Show this help.
--workspace <slug> - Target workspace (uses credentials)Linear CLI Command Reference
Commands
- auth - Manage Linear authentication
- issue - Manage Linear issues
- team - Manage Linear teams
- project - Manage Linear projects
- project-update - Manage project status updates
- cycle - Manage Linear team cycles
- milestone - Manage Linear project milestones
- initiative - Manage Linear initiatives
- initiative-update - Manage initiative status updates (timeline posts)
- label - Manage Linear issue labels
- document - Manage Linear documents
- config - Interactively generate .linear.toml configuration
- schema - Print the GraphQL schema to stdout
- api - Make a raw GraphQL API request
Quick Reference
# Get help for any command
linear <command> --help
linear <command> <subcommand> --helpconfig
Interactively generate .linear.toml configuration
Usage
Usage: linear config
Description:
Interactively generate .linear.toml configuration
Options:
-h, --help - Show this help.
--workspace <slug> - Target workspace (uses credentials)cycle
Manage Linear team cycles
Usage
Usage: linear cycle
Description:
Manage Linear team cycles
Options:
-h, --help - Show this help.
--workspace <slug> - Target workspace (uses credentials)
Commands:
list - List cycles for a team
view, v <cycleRef> - View cycle detailsSubcommands
list
List cycles for a team
Usage: linear cycle list
Description:
List cycles for a team
Options:
-h, --help - Show this help.
--workspace <slug> - Target workspace (uses credentials)
--team <team> - Team key (defaults to current team)view
View cycle details
Usage: linear cycle view <cycleRef>
Description:
View cycle details
Options:
-h, --help - Show this help.
--workspace <slug> - Target workspace (uses credentials)
--team <team> - Team key (defaults to current team)document
Manage Linear documents
Usage
Usage: linear document
Description:
Manage Linear documents
Options:
-h, --help - Show this help.
--workspace <slug> - Target workspace (uses credentials)
Commands:
list, l - List documents
view, v <id> - View a document's content
create, c - Create a new document
update, u <documentId> - Update an existing document
delete, d [documentId] - Delete a document (moves to trash)Subcommands
list
List documents
Usage: linear document list
Description:
List documents
Options:
-h, --help - Show this help.
--workspace <slug> - Target workspace (uses credentials)
--project <project> - Filter by project (slug or name)
--issue <issue> - Filter by issue (identifier like TC-123)
--json - Output as JSON
--limit <limit> - Limit results (Default: 50)view
View a document's content
Usage: linear document view <id>
Description:
View a document's content
Options:
-h, --help - Show this help.
--workspace <slug> - Target workspace (uses credentials)
--raw - Output raw markdown without rendering
-w, --web - Open document in browser
--json - Output full document as JSONcreate
Create a new document
Usage: linear document create
Description:
Create a new document
Options:
-h, --help - Show this help.
--workspace <slug> - Target workspace (uses credentials)
-t, --title <title> - Document title (required)
-c, --content <content> - Markdown content (inline)
-f, --content-file <path> - Read content from file
--project <project> - Attach to project (slug or ID)
--issue <issue> - Attach to issue (identifier like TC-123)
--icon <icon> - Document icon (emoji)
-i, --interactive - Interactive mode with promptsupdate
Update an existing document
Usage: linear document update <documentId>
Description:
Update an existing document
Options:
-h, --help - Show this help.
--workspace <slug> - Target workspace (uses credentials)
-t, --title <title> - New title for the document
-c, --content <content> - New markdown content (inline)
-f, --content-file <path> - Read new content from file
--icon <icon> - New icon (emoji)
-e, --edit - Open current content in $EDITOR for editingdelete
Delete a document (moves to trash)
Usage: linear document delete [documentId]
Description:
Delete a document (moves to trash)
Options:
-h, --help - Show this help.
--workspace <slug> - Target workspace (uses credentials)
-y, --yes - Skip confirmation prompt
--bulk <ids...> - Delete multiple documents by slug or ID
--bulk-file <file> - Read document slugs/IDs from a file (one per line)
--bulk-stdin - Read document slugs/IDs from stdininitiative-update
Manage initiative status updates (timeline posts)
Usage
Usage: linear initiative-update
Description:
Manage initiative status updates (timeline posts)
Options:
-h, --help - Show this help.
--workspace <slug> - Target workspace (uses credentials)
Commands:
create, c <initiativeId> - Create a new status update for an initiative
list, l, ls <initiativeId> - List status updates for an initiativeSubcommands
create
Create a new status update for an initiative
Usage: linear initiative-update create <initiativeId>
Description:
Create a new status update for an initiative
Options:
-h, --help - Show this help.
--workspace <slug> - Target workspace (uses credentials)
--body <body> - Update content (markdown)
--body-file <path> - Read content from file
--health <health> - Health status (onTrack, atRisk, offTrack)
-i, --interactive - Interactive mode with promptslist
List status updates for an initiative
Usage: linear initiative-update list <initiativeId>
Description:
List status updates for an initiative
Options:
-h, --help - Show this help.
--workspace <slug> - Target workspace (uses credentials)
-j, --json - Output as JSON
--limit <limit> - Limit results (Default: 10)initiative
Manage Linear initiatives
Usage
Usage: linear initiative
Description:
Manage Linear initiatives
Options:
-h, --help - Show this help.
--workspace <slug> - Target workspace (uses credentials)
Commands:
list, ls - List initiatives
view, v <initiativeId> - View initiative details
create - Create a new Linear initiative
archive [initiativeId] - Archive a Linear initiative
update <initiativeId> - Update a Linear initiative
unarchive <initiativeId> - Unarchive a Linear initiative
delete [initiativeId] - Permanently delete a Linear initiative
add-project <initiative> <project> - Link a project to an initiative
remove-project <initiative> <project> - Unlink a project from an initiativeSubcommands
list
List initiatives
Usage: linear initiative list
Description:
List initiatives
Options:
-h, --help - Show this help.
--workspace <slug> - Target workspace (uses credentials)
-s, --status <status> - Filter by status (active, planned, completed)
--all-statuses - Show all statuses (default: active only)
-o, --owner <owner> - Filter by owner (username or email)
-w, --web - Open initiatives page in web browser
-a, --app - Open initiatives page in Linear.app
-j, --json - Output as JSON
--archived - Include archived initiativesview
View initiative details
Usage: linear initiative view <initiativeId>
Description:
View initiative details
Options:
-h, --help - Show this help.
--workspace <slug> - Target workspace (uses credentials)
-w, --web - Open in web browser
-a, --app - Open in Linear.app
-j, --json - Output as JSONcreate
Create a new Linear initiative
Usage: linear initiative create
Description:
Create a new Linear initiative
Options:
-h, --help - Show this help.
--workspace <slug> - Target workspace (uses credentials)
-n, --name <name> - Initiative name (required)
-d, --description <description> - Initiative description
-s, --status <status> - Status: planned, active, completed (default: planned)
-o, --owner <owner> - Owner (username, email, or @me for yourself)
--target-date <targetDate> - Target completion date (YYYY-MM-DD)
-c, --color <color> - Color hex code (e.g., #5E6AD2)
--icon <icon> - Icon name
-i, --interactive - Interactive mode (default if no flags provided)archive
Archive a Linear initiative
Usage: linear initiative archive [initiativeId]
Description:
Archive a Linear initiative
Options:
-h, --help - Show this help.
--workspace <slug> - Target workspace (uses credentials)
-y, --force - Skip confirmation prompt
--bulk <ids...> - Archive multiple initiatives by ID, slug, or name
--bulk-file <file> - Read initiative IDs from a file (one per line)
--bulk-stdin - Read initiative IDs from stdinupdate
Update a Linear initiative
Usage: linear initiative update <initiativeId>
Description:
Update a Linear initiative
Options:
-h, --help - Show this help.
--workspace <slug> - Target workspace (uses credentials)
-n, --name <name> - New name for the initiative
-d, --description <description> - New description
--status <status> - New status (planned, active, completed, paused)
--owner <owner> - New owner (username, email, or @me)
--target-date <targetDate> - Target completion date (YYYY-MM-DD)
--color <color> - Initiative color (hex, e.g., #5E6AD2)
--icon <icon> - Initiative icon name
-i, --interactive - Interactive mode for updatesunarchive
Unarchive a Linear initiative
Usage: linear initiative unarchive <initiativeId>
Description:
Unarchive a Linear initiative
Options:
-h, --help - Show this help.
--workspace <slug> - Target workspace (uses credentials)
-y, --force - Skip confirmation promptdelete
Permanently delete a Linear initiative
Usage: linear initiative delete [initiativeId]
Description:
Permanently delete a Linear initiative
Options:
-h, --help - Show this help.
--workspace <slug> - Target workspace (uses credentials)
-y, --force - Skip confirmation prompt
--bulk <ids...> - Delete multiple initiatives by ID, slug, or name
--bulk-file <file> - Read initiative IDs from a file (one per line)
--bulk-stdin - Read initiative IDs from stdinadd-project
Link a project to an initiative
Usage: linear initiative add-project <initiative> <project>
Description:
Link a project to an initiative
Options:
-h, --help - Show this help.
--workspace <slug> - Target workspace (uses credentials)
--sort-order <sortOrder> - Sort order within initiativeremove-project
Unlink a project from an initiative
Usage: linear initiative remove-project <initiative> <project>
Description:
Unlink a project from an initiative
Options:
-h, --help - Show this help.
--workspace <slug> - Target workspace (uses credentials)
-y, --force - Skip confirmation promptissue
Manage Linear issues
Usage
Usage: linear issue
Description:
Manage Linear issues
Options:
-h, --help - Show this help.
--workspace <slug> - Target workspace (uses credentials)
Commands:
id - Print the issue based on the current git branch
mine, list, l - List your issues
query, q - Query issues with structured filters
title [issueId] - Print the issue title
start [issueId] - Start working on an issue
view, v [issueId] - View issue details (default) or open in browser/app
url [issueId] - Print the issue URL
describe [issueId] - Print the issue title and Linear-issue trailer
commits [issueId] - Show all commits for a Linear issue (jj only)
pull-request, pr [issueId] - Create a GitHub pull request with issue details
delete, d [issueId] - Delete an issue
create - Create a linear issue
update [issueId] - Update a linear issue
comment - Manage issue comments
attach <issueId> <filepath> - Attach a file to an issue
link <urlOrIssueId> [url] - Link a URL to an issue
relation - Manage issue relations (dependencies)
agent-session - Manage agent sessions for an issueSubcommands
id
Print the issue based on the current git branch
Usage: linear issue id
Description:
Print the issue based on the current git branch
Options:
-h, --help - Show this help.
--workspace <slug> - Target workspace (uses credentials)mine
List your issues
Usage: linear issue mine
Description:
List your issues
Options:
-h, --help - Show this help.
--workspace <slug> - Target workspace (uses credentials)
-s, --state <state> - Filter by issue state (can be repeated for multiple states) (Default: [ "unstarted" ], Values: "triage", "backlog",
"unstarted", "started", "completed", "canceled")
--all-states - Show issues from all states
--sort <sort> - Sort order (can also be set via LINEAR_ISSUE_SORT) (Values: "manual", "priority")
--team <team> - Team to list issues for (if not your default team)
--project <project> - Filter by project name
--project-label <projectLabel> - Filter by project label name (shows issues from all projects with this label)
--cycle <cycle> - Filter by cycle name, number, or 'active'
--milestone <milestone> - Filter by project milestone name (requires --project)
-l, --label <label> - Filter by label name (can be repeated for multiple labels)
--limit <limit> - Maximum number of issues to fetch (default: 50, use 0 for unlimited) (Default: 50)
--created-after <date> - Filter issues created after this date (ISO 8601 or YYYY-MM-DD)
--updated-after <date> - Filter issues updated after this date (ISO 8601 or YYYY-MM-DD)
-w, --web - Open in web browser
-a, --app - Open in Linear.app
--no-pager - Disable automatic paging for long outputquery
Query issues with structured filters
Usage: linear issue query
Description:
Query issues with structured filters
Options:
-h, --help - Show this help.
--workspace <slug> - Target workspace (uses credentials)
--search <term> - Full-text search term
--search-comments - Also search inside issue comments (requires --search)
--team <team> - Filter by team key (can be repeated for multiple teams)
--all-teams - Query across all teams
-s, --state <state> - Filter by issue state (can be repeated for multiple states) (Values: "triage", "backlog", "unstarted", "started",
"completed", "canceled")
--all-states - Show issues from all states (this is the default)
--assignee <assignee> - Filter by assignee (username)
-A, --all-assignees - Show issues for all assignees (this is the default)
-U, --unassigned - Show only unassigned issues
--sort <sort> - Sort order: manual or priority (default: priority, not available with --search) (Values: "manual", "priority")
--project <project> - Filter by project name
--project-label <projectLabel> - Filter by project label name (shows issues from all projects with this label)
--cycle <cycle> - Filter by cycle name, number, or 'active'
--milestone <milestone> - Filter by project milestone name (requires --project)
-l, --label <label> - Filter by label name (can be repeated for multiple labels)
--limit <limit> - Maximum number of issues to fetch (default: 50, use 0 for unlimited) (Default: 50)
--created-after <date> - Filter issues created after this date (ISO 8601 or YYYY-MM-DD)
--updated-after <date> - Filter issues updated after this date (ISO 8601 or YYYY-MM-DD)
--include-archived - Include archived issues
-j, --json - Output results as JSON
--no-pager - Disable automatic paging for long outputtitle
Print the issue title
Usage: linear issue title [issueId]
Description:
Print the issue title
Options:
-h, --help - Show this help.
--workspace <slug> - Target workspace (uses credentials)start
Start working on an issue
Usage: linear issue start [issueId]
Description:
Start working on an issue
Options:
-h, --help - Show this help.
--workspace <slug> - Target workspace (uses credentials)
-A, --all-assignees - Show issues for all assignees
-U, --unassigned - Show only unassigned issues
-f, --from-ref <fromRef> - Git ref to create new branch from
-b, --branch <branch> - Custom branch name to use instead of the issue identifierview
View issue details (default) or open in browser/app
Usage: linear issue view [issueId]
Description:
View issue details (default) or open in browser/app
Options:
-h, --help - Show this help.
--workspace <slug> - Target workspace (uses credentials)
-w, --web - Open in web browser
-a, --app - Open in Linear.app
--no-comments - Exclude comments from the output
--show-resolved-threads - Include resolved comment threads in the output
--no-pager - Disable automatic paging for long output
-j, --json - Output issue data as JSON
--no-download - Keep remote URLs instead of downloading filesurl
Print the issue URL
Usage: linear issue url [issueId]
Description:
Print the issue URL
Options:
-h, --help - Show this help.
--workspace <slug> - Target workspace (uses credentials)describe
Print the issue title and Linear-issue trailer
Usage: linear issue describe [issueId]
Description:
Print the issue title and Linear-issue trailer
Options:
-h, --help - Show this help.
--workspace <slug> - Target workspace (uses credentials)
-r, --references, --ref - Use 'References' instead of 'Fixes' for the Linear issue linkcommits
Show all commits for a Linear issue (jj only)
Usage: linear issue commits [issueId]
Description:
Show all commits for a Linear issue (jj only)
Options:
-h, --help - Show this help.
--workspace <slug> - Target workspace (uses credentials)pull-request
Create a GitHub pull request with issue details
Usage: linear issue pull-request [issueId]
Description:
Create a GitHub pull request with issue details
Options:
-h, --help - Show this help.
--workspace <slug> - Target workspace (uses credentials)
--base <branch> - The branch into which you want your code merged
--draft - Create the pull request as a draft
-t, --title <title> - Optional title for the pull request (Linear issue ID will be prefixed)
--web - Open the pull request in the browser after creating it
--head <branch> - The branch that contains commits for your pull requestdelete
Delete an issue
Usage: linear issue delete [issueId]
Description:
Delete an issue
Options:
-h, --help - Show this help.
--workspace <slug> - Target workspace (uses credentials)
-y, --confirm - Skip confirmation prompt
--bulk <ids...> - Delete multiple issues by identifier (e.g., TC-123 TC-124)
--bulk-file <file> - Read issue identifiers from a file (one per line)
--bulk-stdin - Read issue identifiers from stdincreate
Create a linear issue
Usage: linear issue create
Description:
Create a linear issue
Options:
-h, --help - Show this help.
--workspace <slug> - Target workspace (uses credentials)
--start - Start the issue after creation
-a, --assignee <assignee> - Assign the issue to 'self' or someone (by username or name)
--due-date <dueDate> - Due date of the issue
--parent <parent> - Parent issue (if any) as a team_number code
-p, --priority <priority> - Priority of the issue (1-4, descending priority)
--estimate <estimate> - Points estimate of the issue
-d, --description <description> - Description of the issue
--description-file <path> - Read description from a file (preferred for markdown content)
-l, --label <label> - Issue label associated with the issue. May be repeated.
--team <team> - Team associated with the issue (if not your default team)
--project <project> - Name or slug ID of the project with the issue
-s, --state <state> - Workflow state for the issue (by name or type)
--milestone <milestone> - Name of the project milestone
--cycle <cycle> - Cycle name, number, or 'active'
--no-use-default-template - Do not use default template for the issue
--no-interactive - Disable interactive prompts
-t, --title <title> - Title of the issueupdate
Update a linear issue
Usage: linear issue update [issueId]
Description:
Update a linear issue
Options:
-h, --help - Show this help.
--workspace <slug> - Target workspace (uses credentials)
-a, --assignee <assignee> - Assign the issue to 'self' or someone (by username or name)
--due-date <dueDate> - Due date of the issue
--parent <parent> - Parent issue (if any) as a team_number code
-p, --priority <priority> - Priority of the issue (1-4, descending priority)
--estimate <estimate> - Points estimate of the issue
-d, --description <description> - Description of the issue
--description-file <path> - Read description from a file (preferred for markdown content)
-l, --label <label> - Issue label associated with the issue. May be repeated.
--team <team> - Team associated with the issue (if not your default team)
--project <project> - Name or slug ID of the project with the issue
-s, --state <state> - Workflow state for the issue (by name or type)
--milestone <milestone> - Name of the project milestone
--cycle <cycle> - Cycle name, number, or 'active'
-t, --title <title> - Title of the issuecomment
Manage issue comments
Usage: linear issue comment
Description:
Manage issue comments
Options:
-h, --help - Show this help.
--workspace <slug> - Target workspace (uses credentials)
Commands:
add [issueId] - Add a comment to an issue or reply to a comment
delete <commentId> - Delete a comment
update <commentId> - Update an existing comment
list [issueId] - List comments for an issuecomment subcommands
add
Usage: linear issue comment add [issueId]
Description:
Add a comment to an issue or reply to a comment
Options:
-h, --help - Show this help.
--workspace <slug> - Target workspace (uses credentials)
-b, --body <text> - Comment body text
--body-file <path> - Read comment body from a file (preferred for markdown content)
-p, --parent <id> - Parent comment ID for replies
-a, --attach <filepath> - Attach a file to the comment (can be used multiple times)delete
Usage: linear issue comment delete <commentId>
Description:
Delete a comment
Options:
-h, --help - Show this help.
--workspace <slug> - Target workspace (uses credentials)update
Usage: linear issue comment update <commentId>
Description:
Update an existing comment
Options:
-h, --help - Show this help.
--workspace <slug> - Target workspace (uses credentials)
-b, --body <text> - New comment body text
--body-file <path> - Read comment body from a file (preferred for markdown content)list
Usage: linear issue comment list [issueId]
Description:
List comments for an issue
Options:
-h, --help - Show this help.
--workspace <slug> - Target workspace (uses credentials)
-j, --json - Output as JSONattach
Attach a file to an issue
Usage: linear issue attach <issueId> <filepath>
Description:
Attach a file to an issue
Options:
-h, --help - Show this help.
--workspace <slug> - Target workspace (uses credentials)
-t, --title <title> - Custom title for the attachment
-c, --comment <body> - Add a comment body linked to the attachmentlink
Link a URL to an issue
Usage: linear issue link <urlOrIssueId> [url]
Description:
Link a URL to an issue
Options:
-h, --help - Show this help.
--workspace <slug> - Target workspace (uses credentials)
-t, --title <title> - Custom title for the link
Examples:
Link a URL to issue detected from branch linear issue link https://github.com/org/repo/pull/123
Link a URL to a specific issue linear issue link ENG-123 https://github.com/org/repo/pull/123
Link with a custom title linear issue link ENG-123 https://example.com --title "Design doc"relation
Manage issue relations (dependencies)
Usage: linear issue relation
Description:
Manage issue relations (dependencies)
Options:
-h, --help - Show this help.
--workspace <slug> - Target workspace (uses credentials)
Commands:
add <issueId> <relationType> <relatedIssueId> - Add a relation between two issues
delete <issueId> <relationType> <relatedIssueId> - Delete a relation between two issues
list [issueId] - List relations for an issuerelation subcommands
add
Usage: linear issue relation add <issueId> <relationType> <relatedIssueId>
Description:
Add a relation between two issues
Options:
-h, --help - Show this help.
--workspace <slug> - Target workspace (uses credentials)
Examples:
Mark issue as blocked by another linear issue relation add ENG-123 blocked-by ENG-100
Mark issue as blocking another linear issue relation add ENG-123 blocks ENG-456
Mark issues as related linear issue relation add ENG-123 related ENG-456
Mark issue as duplicate linear issue relation add ENG-123 duplicate ENG-100delete
Usage: linear issue relation delete <issueId> <relationType> <relatedIssueId>
Description:
Delete a relation between two issues
Options:
-h, --help - Show this help.
--workspace <slug> - Target workspace (uses credentials)list
Usage: linear issue relation list [issueId]
Description:
List relations for an issue
Options:
-h, --help - Show this help.
--workspace <slug> - Target workspace (uses credentials)agent-session
Manage agent sessions for an issue
Usage: linear issue agent-session
Description:
Manage agent sessions for an issue
Options:
-h, --help - Show this help.
--workspace <slug> - Target workspace (uses credentials)
Commands:
list [issueId] - List agent sessions for an issue
view, v <sessionId> - View agent session detailsagent-session subcommands
list
Usage: linear issue agent-session list [issueId]
Description:
List agent sessions for an issue
Options:
-h, --help - Show this help.
--workspace <slug> - Target workspace (uses credentials)
-j, --json - Output as JSON
--status <status> - Filter by session status (Values: "pending", "active", "complete", "awaitingInput",
"error", "stale")view
Usage: linear issue agent-session view <sessionId>
Description:
View agent session details
Options:
-h, --help - Show this help.
--workspace <slug> - Target workspace (uses credentials)
-j, --json - Output as JSONlabel
Manage Linear issue labels
Usage
Usage: linear label
Description:
Manage Linear issue labels
Options:
-h, --help - Show this help.
--workspace <slug> - Target workspace (uses credentials)
Commands:
list - List issue labels
create - Create a new issue label
delete <nameOrId> - Delete an issue labelSubcommands
list
List issue labels
Usage: linear label list
Description:
List issue labels
Options:
-h, --help - Show this help.
--team <teamKey> - Filter by team (e.g., TC). Shows team-specific labels only.
--workspace - Show only workspace-level labels (not team-specific)
--all - Show all labels (both workspace and team)
-j, --json - Output as JSONcreate
Create a new issue label
Usage: linear label create
Description:
Create a new issue label
Options:
-h, --help - Show this help.
--workspace <slug> - Target workspace (uses credentials)
-n, --name <name> - Label name (required)
-c, --color <color> - Color hex code (e.g., #EB5757)
-d, --description <description> - Label description
-t, --team <teamKey> - Team key for team-specific label (omit for workspace label)
-i, --interactive - Interactive mode (default if no flags provided)delete
Delete an issue label
Usage: linear label delete <nameOrId>
Description:
Delete an issue label
Options:
-h, --help - Show this help.
--workspace <slug> - Target workspace (uses credentials)
-t, --team <teamKey> - Team key to disambiguate labels with same name
-f, --force - Skip confirmation promptmilestone
Manage Linear project milestones
Usage
Usage: linear milestone
Description:
Manage Linear project milestones
Options:
-h, --help - Show this help.
--workspace <slug> - Target workspace (uses credentials)
Commands:
list - List milestones for a project
view, v <milestoneId> - View milestone details
create - Create a new project milestone
update <id> - Update an existing project milestone
delete <id> - Delete a project milestoneSubcommands
list
List milestones for a project
Usage: linear milestone list --project <projectId>
Description:
List milestones for a project
Options:
-h, --help - Show this help.
--workspace <slug> - Target workspace (uses credentials)
--project <projectId> - Project ID (required)view
View milestone details
Usage: linear milestone view <milestoneId>
Description:
View milestone details
Options:
-h, --help - Show this help.
--workspace <slug> - Target workspace (uses credentials)create
Create a new project milestone
Usage: linear milestone create --project <projectId> --name <name>
Description:
Create a new project milestone
Options:
-h, --help - Show this help.
--workspace <slug> - Target workspace (uses credentials)
--project <projectId> - Project ID (required)
--name <name> - Milestone name (required)
--description <description> - Milestone description
--target-date <date> - Target date (YYYY-MM-DD)update
Update an existing project milestone
Usage: linear milestone update <id>
Description:
Update an existing project milestone
Options:
-h, --help - Show this help.
--workspace <slug> - Target workspace (uses credentials)
--name <name> - Milestone name
--description <description> - Milestone description
--target-date <date> - Target date (YYYY-MM-DD)
--sort-order <value> - Sort order relative to other milestones
--project <projectId> - Move to a different projectdelete
Delete a project milestone
Usage: linear milestone delete <id>
Description:
Delete a project milestone
Options:
-h, --help - Show this help.
--workspace <slug> - Target workspace (uses credentials)
-f, --force - Skip confirmation promptOrganization Features
Detailed command reference for Linear CLI organization features: initiatives, labels, projects, and bulk operations.
Initiative Management
# List initiatives (default: active only)
linear initiative list
linear initiative list --all-statuses
linear initiative list --status planned
# View initiative details
linear initiative view <id-or-slug>
# Create initiative
linear initiative create --name "Q1 Goals" --status active
linear initiative create -i # Interactive mode
# Archive/unarchive
linear initiative archive <id>
linear initiative unarchive <id>
# Link projects to initiatives
linear initiative add-project <initiative> <project>
linear initiative remove-project <initiative> <project>Label Management
# List labels (shows ID, name, color, team)
linear label list
linear label list --team DEV
linear label list --workspace # Workspace-level only
# Create label
linear label create --name "Bug" --color "#EB5757"
linear label create --name "Feature" --team DEV
# Delete label (by ID or name)
linear label delete <id>
linear label delete "Bug" --team DEVProject Management
# List projects
linear project list
# View project
linear project view <id>
# Create project
linear project create --name "New Feature" --team DEV
linear project create --name "Q1 Work" --team DEV --initiative "Q1 Goals"
linear project create -i # Interactive modeBulk Operations
# Delete multiple issues
linear issue delete --bulk DEV-123 DEV-124 DEV-125
# Delete from file (one ID per line)
linear issue delete --bulk-file issues.txt
# Delete from stdin
echo -e "DEV-123\nDEV-124" | linear issue delete --bulk-stdin
# Archive multiple initiatives
linear initiative archive --bulk <id1> <id2>Adding Labels to Issues
# Add label to issue
linear issue update DEV-123 --label "Bug"
# Add multiple labels
linear issue update DEV-123 --label "Bug" --label "High Priority"project-update
Manage project status updates
Usage
Usage: linear project-update
Description:
Manage project status updates
Options:
-h, --help - Show this help.
--workspace <slug> - Target workspace (uses credentials)
Commands:
create, c <projectId> - Create a new status update for a project
list, l <projectId> - List status updates for a projectSubcommands
create
Create a new status update for a project
Usage: linear project-update create <projectId>
Description:
Create a new status update for a project
Options:
-h, --help - Show this help.
--workspace <slug> - Target workspace (uses credentials)
--body <body> - Update content (inline)
--body-file <path> - Read content from file
--health <health> - Project health status (onTrack, atRisk, offTrack)
-i, --interactive - Interactive mode with promptslist
List status updates for a project
Usage: linear project-update list <projectId>
Description:
List status updates for a project
Options:
-h, --help - Show this help.
--workspace <slug> - Target workspace (uses credentials)
--json - Output as JSON
--limit <limit> - Limit results (Default: 10)project
Manage Linear projects
Usage
Usage: linear project
Description:
Manage Linear projects
Options:
-h, --help - Show this help.
--workspace <slug> - Target workspace (uses credentials)
Commands:
list - List projects
view, v <projectId> - View project details
create - Create a new Linear project
update <projectId> - Update a Linear project
delete <projectId> - Delete (trash) a Linear projectSubcommands
list
List projects
Usage: linear project list
Description:
List projects
Options:
-h, --help - Show this help.
--workspace <slug> - Target workspace (uses credentials)
--team <team> - Filter by team key
--all-teams - Show projects from all teams
--status <status> - Filter by status name
-w, --web - Open in web browser
-a, --app - Open in Linear.app
-j, --json - Output as JSONview
View project details
Usage: linear project view <projectId>
Description:
View project details
Options:
-h, --help - Show this help.
--workspace <slug> - Target workspace (uses credentials)
-w, --web - Open in web browser
-a, --app - Open in Linear.appcreate
Create a new Linear project
Usage: linear project create
Description:
Create a new Linear project
Options:
-h, --help - Show this help.
--workspace <slug> - Target workspace (uses credentials)
-n, --name <name> - Project name (required)
-d, --description <description> - Project description
-t, --team <team> - Team key (required, can be repeated for multiple teams)
-l, --lead <lead> - Project lead (username, email, or @me)
-s, --status <status> - Project status (planned, started, paused, completed, canceled, backlog)
--start-date <startDate> - Start date (YYYY-MM-DD)
--target-date <targetDate> - Target completion date (YYYY-MM-DD)
--initiative <initiative> - Add to initiative immediately (ID, slug, or name)
-i, --interactive - Interactive mode (default if no flags provided)
-j, --json - Output created project as JSONupdate
Update a Linear project
Usage: linear project update <projectId>
Description:
Update a Linear project
Options:
-h, --help - Show this help.
--workspace <slug> - Target workspace (uses credentials)
-n, --name <name> - Project name
-d, --description <description> - Project description
-s, --status <status> - Status (planned, started, paused, completed, canceled, backlog)
-l, --lead <lead> - Project lead (username, email, or @me)
--start-date <startDate> - Start date (YYYY-MM-DD)
--target-date <targetDate> - Target date (YYYY-MM-DD)
-t, --team <team> - Team key (can be repeated for multiple teams)delete
Delete (trash) a Linear project
Usage: linear project delete <projectId>
Description:
Delete (trash) a Linear project
Options:
-h, --help - Show this help.
--workspace <slug> - Target workspace (uses credentials)
-f, --force - Skip confirmation promptschema
Print the GraphQL schema to stdout
Usage
Usage: linear schema
Description:
Print the GraphQL schema to stdout
Options:
-h, --help - Show this help.
--workspace <slug> - Target workspace (uses credentials)
--json - Output as JSON introspection result instead of SDL
-o, --output <file> - Write schema to file instead of stdoutteam
Manage Linear teams
Usage
Usage: linear team
Description:
Manage Linear teams
Options:
-h, --help - Show this help.
--workspace <slug> - Target workspace (uses credentials)
Commands:
create - Create a linear team
delete <teamKey> - Delete a Linear team
list - List teams
id - Print the configured team id
autolinks - Configure GitHub repository autolinks for Linear issues with this team prefix
members [teamKey] - List team membersSubcommands
create
Create a linear team
Usage: linear team create
Description:
Create a linear team
Options:
-h, --help - Show this help.
--workspace <slug> - Target workspace (uses credentials)
-n, --name <name> - Name of the team
-d, --description <description> - Description of the team
-k, --key <key> - Team key (if not provided, will be generated from name)
--private - Make the team private
--no-interactive - Disable interactive promptsdelete
Delete a Linear team
Usage: linear team delete <teamKey>
Description:
Delete a Linear team
Options:
-h, --help - Show this help.
--workspace <slug> - Target workspace (uses credentials)
--move-issues <targetTeam> - Move all issues to another team before deletion
-y, --force - Skip confirmation promptlist
List teams
Usage: linear team list
Description:
List teams
Options:
-h, --help - Show this help.
--workspace <slug> - Target workspace (uses credentials)
-w, --web - Open in web browser
-a, --app - Open in Linear.appid
Print the configured team id
Usage: linear team id
Description:
Print the configured team id
Options:
-h, --help - Show this help.
--workspace <slug> - Target workspace (uses credentials)autolinks
Configure GitHub repository autolinks for Linear issues with this team prefix
Usage: linear team autolinks
Description:
Configure GitHub repository autolinks for Linear issues with this team prefix
Options:
-h, --help - Show this help.
--workspace <slug> - Target workspace (uses credentials)members
List team members
Usage: linear team members [teamKey]
Description:
List team members
Options:
-h, --help - Show this help.
--workspace <slug> - Target workspace (uses credentials)
-a, --all - Include inactive members#!/usr/bin/env -S deno run --allow-run --allow-read --allow-write
/**
* Generates markdown documentation from `linear --help` output.
* Run periodically as the CLI evolves to keep skill references up to date.
*/
import { dirname, join } from "@std/path"
const SCRIPT_DIR = dirname(new URL(import.meta.url).pathname)
const SKILL_DIR = join(SCRIPT_DIR, "..")
const REFERENCES_DIR = join(SKILL_DIR, "references")
const SKILL_MD = join(SKILL_DIR, "SKILL.md")
const SKILL_TEMPLATE = join(SKILL_DIR, "SKILL.template.md")
// Files to preserve (not generated from help)
const PRESERVED_FILES = ["organization-features.md"]
// Commands to skip (shell completions, not useful for docs)
const SKIP_COMMANDS = ["completions"]
interface CommandInfo {
name: string
description: string
help: string
subcommands: CommandInfo[]
}
async function run(
cmd: string[],
): Promise<{ success: boolean; stdout: string; stderr: string }> {
const command = new Deno.Command(cmd[0], {
args: cmd.slice(1),
stdout: "piped",
stderr: "piped",
env: { NO_COLOR: "1" }, // Disable ANSI colors
})
const result = await command.output()
return {
success: result.success,
stdout: new TextDecoder().decode(result.stdout).trim(),
stderr: new TextDecoder().decode(result.stderr).trim(),
}
}
function stripAnsi(str: string): string {
// Remove ANSI escape codes (in case NO_COLOR doesn't work)
// deno-lint-ignore no-control-regex
return str.replace(/\x1b\[[0-9;]*m/g, "")
}
function stripVersion(str: string): string {
// Remove "Version: X.Y.Z" lines from help output to avoid churn on version bumps
return str.replace(/^Version:.*\n?/gm, "").replace(/\n+$/, "")
}
function parseCommands(helpText: string): string[] {
const commands: string[] = []
const lines = helpText.split("\n")
let inCommands = false
let foundAnyCommand = false
for (const line of lines) {
if (line.startsWith("Commands:")) {
inCommands = true
continue
}
if (inCommands) {
// Command lines look like: " command, alias - Description"
// or: " command <arg> - Description"
// Capture command name (stopping at comma or whitespace)
const match = line.match(/^\s{2}([a-z][-a-z]*)(?:,|\s)/)
if (match) {
commands.push(match[1])
foundAnyCommand = true
} else if (foundAnyCommand && line.trim() === "") {
// Empty line after we've found commands means end of section
break
}
// Skip empty lines before first command (common in help output)
}
}
return commands
}
async function getCommandHelp(cmdPath: string[]): Promise<string> {
const result = await run(["linear", ...cmdPath, "--help"])
if (!result.success) {
return result.stderr || "Command help not available"
}
return stripVersion(stripAnsi(result.stdout))
}
async function discoverCommand(cmdPath: string[]): Promise<CommandInfo> {
const help = await getCommandHelp(cmdPath)
const name = cmdPath.join(" ")
// Extract description from help text
const descMatch = help.match(/Description:\s*\n\s*(.+)/)
const description = descMatch ? descMatch[1].trim() : ""
// Find subcommands
const subcommandNames = parseCommands(help)
const subcommands: CommandInfo[] = []
for (const subcmd of subcommandNames) {
const subInfo = await discoverCommand([...cmdPath, subcmd])
subcommands.push(subInfo)
}
return { name, description, help, subcommands }
}
function formatCommandMarkdown(cmd: CommandInfo, depth = 0): string {
const lines: string[] = []
const cmdName = cmd.name.replace(/^linear /, "")
const heading = depth === 0 ? "#" : "##"
lines.push(`${heading} linear ${cmdName}`)
lines.push("")
lines.push("```")
lines.push(cmd.help)
lines.push("```")
lines.push("")
// Add subcommands as separate sections
for (const sub of cmd.subcommands) {
lines.push(formatCommandMarkdown(sub, depth + 1))
}
return lines.join("\n")
}
function generateCommandDoc(cmd: CommandInfo): string {
const lines: string[] = []
const cmdName = cmd.name.replace(/^linear /, "")
lines.push(`# ${cmdName}`)
lines.push("")
lines.push(`> ${cmd.description}`)
lines.push("")
lines.push("## Usage")
lines.push("")
lines.push("```")
lines.push(cmd.help)
lines.push("```")
// Add subcommand details
if (cmd.subcommands.length > 0) {
lines.push("")
lines.push("## Subcommands")
for (const sub of cmd.subcommands) {
const subName = sub.name.split(" ").pop()!
lines.push("")
lines.push(`### ${subName}`)
lines.push("")
if (sub.description) {
lines.push(`> ${sub.description}`)
lines.push("")
}
lines.push("```")
lines.push(sub.help)
lines.push("```")
// Handle 3-level deep commands (e.g., issue comment add)
if (sub.subcommands.length > 0) {
lines.push("")
lines.push(`#### ${subName} subcommands`)
for (const subsub of sub.subcommands) {
const subsubName = subsub.name.split(" ").pop()!
lines.push("")
lines.push(`##### ${subsubName}`)
lines.push("")
lines.push("```")
lines.push(subsub.help)
lines.push("```")
}
}
}
}
return lines.join("\n")
}
async function main() {
console.log("Generating Linear CLI documentation...")
// Check linear is available
const versionResult = await run(["linear", "--version"])
if (!versionResult.success) {
console.error("Error: linear CLI not found. Is it installed?")
Deno.exit(1)
}
console.log(`Linear CLI: ${stripAnsi(versionResult.stdout)}`)
// Auto-discover top-level commands from `linear --help`
console.log("Discovering commands...")
const topLevelHelp = await getCommandHelp([])
const topLevelCommands = parseCommands(topLevelHelp).filter(
(cmd) => !SKIP_COMMANDS.includes(cmd),
)
console.log(`Found ${topLevelCommands.length} top-level commands`)
const commands: CommandInfo[] = []
for (const cmd of topLevelCommands) {
console.log(` Discovering: ${cmd}`)
const info = await discoverCommand([cmd])
commands.push(info)
}
// Generate markdown files
console.log("Generating markdown files...")
// Ensure references directory exists
await Deno.mkdir(REFERENCES_DIR, { recursive: true })
// Get list of preserved files to keep
const preservedPaths = new Set(
PRESERVED_FILES.map((f) => join(REFERENCES_DIR, f)),
)
// Clean up old generated files (but preserve manual files)
for await (const entry of Deno.readDir(REFERENCES_DIR)) {
const filePath = join(REFERENCES_DIR, entry.name)
if (!preservedPaths.has(filePath) && entry.name.endsWith(".md")) {
await Deno.remove(filePath)
}
}
// Write command documentation
for (const cmd of commands) {
const filename = `${cmd.name.replace(/^linear /, "")}.md`
const filepath = join(REFERENCES_DIR, filename)
const content = generateCommandDoc(cmd)
await Deno.writeTextFile(filepath, content + "\n")
console.log(` Generated: ${filename}`)
}
// Generate index file
const indexContent = generateIndex(commands)
await Deno.writeTextFile(join(REFERENCES_DIR, "commands.md"), indexContent)
console.log(" Generated: commands.md")
// Generate SKILL.md from template
console.log("Generating SKILL.md from template...")
const skillContent = await generateSkillMd(commands)
await Deno.writeTextFile(SKILL_MD, skillContent)
console.log(" Generated: SKILL.md")
// Format all generated files
console.log("\nFormatting generated files...")
const fmtResult = await run([
"deno",
"fmt",
SKILL_DIR,
])
if (!fmtResult.success) {
console.error("Warning: Failed to format generated files")
console.error(fmtResult.stderr)
}
console.log(`\nDone! Generated ${commands.length + 2} files.`)
}
function generateIndex(commands: CommandInfo[]): string {
const lines: string[] = []
lines.push("# Linear CLI Command Reference")
lines.push("")
lines.push("## Commands")
lines.push("")
for (const cmd of commands) {
const cmdName = cmd.name.replace(/^linear /, "")
lines.push(`- [${cmdName}](./${cmdName}.md) - ${cmd.description}`)
}
lines.push("")
lines.push("## Quick Reference")
lines.push("")
lines.push("```bash")
lines.push("# Get help for any command")
lines.push("linear <command> --help")
lines.push("linear <command> <subcommand> --help")
lines.push("```")
return lines.join("\n") + "\n"
}
function flattenCommandPaths(cmd: CommandInfo): string[] {
const lines = [`linear ${cmd.name}`]
for (const sub of cmd.subcommands) {
lines.push(...flattenCommandPaths(sub))
}
return lines
}
function generateCommandsSection(commands: CommandInfo[]): string {
return commands
.map((cmd) => flattenCommandPaths(cmd).join("\n"))
.join("\n\n")
}
function generateReferenceToc(commands: CommandInfo[]): string {
const lines: string[] = []
for (const cmd of commands) {
lines.push(
`- [${cmd.name}](references/${cmd.name}.md) - ${cmd.description}`,
)
}
return lines.join("\n")
}
async function generateSkillMd(
commands: CommandInfo[],
): Promise<string> {
const template = await Deno.readTextFile(SKILL_TEMPLATE)
return template
.replace("{{COMMANDS}}", generateCommandsSection(commands))
.replace("{{REFERENCE_TOC}}", generateReferenceToc(commands))
}
main()
Linear CLI
A CLI to manage Linear issues from the command line, with git and jj integration.
Prerequisites
The linear command must be available on PATH. To check:
linear --versionIf not installed globally, you can run it without installing via npx:
npx @schpet/linear-cli --versionAll subsequent commands can be prefixed with npx @schpet/linear-cli in place of linear. Otherwise, follow the install instructions at:\ https://github.com/schpet/linear-cli?tab=readme-ov-file#install
Best Practices for Markdown Content
When working with issue descriptions or comment bodies that contain markdown, always prefer using file-based flags instead of passing content as command-line arguments:
- Use
--description-fileforissue createandissue updatecommands - Use
--body-fileforcomment addandcomment updatecommands
Why use file-based flags:
- Ensures proper formatting in the Linear web UI
- Avoids shell escaping issues with newlines and special characters
- Prevents literal
\nsequences from appearing in markdown - Makes it easier to work with multi-line content
Example workflow:
# Write markdown to a temporary file
cat > /tmp/description.md <<'EOF'
## Summary
- First item
- Second item
## Details
This is a detailed description with proper formatting.
EOF
# Create issue using the file
linear issue create --title "My Issue" --description-file /tmp/description.md
# Or for comments
linear issue comment add ENG-123 --body-file /tmp/comment.mdOnly use inline flags (--description, --body) for simple, single-line content.
Available Commands
Compact command list, generated from linear --help:
{{COMMANDS}}Reference Documentation
{{REFERENCE_TOC}}
For curated examples of organization features (initiatives, labels, projects, bulk operations), see organization-features.
Discovering Options
To see available subcommands and flags, run --help on any command:
linear --help
linear issue --help
linear issue list --help
linear issue create --helpEach command has detailed help output describing all available flags and options.
Some commands have required flags that aren't obvious. Notable examples:
issue listrequires a sort order — provide it via--sort(valid values:manual,priority), theissue_sortconfig option, or theLINEAR_ISSUE_SORTenv var. Also requires--team <key>unless the team can be inferred from the directory — if unknown, runlinear team listfirst.--no-pageris only supported onissue list— passing it to other commands likeproject listwill error.
Using the Linear GraphQL API Directly
Prefer the CLI for all supported operations. The api command should only be used as a fallback for queries not covered by the CLI.
Check the schema for available types and fields
Write the schema to a tempfile, then search it:
linear schema -o "${TMPDIR:-/tmp}/linear-schema.graphql"
grep -i "cycle" "${TMPDIR:-/tmp}/linear-schema.graphql"
grep -A 30 "^type Issue " "${TMPDIR:-/tmp}/linear-schema.graphql"Make a GraphQL request
Important: GraphQL queries containing non-null type markers (e.g. String followed by an exclamation mark) must be passed via heredoc stdin to avoid escaping issues. Simple queries without those markers can be passed inline.
# Simple query (no type markers, so inline is fine)
linear api '{ viewer { id name email } }'
# Query with variables — use heredoc to avoid escaping issues
linear api --variable teamId=abc123 <<'GRAPHQL'
query($teamId: String!) { team(id: $teamId) { name } }
GRAPHQL
# Search issues by text
linear api --variable term=onboarding <<'GRAPHQL'
query($term: String!) { searchIssues(term: $term, first: 20) { nodes { identifier title state { name } } } }
GRAPHQL
# Numeric and boolean variables
linear api --variable first=5 <<'GRAPHQL'
query($first: Int!) { issues(first: $first) { nodes { title } } }
GRAPHQL
# Complex variables via JSON
linear api --variables-json '{"filter": {"state": {"name": {"eq": "In Progress"}}}}' <<'GRAPHQL'
query($filter: IssueFilter!) { issues(filter: $filter) { nodes { title } } }
GRAPHQL
# Pipe to jq for filtering
linear api '{ issues(first: 5) { nodes { identifier title } } }' | jq '.data.issues.nodes[].title'Advanced: Using curl directly
For cases where you need full HTTP control, use linear auth token:
curl -s -X POST https://api.linear.app/graphql \
-H "Content-Type: application/json" \
-H "Authorization: $(linear auth token)" \
-d '{"query": "{ viewer { id } }"}'Related skills
FAQ
What does linear-cli do?
Manage Linear issues from the command line using the linear cli. This skill allows automating linear management.
When should I invoke linear-cli?
Manage Linear issues from the command line using the linear cli. This skill allows automating linear management.
Where is the source documentation?
Ground claims in SKILL.md excerpts and linked reference files from the cached docs.
Is Linear Cli safe to install?
skills.sh reports 3 of 3 security scanners passed. Review the Security Audits panel on this page before installing in production.