@schoolai/shipyard 1.2.0 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (45) hide show
  1. package/dist/{auth-XINVA3ZW.js → auth-V6KVU7VA.js} +4 -3
  2. package/dist/chunk-2H7UOFLK.js +11 -0
  3. package/dist/chunk-2H7UOFLK.js.map +1 -0
  4. package/dist/{chunk-FY3DRRGT.js → chunk-5OHYOIOG.js} +3 -3
  5. package/dist/chunk-5OHYOIOG.js.map +1 -0
  6. package/dist/{chunk-HS57GMAL.js → chunk-6AQKMCGK.js} +15 -9
  7. package/dist/chunk-6AQKMCGK.js.map +1 -0
  8. package/dist/chunk-BYFLMOF7.js +591 -0
  9. package/dist/chunk-BYFLMOF7.js.map +1 -0
  10. package/dist/{login-Q6PDH6HF.js → chunk-C4SKAWEG.js} +104 -40
  11. package/dist/chunk-C4SKAWEG.js.map +1 -0
  12. package/dist/chunk-DPMRSLYJ.js +109 -0
  13. package/dist/chunk-DPMRSLYJ.js.map +1 -0
  14. package/dist/{chunk-K3GFMEBF.js → chunk-JFEQEK53.js} +3 -3
  15. package/dist/chunk-JFEQEK53.js.map +1 -0
  16. package/dist/{chunk-U647WKG5.js → chunk-L6BFDLLZ.js} +264 -48
  17. package/dist/chunk-L6BFDLLZ.js.map +1 -0
  18. package/dist/{chunk-6VAYVPEL.js → chunk-ZU4YUN33.js} +8 -8
  19. package/dist/chunk-ZU4YUN33.js.map +1 -0
  20. package/dist/index.js +41 -49812
  21. package/dist/index.js.map +1 -1
  22. package/dist/login-JWAG3GPR.js +18 -0
  23. package/dist/login-JWAG3GPR.js.map +1 -0
  24. package/dist/{logout-XX5ULFHB.js → logout-PIKY2YCJ.js} +7 -6
  25. package/dist/logout-PIKY2YCJ.js.map +1 -0
  26. package/dist/mcp-servers-2MAQ6WKL.js +15 -0
  27. package/dist/mcp-servers-2MAQ6WKL.js.map +1 -0
  28. package/dist/plugin-mcp-linear.d.ts +2 -0
  29. package/dist/plugin-mcp-linear.js +1683 -0
  30. package/dist/plugin-mcp-linear.js.map +1 -0
  31. package/dist/serve-2FNONIDL.js +69583 -0
  32. package/dist/serve-2FNONIDL.js.map +1 -0
  33. package/dist/skills-NCKYNLUS.js +9 -0
  34. package/dist/skills-NCKYNLUS.js.map +1 -0
  35. package/dist/start-CQC22BQF.js +35 -0
  36. package/dist/start-CQC22BQF.js.map +1 -0
  37. package/package.json +8 -3
  38. package/dist/chunk-6VAYVPEL.js.map +0 -1
  39. package/dist/chunk-FY3DRRGT.js.map +0 -1
  40. package/dist/chunk-HS57GMAL.js.map +0 -1
  41. package/dist/chunk-K3GFMEBF.js.map +0 -1
  42. package/dist/chunk-U647WKG5.js.map +0 -1
  43. package/dist/login-Q6PDH6HF.js.map +0 -1
  44. package/dist/logout-XX5ULFHB.js.map +0 -1
  45. /package/dist/{auth-XINVA3ZW.js.map → auth-V6KVU7VA.js.map} +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../packages/linear-plugin/src/mcp/index.ts","../../../packages/linear-plugin/src/mcp/graphql.ts","../../../packages/linear-plugin/src/mcp/tools/comments.ts","../../../packages/linear-plugin/src/mcp/tools/documents.ts","../../../packages/linear-plugin/src/mcp/tools/issues.ts","../../../packages/linear-plugin/src/mcp/tools/projects.ts","../../../packages/linear-plugin/src/mcp/tools/teams.ts","../../../packages/linear-plugin/src/mcp/tools/users.ts","../../../packages/linear-plugin/src/mcp/tools/workflow.ts"],"sourcesContent":["import { Server } from '@modelcontextprotocol/sdk/server/index.js';\nimport { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';\nimport { CallToolRequestSchema, ListToolsRequestSchema } from '@modelcontextprotocol/sdk/types.js';\nimport { LinearGraphQLClient } from './graphql.js';\nimport { createComment, deleteComment, listComments } from './tools/comments.js';\nimport { getDocument, listDocuments, searchDocumentation } from './tools/documents.js';\nimport {\n createIssue,\n deleteIssue,\n getIssue,\n getIssueGitBranchName,\n listIssues,\n listMyIssues,\n updateIssue,\n} from './tools/issues.js';\nimport {\n createProject,\n deleteProject,\n getProject,\n listProjects,\n updateProject,\n} from './tools/projects.js';\nimport { getTeam, listTeams } from './tools/teams.js';\nimport { getUser, listUsers } from './tools/users.js';\nimport { getIssueStatus, listIssueLabels, listIssueStatuses } from './tools/workflow.js';\n\nconst TOOL_DEFINITIONS = [\n {\n name: 'list_issues',\n description:\n \"List issues in the user's Linear workspace. Returns issue identifiers (e.g., 'ENG-123') that can be passed directly to get_issue, update_issue, or delete_issue. Use 'query' for text search (pagination and ordering not available for text search), or structured filters with pagination. To filter by status name, first call list_issue_statuses to get the stateId. To filter by assignee name, first call list_users to get the userId, or use 'me' for the current user.\",\n inputSchema: {\n type: 'object' as const,\n properties: {\n query: { type: 'string', description: 'Text search query to filter issues' },\n teamId: {\n type: 'string',\n description: \"Filter by team ID (UUID) or team key (e.g., 'ENG')\",\n },\n stateId: {\n type: 'string',\n description:\n 'Filter by workflow state ID (UUID). Call list_issue_statuses to find the ID for a status name.',\n },\n assigneeId: {\n type: 'string',\n description: \"Filter by assignee user ID. Use 'me' for current user.\",\n },\n parentId: {\n type: 'string',\n description: 'Filter by parent issue ID (for sub-issues)',\n },\n projectId: { type: 'string', description: 'Filter by project ID' },\n createdAt: {\n type: 'string',\n description: 'Filter to issues created at or after this date (ISO 8601)',\n },\n updatedAt: {\n type: 'string',\n description: 'Filter to issues updated at or after this date (ISO 8601)',\n },\n includeArchived: {\n type: 'boolean',\n description: 'Include archived issues in results',\n },\n limit: {\n type: 'number',\n description: 'Maximum number of results to return (default: 25, max: 100)',\n },\n after: {\n type: 'string',\n description: 'Cursor for forward pagination (from previous results)',\n },\n orderBy: {\n type: 'string',\n enum: ['createdAt', 'updatedAt'],\n description: \"Order results by 'createdAt' or 'updatedAt'\",\n },\n },\n },\n },\n {\n name: 'get_issue',\n description:\n \"Retrieve a Linear issue's full details including title, description, attachments, comments (with comment UUIDs), and metadata. Accepts a UUID, an identifier like 'ENG-123', or a text search query.\",\n inputSchema: {\n type: 'object' as const,\n properties: {\n id: {\n type: 'string',\n description:\n \"Issue UUID, identifier (e.g., 'ENG-123'), or search text. Identifiers are case-insensitive.\",\n },\n },\n required: ['id'],\n },\n },\n {\n name: 'create_issue',\n description:\n 'Create a new Linear issue or sub-issue. Before calling, use list_teams to resolve the team key and list_issue_statuses for valid stateId values.',\n inputSchema: {\n type: 'object' as const,\n properties: {\n title: { type: 'string', description: 'Issue title (required)' },\n teamId: {\n type: 'string',\n description: \"Team ID (UUID) or key (e.g., 'ENG'). Required.\",\n },\n description: {\n type: 'string',\n description: 'Issue description. Supports markdown',\n },\n priority: {\n type: 'number',\n description: 'Priority level: 0=No priority, 1=Urgent, 2=High, 3=Medium, 4=Low',\n enum: [0, 1, 2, 3, 4],\n },\n projectId: {\n type: 'string',\n description: 'Project ID to associate the issue with',\n },\n parentId: {\n type: 'string',\n description: 'Parent issue ID to create as sub-issue. teamId is still required.',\n },\n stateId: {\n type: 'string',\n description:\n 'Workflow state ID (UUID) for initial status. Call list_issue_statuses to find valid IDs.',\n },\n assigneeId: {\n type: 'string',\n description: \"User ID to assign. Use 'me' for self-assignment.\",\n },\n labelIds: {\n type: 'array',\n items: { type: 'string' },\n description: 'Array of label IDs to apply',\n },\n dueDate: {\n type: 'string',\n description: 'Due date in ISO 8601 format (YYYY-MM-DD)',\n },\n },\n required: ['title', 'teamId'],\n },\n },\n {\n name: 'update_issue',\n description:\n \"Update an existing Linear issue. Accepts UUID or identifier (e.g., 'ENG-123'). Only provided fields are changed; omitted fields are left unchanged. Use list_issue_statuses to find stateId values.\",\n inputSchema: {\n type: 'object' as const,\n properties: {\n id: {\n type: 'string',\n description: \"Issue UUID or identifier (e.g., 'ENG-123')\",\n },\n title: { type: 'string', description: 'New issue title' },\n description: {\n type: 'string',\n description: 'New issue description (markdown)',\n },\n priority: {\n type: 'number',\n description: 'Priority: 0=None, 1=Urgent, 2=High, 3=Medium, 4=Low',\n enum: [0, 1, 2, 3, 4],\n },\n projectId: {\n type: 'string',\n description: 'Project ID to move issue to',\n },\n parentId: {\n type: 'string',\n description: 'Parent issue ID (convert to sub-issue)',\n },\n stateId: {\n type: 'string',\n description: 'Workflow state ID (UUID). Call list_issue_statuses to find valid IDs.',\n },\n assigneeId: {\n type: 'string',\n description: \"User ID to assign (use 'me' for self, null to unassign)\",\n },\n labelIds: {\n type: 'array',\n items: { type: 'string' },\n description: 'Replacement label IDs (overwrites existing)',\n },\n dueDate: {\n type: 'string',\n description: 'Due date (ISO 8601 YYYY-MM-DD)',\n },\n estimate: {\n type: 'number',\n description: 'Complexity/effort estimate points',\n },\n },\n required: ['id'],\n },\n },\n {\n name: 'delete_issue',\n description:\n \"DESTRUCTIVE: Permanently delete a Linear issue by UUID or identifier (e.g., 'ENG-123'). This cannot be undone. Always confirm with the user before deleting.\",\n inputSchema: {\n type: 'object' as const,\n properties: {\n id: {\n type: 'string',\n description: \"Issue UUID or identifier (e.g., 'ENG-123')\",\n },\n },\n required: ['id'],\n },\n },\n {\n name: 'list_my_issues',\n description:\n 'List issues assigned to you (the authenticated user), with cursor-based pagination and ordering. Use this for browsing your issues; use list_issues for filtered searches across the workspace.',\n inputSchema: {\n type: 'object' as const,\n properties: {\n limit: { type: 'number', description: 'Maximum results to return' },\n before: {\n type: 'string',\n description: 'Cursor for backward pagination',\n },\n after: {\n type: 'string',\n description: 'Cursor for forward pagination',\n },\n orderBy: {\n type: 'string',\n enum: ['createdAt', 'updatedAt'],\n description: \"Order results by 'createdAt' or 'updatedAt'\",\n },\n },\n },\n },\n {\n name: 'get_issue_git_branch_name',\n description:\n \"Get the git branch name that Linear auto-generates for an issue, used to link commits and PRs back to the issue. Accepts UUID or identifier (e.g., 'ENG-123').\",\n inputSchema: {\n type: 'object' as const,\n properties: {\n id: {\n type: 'string',\n description: \"Issue UUID or identifier (e.g., 'ENG-123')\",\n },\n },\n required: ['id'],\n },\n },\n {\n name: 'list_issue_statuses',\n description:\n \"List available workflow statuses for a Linear team. Returns status IDs needed for the stateId parameter in create_issue, update_issue, and list_issues filters. Accepts team UUID or key (e.g., 'ENG').\",\n inputSchema: {\n type: 'object' as const,\n properties: {\n teamId: {\n type: 'string',\n description: \"Team ID (UUID) or key (e.g., 'ENG')\",\n },\n },\n required: ['teamId'],\n },\n },\n {\n name: 'get_issue_status',\n description: 'Retrieve details of a specific workflow state by name or ID within a team.',\n inputSchema: {\n type: 'object' as const,\n properties: {\n query: {\n type: 'string',\n description: 'Status name or ID to look up',\n },\n teamId: {\n type: 'string',\n description: 'Team ID the status belongs to',\n },\n },\n required: ['query', 'teamId'],\n },\n },\n {\n name: 'list_issue_labels',\n description:\n \"List available issue labels for a Linear team. Returns label IDs needed for the labelIds parameter in create_issue and update_issue. Accepts team UUID or key (e.g., 'ENG').\",\n inputSchema: {\n type: 'object' as const,\n properties: {\n teamId: {\n type: 'string',\n description: \"Team ID (UUID) or key (e.g., 'ENG')\",\n },\n },\n required: ['teamId'],\n },\n },\n {\n name: 'list_projects',\n description:\n \"List projects in the user's Linear workspace. Returns project names and UUIDs. To update or delete a project, use the UUID from the output or call get_project with the project name.\",\n inputSchema: {\n type: 'object' as const,\n properties: {\n limit: { type: 'number', description: 'Maximum results to return' },\n before: {\n type: 'string',\n description: 'Cursor for backward pagination',\n },\n after: {\n type: 'string',\n description: 'Cursor for forward pagination',\n },\n orderBy: {\n type: 'string',\n enum: ['createdAt', 'updatedAt'],\n description: \"Order results by 'createdAt' or 'updatedAt'\",\n },\n includeArchived: {\n type: 'boolean',\n description: 'Include archived projects',\n },\n teamId: {\n type: 'string',\n description: \"Filter by team ID (UUID) or team key (e.g., 'ENG')\",\n },\n createdAt: {\n type: 'string',\n description: 'Filter by creation date',\n },\n updatedAt: {\n type: 'string',\n description: 'Filter by last update date',\n },\n },\n },\n },\n {\n name: 'get_project',\n description:\n 'Retrieve details of a specific Linear project. Accepts a project name (fuzzy match) or UUID. Returns full details including UUID, which is needed for update_project and delete_project.',\n inputSchema: {\n type: 'object' as const,\n properties: {\n query: {\n type: 'string',\n description: 'Project name (fuzzy match) or UUID',\n },\n },\n required: ['query'],\n },\n },\n {\n name: 'create_project',\n description: 'Create a new project in Linear.',\n inputSchema: {\n type: 'object' as const,\n properties: {\n name: { type: 'string', description: 'Project name' },\n teamId: {\n type: 'string',\n description: \"Team ID (UUID) or key (e.g., 'ENG')\",\n },\n summary: {\n type: 'string',\n description: 'Short project summary (max 255 characters)',\n },\n description: {\n type: 'string',\n description: 'Detailed project description (markdown)',\n },\n startDate: {\n type: 'string',\n description: 'Project start date (ISO 8601 YYYY-MM-DD)',\n },\n targetDate: {\n type: 'string',\n description: 'Project target completion date (ISO 8601 YYYY-MM-DD)',\n },\n },\n required: ['name', 'teamId'],\n },\n },\n {\n name: 'update_project',\n description:\n 'Update an existing Linear project by UUID. To find a project UUID, call get_project with the project name. Only provided fields are changed; omitted fields are left unchanged.',\n inputSchema: {\n type: 'object' as const,\n properties: {\n id: {\n type: 'string',\n description: 'Project UUID. Call get_project with the project name to find this.',\n },\n name: { type: 'string', description: 'New project name' },\n summary: {\n type: 'string',\n description: 'Short summary (max 255 characters)',\n },\n description: {\n type: 'string',\n description: 'Detailed description (markdown)',\n },\n startDate: {\n type: 'string',\n description: 'Start date (ISO 8601 YYYY-MM-DD)',\n },\n targetDate: {\n type: 'string',\n description: 'Target date (ISO 8601 YYYY-MM-DD)',\n },\n },\n required: ['id'],\n },\n },\n {\n name: 'delete_project',\n description:\n 'DESTRUCTIVE: Permanently delete a Linear project by UUID. This cannot be undone. Call get_project with the project name to find the UUID. Always confirm with the user before deleting.',\n inputSchema: {\n type: 'object' as const,\n properties: {\n id: {\n type: 'string',\n description: 'Project UUID. Call get_project with the project name to find this.',\n },\n },\n required: ['id'],\n },\n },\n {\n name: 'list_teams',\n description:\n \"List teams in the user's Linear workspace. Returns team names, keys (e.g., 'ENG'), and UUIDs. Team keys can be used as teamId in other tools.\",\n inputSchema: {\n type: 'object' as const,\n properties: {\n limit: { type: 'number', description: 'Maximum results to return' },\n before: {\n type: 'string',\n description: 'Cursor for backward pagination',\n },\n after: {\n type: 'string',\n description: 'Cursor for forward pagination',\n },\n orderBy: {\n type: 'string',\n enum: ['createdAt', 'updatedAt'],\n description: \"Order results by 'createdAt' or 'updatedAt'\",\n },\n query: {\n type: 'string',\n description: 'Filter by team name or key',\n },\n includeArchived: {\n type: 'boolean',\n description: 'Include archived teams',\n },\n createdAt: {\n type: 'string',\n description: 'Filter by creation date',\n },\n updatedAt: {\n type: 'string',\n description: 'Filter by update date',\n },\n },\n },\n },\n {\n name: 'get_team',\n description: 'Retrieve details of a specific Linear team by name, key, or ID.',\n inputSchema: {\n type: 'object' as const,\n properties: {\n query: {\n type: 'string',\n description: 'Team name, key, or ID to look up',\n },\n },\n required: ['query'],\n },\n },\n {\n name: 'list_users',\n description:\n 'List users in the Linear workspace with their UUIDs, names, emails, and active status. Returns up to 50 users. User UUIDs can be used as assigneeId in other tools.',\n inputSchema: {\n type: 'object' as const,\n properties: {},\n },\n },\n {\n name: 'get_user',\n description: 'Retrieve details of a specific Linear user by name, email, or ID.',\n inputSchema: {\n type: 'object' as const,\n properties: {\n query: {\n type: 'string',\n description: 'User name, email, or ID to look up',\n },\n },\n required: ['query'],\n },\n },\n {\n name: 'list_comments',\n description:\n \"Retrieve comments on a Linear issue. Returns comment text, authors, and comment UUIDs. Accepts an issue UUID or identifier (e.g., 'ENG-123'). To delete a specific comment, use the comment UUID from the output with delete_comment.\",\n inputSchema: {\n type: 'object' as const,\n properties: {\n issueId: {\n type: 'string',\n description: \"Issue UUID or identifier (e.g., 'ENG-123')\",\n },\n },\n required: ['issueId'],\n },\n },\n {\n name: 'create_comment',\n description:\n \"Create a new comment on a Linear issue. Accepts issue UUID or identifier (e.g., 'ENG-123').\",\n inputSchema: {\n type: 'object' as const,\n properties: {\n issueId: {\n type: 'string',\n description: \"Issue UUID or identifier (e.g., 'ENG-123')\",\n },\n body: {\n type: 'string',\n description: 'Comment body text. Supports markdown formatting',\n },\n },\n required: ['issueId', 'body'],\n },\n },\n {\n name: 'delete_comment',\n description:\n 'DESTRUCTIVE: Permanently delete a Linear issue comment by UUID. This cannot be undone. Comment UUIDs are returned by list_comments and get_issue. Always confirm with the user before deleting.',\n inputSchema: {\n type: 'object' as const,\n properties: {\n id: {\n type: 'string',\n description: 'Comment UUID. Find this via list_comments or get_issue.',\n },\n },\n required: ['id'],\n },\n },\n {\n name: 'get_document',\n description: 'Retrieve a Linear document by ID or slug.',\n inputSchema: {\n type: 'object' as const,\n properties: {\n id: {\n type: 'string',\n description: 'Document ID (UUID) or slug',\n },\n },\n required: ['id'],\n },\n },\n {\n name: 'list_documents',\n description:\n \"List documents in the user's Linear workspace. Supports filtering by project, creator, title search, and date ranges.\",\n inputSchema: {\n type: 'object' as const,\n properties: {\n limit: { type: 'number', description: 'Maximum results to return' },\n before: {\n type: 'string',\n description: 'Cursor for backward pagination',\n },\n after: {\n type: 'string',\n description: 'Cursor for forward pagination',\n },\n orderBy: {\n type: 'string',\n enum: ['createdAt', 'updatedAt'],\n description: \"Order results by 'createdAt' or 'updatedAt'\",\n },\n query: { type: 'string', description: 'Text search query' },\n projectId: { type: 'string', description: 'Filter by project ID' },\n creatorId: {\n type: 'string',\n description: 'Filter by creator user ID',\n },\n createdAt: {\n type: 'string',\n description: 'Filter by creation date',\n },\n updatedAt: {\n type: 'string',\n description: 'Filter by update date',\n },\n includeArchived: {\n type: 'boolean',\n description: 'Include archived documents',\n },\n },\n },\n },\n {\n name: 'search_documentation',\n description:\n \"Search Linear's own documentation to learn about Linear features and usage. This is NOT for searching user workspace data -- it searches Linear's help docs.\",\n inputSchema: {\n type: 'object' as const,\n properties: {\n query: {\n type: 'string',\n description: 'Search query for Linear documentation',\n },\n page: {\n type: 'number',\n description: 'Page number for paginated results',\n },\n },\n required: ['query'],\n },\n },\n] as const;\n\nfunction getClient(): LinearGraphQLClient {\n const token = process.env.LINEAR_ACCESS_TOKEN;\n if (!token) {\n throw new Error(\n 'LINEAR_ACCESS_TOKEN environment variable is required. Set it to a Linear API key or OAuth access token.'\n );\n }\n return new LinearGraphQLClient(token);\n}\n\nasync function handleToolCall(name: string, args: Record<string, unknown>): Promise<string> {\n const client = getClient();\n\n const a = args;\n switch (name) {\n case 'list_issues':\n return listIssues(client, a);\n case 'get_issue':\n return getIssue(client, a satisfies Record<string, unknown> as never);\n case 'create_issue':\n return createIssue(client, a satisfies Record<string, unknown> as never);\n case 'update_issue':\n return updateIssue(client, a satisfies Record<string, unknown> as never);\n case 'delete_issue':\n return deleteIssue(client, a satisfies Record<string, unknown> as never);\n case 'list_my_issues':\n return listMyIssues(client, a);\n case 'get_issue_git_branch_name':\n return getIssueGitBranchName(client, a satisfies Record<string, unknown> as never);\n case 'list_issue_statuses':\n return listIssueStatuses(client, a satisfies Record<string, unknown> as never);\n case 'get_issue_status':\n return getIssueStatus(client, a satisfies Record<string, unknown> as never);\n case 'list_issue_labels':\n return listIssueLabels(client, a satisfies Record<string, unknown> as never);\n case 'list_projects':\n return listProjects(client, a);\n case 'get_project':\n return getProject(client, a satisfies Record<string, unknown> as never);\n case 'create_project':\n return createProject(client, a satisfies Record<string, unknown> as never);\n case 'update_project':\n return updateProject(client, a satisfies Record<string, unknown> as never);\n case 'delete_project':\n return deleteProject(client, a satisfies Record<string, unknown> as never);\n case 'list_teams':\n return listTeams(client, a);\n case 'get_team':\n return getTeam(client, a satisfies Record<string, unknown> as never);\n case 'list_users':\n return listUsers(client);\n case 'get_user':\n return getUser(client, a satisfies Record<string, unknown> as never);\n case 'list_comments':\n return listComments(client, a satisfies Record<string, unknown> as never);\n case 'create_comment':\n return createComment(client, a satisfies Record<string, unknown> as never);\n case 'delete_comment':\n return deleteComment(client, a satisfies Record<string, unknown> as never);\n case 'get_document':\n return getDocument(client, a satisfies Record<string, unknown> as never);\n case 'list_documents':\n return listDocuments(client, a);\n case 'search_documentation':\n return searchDocumentation(client, a satisfies Record<string, unknown> as never);\n default:\n throw new Error(`Unknown tool: ${name}`);\n }\n}\n\nasync function main(): Promise<void> {\n const server = new Server(\n { name: '@shipyard/linear-mcp', version: '0.1.0' },\n { capabilities: { tools: {} } }\n );\n\n server.setRequestHandler(ListToolsRequestSchema, async () => ({\n tools: [...TOOL_DEFINITIONS],\n }));\n\n server.setRequestHandler(CallToolRequestSchema, async (request) => {\n const { name, arguments: args } = request.params;\n try {\n const result = await handleToolCall(name, args ?? {});\n return { content: [{ type: 'text', text: result }] };\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n return { content: [{ type: 'text', text: message }], isError: true };\n }\n });\n\n const transport = new StdioServerTransport();\n await server.connect(transport);\n}\n\nmain();\n","const LINEAR_API_URL = 'https://api.linear.app/graphql';\n\ninterface GraphQLResponse<T> {\n data?: T;\n errors?: ReadonlyArray<{ message: string; extensions?: Record<string, unknown> }>;\n}\n\nfunction parseErrorBody(body: string): string {\n if (!body) return '';\n try {\n const parsed: { errors?: Array<{ message: string }>; error?: string } = JSON.parse(\n body\n ) as never;\n if (parsed.errors) {\n return `: ${parsed.errors.map((e) => e.message).join('; ')}`;\n }\n if (parsed.error) {\n return `: ${parsed.error}`;\n }\n return `: ${body}`;\n } catch {\n return `: ${body}`;\n }\n}\n\nasync function readErrorResponse(response: Response): Promise<string> {\n const rateLimitReset = response.headers.get('X-RateLimit-Requests-Reset');\n if (response.status === 429 && rateLimitReset) {\n return `Linear API rate limited. Resets at ${rateLimitReset}. Please wait before retrying.`;\n }\n let body = '';\n try {\n body = await response.text();\n } catch {\n /** NOTE: read errors are expected when the response body is unreadable */\n }\n const detail = parseErrorBody(body);\n return `Linear API request failed (${response.status} ${response.statusText})${detail}`;\n}\n\nfunction stripUndefined(obj: Record<string, unknown>): Record<string, unknown> {\n const result: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(obj)) {\n if (value !== undefined) {\n result[key] = value;\n }\n }\n return result;\n}\n\nexport class LinearGraphQLClient {\n readonly #token: string;\n\n constructor(token: string) {\n this.#token = token;\n }\n\n async query<T>(document: string, variables?: Record<string, unknown>): Promise<T> {\n const cleanedVariables = variables ? stripUndefined(variables) : undefined;\n\n const response = await fetch(LINEAR_API_URL, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Authorization: this.#token,\n },\n body: JSON.stringify({ query: document, variables: cleanedVariables }),\n });\n\n if (!response.ok) {\n throw new Error(await readErrorResponse(response));\n }\n\n const json: GraphQLResponse<T> = (await response.json()) as never;\n\n if (json.errors && json.errors.length > 0) {\n const messages = json.errors\n .map((e) => {\n const ext = e.extensions ? ` (${JSON.stringify(e.extensions)})` : '';\n return `${e.message}${ext}`;\n })\n .join('; ');\n throw new Error(`Linear GraphQL error: ${messages}`);\n }\n\n if (!json.data) {\n throw new Error('Linear API returned no data');\n }\n\n return json.data;\n }\n}\n\nconst UUID_RE = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;\n\nexport function isUUID(value: string): boolean {\n return UUID_RE.test(value);\n}\n\nconst TEAM_KEY_RE = /^[A-Za-z]{1,10}$/;\n\n/**\n * Resolve a team identifier (UUID or key like \"ENG\") to a UUID.\n * Queries the API when given a key.\n */\nexport async function resolveTeamId(\n client: LinearGraphQLClient,\n teamIdOrKey: string\n): Promise<string> {\n if (isUUID(teamIdOrKey)) return teamIdOrKey;\n\n if (TEAM_KEY_RE.test(teamIdOrKey)) {\n const data = await client.query<{\n teams: Connection<{ id: string; key: string }>;\n }>(\n `query($filter: TeamFilter, $first: Int) {\n teams(filter: $filter, first: $first) {\n nodes { id key }\n pageInfo { hasNextPage hasPreviousPage startCursor endCursor }\n }\n }`,\n { filter: { key: { eq: teamIdOrKey.toUpperCase() } }, first: 1 }\n );\n const match = data.teams.nodes[0];\n if (match) return match.id;\n }\n\n throw new Error(`Could not resolve team \"${teamIdOrKey}\". Use a UUID or team key like \"ENG\".`);\n}\n\ninterface PageInfo {\n hasNextPage: boolean;\n hasPreviousPage: boolean;\n startCursor?: string;\n endCursor?: string;\n}\n\nexport interface Connection<T> {\n nodes: T[];\n pageInfo: PageInfo;\n}\n\nexport function formatConnection<T>(\n connection: Connection<T>,\n formatNode: (node: T) => string\n): string {\n const lines = connection.nodes.map(formatNode);\n const pagination: string[] = [];\n if (connection.pageInfo.hasNextPage) {\n pagination.push(`Next page cursor: ${connection.pageInfo.endCursor}`);\n }\n if (connection.pageInfo.hasPreviousPage) {\n pagination.push(`Previous page cursor: ${connection.pageInfo.startCursor}`);\n }\n if (pagination.length > 0) {\n lines.push('', '---', ...pagination);\n }\n return lines.join('\\n');\n}\n","import type { LinearGraphQLClient } from '../graphql.js';\nimport { isUUID } from '../graphql.js';\n\ninterface Comment {\n id: string;\n body: string;\n createdAt: string;\n updatedAt: string;\n user?: { id: string; name: string; email: string };\n}\n\nconst ISSUE_IDENTIFIER_RE = /^[A-Za-z]+-\\d+$/;\n\nasync function resolveIssueIdForComments(\n client: LinearGraphQLClient,\n idOrIdentifier: string\n): Promise<string> {\n if (isUUID(idOrIdentifier)) return idOrIdentifier;\n\n if (ISSUE_IDENTIFIER_RE.test(idOrIdentifier)) {\n const data = await client.query<{\n searchIssues: { nodes: Array<{ id: string; identifier: string }> };\n }>(\n `query($term: String!, $first: Int) {\n searchIssues(term: $term, first: $first) {\n nodes { id identifier }\n pageInfo { hasNextPage hasPreviousPage startCursor endCursor }\n }\n }`,\n { term: idOrIdentifier.toUpperCase(), first: 5 }\n );\n const match = data.searchIssues.nodes.find(\n (n) => n.identifier.toUpperCase() === idOrIdentifier.toUpperCase()\n );\n if (match) return match.id;\n }\n\n throw new Error(\n `Could not resolve issue \"${idOrIdentifier}\". Use a UUID or identifier like \"ENG-123\".`\n );\n}\n\nexport async function listComments(\n client: LinearGraphQLClient,\n params: { issueId: string }\n): Promise<string> {\n const issueId = await resolveIssueIdForComments(client, params.issueId);\n const data = await client.query<{\n issue: {\n identifier: string;\n title: string;\n comments: { nodes: Comment[] };\n };\n }>(\n `query($id: String!) {\n issue(id: $id) {\n identifier title\n comments {\n nodes {\n id body createdAt updatedAt\n user { id name email }\n }\n }\n }\n }`,\n { id: issueId }\n );\n\n const { issue } = data;\n if (issue.comments.nodes.length === 0) {\n return `No comments on ${issue.identifier}: ${issue.title}`;\n }\n\n const lines = [`# Comments on ${issue.identifier}: ${issue.title}`, ''];\n for (const comment of issue.comments.nodes) {\n const author = comment.user ? comment.user.name : 'Unknown';\n lines.push(`**${author}** (${comment.createdAt}) [ID: ${comment.id}]:`);\n lines.push(comment.body, '');\n }\n return lines.join('\\n');\n}\n\nexport async function createComment(\n client: LinearGraphQLClient,\n params: { issueId: string; body: string }\n): Promise<string> {\n const issueId = await resolveIssueIdForComments(client, params.issueId);\n const data = await client.query<{\n commentCreate: {\n success: boolean;\n comment: { id: string; body: string; issue: { identifier: string } };\n };\n }>(\n `mutation($input: CommentCreateInput!) {\n commentCreate(input: $input) {\n success\n comment {\n id body\n issue { identifier }\n }\n }\n }`,\n { input: { issueId, body: params.body } }\n );\n\n const comment = data.commentCreate.comment;\n return `Comment added to ${comment.issue.identifier}\\nID: ${comment.id}`;\n}\n\nexport async function deleteComment(\n client: LinearGraphQLClient,\n params: { id: string }\n): Promise<string> {\n const data = await client.query<{\n commentDelete: { success: boolean };\n }>(\n `mutation($id: String!) {\n commentDelete(id: $id) { success }\n }`,\n { id: params.id }\n );\n\n if (!data.commentDelete.success) {\n throw new Error(`Failed to delete comment \"${params.id}\".`);\n }\n\n return `Deleted comment ${params.id}.`;\n}\n","import type { Connection, LinearGraphQLClient } from '../graphql.js';\nimport { formatConnection } from '../graphql.js';\n\ninterface Document {\n id: string;\n title: string;\n content: string;\n icon?: string;\n color?: string;\n url: string;\n createdAt: string;\n updatedAt: string;\n creator?: { id: string; name: string };\n project?: { id: string; name: string };\n}\n\nconst DOCUMENT_FIELDS = `\n id title icon color url createdAt updatedAt\n creator { id name }\n project { id name }\n`;\n\nfunction formatDocSummary(doc: Document): string {\n const creator = doc.creator ? ` | By: ${doc.creator.name}` : '';\n const project = doc.project ? ` | Project: ${doc.project.name}` : '';\n return `${doc.title}${creator}${project}\\n URL: ${doc.url} | ID: ${doc.id}`;\n}\n\nexport async function getDocument(\n client: LinearGraphQLClient,\n params: { id: string }\n): Promise<string> {\n const data = await client.query<{ document: Document }>(\n `query($id: String!) {\n document(id: $id) {\n ${DOCUMENT_FIELDS}\n content\n }\n }`,\n { id: params.id }\n );\n\n const doc = data.document;\n const lines = [`# ${doc.title}`, '', `**URL:** ${doc.url}`, `**ID:** ${doc.id}`];\n if (doc.creator) lines.push(`**Creator:** ${doc.creator.name}`);\n if (doc.project) lines.push(`**Project:** ${doc.project.name}`);\n lines.push(`**Created:** ${doc.createdAt}`, `**Updated:** ${doc.updatedAt}`);\n if (doc.content) {\n lines.push('', '---', '', doc.content);\n }\n return lines.join('\\n');\n}\n\nconst VALID_PAGINATION_ORDER_BY = new Set(['createdAt', 'updatedAt']);\n\nfunction normalizeOrderBy(orderBy: string | undefined): string | undefined {\n if (!orderBy) return undefined;\n if (VALID_PAGINATION_ORDER_BY.has(orderBy)) return orderBy;\n return undefined;\n}\n\nexport async function listDocuments(\n client: LinearGraphQLClient,\n params: {\n limit?: number;\n before?: string;\n after?: string;\n orderBy?: string;\n query?: string;\n projectId?: string;\n initiativeId?: string;\n creatorId?: string;\n createdAt?: string;\n updatedAt?: string;\n includeArchived?: boolean;\n }\n): Promise<string> {\n const limit = params.limit ?? 25;\n\n const filter: Record<string, unknown> = {};\n if (params.query) filter.title = { containsIgnoreCase: params.query };\n if (params.projectId) filter.project = { id: { eq: params.projectId } };\n if (params.creatorId) filter.creator = { id: { eq: params.creatorId } };\n if (params.createdAt) filter.createdAt = { gte: params.createdAt };\n if (params.updatedAt) filter.updatedAt = { gte: params.updatedAt };\n\n const data = await client.query<{ documents: Connection<Document> }>(\n `query($filter: DocumentFilter, $first: Int, $after: String, $before: String, $includeArchived: Boolean, $orderBy: PaginationOrderBy) {\n documents(filter: $filter, first: $first, after: $after, before: $before, includeArchived: $includeArchived, orderBy: $orderBy) {\n nodes { ${DOCUMENT_FIELDS} }\n pageInfo { hasNextPage hasPreviousPage startCursor endCursor }\n }\n }`,\n {\n filter: Object.keys(filter).length > 0 ? filter : undefined,\n first: limit,\n after: params.after,\n before: params.before,\n includeArchived: params.includeArchived,\n orderBy: normalizeOrderBy(params.orderBy),\n }\n );\n\n if (data.documents.nodes.length === 0) {\n return 'No documents found.';\n }\n\n return formatConnection(data.documents, formatDocSummary);\n}\n\nexport async function searchDocumentation(\n _client: LinearGraphQLClient,\n params: { query: string; page?: number }\n): Promise<string> {\n const page = params.page ?? 1;\n const response = await fetch(\n `https://linear.app/docs/api/search?q=${encodeURIComponent(params.query)}&page=${page}`\n );\n\n if (!response.ok) {\n return `Linear documentation search is not available via this server. Use https://linear.app/docs and search for: ${params.query}`;\n }\n\n const text = await response.text();\n return text || `No documentation results found for: ${params.query}`;\n}\n","import type { Connection, LinearGraphQLClient } from '../graphql.js';\nimport { formatConnection, isUUID, resolveTeamId } from '../graphql.js';\n\nconst ISSUE_IDENTIFIER_RE = /^[A-Za-z]+-\\d+$/;\n\ninterface Issue {\n id: string;\n identifier: string;\n title: string;\n description?: string;\n priority: number;\n priorityLabel: string;\n url: string;\n branchName: string;\n createdAt: string;\n updatedAt: string;\n dueDate?: string;\n estimate?: number;\n state: { id: string; name: string; type: string };\n team: { id: string; key: string; name: string };\n assignee?: { id: string; name: string; email: string };\n project?: { id: string; name: string };\n parent?: { id: string; identifier: string; title: string };\n labels: { nodes: Array<{ id: string; name: string }> };\n attachments: { nodes: Array<{ id: string; title: string; url: string }> };\n comments: {\n nodes: Array<{ id: string; body: string; createdAt: string; user?: { name: string } }>;\n };\n}\n\nconst ISSUE_FIELDS = `\n id identifier title description priority priorityLabel url branchName\n createdAt updatedAt dueDate estimate\n state { id name type }\n team { id key name }\n assignee { id name email }\n project { id name }\n parent { id identifier title }\n labels { nodes { id name } }\n`;\n\nconst ISSUE_DETAIL_FIELDS = `\n ${ISSUE_FIELDS}\n attachments { nodes { id title url } }\n comments { nodes { id body createdAt user { name } } }\n`;\n\nconst ISSUE_LIST_FIELDS = `\n id identifier title priority priorityLabel url\n createdAt updatedAt dueDate\n state { id name type }\n team { id key name }\n assignee { id name email }\n project { id name }\n labels { nodes { id name } }\n`;\n\nfunction formatIssueSummary(issue: {\n id: string;\n identifier: string;\n title: string;\n priority: number;\n priorityLabel: string;\n url: string;\n state: { name: string };\n team: { key: string };\n assignee?: { name: string };\n labels: { nodes: Array<{ name: string }> };\n}): string {\n const assignee = issue.assignee ? ` | Assignee: ${issue.assignee.name}` : '';\n const labels =\n issue.labels.nodes.length > 0\n ? ` | Labels: ${issue.labels.nodes.map((l) => l.name).join(', ')}`\n : '';\n return `[${issue.identifier}] ${issue.title} (${issue.state.name}, ${issue.priorityLabel})${assignee}${labels}\\n URL: ${issue.url}`;\n}\n\nfunction formatIssueMetadata(issue: Issue): string[] {\n const lines = [\n `# ${issue.identifier}: ${issue.title}`,\n '',\n `**Status:** ${issue.state.name} (${issue.state.type})`,\n `**Priority:** ${issue.priorityLabel}`,\n `**Team:** ${issue.team.name} (${issue.team.key})`,\n ];\n if (issue.assignee) lines.push(`**Assignee:** ${issue.assignee.name} (${issue.assignee.email})`);\n if (issue.project) lines.push(`**Project:** ${issue.project.name}`);\n if (issue.parent) lines.push(`**Parent:** ${issue.parent.identifier} - ${issue.parent.title}`);\n if (issue.dueDate) lines.push(`**Due:** ${issue.dueDate}`);\n if (issue.estimate !== undefined) lines.push(`**Estimate:** ${issue.estimate}`);\n if (issue.labels.nodes.length > 0) {\n lines.push(`**Labels:** ${issue.labels.nodes.map((l) => l.name).join(', ')}`);\n }\n lines.push(`**URL:** ${issue.url}`, `**ID:** ${issue.id}`);\n return lines;\n}\n\nfunction formatIssueDetail(issue: Issue): string {\n const lines = formatIssueMetadata(issue);\n if (issue.description) {\n lines.push('', '## Description', '', issue.description);\n }\n if (issue.attachments.nodes.length > 0) {\n lines.push('', '## Attachments');\n for (const a of issue.attachments.nodes) {\n lines.push(`- [${a.title}](${a.url})`);\n }\n }\n if (issue.comments.nodes.length > 0) {\n lines.push('', '## Comments');\n for (const c of issue.comments.nodes) {\n const author = c.user ? c.user.name : 'Unknown';\n lines.push('', `**${author}** (${c.createdAt}) [ID: ${c.id}]:`, c.body);\n }\n }\n return lines.join('\\n');\n}\n\nasync function resolveAssigneeId(\n client: LinearGraphQLClient,\n assigneeId: string | undefined\n): Promise<string | undefined>;\nasync function resolveAssigneeId(\n client: LinearGraphQLClient,\n assigneeId: string | null | undefined\n): Promise<string | null | undefined>;\nasync function resolveAssigneeId(\n client: LinearGraphQLClient,\n assigneeId: string | null | undefined\n): Promise<string | null | undefined> {\n if (assigneeId === 'me') {\n const viewer = await client.query<{ viewer: { id: string } }>(`query { viewer { id } }`);\n return viewer.viewer.id;\n }\n return assigneeId;\n}\n\nconst VALID_PAGINATION_ORDER_BY = new Set(['createdAt', 'updatedAt']);\n\nfunction normalizeOrderBy(orderBy: string | undefined): string | undefined {\n if (!orderBy) return undefined;\n if (VALID_PAGINATION_ORDER_BY.has(orderBy)) return orderBy;\n return undefined;\n}\n\nexport async function listIssues(\n client: LinearGraphQLClient,\n params: {\n query?: string;\n teamId?: string;\n stateId?: string;\n assigneeId?: string;\n parentId?: string;\n projectId?: string;\n createdAt?: string;\n updatedAt?: string;\n includeArchived?: boolean;\n limit?: number;\n before?: string;\n after?: string;\n orderBy?: string;\n }\n): Promise<string> {\n const limit = Math.min(params.limit ?? 25, 100);\n const validOrderBy = normalizeOrderBy(params.orderBy);\n const [teamId, assigneeId] = await Promise.all([\n params.teamId ? resolveTeamId(client, params.teamId) : Promise.resolve(undefined),\n resolveAssigneeId(client, params.assigneeId),\n ]);\n\n if (params.query) {\n const data = await client.query<{\n searchIssues: Connection<{\n id: string;\n identifier: string;\n title: string;\n priority: number;\n priorityLabel: string;\n url: string;\n createdAt: string;\n updatedAt: string;\n dueDate?: string;\n state: { id: string; name: string; type: string };\n team: { id: string; key: string; name: string };\n assignee?: { id: string; name: string; email: string };\n project?: { id: string; name: string };\n labels: { nodes: Array<{ id: string; name: string }> };\n }>;\n }>(\n `query($term: String!, $first: Int, $includeArchived: Boolean) {\n searchIssues(term: $term, first: $first, includeArchived: $includeArchived) {\n nodes { ${ISSUE_LIST_FIELDS} }\n pageInfo { hasNextPage hasPreviousPage startCursor endCursor }\n }\n }`,\n {\n term: params.query,\n first: limit,\n includeArchived: params.includeArchived,\n }\n );\n return formatConnection(data.searchIssues, formatIssueSummary);\n }\n\n const filter = buildIssueFilter({ ...params, teamId, assigneeId });\n\n const data = await client.query<{\n issues: Connection<{\n id: string;\n identifier: string;\n title: string;\n priority: number;\n priorityLabel: string;\n url: string;\n createdAt: string;\n updatedAt: string;\n dueDate?: string;\n state: { id: string; name: string; type: string };\n team: { id: string; key: string; name: string };\n assignee?: { id: string; name: string; email: string };\n project?: { id: string; name: string };\n labels: { nodes: Array<{ id: string; name: string }> };\n }>;\n }>(\n `query($filter: IssueFilter, $first: Int, $after: String, $includeArchived: Boolean, $orderBy: PaginationOrderBy) {\n issues(filter: $filter, first: $first, after: $after, includeArchived: $includeArchived, orderBy: $orderBy) {\n nodes { ${ISSUE_LIST_FIELDS} }\n pageInfo { hasNextPage hasPreviousPage startCursor endCursor }\n }\n }`,\n {\n filter: Object.keys(filter).length > 0 ? filter : undefined,\n first: limit,\n after: params.after,\n includeArchived: params.includeArchived,\n orderBy: validOrderBy,\n }\n );\n return formatConnection(data.issues, formatIssueSummary);\n}\n\nfunction buildIssueFilter(params: {\n teamId?: string;\n stateId?: string;\n assigneeId?: string | null;\n parentId?: string;\n projectId?: string;\n createdAt?: string;\n updatedAt?: string;\n}): Record<string, unknown> {\n const filter: Record<string, unknown> = {};\n if (params.teamId) filter.team = { id: { eq: params.teamId } };\n if (params.stateId) filter.state = { id: { eq: params.stateId } };\n if (params.assigneeId) filter.assignee = { id: { eq: params.assigneeId } };\n if (params.parentId) filter.parent = { id: { eq: params.parentId } };\n if (params.projectId) filter.project = { id: { eq: params.projectId } };\n if (params.createdAt) filter.createdAt = { gte: params.createdAt };\n if (params.updatedAt) filter.updatedAt = { gte: params.updatedAt };\n return filter;\n}\n\nexport async function getIssue(\n client: LinearGraphQLClient,\n params: { id: string }\n): Promise<string> {\n if (isUUID(params.id)) {\n const data = await client.query<{ issue: Issue }>(\n `query($id: String!) {\n issue(id: $id) { ${ISSUE_DETAIL_FIELDS} }\n }`,\n { id: params.id }\n );\n return formatIssueDetail(data.issue);\n }\n\n if (ISSUE_IDENTIFIER_RE.test(params.id)) {\n const searchData = await client.query<{ searchIssues: Connection<Issue> }>(\n `query($term: String!, $first: Int) {\n searchIssues(term: $term, first: $first) {\n nodes { ${ISSUE_DETAIL_FIELDS} }\n pageInfo { hasNextPage hasPreviousPage startCursor endCursor }\n }\n }`,\n { term: params.id.toUpperCase(), first: 5 }\n );\n const match = searchData.searchIssues.nodes.find(\n (n) => n.identifier.toUpperCase() === params.id.toUpperCase()\n );\n if (match) {\n return formatIssueDetail(match);\n }\n }\n\n const searchData = await client.query<{ searchIssues: Connection<Issue> }>(\n `query($term: String!, $first: Int) {\n searchIssues(term: $term, first: $first) {\n nodes { ${ISSUE_DETAIL_FIELDS} }\n pageInfo { hasNextPage hasPreviousPage startCursor endCursor }\n }\n }`,\n { term: params.id, first: 1 }\n );\n const first = searchData.searchIssues.nodes[0];\n if (!first) {\n throw new Error(\n `Issue not found: \"${params.id}\". Try using a UUID, an identifier like \"ENG-123\", or a search term.`\n );\n }\n return formatIssueDetail(first);\n}\n\nexport async function createIssue(\n client: LinearGraphQLClient,\n params: {\n title: string;\n teamId: string;\n description?: string;\n priority?: number;\n projectId?: string;\n parentId?: string;\n stateId?: string;\n assigneeId?: string;\n labelIds?: string[];\n dueDate?: string;\n }\n): Promise<string> {\n const [teamId, assigneeId] = await Promise.all([\n resolveTeamId(client, params.teamId),\n resolveAssigneeId(client, params.assigneeId),\n ]);\n\n const input: Record<string, unknown> = {\n title: params.title,\n teamId,\n };\n if (params.description !== undefined) input.description = params.description;\n if (params.priority !== undefined) input.priority = params.priority;\n if (params.projectId) input.projectId = params.projectId;\n if (params.parentId) input.parentId = params.parentId;\n if (params.stateId) input.stateId = params.stateId;\n if (assigneeId) input.assigneeId = assigneeId;\n if (params.labelIds) input.labelIds = params.labelIds;\n if (params.dueDate) input.dueDate = params.dueDate;\n\n const data = await client.query<{\n issueCreate: {\n success: boolean;\n issue: {\n id: string;\n identifier: string;\n title: string;\n url: string;\n state: { name: string };\n team: { key: string };\n };\n };\n }>(\n `mutation($input: IssueCreateInput!) {\n issueCreate(input: $input) {\n success\n issue {\n id identifier title url\n state { name }\n team { key }\n }\n }\n }`,\n { input }\n );\n\n const issue = data.issueCreate.issue;\n return `Created issue ${issue.identifier}: ${issue.title}\\nStatus: ${issue.state.name}\\nURL: ${issue.url}\\nID: ${issue.id}`;\n}\n\nexport async function updateIssue(\n client: LinearGraphQLClient,\n params: {\n id: string;\n title?: string;\n description?: string;\n priority?: number;\n projectId?: string;\n parentId?: string;\n stateId?: string;\n assigneeId?: string | null;\n labelIds?: string[];\n dueDate?: string;\n estimate?: number;\n }\n): Promise<string> {\n const resolvedId = await resolveIssueId(client, params.id);\n const resolvedAssignee = await resolveAssigneeId(client, params.assigneeId);\n const { id: _id, assigneeId: _assigneeId, ...rest } = params;\n\n const input: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(rest)) {\n if (value !== undefined) {\n input[key] = value;\n }\n }\n if (resolvedAssignee !== undefined) input.assigneeId = resolvedAssignee;\n\n const data = await client.query<{\n issueUpdate: {\n success: boolean;\n issue: {\n id: string;\n identifier: string;\n title: string;\n url: string;\n state: { name: string };\n };\n };\n }>(\n `mutation($id: String!, $input: IssueUpdateInput!) {\n issueUpdate(id: $id, input: $input) {\n success\n issue {\n id identifier title url\n state { name }\n }\n }\n }`,\n { id: resolvedId, input }\n );\n\n const issue = data.issueUpdate.issue;\n return `Updated issue ${issue.identifier}: ${issue.title}\\nStatus: ${issue.state.name}\\nURL: ${issue.url}`;\n}\n\nexport async function deleteIssue(\n client: LinearGraphQLClient,\n params: { id: string }\n): Promise<string> {\n const resolvedId = await resolveIssueId(client, params.id);\n\n const data = await client.query<{\n issueDelete: { success: boolean };\n }>(\n `mutation($id: String!) {\n issueDelete(id: $id) { success }\n }`,\n { id: resolvedId }\n );\n\n if (!data.issueDelete.success) {\n throw new Error(`Failed to delete issue \"${params.id}\".`);\n }\n\n return `Deleted issue ${params.id}.`;\n}\n\nexport async function listMyIssues(\n client: LinearGraphQLClient,\n params: {\n limit?: number;\n before?: string;\n after?: string;\n orderBy?: string;\n }\n): Promise<string> {\n const limit = params.limit ?? 25;\n\n const validOrderBy = normalizeOrderBy(params.orderBy);\n\n const data = await client.query<{\n viewer: {\n assignedIssues: Connection<{\n id: string;\n identifier: string;\n title: string;\n priority: number;\n priorityLabel: string;\n url: string;\n createdAt: string;\n updatedAt: string;\n dueDate?: string;\n state: { id: string; name: string; type: string };\n team: { id: string; key: string; name: string };\n assignee?: { id: string; name: string; email: string };\n project?: { id: string; name: string };\n labels: { nodes: Array<{ id: string; name: string }> };\n }>;\n };\n }>(\n `query($first: Int, $after: String, $before: String, $orderBy: PaginationOrderBy) {\n viewer {\n assignedIssues(first: $first, after: $after, before: $before, orderBy: $orderBy) {\n nodes { ${ISSUE_LIST_FIELDS} }\n pageInfo { hasNextPage hasPreviousPage startCursor endCursor }\n }\n }\n }`,\n {\n first: limit,\n after: params.after,\n before: params.before,\n orderBy: validOrderBy,\n }\n );\n\n if (data.viewer.assignedIssues.nodes.length === 0) {\n return 'No issues assigned to you.';\n }\n\n return formatConnection(data.viewer.assignedIssues, formatIssueSummary);\n}\n\nexport async function getIssueGitBranchName(\n client: LinearGraphQLClient,\n params: { id: string }\n): Promise<string> {\n const issueId = await resolveIssueId(client, params.id);\n const data = await client.query<{ issue: { identifier: string; branchName: string } }>(\n `query($id: String!) {\n issue(id: $id) { identifier branchName }\n }`,\n { id: issueId }\n );\n return `Branch name for ${data.issue.identifier}: ${data.issue.branchName}`;\n}\n\nasync function resolveIssueId(\n client: LinearGraphQLClient,\n idOrIdentifier: string\n): Promise<string> {\n if (isUUID(idOrIdentifier)) return idOrIdentifier;\n\n if (ISSUE_IDENTIFIER_RE.test(idOrIdentifier)) {\n const data = await client.query<{\n searchIssues: Connection<{ id: string; identifier: string }>;\n }>(\n `query($term: String!, $first: Int) {\n searchIssues(term: $term, first: $first) {\n nodes { id identifier }\n pageInfo { hasNextPage hasPreviousPage startCursor endCursor }\n }\n }`,\n { term: idOrIdentifier.toUpperCase(), first: 5 }\n );\n const match = data.searchIssues.nodes.find(\n (n) => n.identifier.toUpperCase() === idOrIdentifier.toUpperCase()\n );\n if (match) return match.id;\n }\n\n throw new Error(\n `Could not resolve issue \"${idOrIdentifier}\". Use a UUID or identifier like \"ENG-123\".`\n );\n}\n","import type { Connection, LinearGraphQLClient } from '../graphql.js';\nimport { formatConnection, isUUID, resolveTeamId } from '../graphql.js';\n\ninterface Project {\n id: string;\n name: string;\n description?: string;\n url: string;\n state: string;\n progress: number;\n startDate?: string;\n targetDate?: string;\n createdAt: string;\n updatedAt: string;\n lead?: { id: string; name: string };\n teams: { nodes: Array<{ id: string; key: string; name: string }> };\n}\n\nconst PROJECT_FIELDS = `\n id name description url state progress\n startDate targetDate createdAt updatedAt\n lead { id name }\n teams { nodes { id key name } }\n`;\n\nfunction formatProjectSummary(project: Project): string {\n const lead = project.lead ? ` | Lead: ${project.lead.name}` : '';\n const teams = project.teams.nodes.map((t) => t.key).join(', ');\n return `${project.name} (${project.state}, ${Math.round(project.progress * 100)}%)${lead}\\n Teams: ${teams} | URL: ${project.url}\\n ID: ${project.id}`;\n}\n\nfunction formatProjectDetail(project: Project): string {\n const lines = [\n `# ${project.name}`,\n '',\n `**State:** ${project.state}`,\n `**Progress:** ${Math.round(project.progress * 100)}%`,\n `**Teams:** ${project.teams.nodes.map((t) => `${t.name} (${t.key})`).join(', ')}`,\n ];\n if (project.lead) lines.push(`**Lead:** ${project.lead.name}`);\n if (project.startDate) lines.push(`**Start Date:** ${project.startDate}`);\n if (project.targetDate) lines.push(`**Target Date:** ${project.targetDate}`);\n lines.push(`**URL:** ${project.url}`, `**ID:** ${project.id}`);\n if (project.description) {\n lines.push('', '## Description', '', project.description);\n }\n return lines.join('\\n');\n}\n\nconst VALID_PAGINATION_ORDER_BY = new Set(['createdAt', 'updatedAt']);\n\nfunction normalizeOrderBy(orderBy: string | undefined): string | undefined {\n if (!orderBy) return undefined;\n if (VALID_PAGINATION_ORDER_BY.has(orderBy)) return orderBy;\n return undefined;\n}\n\nexport async function listProjects(\n client: LinearGraphQLClient,\n params: {\n limit?: number;\n before?: string;\n after?: string;\n orderBy?: string;\n includeArchived?: boolean;\n teamId?: string;\n createdAt?: string;\n updatedAt?: string;\n }\n): Promise<string> {\n const limit = params.limit ?? 25;\n const validOrderBy = normalizeOrderBy(params.orderBy);\n\n if (params.teamId) {\n const teamId = await resolveTeamId(client, params.teamId);\n const data = await client.query<{\n team: { projects: Connection<Project> };\n }>(\n `query($teamId: String!, $first: Int, $after: String, $before: String, $orderBy: PaginationOrderBy, $filter: ProjectFilter) {\n team(id: $teamId) {\n projects(first: $first, after: $after, before: $before, orderBy: $orderBy, filter: $filter) {\n nodes { ${PROJECT_FIELDS} }\n pageInfo { hasNextPage hasPreviousPage startCursor endCursor }\n }\n }\n }`,\n {\n teamId,\n first: limit,\n after: params.after,\n before: params.before,\n orderBy: validOrderBy,\n filter: buildProjectFilter(params),\n }\n );\n\n if (data.team.projects.nodes.length === 0) {\n return 'No projects found for this team.';\n }\n\n return formatConnection(data.team.projects, formatProjectSummary);\n }\n\n const filter = buildProjectFilter(params);\n\n const data = await client.query<{ projects: Connection<Project> }>(\n `query($filter: ProjectFilter, $first: Int, $after: String, $before: String, $includeArchived: Boolean, $orderBy: PaginationOrderBy) {\n projects(filter: $filter, first: $first, after: $after, before: $before, includeArchived: $includeArchived, orderBy: $orderBy) {\n nodes { ${PROJECT_FIELDS} }\n pageInfo { hasNextPage hasPreviousPage startCursor endCursor }\n }\n }`,\n {\n filter,\n first: limit,\n after: params.after,\n before: params.before,\n includeArchived: params.includeArchived,\n orderBy: validOrderBy,\n }\n );\n\n if (data.projects.nodes.length === 0) {\n return 'No projects found.';\n }\n\n return formatConnection(data.projects, formatProjectSummary);\n}\n\nfunction buildProjectFilter(params: {\n createdAt?: string;\n updatedAt?: string;\n}): Record<string, unknown> | undefined {\n const filter: Record<string, unknown> = {};\n if (params.createdAt) filter.createdAt = { gte: params.createdAt };\n if (params.updatedAt) filter.updatedAt = { gte: params.updatedAt };\n return Object.keys(filter).length > 0 ? filter : undefined;\n}\n\nexport async function getProject(\n client: LinearGraphQLClient,\n params: { query: string }\n): Promise<string> {\n if (isUUID(params.query)) {\n const data = await client.query<{ project: Project }>(\n `query($id: String!) {\n project(id: $id) { ${PROJECT_FIELDS} }\n }`,\n { id: params.query }\n );\n return formatProjectDetail(data.project);\n }\n\n const data = await client.query<{ projects: Connection<Project> }>(\n `query($name: String!) {\n projects(filter: { name: { containsIgnoreCase: $name } }, first: 5) {\n nodes { ${PROJECT_FIELDS} }\n pageInfo { hasNextPage hasPreviousPage startCursor endCursor }\n }\n }`,\n { name: params.query }\n );\n\n if (data.projects.nodes.length === 0) {\n throw new Error(`No project matching \"${params.query}\" found.`);\n }\n\n if (data.projects.nodes.length === 1) {\n const first = data.projects.nodes[0];\n if (!first) throw new Error(`No project matching \"${params.query}\" found.`);\n return formatProjectDetail(first);\n }\n\n return formatConnection(data.projects, formatProjectSummary);\n}\n\nexport async function createProject(\n client: LinearGraphQLClient,\n params: {\n name: string;\n teamId: string;\n summary?: string;\n description?: string;\n startDate?: string;\n targetDate?: string;\n }\n): Promise<string> {\n const teamId = await resolveTeamId(client, params.teamId);\n const input: Record<string, unknown> = {\n name: params.name,\n teamIds: [teamId],\n };\n if (params.summary) input.summary = params.summary;\n if (params.description) input.description = params.description;\n if (params.startDate) input.startDate = params.startDate;\n if (params.targetDate) input.targetDate = params.targetDate;\n\n const data = await client.query<{\n projectCreate: {\n success: boolean;\n project: { id: string; name: string; url: string; state: string };\n };\n }>(\n `mutation($input: ProjectCreateInput!) {\n projectCreate(input: $input) {\n success\n project { id name url state }\n }\n }`,\n { input }\n );\n\n const project = data.projectCreate.project;\n return `Created project: ${project.name}\\nState: ${project.state}\\nURL: ${project.url}\\nID: ${project.id}`;\n}\n\nexport async function updateProject(\n client: LinearGraphQLClient,\n params: {\n id: string;\n name?: string;\n summary?: string;\n description?: string;\n startDate?: string;\n targetDate?: string;\n }\n): Promise<string> {\n const { id, ...rest } = params;\n const input: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(rest)) {\n if (value !== undefined) {\n input[key] = value;\n }\n }\n\n const data = await client.query<{\n projectUpdate: {\n success: boolean;\n project: { id: string; name: string; url: string; state: string };\n };\n }>(\n `mutation($id: String!, $input: ProjectUpdateInput!) {\n projectUpdate(id: $id, input: $input) {\n success\n project { id name url state }\n }\n }`,\n { id, input }\n );\n\n const project = data.projectUpdate.project;\n return `Updated project: ${project.name}\\nState: ${project.state}\\nURL: ${project.url}`;\n}\n\nexport async function deleteProject(\n client: LinearGraphQLClient,\n params: { id: string }\n): Promise<string> {\n const data = await client.query<{\n projectDelete: { success: boolean };\n }>(\n `mutation($id: String!) {\n projectDelete(id: $id) { success }\n }`,\n { id: params.id }\n );\n\n if (!data.projectDelete.success) {\n throw new Error(`Failed to delete project \"${params.id}\".`);\n }\n\n return `Deleted project ${params.id}.`;\n}\n","import type { Connection, LinearGraphQLClient } from '../graphql.js';\nimport { formatConnection, isUUID } from '../graphql.js';\n\ninterface Team {\n id: string;\n name: string;\n key: string;\n description?: string;\n icon?: string;\n color?: string;\n private: boolean;\n timezone?: string;\n issueCount: number;\n}\n\nconst TEAM_FIELDS = `\n id name key description icon color private timezone issueCount\n`;\n\nfunction formatTeamSummary(team: Team): string {\n const priv = team.private ? ' (private)' : '';\n return `${team.name} [${team.key}]${priv} | ${team.issueCount} issues\\n ID: ${team.id}`;\n}\n\nfunction formatTeamDetail(team: Team): string {\n const lines = [\n `# ${team.name} [${team.key}]`,\n '',\n `**ID:** ${team.id}`,\n `**Private:** ${team.private}`,\n `**Issues:** ${team.issueCount}`,\n ];\n if (team.description) lines.push(`**Description:** ${team.description}`);\n if (team.timezone) lines.push(`**Timezone:** ${team.timezone}`);\n if (team.color) lines.push(`**Color:** ${team.color}`);\n return lines.join('\\n');\n}\n\nconst VALID_PAGINATION_ORDER_BY = new Set(['createdAt', 'updatedAt']);\n\nfunction normalizeOrderBy(orderBy: string | undefined): string | undefined {\n if (!orderBy) return undefined;\n if (VALID_PAGINATION_ORDER_BY.has(orderBy)) return orderBy;\n return undefined;\n}\n\nexport async function listTeams(\n client: LinearGraphQLClient,\n params: {\n limit?: number;\n before?: string;\n after?: string;\n orderBy?: string;\n query?: string;\n includeArchived?: boolean;\n createdAt?: string;\n updatedAt?: string;\n }\n): Promise<string> {\n const limit = params.limit ?? 50;\n\n const filter: Record<string, unknown> = {};\n if (params.query) filter.name = { containsIgnoreCase: params.query };\n if (params.createdAt) filter.createdAt = { gte: params.createdAt };\n if (params.updatedAt) filter.updatedAt = { gte: params.updatedAt };\n\n const data = await client.query<{ teams: Connection<Team> }>(\n `query($filter: TeamFilter, $first: Int, $after: String, $before: String, $includeArchived: Boolean, $orderBy: PaginationOrderBy) {\n teams(filter: $filter, first: $first, after: $after, before: $before, includeArchived: $includeArchived, orderBy: $orderBy) {\n nodes { ${TEAM_FIELDS} }\n pageInfo { hasNextPage hasPreviousPage startCursor endCursor }\n }\n }`,\n {\n filter: Object.keys(filter).length > 0 ? filter : undefined,\n first: limit,\n after: params.after,\n before: params.before,\n includeArchived: params.includeArchived,\n orderBy: normalizeOrderBy(params.orderBy),\n }\n );\n\n if (data.teams.nodes.length === 0) {\n return 'No teams found.';\n }\n\n return formatConnection(data.teams, formatTeamSummary);\n}\n\nexport async function getTeam(\n client: LinearGraphQLClient,\n params: { query: string }\n): Promise<string> {\n if (isUUID(params.query)) {\n const data = await client.query<{ team: Team }>(\n `query($id: String!) {\n team(id: $id) { ${TEAM_FIELDS} }\n }`,\n { id: params.query }\n );\n return formatTeamDetail(data.team);\n }\n\n const filter = {\n or: [{ name: { containsIgnoreCase: params.query } }, { key: { eq: params.query } }],\n };\n\n const data = await client.query<{ teams: Connection<Team> }>(\n `query($filter: TeamFilter, $first: Int) {\n teams(filter: $filter, first: $first) {\n nodes { ${TEAM_FIELDS} }\n pageInfo { hasNextPage hasPreviousPage startCursor endCursor }\n }\n }`,\n { filter, first: 5 }\n );\n\n if (data.teams.nodes.length === 0) {\n throw new Error(`No team matching \"${params.query}\" found.`);\n }\n\n if (data.teams.nodes.length === 1) {\n const first = data.teams.nodes[0];\n if (!first) throw new Error(`No team matching \"${params.query}\" found.`);\n return formatTeamDetail(first);\n }\n\n return formatConnection(data.teams, formatTeamSummary);\n}\n","import type { Connection, LinearGraphQLClient } from '../graphql.js';\nimport { formatConnection, isUUID } from '../graphql.js';\n\ninterface User {\n id: string;\n name: string;\n displayName: string;\n email: string;\n active: boolean;\n admin: boolean;\n avatarUrl?: string;\n createdAt: string;\n}\n\nconst USER_FIELDS = `id name displayName email active admin avatarUrl createdAt`;\n\nfunction formatUserSummary(user: User): string {\n const status = user.active ? 'active' : 'deactivated';\n const admin = user.admin ? ' (admin)' : '';\n return `${user.displayName} <${user.email}> [${status}${admin}]\\n ID: ${user.id}`;\n}\n\nfunction formatUserDetail(user: User): string {\n return [\n `# ${user.displayName}`,\n '',\n `**Name:** ${user.name}`,\n `**Email:** ${user.email}`,\n `**Active:** ${user.active}`,\n `**Admin:** ${user.admin}`,\n `**ID:** ${user.id}`,\n `**Created:** ${user.createdAt}`,\n ].join('\\n');\n}\n\nexport async function listUsers(client: LinearGraphQLClient): Promise<string> {\n const data = await client.query<{ users: Connection<User> }>(\n `query($first: Int) {\n users(first: $first) {\n nodes { ${USER_FIELDS} }\n pageInfo { hasNextPage hasPreviousPage startCursor endCursor }\n }\n }`,\n { first: 50 }\n );\n\n if (data.users.nodes.length === 0) {\n return 'No users found.';\n }\n\n return formatConnection(data.users, formatUserSummary);\n}\n\nexport async function getUser(\n client: LinearGraphQLClient,\n params: { query: string }\n): Promise<string> {\n if (isUUID(params.query)) {\n const data = await client.query<{ user: User }>(\n `query($id: String!) {\n user(id: $id) { ${USER_FIELDS} }\n }`,\n { id: params.query }\n );\n return formatUserDetail(data.user);\n }\n\n const filter = {\n or: [\n { name: { containsIgnoreCase: params.query } },\n { email: { containsIgnoreCase: params.query } },\n { displayName: { containsIgnoreCase: params.query } },\n ],\n };\n\n const data = await client.query<{ users: Connection<User> }>(\n `query($filter: UserFilter) {\n users(filter: $filter) {\n nodes { ${USER_FIELDS} }\n pageInfo { hasNextPage hasPreviousPage startCursor endCursor }\n }\n }`,\n { filter }\n );\n\n if (data.users.nodes.length === 0) {\n throw new Error(`No user matching \"${params.query}\" found.`);\n }\n\n if (data.users.nodes.length === 1) {\n const first = data.users.nodes[0];\n if (!first) throw new Error(`No user matching \"${params.query}\" found.`);\n return formatUserDetail(first);\n }\n\n return formatConnection(data.users, formatUserSummary);\n}\n","import type { Connection, LinearGraphQLClient } from '../graphql.js';\nimport { formatConnection, isUUID, resolveTeamId } from '../graphql.js';\n\ninterface WorkflowState {\n id: string;\n name: string;\n type: string;\n color: string;\n position: number;\n description?: string;\n team: { id: string; key: string; name: string };\n}\n\ninterface IssueLabel {\n id: string;\n name: string;\n color: string;\n description?: string;\n parent?: { id: string; name: string };\n}\n\nfunction formatWorkflowState(state: WorkflowState): string {\n return `[${state.type}] ${state.name} (${state.color})\\n ID: ${state.id}`;\n}\n\nfunction formatLabel(label: IssueLabel): string {\n const parent = label.parent ? ` (parent: ${label.parent.name})` : '';\n const desc = label.description ? ` - ${label.description}` : '';\n return `${label.name}${parent}${desc}\\n ID: ${label.id} | Color: ${label.color}`;\n}\n\nexport async function listIssueStatuses(\n client: LinearGraphQLClient,\n params: { teamId: string }\n): Promise<string> {\n const teamId = await resolveTeamId(client, params.teamId);\n const filter = { team: { id: { eq: teamId } } };\n\n const data = await client.query<{ workflowStates: Connection<WorkflowState> }>(\n `query($filter: WorkflowStateFilter) {\n workflowStates(filter: $filter) {\n nodes {\n id name type color position description\n team { id key name }\n }\n pageInfo { hasNextPage hasPreviousPage startCursor endCursor }\n }\n }`,\n { filter }\n );\n\n if (data.workflowStates.nodes.length === 0) {\n return 'No workflow states found for this team.';\n }\n\n return formatConnection(data.workflowStates, formatWorkflowState);\n}\n\nexport async function getIssueStatus(\n client: LinearGraphQLClient,\n params: { query: string; teamId: string }\n): Promise<string> {\n if (isUUID(params.query)) {\n const data = await client.query<{ workflowState: WorkflowState }>(\n `query($id: String!) {\n workflowState(id: $id) {\n id name type color position description\n team { id key name }\n }\n }`,\n { id: params.query }\n );\n return formatWorkflowState(data.workflowState);\n }\n\n const teamId = await resolveTeamId(client, params.teamId);\n const filter = {\n team: { id: { eq: teamId } },\n name: { containsIgnoreCase: params.query },\n };\n\n const data = await client.query<{ workflowStates: Connection<WorkflowState> }>(\n `query($filter: WorkflowStateFilter) {\n workflowStates(filter: $filter) {\n nodes {\n id name type color position description\n team { id key name }\n }\n pageInfo { hasNextPage hasPreviousPage startCursor endCursor }\n }\n }`,\n { filter }\n );\n\n if (data.workflowStates.nodes.length === 0) {\n throw new Error(`No workflow state matching \"${params.query}\" found in this team.`);\n }\n\n return data.workflowStates.nodes.map(formatWorkflowState).join('\\n\\n');\n}\n\nexport async function listIssueLabels(\n client: LinearGraphQLClient,\n params: { teamId: string }\n): Promise<string> {\n const teamId = await resolveTeamId(client, params.teamId);\n const filter = { team: { id: { eq: teamId } } };\n\n const data = await client.query<{ issueLabels: Connection<IssueLabel> }>(\n `query($filter: IssueLabelFilter) {\n issueLabels(filter: $filter) {\n nodes {\n id name color description\n parent { id name }\n }\n pageInfo { hasNextPage hasPreviousPage startCursor endCursor }\n }\n }`,\n { filter }\n );\n\n if (data.issueLabels.nodes.length === 0) {\n return 'No labels found for this team.';\n }\n\n return formatConnection(data.issueLabels, formatLabel);\n}\n"],"mappings":"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ACN,aACE;IACF,aAAa;MACX,MAAM;MACN,YAAY;QACV,OAAO,EAAE,MAAM,UAAU,aAAa,qCAAqC;QAC3E,QAAQ;UACN,MAAM;UACN,aAAa;QACf;QACA,SAAS;UACP,MAAM;UACN,aACE;QACJ;QACA,YAAY;UACV,MAAM;UACN,aAAa;QACf;QACA,UAAU;UACR,MAAM;UACN,aAAa;QACf;QACA,WAAW,EAAE,MAAM,UAAU,aAAa,uBAAuB;QACjE,WAAW;UACT,MAAM;UACN,aAAa;QACf;QACA,WAAW;UACT,MAAM;UACN,aAAa;QACf;QACA,iBAAiB;UACf,MAAM;UACN,aAAa;QACf;QACA,OAAO;UACL,MAAM;UACN,aAAa;QACf;QACA,OAAO;UACL,MAAM;UACN,aAAa;QACf;QACA,SAAS;UACP,MAAM;UACN,MAAM,CAAC,aAAa,WAAW;UAC/B,aAAa;QACf;MACF;IACF;EACF;EACA;IACE,MAAM;IACN,aACE;IACF,aAAa;MACX,MAAM;MACN,YAAY;QACV,IAAI;UACF,MAAM;UACN,aACE;QACJ;MACF;MACA,UAAU,CAAC,IAAI;IACjB;EACF;EACA;IACE,MAAM;IACN,aACE;IACF,aAAa;MACX,MAAM;MACN,YAAY;QACV,OAAO,EAAE,MAAM,UAAU,aAAa,yBAAyB;QAC/D,QAAQ;UACN,MAAM;UACN,aAAa;QACf;QACA,aAAa;UACX,MAAM;UACN,aAAa;QACf;QACA,UAAU;UACR,MAAM;UACN,aAAa;UACb,MAAM,CAAC,GAAG,GAAG,GAAG,GAAG,CAAC;QACtB;QACA,WAAW;UACT,MAAM;UACN,aAAa;QACf;QACA,UAAU;UACR,MAAM;UACN,aAAa;QACf;QACA,SAAS;UACP,MAAM;UACN,aACE;QACJ;QACA,YAAY;UACV,MAAM;UACN,aAAa;QACf;QACA,UAAU;UACR,MAAM;UACN,OAAO,EAAE,MAAM,SAAS;UACxB,aAAa;QACf;QACA,SAAS;UACP,MAAM;UACN,aAAa;QACf;MACF;MACA,UAAU,CAAC,SAAS,QAAQ;IAC9B;EACF;EACA;IACE,MAAM;IACN,aACE;IACF,aAAa;MACX,MAAM;MACN,YAAY;QACV,IAAI;UACF,MAAM;UACN,aAAa;QACf;QACA,OAAO,EAAE,MAAM,UAAU,aAAa,kBAAkB;QACxD,aAAa;UACX,MAAM;UACN,aAAa;QACf;QACA,UAAU;UACR,MAAM;UACN,aAAa;UACb,MAAM,CAAC,GAAG,GAAG,GAAG,GAAG,CAAC;QACtB;QACA,WAAW;UACT,MAAM;UACN,aAAa;QACf;QACA,UAAU;UACR,MAAM;UACN,aAAa;QACf;QACA,SAAS;UACP,MAAM;UACN,aAAa;QACf;QACA,YAAY;UACV,MAAM;UACN,aAAa;QACf;QACA,UAAU;UACR,MAAM;UACN,OAAO,EAAE,MAAM,SAAS;UACxB,aAAa;QACf;QACA,SAAS;UACP,MAAM;UACN,aAAa;QACf;QACA,UAAU;UACR,MAAM;UACN,aAAa;QACf;MACF;MACA,UAAU,CAAC,IAAI;IACjB;EACF;EACA;IACE,MAAM;IACN,aACE;IACF,aAAa;MACX,MAAM;MACN,YAAY;QACV,IAAI;UACF,MAAM;UACN,aAAa;QACf;MACF;MACA,UAAU,CAAC,IAAI;IACjB;EACF;EACA;IACE,MAAM;IACN,aACE;IACF,aAAa;MACX,MAAM;MACN,YAAY;QACV,OAAO,EAAE,MAAM,UAAU,aAAa,4BAA4B;QAClE,QAAQ;UACN,MAAM;UACN,aAAa;QACf;QACA,OAAO;UACL,MAAM;UACN,aAAa;QACf;QACA,SAAS;UACP,MAAM;UACN,MAAM,CAAC,aAAa,WAAW;UAC/B,aAAa;QACf;MACF;IACF;EACF;EACA;IACE,MAAM;IACN,aACE;IACF,aAAa;MACX,MAAM;MACN,YAAY;QACV,IAAI;UACF,MAAM;UACN,aAAa;QACf;MACF;MACA,UAAU,CAAC,IAAI;IACjB;EACF;EACA;IACE,MAAM;IACN,aACE;IACF,aAAa;MACX,MAAM;MACN,YAAY;QACV,QAAQ;UACN,MAAM;UACN,aAAa;QACf;MACF;MACA,UAAU,CAAC,QAAQ;IACrB;EACF;EACA;IACE,MAAM;IACN,aAAa;IACb,aAAa;MACX,MAAM;MACN,YAAY;QACV,OAAO;UACL,MAAM;UACN,aAAa;QACf;QACA,QAAQ;UACN,MAAM;UACN,aAAa;QACf;MACF;MACA,UAAU,CAAC,SAAS,QAAQ;IAC9B;EACF;EACA;IACE,MAAM;IACN,aACE;IACF,aAAa;MACX,MAAM;MACN,YAAY;QACV,QAAQ;UACN,MAAM;UACN,aAAa;QACf;MACF;MACA,UAAU,CAAC,QAAQ;IACrB;EACF;EACA;IACE,MAAM;IACN,aACE;IACF,aAAa;MACX,MAAM;MACN,YAAY;QACV,OAAO,EAAE,MAAM,UAAU,aAAa,4BAA4B;QAClE,QAAQ;UACN,MAAM;UACN,aAAa;QACf;QACA,OAAO;UACL,MAAM;UACN,aAAa;QACf;QACA,SAAS;UACP,MAAM;UACN,MAAM,CAAC,aAAa,WAAW;UAC/B,aAAa;QACf;QACA,iBAAiB;UACf,MAAM;UACN,aAAa;QACf;QACA,QAAQ;UACN,MAAM;UACN,aAAa;QACf;QACA,WAAW;UACT,MAAM;UACN,aAAa;QACf;QACA,WAAW;UACT,MAAM;UACN,aAAa;QACf;MACF;IACF;EACF;EACA;IACE,MAAM;IACN,aACE;IACF,aAAa;MACX,MAAM;MACN,YAAY;QACV,OAAO;UACL,MAAM;UACN,aAAa;QACf;MACF;MACA,UAAU,CAAC,OAAO;IACpB;EACF;EACA;IACE,MAAM;IACN,aAAa;IACb,aAAa;MACX,MAAM;MACN,YAAY;QACV,MAAM,EAAE,MAAM,UAAU,aAAa,eAAe;QACpD,QAAQ;UACN,MAAM;UACN,aAAa;QACf;QACA,SAAS;UACP,MAAM;UACN,aAAa;QACf;QACA,aAAa;UACX,MAAM;UACN,aAAa;QACf;QACA,WAAW;UACT,MAAM;UACN,aAAa;QACf;QACA,YAAY;UACV,MAAM;UACN,aAAa;QACf;MACF;MACA,UAAU,CAAC,QAAQ,QAAQ;IAC7B;EACF;EACA;IACE,MAAM;IACN,aACE;IACF,aAAa;MACX,MAAM;MACN,YAAY;QACV,IAAI;UACF,MAAM;UACN,aAAa;QACf;QACA,MAAM,EAAE,MAAM,UAAU,aAAa,mBAAmB;QACxD,SAAS;UACP,MAAM;UACN,aAAa;QACf;QACA,aAAa;UACX,MAAM;UACN,aAAa;QACf;QACA,WAAW;UACT,MAAM;UACN,aAAa;QACf;QACA,YAAY;UACV,MAAM;UACN,aAAa;QACf;MACF;MACA,UAAU,CAAC,IAAI;IACjB;EACF;EACA;IACE,MAAM;IACN,aACE;IACF,aAAa;MACX,MAAM;MACN,YAAY;QACV,IAAI;UACF,MAAM;UACN,aAAa;QACf;MACF;MACA,UAAU,CAAC,IAAI;IACjB;EACF;EACA;IACE,MAAM;IACN,aACE;IACF,aAAa;MACX,MAAM;MACN,YAAY;QACV,OAAO,EAAE,MAAM,UAAU,aAAa,4BAA4B;QAClE,QAAQ;UACN,MAAM;UACN,aAAa;QACf;QACA,OAAO;UACL,MAAM;UACN,aAAa;QACf;QACA,SAAS;UACP,MAAM;UACN,MAAM,CAAC,aAAa,WAAW;UAC/B,aAAa;QACf;QACA,OAAO;UACL,MAAM;UACN,aAAa;QACf;QACA,iBAAiB;UACf,MAAM;UACN,aAAa;QACf;QACA,WAAW;UACT,MAAM;UACN,aAAa;QACf;QACA,WAAW;UACT,MAAM;UACN,aAAa;QACf;MACF;IACF;EACF;EACA;IACE,MAAM;IACN,aAAa;IACb,aAAa;MACX,MAAM;MACN,YAAY;QACV,OAAO;UACL,MAAM;UACN,aAAa;QACf;MACF;MACA,UAAU,CAAC,OAAO;IACpB;EACF;EACA;IACE,MAAM;IACN,aACE;IACF,aAAa;MACX,MAAM;MACN,YAAY,CAAC;IACf;EACF;EACA;IACE,MAAM;IACN,aAAa;IACb,aAAa;MACX,MAAM;MACN,YAAY;QACV,OAAO;UACL,MAAM;UACN,aAAa;QACf;MACF;MACA,UAAU,CAAC,OAAO;IACpB;EACF;EACA;IACE,MAAM;IACN,aACE;IACF,aAAa;MACX,MAAM;MACN,YAAY;QACV,SAAS;UACP,MAAM;UACN,aAAa;QACf;MACF;MACA,UAAU,CAAC,SAAS;IACtB;EACF;EACA;IACE,MAAM;IACN,aACE;IACF,aAAa;MACX,MAAM;MACN,YAAY;QACV,SAAS;UACP,MAAM;UACN,aAAa;QACf;QACA,MAAM;UACJ,MAAM;UACN,aAAa;QA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","names":["ISSUE_IDENTIFIER_RE","VALID_PAGINATION_ORDER_BY","normalizeOrderBy","data","searchData"]}