[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M76BAJGDAPQWFNWCM6A4PC0R":3,"skill-same:01M76BAJGDAPQWFNWCM6A4PC0R":59},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":15,"categories":16,"keywords":17,"publishedAt":18,"linkOnly":19,"markdownContent":20,"markdownBody":21,"frontMatter":22,"refName":39,"commitSha":40,"skillDirectory":41,"forksCount":13,"repositoryHtmlUrl":42,"repositoryHomepageUrl":6,"ownerHtmlUrl":43,"ownerBlogUrl":6,"ownerDescription":6,"updatedAt":44,"install":45,"resources":58},"01M76BAJGDAPQWFNWCM6A4PC0R","linear",null,"Linear: manage issues, projects, teams via GraphQL + curl.","LyrikNilpferd71\u002FHermes-Backup","LyrikNilpferd71","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F187173780?v=4","01M727S8GPB77P0S9ECRRMZT58","01M727S8HF63B0MD53F496MK1V",0,"MIT","https:\u002F\u002Fgithub.com\u002FLyrikNilpferd71\u002FHermes-Backup\u002Fblob\u002Fmain\u002Fsnapshots\u002F2026-11-08T13-00-51+0100\u002Fskills\u002Fproductivity\u002Flinear\u002FSKILL.md",[],[],"2026-11-12 13:55:43",false,"---\nname: linear\ndescription: \"Linear: manage issues, projects, teams via GraphQL + curl.\"\nversion: 1.0.0\nauthor: Hermes Agent\nlicense: MIT\nprerequisites:\n  env_vars: [LINEAR_API_KEY]\n  commands: [curl]\nmetadata:\n  hermes:\n    tags: [Linear, Project Management, Issues, GraphQL, API, Productivity]\n---\n\n# Linear — Issue & Project Management\n\nManage Linear issues, projects, and teams directly via the GraphQL API using `curl`. No MCP server, no OAuth flow, no extra dependencies.\n\n## Setup\n\n1. Get a personal API key from **Linear Settings > API > Personal API keys**\n2. Set `LINEAR_API_KEY` in your environment (via `hermes setup` or your env config)\n\n## API Basics\n\n- **Endpoint:** `https:\u002F\u002Fapi.linear.app\u002Fgraphql` (POST)\n- **Auth header:** `Authorization: $LINEAR_API_KEY` (no \"Bearer\" prefix for API keys)\n- **All requests are POST** with `Content-Type: application\u002Fjson`\n- **Both UUIDs and short identifiers** (e.g., `ENG-123`) work for `issue(id:)`\n\nBase curl pattern:\n```bash\ncurl -s -X POST https:\u002F\u002Fapi.linear.app\u002Fgraphql \\\n  -H \"Authorization: $LINEAR_API_KEY\" \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -d '{\"query\": \"{ viewer { id name } }\"}' | python3 -m json.tool\n```\n\n## Workflow States\n\nLinear uses `WorkflowState` objects with a `type` field. **6 state types:**\n\n| Type | Description |\n|------|-------------|\n| `triage` | Incoming issues needing review |\n| `backlog` | Acknowledged but not yet planned |\n| `unstarted` | Planned\u002Fready but not started |\n| `started` | Actively being worked on |\n| `completed` | Done |\n| `canceled` | Won't do |\n\nEach team has its own named states (e.g., \"In Progress\" is type `started`). To change an issue's status, you need the `stateId` (UUID) of the target state — query workflow states first.\n\n**Priority values:** 0 = None, 1 = Urgent, 2 = High, 3 = Medium, 4 = Low\n\n## Common Queries\n\n### Get current user\n```bash\ncurl -s -X POST https:\u002F\u002Fapi.linear.app\u002Fgraphql \\\n  -H \"Authorization: $LINEAR_API_KEY\" \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -d '{\"query\": \"{ viewer { id name email } }\"}' | python3 -m json.tool\n```\n\n### List teams\n```bash\ncurl -s -X POST https:\u002F\u002Fapi.linear.app\u002Fgraphql \\\n  -H \"Authorization: $LINEAR_API_KEY\" \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -d '{\"query\": \"{ teams { nodes { id name key } } }\"}' | python3 -m json.tool\n```\n\n### List workflow states for a team\n```bash\ncurl -s -X POST https:\u002F\u002Fapi.linear.app\u002Fgraphql \\\n  -H \"Authorization: $LINEAR_API_KEY\" \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -d '{\"query\": \"{ workflowStates(filter: { team: { key: { eq: \\\"ENG\\\" } } }) { nodes { id name type } } }\"}' | python3 -m json.tool\n```\n\n### List issues (first 20)\n```bash\ncurl -s -X POST https:\u002F\u002Fapi.linear.app\u002Fgraphql \\\n  -H \"Authorization: $LINEAR_API_KEY\" \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -d '{\"query\": \"{ issues(first: 20) { nodes { identifier title priority state { name type } assignee { name } team { key } url } pageInfo { hasNextPage endCursor } } }\"}' | python3 -m json.tool\n```\n\n### List my assigned issues\n```bash\ncurl -s -X POST https:\u002F\u002Fapi.linear.app\u002Fgraphql \\\n  -H \"Authorization: $LINEAR_API_KEY\" \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -d '{\"query\": \"{ viewer { assignedIssues(first: 25) { nodes { identifier title state { name type } priority url } } } }\"}' | python3 -m json.tool\n```\n\n### Get a single issue (by identifier like ENG-123)\n```bash\ncurl -s -X POST https:\u002F\u002Fapi.linear.app\u002Fgraphql \\\n  -H \"Authorization: $LINEAR_API_KEY\" \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -d '{\"query\": \"{ issue(id: \\\"ENG-123\\\") { id identifier title description priority state { id name type } assignee { id name } team { key } project { name } labels { nodes { name } } comments { nodes { body user { name } createdAt } } url } }\"}' | python3 -m json.tool\n```\n\n### Search issues by text\n```bash\ncurl -s -X POST https:\u002F\u002Fapi.linear.app\u002Fgraphql \\\n  -H \"Authorization: $LINEAR_API_KEY\" \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -d '{\"query\": \"{ issueSearch(query: \\\"bug login\\\", first: 10) { nodes { identifier title state { name } assignee { name } url } } }\"}' | python3 -m json.tool\n```\n\n### Filter issues by state type\n```bash\ncurl -s -X POST https:\u002F\u002Fapi.linear.app\u002Fgraphql \\\n  -H \"Authorization: $LINEAR_API_KEY\" \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -d '{\"query\": \"{ issues(filter: { state: { type: { in: [\\\"started\\\"] } } }, first: 20) { nodes { identifier title state { name } assignee { name } } } }\"}' | python3 -m json.tool\n```\n\n### Filter by team and assignee\n```bash\ncurl -s -X POST https:\u002F\u002Fapi.linear.app\u002Fgraphql \\\n  -H \"Authorization: $LINEAR_API_KEY\" \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -d '{\"query\": \"{ issues(filter: { team: { key: { eq: \\\"ENG\\\" } }, assignee: { email: { eq: \\\"user@example.com\\\" } } }, first: 20) { nodes { identifier title state { name } priority } } }\"}' | python3 -m json.tool\n```\n\n### List projects\n```bash\ncurl -s -X POST https:\u002F\u002Fapi.linear.app\u002Fgraphql \\\n  -H \"Authorization: $LINEAR_API_KEY\" \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -d '{\"query\": \"{ projects(first: 20) { nodes { id name description progress lead { name } teams { nodes { key } } url } } }\"}' | python3 -m json.tool\n```\n\n### List team members\n```bash\ncurl -s -X POST https:\u002F\u002Fapi.linear.app\u002Fgraphql \\\n  -H \"Authorization: $LINEAR_API_KEY\" \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -d '{\"query\": \"{ users { nodes { id name email active } } }\"}' | python3 -m json.tool\n```\n\n### List labels\n```bash\ncurl -s -X POST https:\u002F\u002Fapi.linear.app\u002Fgraphql \\\n  -H \"Authorization: $LINEAR_API_KEY\" \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -d '{\"query\": \"{ issueLabels { nodes { id name color } } }\"}' | python3 -m json.tool\n```\n\n## Common Mutations\n\n### Create an issue\n```bash\ncurl -s -X POST https:\u002F\u002Fapi.linear.app\u002Fgraphql \\\n  -H \"Authorization: $LINEAR_API_KEY\" \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -d '{\n    \"query\": \"mutation($input: IssueCreateInput!) { issueCreate(input: $input) { success issue { id identifier title url } } }\",\n    \"variables\": {\n      \"input\": {\n        \"teamId\": \"TEAM_UUID\",\n        \"title\": \"Fix login bug\",\n        \"description\": \"Users cannot login with SSO\",\n        \"priority\": 2\n      }\n    }\n  }' | python3 -m json.tool\n```\n\n### Update issue status\nFirst get the target state UUID from the workflow states query above, then:\n```bash\ncurl -s -X POST https:\u002F\u002Fapi.linear.app\u002Fgraphql \\\n  -H \"Authorization: $LINEAR_API_KEY\" \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -d '{\"query\": \"mutation { issueUpdate(id: \\\"ENG-123\\\", input: { stateId: \\\"STATE_UUID\\\" }) { success issue { identifier state { name type } } } }\"}' | python3 -m json.tool\n```\n\n### Assign an issue\n```bash\ncurl -s -X POST https:\u002F\u002Fapi.linear.app\u002Fgraphql \\\n  -H \"Authorization: $LINEAR_API_KEY\" \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -d '{\"query\": \"mutation { issueUpdate(id: \\\"ENG-123\\\", input: { assigneeId: \\\"USER_UUID\\\" }) { success issue { identifier assignee { name } } } }\"}' | python3 -m json.tool\n```\n\n### Set priority\n```bash\ncurl -s -X POST https:\u002F\u002Fapi.linear.app\u002Fgraphql \\\n  -H \"Authorization: $LINEAR_API_KEY\" \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -d '{\"query\": \"mutation { issueUpdate(id: \\\"ENG-123\\\", input: { priority: 1 }) { success issue { identifier priority } } }\"}' | python3 -m json.tool\n```\n\n### Add a comment\n```bash\ncurl -s -X POST https:\u002F\u002Fapi.linear.app\u002Fgraphql \\\n  -H \"Authorization: $LINEAR_API_KEY\" \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -d '{\"query\": \"mutation { commentCreate(input: { issueId: \\\"ISSUE_UUID\\\", body: \\\"Investigated. Root cause is X.\\\" }) { success comment { id body } } }\"}' | python3 -m json.tool\n```\n\n### Set due date\n```bash\ncurl -s -X POST https:\u002F\u002Fapi.linear.app\u002Fgraphql \\\n  -H \"Authorization: $LINEAR_API_KEY\" \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -d '{\"query\": \"mutation { issueUpdate(id: \\\"ENG-123\\\", input: { dueDate: \\\"2026-04-01\\\" }) { success issue { identifier dueDate } } }\"}' | python3 -m json.tool\n```\n\n### Add labels to an issue\n```bash\ncurl -s -X POST https:\u002F\u002Fapi.linear.app\u002Fgraphql \\\n  -H \"Authorization: $LINEAR_API_KEY\" \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -d '{\"query\": \"mutation { issueUpdate(id: \\\"ENG-123\\\", input: { labelIds: [\\\"LABEL_UUID_1\\\", \\\"LABEL_UUID_2\\\"] }) { success issue { identifier labels { nodes { name } } } } }\"}' | python3 -m json.tool\n```\n\n### Add issue to a project\n```bash\ncurl -s -X POST https:\u002F\u002Fapi.linear.app\u002Fgraphql \\\n  -H \"Authorization: $LINEAR_API_KEY\" \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -d '{\"query\": \"mutation { issueUpdate(id: \\\"ENG-123\\\", input: { projectId: \\\"PROJECT_UUID\\\" }) { success issue { identifier project { name } } } }\"}' | python3 -m json.tool\n```\n\n### Create a project\n```bash\ncurl -s -X POST https:\u002F\u002Fapi.linear.app\u002Fgraphql \\\n  -H \"Authorization: $LINEAR_API_KEY\" \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -d '{\n    \"query\": \"mutation($input: ProjectCreateInput!) { projectCreate(input: $input) { success project { id name url } } }\",\n    \"variables\": {\n      \"input\": {\n        \"name\": \"Q2 Auth Overhaul\",\n        \"description\": \"Replace legacy auth with OAuth2 and PKCE\",\n        \"teamIds\": [\"TEAM_UUID\"]\n      }\n    }\n  }' | python3 -m json.tool\n```\n\n## Pagination\n\nLinear uses Relay-style cursor pagination:\n\n```bash\n# First page\ncurl -s -X POST https:\u002F\u002Fapi.linear.app\u002Fgraphql \\\n  -H \"Authorization: $LINEAR_API_KEY\" \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -d '{\"query\": \"{ issues(first: 20) { nodes { identifier title } pageInfo { hasNextPage endCursor } } }\"}' | python3 -m json.tool\n\n# Next page — use endCursor from previous response\ncurl -s -X POST https:\u002F\u002Fapi.linear.app\u002Fgraphql \\\n  -H \"Authorization: $LINEAR_API_KEY\" \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -d '{\"query\": \"{ issues(first: 20, after: \\\"CURSOR_FROM_PREVIOUS\\\") { nodes { identifier title } pageInfo { hasNextPage endCursor } } }\"}' | python3 -m json.tool\n```\n\nDefault page size: 50. Max: 250. Always use `first: N` to limit results.\n\n## Filtering Reference\n\nComparators: `eq`, `neq`, `in`, `nin`, `lt`, `lte`, `gt`, `gte`, `contains`, `startsWith`, `containsIgnoreCase`\n\nCombine filters with `or: [...]` for OR logic (default is AND within a filter object).\n\n## Typical Workflow\n\n1. **Query teams** to get team IDs and keys\n2. **Query workflow states** for target team to get state UUIDs\n3. **List or search issues** to find what needs work\n4. **Create issues** with team ID, title, description, priority\n5. **Update status** by setting `stateId` to the target workflow state\n6. **Add comments** to track progress\n7. **Mark complete** by setting `stateId` to the team's \"completed\" type state\n\n## Rate Limits\n\n- 5,000 requests\u002Fhour per API key\n- 3,000,000 complexity points\u002Fhour\n- Use `first: N` to limit results and reduce complexity cost\n- Monitor `X-RateLimit-Requests-Remaining` response header\n\n## Important Notes\n\n- Always use `terminal` tool with `curl` for API calls — do NOT use `web_extract` or `browser`\n- Always check the `errors` array in GraphQL responses — HTTP 200 can still contain errors\n- If `stateId` is omitted when creating issues, Linear defaults to the first backlog state\n- The `description` field supports Markdown\n- Use `python3 -m json.tool` or `jq` to format JSON responses for readability\n","# Linear — Issue & Project Management\n\nManage Linear issues, projects, and teams directly via the GraphQL API using `curl`. No MCP server, no OAuth flow, no extra dependencies.\n\n## Setup\n\n1. Get a personal API key from **Linear Settings > API > Personal API keys**\n2. Set `LINEAR_API_KEY` in your environment (via `hermes setup` or your env config)\n\n## API Basics\n\n- **Endpoint:** `https:\u002F\u002Fapi.linear.app\u002Fgraphql` (POST)\n- **Auth header:** `Authorization: $LINEAR_API_KEY` (no \"Bearer\" prefix for API keys)\n- **All requests are POST** with `Content-Type: application\u002Fjson`\n- **Both UUIDs and short identifiers** (e.g., `ENG-123`) work for `issue(id:)`\n\nBase curl pattern:\n```bash\ncurl -s -X POST https:\u002F\u002Fapi.linear.app\u002Fgraphql \\\n  -H \"Authorization: $LINEAR_API_KEY\" \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -d '{\"query\": \"{ viewer { id name } }\"}' | python3 -m json.tool\n```\n\n## Workflow States\n\nLinear uses `WorkflowState` objects with a `type` field. **6 state types:**\n\n| Type | Description |\n|------|-------------|\n| `triage` | Incoming issues needing review |\n| `backlog` | Acknowledged but not yet planned |\n| `unstarted` | Planned\u002Fready but not started |\n| `started` | Actively being worked on |\n| `completed` | Done |\n| `canceled` | Won't do |\n\nEach team has its own named states (e.g., \"In Progress\" is type `started`). To change an issue's status, you need the `stateId` (UUID) of the target state — query workflow states first.\n\n**Priority values:** 0 = None, 1 = Urgent, 2 = High, 3 = Medium, 4 = Low\n\n## Common Queries\n\n### Get current user\n```bash\ncurl -s -X POST https:\u002F\u002Fapi.linear.app\u002Fgraphql \\\n  -H \"Authorization: $LINEAR_API_KEY\" \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -d '{\"query\": \"{ viewer { id name email } }\"}' | python3 -m json.tool\n```\n\n### List teams\n```bash\ncurl -s -X POST https:\u002F\u002Fapi.linear.app\u002Fgraphql \\\n  -H \"Authorization: $LINEAR_API_KEY\" \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -d '{\"query\": \"{ teams { nodes { id name key } } }\"}' | python3 -m json.tool\n```\n\n### List workflow states for a team\n```bash\ncurl -s -X POST https:\u002F\u002Fapi.linear.app\u002Fgraphql \\\n  -H \"Authorization: $LINEAR_API_KEY\" \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -d '{\"query\": \"{ workflowStates(filter: { team: { key: { eq: \\\"ENG\\\" } } }) { nodes { id name type } } }\"}' | python3 -m json.tool\n```\n\n### List issues (first 20)\n```bash\ncurl -s -X POST https:\u002F\u002Fapi.linear.app\u002Fgraphql \\\n  -H \"Authorization: $LINEAR_API_KEY\" \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -d '{\"query\": \"{ issues(first: 20) { nodes { identifier title priority state { name type } assignee { name } team { key } url } pageInfo { hasNextPage endCursor } } }\"}' | python3 -m json.tool\n```\n\n### List my assigned issues\n```bash\ncurl -s -X POST https:\u002F\u002Fapi.linear.app\u002Fgraphql \\\n  -H \"Authorization: $LINEAR_API_KEY\" \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -d '{\"query\": \"{ viewer { assignedIssues(first: 25) { nodes { identifier title state { name type } priority url } } } }\"}' | python3 -m json.tool\n```\n\n### Get a single issue (by identifier like ENG-123)\n```bash\ncurl -s -X POST https:\u002F\u002Fapi.linear.app\u002Fgraphql \\\n  -H \"Authorization: $LINEAR_API_KEY\" \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -d '{\"query\": \"{ issue(id: \\\"ENG-123\\\") { id identifier title description priority state { id name type } assignee { id name } team { key } project { name } labels { nodes { name } } comments { nodes { body user { name } createdAt } } url } }\"}' | python3 -m json.tool\n```\n\n### Search issues by text\n```bash\ncurl -s -X POST https:\u002F\u002Fapi.linear.app\u002Fgraphql \\\n  -H \"Authorization: $LINEAR_API_KEY\" \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -d '{\"query\": \"{ issueSearch(query: \\\"bug login\\\", first: 10) { nodes { identifier title state { name } assignee { name } url } } }\"}' | python3 -m json.tool\n```\n\n### Filter issues by state type\n```bash\ncurl -s -X POST https:\u002F\u002Fapi.linear.app\u002Fgraphql \\\n  -H \"Authorization: $LINEAR_API_KEY\" \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -d '{\"query\": \"{ issues(filter: { state: { type: { in: [\\\"started\\\"] } } }, first: 20) { nodes { identifier title state { name } assignee { name } } } }\"}' | python3 -m json.tool\n```\n\n### Filter by team and assignee\n```bash\ncurl -s -X POST https:\u002F\u002Fapi.linear.app\u002Fgraphql \\\n  -H \"Authorization: $LINEAR_API_KEY\" \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -d '{\"query\": \"{ issues(filter: { team: { key: { eq: \\\"ENG\\\" } }, assignee: { email: { eq: \\\"user@example.com\\\" } } }, first: 20) { nodes { identifier title state { name } priority } } }\"}' | python3 -m json.tool\n```\n\n### List projects\n```bash\ncurl -s -X POST https:\u002F\u002Fapi.linear.app\u002Fgraphql \\\n  -H \"Authorization: $LINEAR_API_KEY\" \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -d '{\"query\": \"{ projects(first: 20) { nodes { id name description progress lead { name } teams { nodes { key } } url } } }\"}' | python3 -m json.tool\n```\n\n### List team members\n```bash\ncurl -s -X POST https:\u002F\u002Fapi.linear.app\u002Fgraphql \\\n  -H \"Authorization: $LINEAR_API_KEY\" \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -d '{\"query\": \"{ users { nodes { id name email active } } }\"}' | python3 -m json.tool\n```\n\n### List labels\n```bash\ncurl -s -X POST https:\u002F\u002Fapi.linear.app\u002Fgraphql \\\n  -H \"Authorization: $LINEAR_API_KEY\" \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -d '{\"query\": \"{ issueLabels { nodes { id name color } } }\"}' | python3 -m json.tool\n```\n\n## Common Mutations\n\n### Create an issue\n```bash\ncurl -s -X POST https:\u002F\u002Fapi.linear.app\u002Fgraphql \\\n  -H \"Authorization: $LINEAR_API_KEY\" \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -d '{\n    \"query\": \"mutation($input: IssueCreateInput!) { issueCreate(input: $input) { success issue { id identifier title url } } }\",\n    \"variables\": {\n      \"input\": {\n        \"teamId\": \"TEAM_UUID\",\n        \"title\": \"Fix login bug\",\n        \"description\": \"Users cannot login with SSO\",\n        \"priority\": 2\n      }\n    }\n  }' | python3 -m json.tool\n```\n\n### Update issue status\nFirst get the target state UUID from the workflow states query above, then:\n```bash\ncurl -s -X POST https:\u002F\u002Fapi.linear.app\u002Fgraphql \\\n  -H \"Authorization: $LINEAR_API_KEY\" \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -d '{\"query\": \"mutation { issueUpdate(id: \\\"ENG-123\\\", input: { stateId: \\\"STATE_UUID\\\" }) { success issue { identifier state { name type } } } }\"}' | python3 -m json.tool\n```\n\n### Assign an issue\n```bash\ncurl -s -X POST https:\u002F\u002Fapi.linear.app\u002Fgraphql \\\n  -H \"Authorization: $LINEAR_API_KEY\" \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -d '{\"query\": \"mutation { issueUpdate(id: \\\"ENG-123\\\", input: { assigneeId: \\\"USER_UUID\\\" }) { success issue { identifier assignee { name } } } }\"}' | python3 -m json.tool\n```\n\n### Set priority\n```bash\ncurl -s -X POST https:\u002F\u002Fapi.linear.app\u002Fgraphql \\\n  -H \"Authorization: $LINEAR_API_KEY\" \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -d '{\"query\": \"mutation { issueUpdate(id: \\\"ENG-123\\\", input: { priority: 1 }) { success issue { identifier priority } } }\"}' | python3 -m json.tool\n```\n\n### Add a comment\n```bash\ncurl -s -X POST https:\u002F\u002Fapi.linear.app\u002Fgraphql \\\n  -H \"Authorization: $LINEAR_API_KEY\" \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -d '{\"query\": \"mutation { commentCreate(input: { issueId: \\\"ISSUE_UUID\\\", body: \\\"Investigated. Root cause is X.\\\" }) { success comment { id body } } }\"}' | python3 -m json.tool\n```\n\n### Set due date\n```bash\ncurl -s -X POST https:\u002F\u002Fapi.linear.app\u002Fgraphql \\\n  -H \"Authorization: $LINEAR_API_KEY\" \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -d '{\"query\": \"mutation { issueUpdate(id: \\\"ENG-123\\\", input: { dueDate: \\\"2026-04-01\\\" }) { success issue { identifier dueDate } } }\"}' | python3 -m json.tool\n```\n\n### Add labels to an issue\n```bash\ncurl -s -X POST https:\u002F\u002Fapi.linear.app\u002Fgraphql \\\n  -H \"Authorization: $LINEAR_API_KEY\" \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -d '{\"query\": \"mutation { issueUpdate(id: \\\"ENG-123\\\", input: { labelIds: [\\\"LABEL_UUID_1\\\", \\\"LABEL_UUID_2\\\"] }) { success issue { identifier labels { nodes { name } } } } }\"}' | python3 -m json.tool\n```\n\n### Add issue to a project\n```bash\ncurl -s -X POST https:\u002F\u002Fapi.linear.app\u002Fgraphql \\\n  -H \"Authorization: $LINEAR_API_KEY\" \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -d '{\"query\": \"mutation { issueUpdate(id: \\\"ENG-123\\\", input: { projectId: \\\"PROJECT_UUID\\\" }) { success issue { identifier project { name } } } }\"}' | python3 -m json.tool\n```\n\n### Create a project\n```bash\ncurl -s -X POST https:\u002F\u002Fapi.linear.app\u002Fgraphql \\\n  -H \"Authorization: $LINEAR_API_KEY\" \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -d '{\n    \"query\": \"mutation($input: ProjectCreateInput!) { projectCreate(input: $input) { success project { id name url } } }\",\n    \"variables\": {\n      \"input\": {\n        \"name\": \"Q2 Auth Overhaul\",\n        \"description\": \"Replace legacy auth with OAuth2 and PKCE\",\n        \"teamIds\": [\"TEAM_UUID\"]\n      }\n    }\n  }' | python3 -m json.tool\n```\n\n## Pagination\n\nLinear uses Relay-style cursor pagination:\n\n```bash\n# First page\ncurl -s -X POST https:\u002F\u002Fapi.linear.app\u002Fgraphql \\\n  -H \"Authorization: $LINEAR_API_KEY\" \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -d '{\"query\": \"{ issues(first: 20) { nodes { identifier title } pageInfo { hasNextPage endCursor } } }\"}' | python3 -m json.tool\n\n# Next page — use endCursor from previous response\ncurl -s -X POST https:\u002F\u002Fapi.linear.app\u002Fgraphql \\\n  -H \"Authorization: $LINEAR_API_KEY\" \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -d '{\"query\": \"{ issues(first: 20, after: \\\"CURSOR_FROM_PREVIOUS\\\") { nodes { identifier title } pageInfo { hasNextPage endCursor } } }\"}' | python3 -m json.tool\n```\n\nDefault page size: 50. Max: 250. Always use `first: N` to limit results.\n\n## Filtering Reference\n\nComparators: `eq`, `neq`, `in`, `nin`, `lt`, `lte`, `gt`, `gte`, `contains`, `startsWith`, `containsIgnoreCase`\n\nCombine filters with `or: [...]` for OR logic (default is AND within a filter object).\n\n## Typical Workflow\n\n1. **Query teams** to get team IDs and keys\n2. **Query workflow states** for target team to get state UUIDs\n3. **List or search issues** to find what needs work\n4. **Create issues** with team ID, title, description, priority\n5. **Update status** by setting `stateId` to the target workflow state\n6. **Add comments** to track progress\n7. **Mark complete** by setting `stateId` to the team's \"completed\" type state\n\n## Rate Limits\n\n- 5,000 requests\u002Fhour per API key\n- 3,000,000 complexity points\u002Fhour\n- Use `first: N` to limit results and reduce complexity cost\n- Monitor `X-RateLimit-Requests-Remaining` response header\n\n## Important Notes\n\n- Always use `terminal` tool with `curl` for API calls — do NOT use `web_extract` or `browser`\n- Always check the `errors` array in GraphQL responses — HTTP 200 can still contain errors\n- If `stateId` is omitted when creating issues, Linear defaults to the first backlog state\n- The `description` field supports Markdown\n- Use `python3 -m json.tool` or `jq` to format JSON responses for readability\n",{"name":5,"author":23,"license":14,"version":24,"metadata":25,"description":7,"prerequisites":34},"Hermes Agent","1.0.0",{"hermes":26},{"tags":27},[28,29,30,31,32,33],"Linear","Project Management","Issues","GraphQL","API","Productivity",{"commands":35,"env_vars":37},[36],"curl",[38],"LINEAR_API_KEY","main","404fd33aabef3b6bc1cc913117ba2160ade62625","snapshots\u002F2026-11-08T13-00-51+0100\u002Fskills\u002Fproductivity\u002Flinear","https:\u002F\u002Fgithub.com\u002FLyrikNilpferd71\u002FHermes-Backup","https:\u002F\u002Fgithub.com\u002FLyrikNilpferd71","2026-11-08 20:00:57",{"source":8,"skillName":5,"commands":46,"prompt":56,"zipAvailable":57},[47,50,53],{"tool":48,"command":49},"npx","npx skills add LyrikNilpferd71\u002FHermes-Backup --skill linear",{"tool":51,"command":52},"bunx","bunx skills add LyrikNilpferd71\u002FHermes-Backup --skill linear",{"tool":54,"command":55},"pnpm","pnpm dlx skills add LyrikNilpferd71\u002FHermes-Backup --skill linear","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002FLyrikNilpferd71\u002FHermes-Backup\u002Fblob\u002Fmain\u002Fsnapshots\u002F2026-11-08T13-00-51+0100\u002Fskills\u002Fproductivity\u002Flinear\u002FSKILL.md",true,[],[60,67,74,81,88,95],{"skillNo":61,"name":62,"nameZh":6,"description":63,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":64,"categories":65,"keywords":66,"publishedAt":18},"01M76BBCCNA7WQ82Q8QNZH8PBK","writing-plans","Write implementation plans: bite-sized tasks, paths, code.","https:\u002F\u002Fgithub.com\u002FLyrikNilpferd71\u002FHermes-Backup\u002Fblob\u002Fmain\u002Fsnapshots\u002F2026-11-08T13-00-51+0100\u002Fskills\u002Fsoftware-development\u002Fwriting-plans\u002FSKILL.md",[],[],{"skillNo":68,"name":69,"nameZh":6,"description":70,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":71,"categories":72,"keywords":73,"publishedAt":18},"01M76BB8YS41CA3NKW0YMSSB88","systematic-debugging","4-phase root cause debugging: understand bugs before fixing.","https:\u002F\u002Fgithub.com\u002FLyrikNilpferd71\u002FHermes-Backup\u002Fblob\u002Fmain\u002Fsnapshots\u002F2026-11-08T13-00-51+0100\u002Fskills\u002Fsoftware-development\u002Fsystematic-debugging\u002FSKILL.md",[],[],{"skillNo":75,"name":76,"nameZh":6,"description":77,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":78,"categories":79,"keywords":80,"publishedAt":18},"01M76BB680FPNT998E1GM2QW10","subagent-driven-development","Execute plans via delegate_task subagents (2-stage review).","https:\u002F\u002Fgithub.com\u002FLyrikNilpferd71\u002FHermes-Backup\u002Fblob\u002Fmain\u002Fsnapshots\u002F2026-11-08T13-00-51+0100\u002Fskills\u002Fsoftware-development\u002Fsubagent-driven-development\u002FSKILL.md",[],[],{"skillNo":82,"name":83,"nameZh":6,"description":84,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":85,"categories":86,"keywords":87,"publishedAt":18},"01M76BB3C4ZB9S4RWPMM8MX0YB","plan","Write a markdown plan to .hermes\u002Fplans\u002F; no execution.","https:\u002F\u002Fgithub.com\u002FLyrikNilpferd71\u002FHermes-Backup\u002Fblob\u002Fmain\u002Fsnapshots\u002F2026-11-08T13-00-51+0100\u002Fskills\u002Fsoftware-development\u002Fplan\u002FSKILL.md",[],[],{"skillNo":89,"name":90,"nameZh":6,"description":91,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":92,"categories":93,"keywords":94,"publishedAt":18},"01M76BB0NK28KMP51YDB5R3EXA","hermes-agent-skill-authoring","Author in-repo SKILL.md files: frontmatter and structure.","https:\u002F\u002Fgithub.com\u002FLyrikNilpferd71\u002FHermes-Backup\u002Fblob\u002Fmain\u002Fsnapshots\u002F2026-11-08T13-00-51+0100\u002Fskills\u002Fsoftware-development\u002Fhermes-agent-skill-authoring\u002FSKILL.md",[],[],{"skillNo":96,"name":97,"nameZh":6,"description":98,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":99,"categories":100,"keywords":101,"publishedAt":18},"01M76BAYV58H0CKNSTZE3ZH4NY","debugging-hermes-tui-commands","Debug Hermes TUI slash commands: Python, gateway, Ink UI.","https:\u002F\u002Fgithub.com\u002FLyrikNilpferd71\u002FHermes-Backup\u002Fblob\u002Fmain\u002Fsnapshots\u002F2026-11-08T13-00-51+0100\u002Fskills\u002Fsoftware-development\u002Fdebugging-hermes-tui-commands\u002FSKILL.md",[],[]]