[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6CAK7WCV635EVTFND7PBZD6":3,"skill-same:01M6CAK7WCV635EVTFND7PBZD6":85},{"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":23,"publishedAt":38,"linkOnly":39,"markdownContent":40,"markdownBody":41,"frontMatter":42,"refName":58,"commitSha":59,"skillDirectory":60,"forksCount":61,"repositoryHtmlUrl":62,"repositoryHomepageUrl":6,"ownerHtmlUrl":63,"ownerBlogUrl":6,"ownerDescription":6,"updatedAt":64,"install":65,"resources":78},"01M6CAK7WCV635EVTFND7PBZD6","linear",null,"Linear: manage issues, projects, teams via GraphQL + curl.","adnichols\u002Fai-configs","adnichols","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F493746?v=4","01M6C33VRY9WF6XWYPT1AFA7JJ","Aaron Nichols","01M6C33VWTNKGRM92E9G643V4W",5,"MIT","https:\u002F\u002Fgithub.com\u002Fadnichols\u002Fai-configs\u002Fblob\u002Fmain\u002F_hermes\u002Fdefault\u002Fprofiles\u002Fwriting\u002Fskills\u002F.archive\u002Flinear\u002FSKILL.md",[18],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000010","后端与接口","SCENARIO","使用场景",[5,24,25,26,27,28,29,30,31,32,33,34,35,36,37],"macos","linux","windows","teams","project management","issues","productivity","GraphQL","api","projects","hermes","hermes agent","curl","management","2026-11-10 10:12:30",false,"---\nname: linear\ndescription: \"Linear: manage issues, projects, teams via GraphQL + curl.\"\nversion: 1.0.0\nauthor: Hermes Agent\nlicense: MIT\nplatforms: [linux, macos, windows]\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 > Account > Security & access > Personal API keys** (URL: https:\u002F\u002Flinear.app\u002Fsettings\u002Faccount\u002Fsecurity). Note: the org-level *Settings > API* page only shows OAuth apps and workspace-member keys, not personal 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## Python helper script (ergonomic alternative)\n\nFor faster one-liners that don't need hand-written GraphQL, this skill ships a stdlib Python CLI at `scripts\u002Flinear_api.py`. Zero dependencies. Same auth (reads `LINEAR_API_KEY`).\n\n```bash\nSCRIPT=$(dirname \"$(find ~\u002F.hermes -path '*skills\u002Fproductivity\u002Flinear\u002Fscripts\u002Flinear_api.py' 2>\u002Fdev\u002Fnull | head -1)\")\u002Flinear_api.py\n\npython3 \"$SCRIPT\" whoami\npython3 \"$SCRIPT\" list-teams\npython3 \"$SCRIPT\" get-issue ENG-42\npython3 \"$SCRIPT\" get-document 38359beef67c      # fetch a doc by slugId from the URL\npython3 \"$SCRIPT\" raw 'query { viewer { name } }'\n```\n\nAll subcommands: `whoami`, `list-teams`, `list-projects`, `list-states`, `list-issues`, `get-issue`, `search-issues`, `create-issue`, `update-issue`, `update-status`, `add-comment`, `list-documents`, `get-document`, `search-documents`, `raw`. Run with `--help` for flags.\n\nUse the script when: you want a quick answer without crafting GraphQL. Use curl when: you need a query the script doesn't wrap, or you want to compose filters inline.\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## Documents\n\nLinear **Documents** are prose docs (RFCs, specs, notes) stored alongside issues. They have their own `documents` root query and `document(id:)` single-fetch.\n\n### Document URLs and `slugId`\n\nDocument URLs look like:\n```\nhttps:\u002F\u002Flinear.app\u002F\u003Cworkspace>\u002Fdocument\u002F\u003Cslug>-\u003ChexSlugId>\n```\n\nThe trailing hex segment is the `slugId`. Example: `https:\u002F\u002Flinear.app\u002Fnousresearch\u002Fdocument\u002Frfc-hermes-permission-gateway-discord-38359beef67c` → `slugId` is `38359beef67c`.\n\n**Important schema detail:** the Markdown body is in the `content` field. The ProseMirror JSON is in `contentState` (not `contentData` — that field does not exist and the API returns 400).\n\n### Fetch a document by slugId\n\n`document(id:)` only accepts UUIDs. To fetch by the URL's hex slug, filter the collection:\n\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\": \"query($s: String!) { documents(filter: { slugId: { eq: $s } }, first: 1) { nodes { id title content contentState slugId url creator { name } project { name } updatedAt } } }\", \"variables\": {\"s\": \"38359beef67c\"}}' \\\n  | python3 -m json.tool\n```\n\nOr via the Python helper:\n```bash\npython3 scripts\u002Flinear_api.py get-document 38359beef67c\n```\n\n### Fetch a document by UUID\n\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\": \"{ document(id: \\\"11700cff-b514-4db3-afcc-3ed1afacba1c\\\") { title content url } }\"}' \\\n  | python3 -m json.tool\n```\n\n### List recent documents\n\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\": \"{ documents(first: 25, orderBy: updatedAt) { nodes { id title slugId url updatedAt project { name } } } }\"}' \\\n  | python3 -m json.tool\n```\n\n### Search documents by title\n\nLinear's schema has no `searchDocuments` root. Use a title-substring filter instead:\n\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\": \"{ documents(filter: { title: { containsIgnoreCase: \\\"RFC\\\" } }, first: 25) { nodes { title slugId url } } }\"}' \\\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 > Account > Security & access > Personal API keys** (URL: https:\u002F\u002Flinear.app\u002Fsettings\u002Faccount\u002Fsecurity). Note: the org-level *Settings > API* page only shows OAuth apps and workspace-member keys, not personal 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## Python helper script (ergonomic alternative)\n\nFor faster one-liners that don't need hand-written GraphQL, this skill ships a stdlib Python CLI at `scripts\u002Flinear_api.py`. Zero dependencies. Same auth (reads `LINEAR_API_KEY`).\n\n```bash\nSCRIPT=$(dirname \"$(find ~\u002F.hermes -path '*skills\u002Fproductivity\u002Flinear\u002Fscripts\u002Flinear_api.py' 2>\u002Fdev\u002Fnull | head -1)\")\u002Flinear_api.py\n\npython3 \"$SCRIPT\" whoami\npython3 \"$SCRIPT\" list-teams\npython3 \"$SCRIPT\" get-issue ENG-42\npython3 \"$SCRIPT\" get-document 38359beef67c      # fetch a doc by slugId from the URL\npython3 \"$SCRIPT\" raw 'query { viewer { name } }'\n```\n\nAll subcommands: `whoami`, `list-teams`, `list-projects`, `list-states`, `list-issues`, `get-issue`, `search-issues`, `create-issue`, `update-issue`, `update-status`, `add-comment`, `list-documents`, `get-document`, `search-documents`, `raw`. Run with `--help` for flags.\n\nUse the script when: you want a quick answer without crafting GraphQL. Use curl when: you need a query the script doesn't wrap, or you want to compose filters inline.\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## Documents\n\nLinear **Documents** are prose docs (RFCs, specs, notes) stored alongside issues. They have their own `documents` root query and `document(id:)` single-fetch.\n\n### Document URLs and `slugId`\n\nDocument URLs look like:\n```\nhttps:\u002F\u002Flinear.app\u002F\u003Cworkspace>\u002Fdocument\u002F\u003Cslug>-\u003ChexSlugId>\n```\n\nThe trailing hex segment is the `slugId`. Example: `https:\u002F\u002Flinear.app\u002Fnousresearch\u002Fdocument\u002Frfc-hermes-permission-gateway-discord-38359beef67c` → `slugId` is `38359beef67c`.\n\n**Important schema detail:** the Markdown body is in the `content` field. The ProseMirror JSON is in `contentState` (not `contentData` — that field does not exist and the API returns 400).\n\n### Fetch a document by slugId\n\n`document(id:)` only accepts UUIDs. To fetch by the URL's hex slug, filter the collection:\n\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\": \"query($s: String!) { documents(filter: { slugId: { eq: $s } }, first: 1) { nodes { id title content contentState slugId url creator { name } project { name } updatedAt } } }\", \"variables\": {\"s\": \"38359beef67c\"}}' \\\n  | python3 -m json.tool\n```\n\nOr via the Python helper:\n```bash\npython3 scripts\u002Flinear_api.py get-document 38359beef67c\n```\n\n### Fetch a document by UUID\n\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\": \"{ document(id: \\\"11700cff-b514-4db3-afcc-3ed1afacba1c\\\") { title content url } }\"}' \\\n  | python3 -m json.tool\n```\n\n### List recent documents\n\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\": \"{ documents(first: 25, orderBy: updatedAt) { nodes { id title slugId url updatedAt project { name } } } }\"}' \\\n  | python3 -m json.tool\n```\n\n### Search documents by title\n\nLinear's schema has no `searchDocuments` root. Use a title-substring filter instead:\n\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\": \"{ documents(filter: { title: { containsIgnoreCase: \\\"RFC\\\" } }, first: 25) { nodes { title slugId url } } }\"}' \\\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":43,"license":15,"version":44,"metadata":45,"platforms":53,"description":7,"prerequisites":54},"Hermes Agent","1.0.0",{"hermes":46},{"tags":47},[48,49,50,31,51,52],"Linear","Project Management","Issues","API","Productivity",[25,24,26],{"commands":55,"env_vars":56},[36],[57],"LINEAR_API_KEY","main","64e2fc9afa7bb3da1138eb73399144d0e7e73e9d","_hermes\u002Fdefault\u002Fprofiles\u002Fwriting\u002Fskills\u002F.archive\u002Flinear",4,"https:\u002F\u002Fgithub.com\u002Fadnichols\u002Fai-configs","https:\u002F\u002Fgithub.com\u002Fadnichols","2026-11-06 00:28:38",{"source":8,"skillName":5,"commands":66,"prompt":76,"zipAvailable":77},[67,70,73],{"tool":68,"command":69},"npx","npx skills add adnichols\u002Fai-configs --skill linear",{"tool":71,"command":72},"bunx","bunx skills add adnichols\u002Fai-configs --skill linear",{"tool":74,"command":75},"pnpm","pnpm dlx skills add adnichols\u002Fai-configs --skill linear","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fadnichols\u002Fai-configs\u002Fblob\u002Fmain\u002F_hermes\u002Fdefault\u002Fprofiles\u002Fwriting\u002Fskills\u002F.archive\u002Flinear\u002FSKILL.md",true,[79],{"path":80,"resourceType":81,"resourceTypeDesc":82,"sizeBytes":83,"sourceHtmlUrl":84},"scripts\u002Flinear_api.py","SCRIPT","脚本",15603,"https:\u002F\u002Fgithub.com\u002Fadnichols\u002Fai-configs\u002Fblob\u002Fmain\u002F_hermes\u002Fdefault\u002Fprofiles\u002Fwriting\u002Fskills\u002F.archive\u002Flinear\u002Fscripts\u002Flinear_api.py",[86,103,135,160,171,187],{"skillNo":87,"name":88,"nameZh":6,"description":89,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":90,"categories":91,"keywords":92,"publishedAt":38},"01M6CB7RN791P5RRRCJWWC7DAR","blocked-page-recovery","Use when a fetch fails: 403\u002F429, paywall, WAF, bot wall.","https:\u002F\u002Fgithub.com\u002Fadnichols\u002Fai-configs\u002Fblob\u002Fmain\u002F_hermes\u002Fdefault\u002Fskills\u002Fweb\u002Fblocked-page-recovery\u002FSKILL.md",[],[93,94,95,96,97,98,99,35,34,100,101,26,102,25,24],"recovery","page","blocked page recovery","bot","fallback","use","fetch","Citations","waf","research",{"skillNo":104,"name":105,"nameZh":6,"description":106,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":107,"categories":108,"keywords":120,"publishedAt":38},"01M6CB7NQY2VVYCQJ1QBXACQF4","writing-plans","Use when creating or updating executable software plans. Keep plans as local files unless the user explicitly asks to register them in Doct.","https:\u002F\u002Fgithub.com\u002Fadnichols\u002Fai-configs\u002Fblob\u002Fmain\u002F_hermes\u002Fdefault\u002Fskills\u002Fsoftware-development\u002Fwriting-plans\u002FSKILL.md",[109,112,115],{"categoryNo":110,"categoryName":111,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000018","写作与文案",{"categoryNo":113,"categoryName":114,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000023","Skill与智能体开发",{"categoryNo":116,"categoryName":117,"taxonomyType":118,"taxonomyTypeDesc":119},"01JBSEEDCAT000000000000036","内容创作者","PROFESSION","适用职业",[121,122,123,124,125,126,127,128,129,130,131,132,98,133,35,34,134],"writing","writing plans","documentation","test","workflow","design","user","development","planning","files","implementation","html","ops","plan",{"skillNo":136,"name":137,"nameZh":6,"description":138,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":139,"categories":140,"keywords":150,"publishedAt":38},"01M6CB7JME246KZQHP73Z2STDF","test-driven-development","TDD: enforce RED-GREEN-REFACTOR, tests before code.","https:\u002F\u002Fgithub.com\u002Fadnichols\u002Fai-configs\u002Fblob\u002Fmain\u002F_hermes\u002Fdefault\u002Fskills\u002Fsoftware-development\u002Ftest-driven-development\u002FSKILL.md",[141,144,147],{"categoryNo":142,"categoryName":143,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000007","代码审查",{"categoryNo":145,"categoryName":146,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000008","测试与质量",{"categoryNo":148,"categoryName":149,"taxonomyType":118,"taxonomyTypeDesc":119},"01JBSEEDCAT000000000000037","律师与法务",[124,128,151,152,153,35,34,154,134,155,156,157,24,158,25,159,26],"test driven development","red-green-refactor","superpowers","quality","refactor","code","debugging","tdd","testing",{"skillNo":161,"name":162,"nameZh":6,"description":163,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":164,"categories":165,"keywords":167,"publishedAt":38},"01M6CB7FQ407KQTD4Z9VAWKY54","systematic-debugging","4-phase root cause debugging: understand bugs before fixing.","https:\u002F\u002Fgithub.com\u002Fadnichols\u002Fai-configs\u002Fblob\u002Fmain\u002F_hermes\u002Fdefault\u002Fskills\u002Fsoftware-development\u002Fsystematic-debugging\u002FSKILL.md",[166],{"categoryNo":145,"categoryName":146,"taxonomyType":21,"taxonomyTypeDesc":22},[157,168,128,153,35,34,169,134,170,26,124,25,24],"systematic debugging","troubleshooting","investigation",{"skillNo":172,"name":173,"nameZh":6,"description":174,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":175,"categories":176,"keywords":180,"publishedAt":38},"01M6CB7D57MK88HE5YPZHKH68Q","spike","Throwaway experiments to validate an idea before build.","https:\u002F\u002Fgithub.com\u002Fadnichols\u002Fai-configs\u002Fblob\u002Fmain\u002F_hermes\u002Fdefault\u002Fskills\u002Fsoftware-development\u002Fspike\u002FSKILL.md",[177],{"categoryNo":178,"categoryName":179,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000021","资料检索与研究",[173,26,181,182,102,183,25,24,184,185,186,35,34,134,129],"validate","experiments","prototype","feasibility","sketch","experiment",{"skillNo":188,"name":189,"nameZh":6,"description":190,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":191,"categories":192,"keywords":197,"publishedAt":38},"01M6CB7APAQ37YE5YE1MAAFT42","simplify-code","Parallel 3-agent cleanup of recent code changes.","https:\u002F\u002Fgithub.com\u002Fadnichols\u002Fai-configs\u002Fblob\u002Fmain\u002F_hermes\u002Fdefault\u002Fskills\u002Fsoftware-development\u002Fsimplify-code\u002FSKILL.md",[193,194],{"categoryNo":113,"categoryName":114,"taxonomyType":21,"taxonomyTypeDesc":22},{"categoryNo":195,"categoryName":196,"taxonomyType":118,"taxonomyTypeDesc":119},"01JBSEEDCAT000000000000030","开发工程师",[198,199,156,200,35,34,201,134,155,202,203,204,128,26,124,25,205,24],"simplify code","simplify","subagent","parallel","code-review","delegation","cleanup","review"]