
Linear
- 4 installs
- 134 repo stars
- Updated August 4, 2026
- openhands/extensions
This is a copy of linear by openhands - installs and ranking accrue to the original listing.
Helps with ai & agent building tasks.
About
linear is a Claude Code skill for ai & agent building. It helps solo builders move faster with AI-assisted development.
- linear
- AI & Agent Building
- AI-coding skill
Linear by the numbers
- 4 all-time installs (skills.sh)
- Data as of Aug 5, 2026 (Skillselion catalog sync)
npx skills add https://github.com/openhands/extensions --skill linearAdd your badge
Show developers this skill is listed on Skillselion. Paste this into your README.
| Installs | 4 |
|---|---|
| repo stars | ★ 134 |
| Last updated | August 4, 2026 |
| Repository | openhands/extensions ↗ |
What it does
Helps with ai & agent building tasks.
Files
Linear
<IMPORTANT> Before performing any Linear operations, check if the required environment variable is set:
[ -n "$LINEAR_API_KEY" ] && echo "LINEAR_API_KEY is set" || echo "LINEAR_API_KEY is NOT set"If LINEAR_API_KEY is missing, ask the user to provide it before proceeding. </IMPORTANT>
Understanding Linear Identifiers
Linear uses two types of identifiers for issues:
- Human-readable identifier (e.g.,
ALL-1234): Displayed to users, used in search queries. This is the team key + number. - UUID (e.g.,
a1b2c3d4-e5f6-7890-abcd-ef1234567890): Required for all mutations (update, comment, etc.). Returned asidin query results.
Important workflow: When working with issues, you must: 1. Search or query using the human-readable identifier 2. Extract the id (UUID) from the query result 3. Use the UUID in any mutation operations
Authentication
All Linear API requests use GraphQL with the API key in the Authorization header:
curl -s -X POST https://api.linear.app/graphql \
-H "Content-Type: application/json" \
-H "Authorization: $LINEAR_API_KEY" \
-d '{"query": "YOUR_GRAPHQL_QUERY"}'Common Queries
Get Assigned Issues (Open)
curl -s -X POST https://api.linear.app/graphql \
-H "Content-Type: application/json" \
-H "Authorization: $LINEAR_API_KEY" \
-d '{
"query": "query { viewer { assignedIssues(first: 50, filter: { state: { type: { nin: [\"completed\", \"canceled\"] } } }) { nodes { id identifier title priority priorityLabel state { name type } description createdAt updatedAt } } } }"
}' | jq '.data.viewer.assignedIssues.nodes'Get Issues by Priority
Priority values: 0 = No priority, 1 = Urgent, 2 = High, 3 = Medium, 4 = Low
curl -s -X POST https://api.linear.app/graphql \
-H "Content-Type: application/json" \
-H "Authorization: $LINEAR_API_KEY" \
-d '{
"query": "query { viewer { assignedIssues(first: 50, filter: { priority: { lte: 2 }, state: { type: { nin: [\"completed\", \"canceled\"] } } }) { nodes { id identifier title priority priorityLabel state { name } } } } }"
}' | jq '.data.viewer.assignedIssues.nodes'Get Issue Details
curl -s -X POST https://api.linear.app/graphql \
-H "Content-Type: application/json" \
-H "Authorization: $LINEAR_API_KEY" \
-d '{
"query": "query { issue(id: \"ISSUE_UUID\") { id identifier title description state { name } priority assignee { name email } labels { nodes { name } } comments { nodes { body createdAt user { name } } } } }"
}' | jq '.data.issue'Search Issues by Identifier
curl -s -X POST https://api.linear.app/graphql \
-H "Content-Type: application/json" \
-H "Authorization: $LINEAR_API_KEY" \
-d '{
"query": "query { issueSearch(query: \"ALL-1234\", first: 5) { nodes { id identifier title state { name } } } }"
}' | jq '.data.issueSearch.nodes'Common Mutations
Update Issue State
First, get available workflow states:
curl -s -X POST https://api.linear.app/graphql \
-H "Content-Type: application/json" \
-H "Authorization: $LINEAR_API_KEY" \
-d '{
"query": "query { workflowStates { nodes { id name type } } }"
}' | jq '.data.workflowStates.nodes'Then update the issue:
curl -s -X POST https://api.linear.app/graphql \
-H "Content-Type: application/json" \
-H "Authorization: $LINEAR_API_KEY" \
-d '{
"query": "mutation { issueUpdate(id: \"ISSUE_UUID\", input: { stateId: \"STATE_UUID\" }) { success issue { identifier state { name } } } }"
}' | jq '.data.issueUpdate'Add Comment to Issue
curl -s -X POST https://api.linear.app/graphql \
-H "Content-Type: application/json" \
-H "Authorization: $LINEAR_API_KEY" \
-d '{
"query": "mutation { commentCreate(input: { issueId: \"ISSUE_UUID\", body: \"Your comment here\" }) { success comment { id body } } }"
}' | jq '.data.commentCreate'Create New Issue
curl -s -X POST https://api.linear.app/graphql \
-H "Content-Type: application/json" \
-H "Authorization: $LINEAR_API_KEY" \
-d '{
"query": "mutation { issueCreate(input: { teamId: \"TEAM_UUID\", title: \"Issue Title\", description: \"Issue description\", priority: 2 }) { success issue { identifier title url } } }"
}' | jq '.data.issueCreate'End-to-End Workflow: Move Issue to "In Progress"
This example shows the complete flow to change an issue's state using its human-readable identifier:
Step 1: Search for the issue to get its UUID
# Search for issue ALL-1234 and extract its UUID
curl -s -X POST https://api.linear.app/graphql \
-H "Content-Type: application/json" \
-H "Authorization: $LINEAR_API_KEY" \
-d '{
"query": "query { issueSearch(query: \"ALL-1234\", first: 1) { nodes { id identifier title state { name } } } }"
}' | jq '.data.issueSearch.nodes[0]'
# Save the "id" value (UUID) from the responseStep 2: Get available workflow states
# List all workflow states to find the "In Progress" state UUID
curl -s -X POST https://api.linear.app/graphql \
-H "Content-Type: application/json" \
-H "Authorization: $LINEAR_API_KEY" \
-d '{
"query": "query { workflowStates { nodes { id name type } } }"
}' | jq '.data.workflowStates.nodes[] | select(.name == "In Progress")'
# Save the "id" value of the desired stateStep 3: Update the issue state
# Use the issue UUID and state UUID from previous steps
curl -s -X POST https://api.linear.app/graphql \
-H "Content-Type: application/json" \
-H "Authorization: $LINEAR_API_KEY" \
-d '{
"query": "mutation { issueUpdate(id: \"ISSUE_UUID_FROM_STEP_1\", input: { stateId: \"STATE_UUID_FROM_STEP_2\" }) { success issue { identifier state { name } } } }"
}' | jq '.data.issueUpdate'Get Team Information
curl -s -X POST https://api.linear.app/graphql \
-H "Content-Type: application/json" \
-H "Authorization: $LINEAR_API_KEY" \
-d '{
"query": "query { teams { nodes { id name key } } }"
}' | jq '.data.teams.nodes'Priority Levels
| Priority | Label | Recommended Action |
|---|---|---|
| 1 | Urgent | Work on immediately |
| 2 | High | Work on first |
| 3 | Medium | Normal priority |
| 4 | Low | When time permits |
| 0 | None | Backlog |
State Types
backlog- Not yet startedunstarted- Todostarted- In Progresscompleted- Donecanceled- Won't do
Documentation
.plugin.plugin{
"name": "linear",
"version": "1.0.0",
"description": "Interact with Linear project management - query issues, update status, create tickets using the Linear GraphQL API.",
"author": {
"name": "OpenHands",
"email": "contact@all-hands.dev"
},
"homepage": "https://github.com/OpenHands/extensions",
"repository": "https://github.com/OpenHands/extensions",
"license": "MIT",
"keywords": [
"linear",
"ticket",
"issue",
"project-management",
"graphql"
]
}
Linear
Interact with Linear project management - query issues, update status, create tickets, and manage workflows using the Linear GraphQL API. Use when working with Linear tickets, sprints, or project tracking.
Triggers
This skill is activated by the following keywords:
linearticketissue tracking
Details
You need access to an environment variable, LINEAR_API_KEY, which allows you to interact with the Linear API.
<IMPORTANT> You can use curl with the LINEAR_API_KEY to interact with Linear's GraphQL API. ALWAYS use the Linear API for operations instead of a web browser. Before performing any Linear operations, verify the API key is available by checking the environment variable. </IMPORTANT>
Features
- Query Issues: Get assigned issues, filter by priority, search by identifier
- Update State: Change issue status with workflow state lookup
- Comments: Add comments to issues
- Create Issues: Create new tickets with proper team assignment
- Reference: Priority levels, state types, API documentation links
Important Concepts
Linear Identifiers
Linear uses two types of identifiers for issues:
- Human-readable identifier (e.g.,
ALL-1234): Displayed to users, used in search queries - UUID (e.g.,
a1b2c3d4-e5f6-7890-abcd-ef1234567890): Required for all mutations
Important workflow: When updating issues: 1. Search using the human-readable identifier 2. Extract the UUID from the query result 3. Use the UUID in mutation operations
Priority Levels
| Priority | Label | Description |
|---|---|---|
| 1 | Urgent | Work on immediately |
| 2 | High | Work on first |
| 3 | Medium | Normal priority |
| 4 | Low | When time permits |
| 0 | None | Backlog |