[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M71JD3S0CCY1YAVXE0AYYMYE":3,"skill-same:01M71JD3S0CCY1YAVXE0AYYMYE":87},{"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":27,"publishedAt":47,"linkOnly":48,"markdownContent":49,"markdownBody":50,"frontMatter":51,"refName":66,"commitSha":67,"skillDirectory":68,"forksCount":69,"repositoryHtmlUrl":70,"repositoryHomepageUrl":6,"ownerHtmlUrl":71,"ownerBlogUrl":6,"ownerDescription":6,"updatedAt":72,"install":73,"resources":86},"01M71JD3S0CCY1YAVXE0AYYMYE","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.","xuanxuan1983\u002Fhermes-skills-backup","xuanxuan1983","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F151701653?v=4","01M71HCZNB5H19QJ6YBF98W2WH","01M71HCZP14T0921BD0TC9EPD3",1,"MIT","https:\u002F\u002Fgithub.com\u002Fxuanxuan1983\u002Fhermes-skills-backup\u002Fblob\u002Fmain\u002Fskills\u002Fproductivity\u002Flinear\u002FSKILL.md",[17,22],{"categoryNo":18,"categoryName":19,"taxonomyType":20,"taxonomyTypeDesc":21},"01JBSEEDCAT000000000000010","后端与接口","SCENARIO","使用场景",{"categoryNo":23,"categoryName":24,"taxonomyType":25,"taxonomyTypeDesc":26},"01JBSEEDCAT000000000000030","开发工程师","PROFESSION","适用职业",[5,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46],"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":52,"license":14,"version":53,"metadata":54,"description":7,"prerequisites":62},"Hermes Agent","1.0.0",{"hermes":55},{"tags":56},[57,58,59,33,60,61],"Linear","Project Management","Issues","API","Productivity",{"commands":63,"env_vars":64},[31],[65],"LINEAR_API_KEY","main","17ee50c38aefa9426a89d7e8ee167fdc4c184fb7","skills\u002Fproductivity\u002Flinear",0,"https:\u002F\u002Fgithub.com\u002Fxuanxuan1983\u002Fhermes-skills-backup","https:\u002F\u002Fgithub.com\u002Fxuanxuan1983","2026-05-24 00:14:48",{"source":8,"skillName":5,"commands":74,"prompt":84,"zipAvailable":85},[75,78,81],{"tool":76,"command":77},"npx","npx skills add xuanxuan1983\u002Fhermes-skills-backup --skill linear",{"tool":79,"command":80},"bunx","bunx skills add xuanxuan1983\u002Fhermes-skills-backup --skill linear",{"tool":82,"command":83},"pnpm","pnpm dlx skills add xuanxuan1983\u002Fhermes-skills-backup --skill linear","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fxuanxuan1983\u002Fhermes-skills-backup\u002Fblob\u002Fmain\u002Fskills\u002Fproductivity\u002Flinear\u002FSKILL.md",true,[],[88,125,153,169,191,212],{"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":104,"publishedAt":47},"01M71JFHVW1W4XE013TY9ZYN9P","writing-plans","Use when you have a spec or requirements for a multi-step task. Creates comprehensive implementation plans with bite-sized tasks, exact file paths, and complete code examples.","https:\u002F\u002Fgithub.com\u002Fxuanxuan1983\u002Fhermes-skills-backup\u002Fblob\u002Fmain\u002Fskills\u002Fsoftware-development\u002Fwriting-plans\u002FSKILL.md",[94,97,100,101],{"categoryNo":95,"categoryName":96,"taxonomyType":20,"taxonomyTypeDesc":21},"01JBSEEDCAT000000000000015","视觉设计",{"categoryNo":98,"categoryName":99,"taxonomyType":20,"taxonomyTypeDesc":21},"01JBSEEDCAT000000000000018","写作与文案",{"categoryNo":23,"categoryName":24,"taxonomyType":25,"taxonomyTypeDesc":26},{"categoryNo":102,"categoryName":103,"taxonomyType":25,"taxonomyTypeDesc":26},"01JBSEEDCAT000000000000036","内容创作者",[105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124],"writing","writing plans","plans","test-driven","test-driven-development","superpowers","design","when","workflow","you","code","tasks","subagent","code-review","review","documentation","paths","planning","development","for",{"skillNo":126,"name":109,"nameZh":6,"description":127,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":128,"categories":129,"keywords":138,"publishedAt":47},"01M71JFF859RV0XGWS206X1TMB","Use when implementing any feature or bugfix, before writing implementation code. Enforces RED-GREEN-REFACTOR cycle with test-first approach.","https:\u002F\u002Fgithub.com\u002Fxuanxuan1983\u002Fhermes-skills-backup\u002Fblob\u002Fmain\u002Fskills\u002Fsoftware-development\u002Ftest-driven-development\u002FSKILL.md",[130,133,136,137],{"categoryNo":131,"categoryName":132,"taxonomyType":20,"taxonomyTypeDesc":21},"01JBSEEDCAT000000000000007","代码审查",{"categoryNo":134,"categoryName":135,"taxonomyType":20,"taxonomyTypeDesc":21},"01JBSEEDCAT000000000000008","测试与质量",{"categoryNo":98,"categoryName":99,"taxonomyType":20,"taxonomyTypeDesc":21},{"categoryNo":102,"categoryName":103,"taxonomyType":25,"taxonomyTypeDesc":26},[139,123,140,141,142,143,144,145,146,147,110,105,148,112,115,117,149,150,151,152],"test driven development","test","driven","test-first","green","cycle","red-green-refactor","testing","implementing","debugging","systematic","bugfix","refactor","systematic-debugging",{"skillNo":154,"name":152,"nameZh":6,"description":155,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":156,"categories":157,"keywords":159,"publishedAt":47},"01M71JFCA5S48PZ5M7DG31R8K5","Use when encountering any bug, test failure, or unexpected behavior. 4-phase root cause investigation — NO fixes without understanding the problem first.","https:\u002F\u002Fgithub.com\u002Fxuanxuan1983\u002Fhermes-skills-backup\u002Fblob\u002Fmain\u002Fskills\u002Fsoftware-development\u002Fsystematic-debugging\u002FSKILL.md",[158],{"categoryNo":134,"categoryName":135,"taxonomyType":20,"taxonomyTypeDesc":21},[160,148,149,108,161,162,109,110,105,112,117,163,164,123,165,166,107,167,168,140],"systematic debugging","problem","problem-solving","phase","bug","fixes","root cause","use","root-cause",{"skillNo":170,"name":171,"nameZh":6,"description":172,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":173,"categories":174,"keywords":184,"publishedAt":47},"01M71JF9RQ092KM5ZXCBBT6FS1","subagent-driven-development","Use when executing implementation plans with independent tasks. Dispatches fresh delegate_task per task with two-stage review (spec compliance then code quality).","https:\u002F\u002Fgithub.com\u002Fxuanxuan1983\u002Fhermes-skills-backup\u002Fblob\u002Fmain\u002Fskills\u002Fsoftware-development\u002Fsubagent-driven-development\u002FSKILL.md",[175,176,179,180,181],{"categoryNo":98,"categoryName":99,"taxonomyType":20,"taxonomyTypeDesc":21},{"categoryNo":177,"categoryName":178,"taxonomyType":20,"taxonomyTypeDesc":21},"01JBSEEDCAT000000000000023","Skill与智能体开发",{"categoryNo":23,"categoryName":24,"taxonomyType":25,"taxonomyTypeDesc":26},{"categoryNo":102,"categoryName":103,"taxonomyType":25,"taxonomyTypeDesc":26},{"categoryNo":182,"categoryName":183,"taxonomyType":25,"taxonomyTypeDesc":26},"01JBSEEDCAT000000000000037","律师与法务",[185,117,123,141,108,109,186,187,110,105,112,113,115,116,118,119,188,189,190,107],"subagent driven development","delegate","delegation","fresh","parallel","code quality",{"skillNo":192,"name":193,"nameZh":6,"description":194,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":195,"categories":196,"keywords":199,"publishedAt":47},"01M71JF76DA8ARZ4JRYR4VBRWM","requesting-code-review","Pre-commit verification pipeline — static security scan, baseline-aware quality gates, independent reviewer subagent, and auto-fix loop. Use after code changes and before committing, pushing, or opening a PR.","https:\u002F\u002Fgithub.com\u002Fxuanxuan1983\u002Fhermes-skills-backup\u002Fblob\u002Fmain\u002Fskills\u002Fsoftware-development\u002Frequesting-code-review\u002FSKILL.md",[197,198],{"categoryNo":131,"categoryName":132,"taxonomyType":20,"taxonomyTypeDesc":21},{"categoryNo":23,"categoryName":24,"taxonomyType":25,"taxonomyTypeDesc":26},[200,201,115,119,108,202,203,109,204,205,110,206,105,207,208,209,117,118,210,211],"code review","requesting code review","pipeline","static","fix","auto-fix","auto","loop","security scan","commit","reviewer","verification",{"skillNo":213,"name":214,"nameZh":6,"description":215,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":216,"categories":217,"keywords":218,"publishedAt":47},"01M71JF52HZT5VQXFVF9K2H76K","plan","Plan mode for Hermes — inspect context, write a markdown plan into the active workspace's `.hermes\u002Fplans\u002F` directory, and do not execute the work.","https:\u002F\u002Fgithub.com\u002Fxuanxuan1983\u002Fhermes-skills-backup\u002Fblob\u002Fmain\u002Fskills\u002Fsoftware-development\u002Fplan\u002FSKILL.md",[],[214,219,220,122,123,124,221,222,107,105,113,117,223,224,225,226,227,228,229,230],"plan-mode","do","inspect","mode","work","markdown","active","directory","workspace","plan mode","write","implementation"]