[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M71AJBTY8WPJTP3NHBXD9ER0":3,"skill-same:01M71AJBTY8WPJTP3NHBXD9ER0":87},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":16,"categories":17,"keywords":28,"publishedAt":48,"linkOnly":49,"markdownContent":50,"markdownBody":51,"frontMatter":52,"refName":67,"commitSha":68,"skillDirectory":69,"forksCount":14,"repositoryHtmlUrl":70,"repositoryHomepageUrl":6,"ownerHtmlUrl":71,"ownerBlogUrl":6,"ownerDescription":6,"updatedAt":72,"install":73,"resources":86},"01M71AJBTY8WPJTP3NHBXD9ER0","linear",null,"Manage Linear issues, projects, and teams via the GraphQL API. Create, update, search, and organize issues. Uses API key auth (no OAuth needed). All operations via curl — no dependencies.","sapsapshen\u002Fai-memory-router","sapsapshen","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F20347959?v=4","01M6XDQEF1DP50DKF37H81J3J5","shenmian","01M6XDQEJPE41Y3DT2763X8ZJN",0,"MIT","https:\u002F\u002Fgithub.com\u002Fsapsapshen\u002Fai-memory-router\u002Fblob\u002Fmain\u002Fskills-store\u002Fhermes\u002Flinear\u002FSKILL.md",[18,23],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000010","后端与接口","SCENARIO","使用场景",{"categoryNo":24,"categoryName":25,"taxonomyType":26,"taxonomyTypeDesc":27},"01JBSEEDCAT000000000000030","开发工程师","PROFESSION","适用职业",[5,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47],"organize","operations","via","curl","productivity","GraphQL","OAuth","teams","manage","project management","update","create","api","issues","search","project","auth","projects","linear issues","2026-11-10 10:12:30",false,"---\nname: linear\ndescription: Manage Linear issues, projects, and teams via the GraphQL API. Create, update, search, and organize issues. Uses API key auth (no OAuth needed). All operations via curl — no dependencies.\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":53,"license":15,"version":54,"metadata":55,"description":7,"prerequisites":63},"Hermes Agent","1.0.0",{"hermes":56},{"tags":57},[58,59,60,34,61,62],"Linear","Project Management","Issues","API","Productivity",{"commands":64,"env_vars":65},[32],[66],"LINEAR_API_KEY","main","7a38d8e7073e61c16eda85681cb32fb68a8657a5","skills-store\u002Fhermes\u002Flinear","https:\u002F\u002Fgithub.com\u002Fsapsapshen\u002Fai-memory-router","https:\u002F\u002Fgithub.com\u002Fsapsapshen","2026-04-14 21:12:12",{"source":8,"skillName":5,"commands":74,"prompt":84,"zipAvailable":85},[75,78,81],{"tool":76,"command":77},"npx","npx skills add sapsapshen\u002Fai-memory-router --skill linear",{"tool":79,"command":80},"bunx","bunx skills add sapsapshen\u002Fai-memory-router --skill linear",{"tool":82,"command":83},"pnpm","pnpm dlx skills add sapsapshen\u002Fai-memory-router --skill linear","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fsapsapshen\u002Fai-memory-router\u002Fblob\u002Fmain\u002Fskills-store\u002Fhermes\u002Flinear\u002FSKILL.md",true,[],[88,109,134,144,157,174],{"skillNo":89,"name":90,"nameZh":6,"description":91,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":92,"categories":93,"keywords":97,"publishedAt":48},"01M71ATQRKG48SH06FQ697T5G9","wechat-search","Search WeChat Official Account articles using OpenClaw's web search and fetch capabilities with compliance-focused design.","https:\u002F\u002Fgithub.com\u002Fsapsapshen\u002Fai-memory-router\u002Fblob\u002Fmain\u002Fskills-store\u002Fopenclaw\u002Fwechat-search-release\u002FSKILL.md",[94],{"categoryNo":95,"categoryName":96,"taxonomyType":26,"taxonomyTypeDesc":27},"01JBSEEDCAT000000000000037","律师与法务",[98,99,43,100,101,102,103,104,105,106,107,108],"wechat search","wechat","capabilities","openclaw","design","web search","compliance","web","official","fetch","with",{"skillNo":110,"name":111,"nameZh":6,"description":112,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":113,"categories":114,"keywords":115,"publishedAt":48},"01M71ATNAVGZB35PFYM2GC5N00","trend-tap","Real-time trending topics aggregator across 7 platforms (X\u002FTwitter, Reddit, Google Trends, Hacker News, Zhihu, Bilibili, Weibo). Trigger: when user says 'trend', 'trends', 'trend tap', '热点', '热搜', or asks what is trending\u002Fhot. Do NOT use web_search — this skill already fetches live data from all platforms with zero API keys.","https:\u002F\u002Fgithub.com\u002Fsapsapshen\u002Fai-memory-router\u002Fblob\u002Fmain\u002Fskills-store\u002Fopenclaw\u002Ftrend-tap\u002FSKILL.md",[],[116,117,118,119,120,121,43,122,123,124,125,126,127,128,129,130,131,132,133,41],"trend","trend tap","tap","api keys","Bash","time","trending","hacker","aggregator","do","when","brew","live","data","google","install","read","across",{"skillNo":135,"name":136,"nameZh":6,"description":137,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":138,"categories":139,"keywords":140,"publishedAt":48},"01M71ATJ9AM5KM15AA8PS302EB","trend-radar","Real-time trending topics aggregator across 7 platforms (X\u002FTwitter, Reddit, Google Trends, Hacker News, Zhihu, Bilibili, Weibo). Trigger: when user says 'trend', 'trends', 'trend pulse', '热点', '热搜', or asks what is trending\u002Fhot. Do NOT use web_search — this skill already fetches live data from all platforms with zero API keys.","https:\u002F\u002Fgithub.com\u002Fsapsapshen\u002Fai-memory-router\u002Fblob\u002Fmain\u002Fskills-store\u002Fopenclaw\u002Ftrend-radar\u002FSKILL.md",[],[141,142,116,127,128,129,130,120,43,132,143,133,41,126,124,123,122,131,121,119],"trend radar","radar","pulse",{"skillNo":145,"name":146,"nameZh":6,"description":147,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":148,"categories":149,"keywords":150,"publishedAt":48},"01M71ATGF095N3EJM9G8SD0BB5","tech-news-daily","每日科技新闻汇——从全球多个 RSS 源抓取最新科技新闻，翻译（英→中）、去重、排版成每日简报。当用户询问科技新闻、科技新鲜事、每日科技、技术动态、Daily Tech News 或类似表达时触发此技能。","https:\u002F\u002Fgithub.com\u002Fsapsapshen\u002Fai-memory-router\u002Fblob\u002Fmain\u002Fskills-store\u002Fopenclaw\u002Ftech-news-daily\u002FSKILL.md",[],[151,152,153,154,155,156],"news","tech","tech news daily","daily","rss","翻译",{"skillNo":158,"name":159,"nameZh":6,"description":160,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":161,"categories":162,"keywords":166,"publishedAt":48},"01M71ATFAEAMQ17M70NQNY7SR8","summarize","Summarize URLs or files with the summarize CLI (web, PDFs, images, audio, YouTube).","https:\u002F\u002Fgithub.com\u002Fsapsapshen\u002Fai-memory-router\u002Fblob\u002Fmain\u002Fskills-store\u002Fopenclaw\u002Fsummarize\u002FSKILL.md",[163],{"categoryNo":164,"categoryName":165,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000021","资料检索与研究",[159,105,167,168,169,108,127,170,171,172,118,173,131],"Audio","cli","youtube","images","https","files","pdfs",{"skillNo":175,"name":176,"nameZh":6,"description":177,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":178,"categories":179,"keywords":180,"publishedAt":48},"01M71ATDNS3R0M4H936PACQAWZ","sonoscli","Control Sonos speakers (discover\u002Fstatus\u002Fplay\u002Fvolume\u002Fgroup).","https:\u002F\u002Fgithub.com\u002Fsapsapshen\u002Fai-memory-router\u002Fblob\u002Fmain\u002Fskills-store\u002Fopenclaw\u002Fsonoscli\u002FSKILL.md",[],[176,181,182,183,131,184,171,185,186,187,188,189],"status","play","go","latest","github","discover","control","cmd","volume"]