import { LinearAPIClient } from '../linear-client.js';
import {
ListIssuesSchema,
CreateIssueSchema,
UpdateIssueSchema,
GetIssueSchema,
SearchIssuesSchema,
AssignIssueSchema,
AddCommentSchema,
} from '../schemas/index.js';
/**
* List issues with optional filters
*/
export async function listIssues(client: LinearAPIClient, args: unknown) {
const params = ListIssuesSchema.parse(args);
const issues = await client.listIssues(params);
return {
content: [
{
type: 'text' as const,
text: JSON.stringify(
{
count: issues.length,
issues: issues,
},
null,
2
),
},
],
};
}
/**
* Create a new issue
*/
export async function createIssue(client: LinearAPIClient, args: unknown) {
const params = CreateIssueSchema.parse(args);
const issue = await client.createIssue(params);
return {
content: [
{
type: 'text' as const,
text: JSON.stringify(
{
success: true,
message: `Issue created: ${issue.identifier} - ${issue.title}`,
issue: issue,
},
null,
2
),
},
],
};
}
/**
* Update an existing issue
*/
export async function updateIssue(client: LinearAPIClient, args: unknown) {
const params = UpdateIssueSchema.parse(args);
const { issueId, ...updateData } = params;
const issue = await client.updateIssue(issueId, updateData);
return {
content: [
{
type: 'text' as const,
text: JSON.stringify(
{
success: true,
message: `Issue updated: ${issue.identifier}`,
issue: issue,
},
null,
2
),
},
],
};
}
/**
* Get issue details by ID or identifier
*/
export async function getIssue(client: LinearAPIClient, args: unknown) {
const params = GetIssueSchema.parse(args);
const issue = await client.getIssue(params.issueId);
return {
content: [
{
type: 'text' as const,
text: JSON.stringify(issue, null, 2),
},
],
};
}
/**
* Search issues by text query
*/
export async function searchIssues(client: LinearAPIClient, args: unknown) {
const params = SearchIssuesSchema.parse(args);
const { query, ...options } = params;
const issues = await client.searchIssues(query, options);
return {
content: [
{
type: 'text' as const,
text: JSON.stringify(
{
query: query,
count: issues.length,
issues: issues,
},
null,
2
),
},
],
};
}
/**
* Assign an issue to a user
*/
export async function assignIssue(client: LinearAPIClient, args: unknown) {
const params = AssignIssueSchema.parse(args);
const issue = await client.updateIssue(params.issueId, {
assigneeId: params.assigneeId,
});
return {
content: [
{
type: 'text' as const,
text: JSON.stringify(
{
success: true,
message: `Issue ${issue.identifier} assigned to ${issue.assignee?.name || 'user'}`,
issue: issue,
},
null,
2
),
},
],
};
}
/**
* Add a comment to an issue
*/
export async function addComment(client: LinearAPIClient, args: unknown) {
const params = AddCommentSchema.parse(args);
const comment = await client.addComment(params.issueId, params.body);
return {
content: [
{
type: 'text' as const,
text: JSON.stringify(
{
success: true,
message: 'Comment added successfully',
comment: comment,
},
null,
2
),
},
],
};
}