@rallycry/conveyor-mcp 2.1.3 → 2.2.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.
- package/dist/cli.js +31 -13
- package/dist/cli.js.map +1 -1
- package/package.json +1 -1
package/dist/cli.js
CHANGED
|
@@ -299,10 +299,39 @@ function registerListTaskFiles(server2, conn2) {
|
|
|
299
299
|
}
|
|
300
300
|
);
|
|
301
301
|
}
|
|
302
|
+
function buildTextContent(file, content) {
|
|
303
|
+
const start = file.contentByteOffset ?? 0;
|
|
304
|
+
const shown = Buffer.byteLength(content, "utf-8");
|
|
305
|
+
const total = file.contentTotalBytes ?? shown;
|
|
306
|
+
const more = file.contentTruncated ? ` \u2014 showing bytes ${start}\u2013${start + shown} of ${total}; pass offset=${start + shown} for the next page, or fetch the full file at downloadUrl` : "";
|
|
307
|
+
const header = `${file.fileName ?? "file"} (${file.mimeType ?? "?"}, ${total} bytes)${more}
|
|
308
|
+
${file.downloadUrl ? `downloadUrl: ${file.downloadUrl}
|
|
309
|
+
` : ""}---
|
|
310
|
+
`;
|
|
311
|
+
return [{ type: "text", text: header + content }];
|
|
312
|
+
}
|
|
313
|
+
function buildImageContent(file, content, mimeType) {
|
|
314
|
+
const header = `${file.fileName ?? "file"} (${mimeType}, ${file.fileSize ?? "?"} bytes)${file.downloadUrl ? `
|
|
315
|
+
downloadUrl: ${file.downloadUrl}` : ""}`;
|
|
316
|
+
return [
|
|
317
|
+
{ type: "text", text: header },
|
|
318
|
+
{ type: "image", data: content, mimeType }
|
|
319
|
+
];
|
|
320
|
+
}
|
|
321
|
+
function buildAttachmentContent(file) {
|
|
322
|
+
if (typeof file.content === "string" && file.contentEncoding === "utf-8") {
|
|
323
|
+
return buildTextContent(file, file.content);
|
|
324
|
+
}
|
|
325
|
+
if (typeof file.content === "string" && file.contentEncoding === "base64" && file.mimeType?.startsWith("image/")) {
|
|
326
|
+
return buildImageContent(file, file.content, file.mimeType);
|
|
327
|
+
}
|
|
328
|
+
const { content: _content, ...metadata } = file;
|
|
329
|
+
return [{ type: "text", text: JSON.stringify(metadata, null, 2) }];
|
|
330
|
+
}
|
|
302
331
|
function registerGetAttachment(server2, conn2) {
|
|
303
332
|
server2.tool(
|
|
304
333
|
"get_attachment",
|
|
305
|
-
"Fetch one task file's content plus metadata by file ID (accepts task id or slug). Large text files (logs, JSON) are returned in pages \u2014 use `offset`/`maxBytes` to read more, or fetch `downloadUrl` for the whole file. Call list_task_files first to discover IDs and sizes.",
|
|
334
|
+
"Fetch one task file's content plus metadata by file ID (accepts task id or slug). Images are returned as viewable image blocks. Large text files (logs, JSON) are returned in pages \u2014 use `offset`/`maxBytes` to read more, or fetch `downloadUrl` for the whole file. Call list_task_files first to discover IDs and sizes.",
|
|
306
335
|
{
|
|
307
336
|
taskId: z3.string().describe("The task ID or slug"),
|
|
308
337
|
fileId: z3.string().describe("The file ID to fetch"),
|
|
@@ -314,18 +343,7 @@ function registerGetAttachment(server2, conn2) {
|
|
|
314
343
|
offset: params.offset,
|
|
315
344
|
maxBytes: params.maxBytes
|
|
316
345
|
});
|
|
317
|
-
|
|
318
|
-
const start = file.contentByteOffset ?? 0;
|
|
319
|
-
const shown = Buffer.byteLength(file.content, "utf-8");
|
|
320
|
-
const total = file.contentTotalBytes ?? shown;
|
|
321
|
-
const more = file.contentTruncated ? ` \u2014 showing bytes ${start}\u2013${start + shown} of ${total}; pass offset=${start + shown} for the next page, or fetch the full file at downloadUrl` : "";
|
|
322
|
-
const header = `${file.fileName ?? "file"} (${file.mimeType ?? "?"}, ${total} bytes)${more}
|
|
323
|
-
${file.downloadUrl ? `downloadUrl: ${file.downloadUrl}
|
|
324
|
-
` : ""}---
|
|
325
|
-
`;
|
|
326
|
-
return { content: [{ type: "text", text: header + file.content }] };
|
|
327
|
-
}
|
|
328
|
-
return { content: [{ type: "text", text: JSON.stringify(file, null, 2) }] };
|
|
346
|
+
return { content: buildAttachmentContent(file) };
|
|
329
347
|
}
|
|
330
348
|
);
|
|
331
349
|
}
|
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/cli.ts","../src/tools/project.ts","../src/tools/tasks.ts","../src/tools/builds.ts","../src/tools/attachments.ts","../src/tools/pull-request.ts","../src/tools/subtasks.ts","../src/tools/dependencies.ts","../src/tools/suggestions.ts","../src/tools/index.ts"],"sourcesContent":["#!/usr/bin/env node\n\nimport { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { StdioServerTransport } from \"@modelcontextprotocol/sdk/server/stdio.js\";\nimport { ConveyorConnection } from \"./connection.js\";\nimport { registerAllTools } from \"./tools/index.js\";\n\nconst apiUrl = process.env.CONVEYOR_API_URL;\nconst projectToken = process.env.CONVEYOR_PROJECT_TOKEN;\nconst projectId = process.env.CONVEYOR_PROJECT_ID;\n\nif (!apiUrl || !projectToken || !projectId) {\n process.stderr.write(\n \"Error: CONVEYOR_API_URL, CONVEYOR_PROJECT_TOKEN, and CONVEYOR_PROJECT_ID environment variables are required.\\n\",\n );\n process.exit(1);\n}\n\nconst conn = new ConveyorConnection({ apiUrl, projectToken, projectId });\n\ntry {\n await conn.connect();\n process.stderr.write(\"Connected to Conveyor API\\n\");\n} catch (err) {\n process.stderr.write(`Failed to connect to Conveyor API: ${err}\\n`);\n process.exit(1);\n}\n\nconst server = new McpServer({\n name: \"conveyor\",\n version: \"2.1.2\",\n});\n\nregisterAllTools(server, conn);\n\nconst transport = new StdioServerTransport();\nawait server.connect(transport);\n\nprocess.on(\"SIGINT\", () => {\n conn.disconnect();\n process.exit(0);\n});\n\nprocess.on(\"SIGTERM\", () => {\n conn.disconnect();\n process.exit(0);\n});\n","import type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport type { ConveyorConnection } from \"../connection.js\";\n\nexport function registerProjectTools(server: McpServer, conn: ConveyorConnection): void {\n server.tool(\n \"get_project_summary\",\n \"Get overall project status: task counts by status, active builds, repo info\",\n {},\n async () => {\n const summary = await conn.getProjectSummary();\n return { content: [{ type: \"text\", text: JSON.stringify(summary, null, 2) }] };\n },\n );\n}\n","import { z } from \"zod\";\nimport type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport type { ConveyorConnection } from \"../connection.js\";\n\nconst CLI_EVENT_FORMATTERS: Record<string, (data: Record<string, unknown>) => string> = {\n thinking: (data) => String(data.message ?? \"\"),\n tool_use: (data) => `${data.tool}: ${String(data.input ?? \"\").slice(0, 1000)}`,\n tool_result: (data) =>\n `${data.tool} → ${String(data.output ?? \"\").slice(0, 500)}${data.isError ? \" [ERROR]\" : \"\"}`,\n message: (data) => String(data.content ?? \"\"),\n error: (data) => `ERROR: ${String(data.message ?? \"\")}`,\n completed: (data) =>\n `Completed: ${data.summary ?? \"\"} (cost: $${data.costUsd ?? \"?\"}, duration: ${data.durationMs ?? \"?\"}ms)`,\n setup_output: (data) => `[${data.stream ?? \"stdout\"}] ${String(data.data ?? \"\")}`,\n start_command_output: (data) => `[${data.stream ?? \"stdout\"}] ${String(data.data ?? \"\")}`,\n turn_end: (data) =>\n `Turn complete (${Array.isArray(data.toolCalls) ? data.toolCalls.length : 0} tool calls)`,\n};\n\nfunction formatCliEventSummary(type: string, data: Record<string, unknown>): string {\n const formatter = CLI_EVENT_FORMATTERS[type];\n return formatter ? formatter(data) : JSON.stringify(data);\n}\n\nconst STATUS_ENUM = [\n \"Planning\",\n \"Open\",\n \"InProgress\",\n \"ReviewPR\",\n \"ReviewDev\",\n \"ReviewLive\",\n \"Complete\",\n \"Cancelled\",\n] as const;\n\nfunction registerListTasks(server: McpServer, conn: ConveyorConnection): void {\n server.tool(\n \"list_tasks\",\n \"List project tasks, optionally filtered by status or assignee\",\n {\n status: z.enum(STATUS_ENUM).optional().describe(\"Filter by task status\"),\n assigneeId: z.string().optional().describe(\"Filter by assigned user ID\"),\n limit: z.number().optional().describe(\"Max tasks to return (default 50)\"),\n },\n async (params) => {\n const tasks = await conn.listTasks(params);\n return { content: [{ type: \"text\", text: JSON.stringify(tasks, null, 2) }] };\n },\n );\n}\n\nfunction registerGetTask(server: McpServer, conn: ConveyorConnection): void {\n server.tool(\n \"get_task\",\n \"Get full task details including plan, chat history, PR info, subtasks, and build status\",\n {\n taskId: z.string().describe(\"The task ID or slug (the value in a card URL, /cards/<slug>)\"),\n },\n async (params) => {\n const task = await conn.getTask(params.taskId);\n return { content: [{ type: \"text\", text: JSON.stringify(task, null, 2) }] };\n },\n );\n}\n\nfunction registerCreateTask(server: McpServer, conn: ConveyorConnection): void {\n server.tool(\n \"create_task\",\n \"Create a new task with title, description, and optional plan\",\n {\n title: z.string().describe(\"Task title\"),\n description: z.string().optional().describe(\"Task description\"),\n plan: z.string().optional().describe(\"Task implementation plan (markdown)\"),\n status: z\n .enum([\"Planning\", \"Open\"])\n .optional()\n .describe(\"Initial status (default: Planning)\"),\n },\n async (params) => {\n const task = await conn.createTask(params);\n return {\n content: [{ type: \"text\", text: `Task created: ${task.id} (slug: ${task.slug})` }],\n };\n },\n );\n}\n\nfunction registerUpdateTask(server: McpServer, conn: ConveyorConnection): void {\n server.tool(\n \"update_task\",\n \"Update task fields: title, description, plan, status, or assignment\",\n {\n taskId: z.string().describe(\"The task ID\"),\n title: z.string().optional().describe(\"New title\"),\n description: z.string().optional().describe(\"New description\"),\n plan: z.string().optional().describe(\"New plan (markdown)\"),\n status: z.enum(STATUS_ENUM).optional().describe(\"New status\"),\n assignedUserId: z.string().nullable().optional().describe(\"User ID to assign, or null\"),\n },\n async (params) => {\n const result = await conn.updateTask(params);\n return {\n content: [{ type: \"text\", text: `Task ${result.id} updated (status: ${result.status})` }],\n };\n },\n );\n}\n\nfunction registerChatTools(server: McpServer, conn: ConveyorConnection): void {\n server.tool(\n \"get_task_chat\",\n \"Read messages from a task's chat\",\n {\n taskId: z.string().describe(\"The task ID\"),\n limit: z.number().optional().describe(\"Max messages to return (default 50)\"),\n },\n async (params) => {\n const messages = await conn.getTaskChat(params.taskId, params.limit);\n return { content: [{ type: \"text\", text: JSON.stringify(messages, null, 2) }] };\n },\n );\n\n server.tool(\n \"post_to_task_chat\",\n \"Post a message to a task's chat\",\n {\n taskId: z.string().describe(\"The task ID\"),\n content: z.string().describe(\"Message content\"),\n },\n async (params) => {\n await conn.postToTaskChat(params.taskId, params.content);\n return { content: [{ type: \"text\", text: \"Message posted\" }] };\n },\n );\n}\n\nfunction registerGetTaskCli(server: McpServer, conn: ConveyorConnection): void {\n server.tool(\n \"get_task_cli\",\n \"Read CLI execution logs from a task. Returns agent reasoning, tool calls, setup output, and other execution events.\",\n {\n taskId: z.string().describe(\"The task ID or slug\"),\n source: z\n .enum([\"agent\", \"application\"])\n .optional()\n .describe(\n \"Filter by log source: 'agent' for reasoning/tool calls, 'application' for setup/dev-server output\",\n ),\n limit: z.number().optional().describe(\"Max entries to return (default 50, max 500)\"),\n },\n async ({ taskId, source, limit }) => {\n const effectiveLimit = Math.min(limit ?? 50, 500);\n const logs = await conn.getTaskCli(taskId, effectiveLimit, source);\n const formatted = logs\n .map((log) => {\n return `[${log.timestamp}] [${log.type}] ${formatCliEventSummary(log.type, log.data)}`;\n })\n .join(\"\\n\");\n return {\n content: [{ type: \"text\" as const, text: formatted || \"No CLI logs found for this task.\" }],\n };\n },\n );\n}\n\nfunction registerSearchTasks(server: McpServer, conn: ConveyorConnection): void {\n server.tool(\n \"search_tasks\",\n \"Search tasks by tag name, text query, and/or status. Use tag names like 'agent-runner', not IDs.\",\n {\n tagNames: z\n .array(z.string())\n .optional()\n .describe('Tag names to filter by (e.g., [\"agent-runner\", \"chat\"])'),\n searchQuery: z.string().optional().describe(\"Text search on title and description\"),\n statusFilters: z\n .array(z.enum(STATUS_ENUM))\n .optional()\n .describe(\"Filter by one or more statuses\"),\n limit: z.number().optional().describe(\"Max results to return (default 20)\"),\n },\n async (params) => {\n const tasks = await conn.searchTasks(params);\n return { content: [{ type: \"text\", text: JSON.stringify(tasks, null, 2) }] };\n },\n );\n}\n\nfunction registerListTags(server: McpServer, conn: ConveyorConnection): void {\n server.tool(\n \"list_tags\",\n \"List all project tags with their names, IDs, and colors\",\n {},\n async () => {\n const tags = await conn.listTags();\n return { content: [{ type: \"text\", text: JSON.stringify(tags, null, 2) }] };\n },\n );\n}\n\nfunction registerReviewTools(server: McpServer, conn: ConveyorConnection): void {\n server.tool(\n \"approve_task\",\n \"Move a task forward in the review flow (ReviewPR -> ReviewDev, or -> Complete)\",\n {\n taskId: z.string().describe(\"The task ID\"),\n },\n async (params) => {\n const result = await conn.approveTask(params.taskId);\n return {\n content: [{ type: \"text\", text: `Task approved, new status: ${result.status}` }],\n };\n },\n );\n\n server.tool(\n \"approve_and_merge_pr\",\n \"Approve and merge a child task's pull request. Only succeeds if all CI/CD checks are passing. The child task must be in ReviewPR status with a PR.\",\n {\n childTaskId: z.string().describe(\"The child task ID whose PR should be approved and merged\"),\n },\n async (params) => {\n const result = await conn.approveAndMergePR(params.childTaskId);\n return {\n content: [\n {\n type: \"text\",\n text: `PR #${result.prNumber} approved and merged for task ${result.childTaskId}`,\n },\n ],\n };\n },\n );\n\n server.tool(\n \"request_changes\",\n \"Post feedback and send task back to InProgress for more work\",\n {\n taskId: z.string().describe(\"The task ID\"),\n feedback: z.string().describe(\"Feedback message describing requested changes\"),\n },\n async (params) => {\n await conn.requestChanges(params.taskId, params.feedback);\n return { content: [{ type: \"text\", text: \"Changes requested, task moved to InProgress\" }] };\n },\n );\n}\n\nexport function registerTaskTools(server: McpServer, conn: ConveyorConnection): void {\n registerListTasks(server, conn);\n registerGetTask(server, conn);\n registerCreateTask(server, conn);\n registerUpdateTask(server, conn);\n registerChatTools(server, conn);\n registerGetTaskCli(server, conn);\n registerSearchTasks(server, conn);\n registerListTags(server, conn);\n registerReviewTools(server, conn);\n}\n","import { z } from \"zod\";\nimport type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport type { ConveyorConnection } from \"../connection.js\";\n\nexport function registerBuildTools(server: McpServer, conn: ConveyorConnection): void {\n server.tool(\n \"start_build\",\n \"Start a cloud build (codespace) for a task\",\n {\n taskId: z.string().describe(\"The task ID\"),\n },\n async (params) => {\n const result = await conn.startBuild(params.taskId);\n return { content: [{ type: \"text\", text: JSON.stringify(result, null, 2) }] };\n },\n );\n\n server.tool(\n \"stop_build\",\n \"Stop a running cloud build for a task\",\n {\n taskId: z.string().describe(\"The task ID\"),\n },\n async (params) => {\n const result = await conn.stopBuild(params.taskId);\n return { content: [{ type: \"text\", text: JSON.stringify(result, null, 2) }] };\n },\n );\n\n server.tool(\n \"get_build_status\",\n \"Check codespace and agent status for a task\",\n {\n taskId: z.string().describe(\"The task ID\"),\n },\n async (params) => {\n const status = await conn.getBuildStatus(params.taskId);\n return { content: [{ type: \"text\", text: JSON.stringify(status, null, 2) }] };\n },\n );\n}\n","import { z } from \"zod\";\nimport type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport type { ConveyorConnection } from \"../connection.js\";\n\nfunction registerListTaskFiles(server: McpServer, conn: ConveyorConnection): void {\n server.tool(\n \"list_task_files\",\n \"List all files attached to a task with metadata (no contents — fast and small). Use before fetching a specific file to see what is available and how large each is. For file contents use get_attachment.\",\n {\n taskId: z.string().describe(\"The task ID or slug\"),\n },\n async (params) => {\n const files = await conn.listTaskFiles(params.taskId);\n return { content: [{ type: \"text\", text: JSON.stringify(files, null, 2) }] };\n },\n );\n}\n\ninterface AttachmentResult {\n fileName?: string;\n mimeType?: string;\n fileSize?: number;\n content?: string;\n contentEncoding?: string;\n contentByteOffset?: number;\n contentTotalBytes?: number;\n contentTruncated?: boolean;\n downloadUrl?: string;\n}\n\nfunction registerGetAttachment(server: McpServer, conn: ConveyorConnection): void {\n server.tool(\n \"get_attachment\",\n \"Fetch one task file's content plus metadata by file ID (accepts task id or slug). Large text files (logs, JSON) are returned in pages — use `offset`/`maxBytes` to read more, or fetch `downloadUrl` for the whole file. Call list_task_files first to discover IDs and sizes.\",\n {\n taskId: z.string().describe(\"The task ID or slug\"),\n fileId: z.string().describe(\"The file ID to fetch\"),\n offset: z\n .number()\n .int()\n .nonnegative()\n .optional()\n .describe(\"Byte offset into text content (paging). Default 0.\"),\n maxBytes: z\n .number()\n .int()\n .positive()\n .optional()\n .describe(\"Max bytes of text content to return from offset.\"),\n },\n async (params) => {\n const file = (await conn.getAttachment(params.taskId, params.fileId, {\n offset: params.offset,\n maxBytes: params.maxBytes,\n })) as AttachmentResult;\n\n // For text content, return the raw content as text (not JSON.stringify'd —\n // that double-escapes it). Prepend a compact metadata + paging header.\n if (typeof file.content === \"string\" && file.contentEncoding === \"utf-8\") {\n const start = file.contentByteOffset ?? 0;\n const shown = Buffer.byteLength(file.content, \"utf-8\");\n const total = file.contentTotalBytes ?? shown;\n const more = file.contentTruncated\n ? ` — showing bytes ${start}–${start + shown} of ${total}; pass offset=${start + shown} for the next page, or fetch the full file at downloadUrl`\n : \"\";\n const header = `${file.fileName ?? \"file\"} (${file.mimeType ?? \"?\"}, ${total} bytes)${more}\\n${file.downloadUrl ? `downloadUrl: ${file.downloadUrl}\\n` : \"\"}---\\n`;\n return { content: [{ type: \"text\", text: header + file.content }] };\n }\n return { content: [{ type: \"text\", text: JSON.stringify(file, null, 2) }] };\n },\n );\n}\n\nexport function registerAttachmentTools(server: McpServer, conn: ConveyorConnection): void {\n registerListTaskFiles(server, conn);\n registerGetAttachment(server, conn);\n}\n","import { z } from \"zod\";\nimport type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport type { ConveyorConnection } from \"../connection.js\";\n\nexport function registerPullRequestTools(server: McpServer, conn: ConveyorConnection): void {\n server.tool(\n \"create_pull_request\",\n \"Open a GitHub pull request for a task's existing branch (the branch must already be pushed to origin). Moves the task to ReviewPR. Returns the PR number and URL.\",\n {\n taskId: z.string().describe(\"The task ID whose branch should be opened as a PR\"),\n title: z.string().describe(\"Pull request title\"),\n body: z.string().describe(\"Pull request body (markdown)\"),\n head: z\n .string()\n .optional()\n .describe(\"Source branch for the PR (defaults to the task's branch)\"),\n base: z\n .string()\n .optional()\n .describe(\"Target branch for the PR (defaults to the repo default)\"),\n },\n async (params) => {\n const result = await conn.createPullRequest(params);\n return {\n content: [{ type: \"text\", text: `PR #${result.prNumber} opened: ${result.prUrl}` }],\n };\n },\n );\n}\n","import { z } from \"zod\";\nimport type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport type { ConveyorConnection } from \"../connection.js\";\n\nconst STATUS_ENUM = [\n \"Planning\",\n \"Open\",\n \"InProgress\",\n \"ReviewPR\",\n \"ReviewDev\",\n \"ReviewLive\",\n \"Complete\",\n \"Cancelled\",\n] as const;\n\nconst SP_DESCRIPTION = \"Story point value (1=Common, 2=Magic, 3=Rare, 5=Unique)\";\n\nfunction registerCreateSubtask(server: McpServer, conn: ConveyorConnection): void {\n server.tool(\n \"create_subtask\",\n \"Create a subtask under a parent task. Subtasks break a larger task into independently buildable pieces.\",\n {\n parentTaskId: z.string().describe(\"The parent task ID\"),\n title: z.string().describe(\"Subtask title\"),\n description: z.string().optional().describe(\"Subtask description\"),\n plan: z.string().optional().describe(\"Subtask implementation plan (markdown)\"),\n ordinal: z.number().optional().describe(\"Ordering position among siblings\"),\n storyPointValue: z.number().optional().describe(SP_DESCRIPTION),\n },\n async (params) => {\n const subtask = await conn.createSubtask(params);\n return {\n content: [{ type: \"text\", text: `Subtask created: ${subtask.id} (slug: ${subtask.slug})` }],\n };\n },\n );\n}\n\nfunction registerUpdateSubtask(server: McpServer, conn: ConveyorConnection): void {\n server.tool(\n \"update_subtask\",\n \"Update a subtask's fields: title, description, plan, status, ordering, or story points.\",\n {\n subtaskId: z.string().describe(\"The subtask ID\"),\n title: z.string().optional().describe(\"New title\"),\n description: z.string().optional().describe(\"New description\"),\n plan: z.string().optional().describe(\"New plan (markdown)\"),\n status: z.enum(STATUS_ENUM).optional().describe(\"New status\"),\n ordinal: z.number().optional().describe(\"New ordering position among siblings\"),\n storyPointValue: z.number().optional().describe(SP_DESCRIPTION),\n },\n async (params) => {\n const result = await conn.updateSubtask(params);\n return {\n content: [\n { type: \"text\", text: `Subtask ${result.id} updated (status: ${result.status})` },\n ],\n };\n },\n );\n}\n\nfunction registerListSubtasks(server: McpServer, conn: ConveyorConnection): void {\n server.tool(\n \"list_subtasks\",\n \"List all subtasks of a parent task with their status and ordering.\",\n {\n taskId: z.string().describe(\"The parent task ID\"),\n },\n async (params) => {\n const subtasks = await conn.listSubtasks(params.taskId);\n return { content: [{ type: \"text\", text: JSON.stringify(subtasks, null, 2) }] };\n },\n );\n}\n\nfunction registerDeleteSubtask(server: McpServer, conn: ConveyorConnection): void {\n server.tool(\n \"delete_subtask\",\n \"Delete a subtask by ID. This is permanent — use update_subtask to set status to Cancelled if you only want to close it.\",\n {\n subtaskId: z.string().describe(\"The subtask ID to delete\"),\n },\n async (params) => {\n const result = await conn.deleteSubtask(params.subtaskId);\n return {\n content: [\n { type: \"text\", text: result.deleted ? \"Subtask deleted\" : \"Subtask not deleted\" },\n ],\n };\n },\n );\n}\n\nexport function registerSubtaskTools(server: McpServer, conn: ConveyorConnection): void {\n registerCreateSubtask(server, conn);\n registerUpdateSubtask(server, conn);\n registerListSubtasks(server, conn);\n registerDeleteSubtask(server, conn);\n}\n","import { z } from \"zod\";\nimport type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport type { ConveyorConnection } from \"../connection.js\";\n\nfunction registerGetDependencies(server: McpServer, conn: ConveyorConnection): void {\n server.tool(\n \"get_dependencies\",\n \"Get a task's dependencies and their met/unmet status (met = merged to dev). Use to confirm blockers merged, or see why a task cannot start. For task state use get_task.\",\n {\n taskId: z.string().describe(\"The task ID\"),\n },\n async (params) => {\n const deps = await conn.getDependencies(params.taskId);\n return { content: [{ type: \"text\", text: JSON.stringify(deps, null, 2) }] };\n },\n );\n}\n\nfunction registerAddDependency(server: McpServer, conn: ConveyorConnection): void {\n server.tool(\n \"add_dependency\",\n \"Add a blocking dependency — this task cannot start until the named task is merged to dev.\",\n {\n taskId: z.string().describe(\"The task ID that will be blocked\"),\n dependsOnSlugOrId: z.string().describe(\"Slug or ID of the task this one depends on\"),\n },\n async (params) => {\n await conn.addDependency(params);\n return { content: [{ type: \"text\", text: \"Dependency added\" }] };\n },\n );\n}\n\nfunction registerRemoveDependency(server: McpServer, conn: ConveyorConnection): void {\n server.tool(\n \"remove_dependency\",\n \"Remove a previously added dependency from a task. The task is no longer blocked by the named task. Returns: confirmation string.\",\n {\n taskId: z.string().describe(\"The task ID to unblock\"),\n dependsOnSlugOrId: z.string().describe(\"Slug or ID of the dependency to remove\"),\n },\n async (params) => {\n await conn.removeDependency(params);\n return { content: [{ type: \"text\", text: \"Dependency removed\" }] };\n },\n );\n}\n\nexport function registerDependencyTools(server: McpServer, conn: ConveyorConnection): void {\n registerGetDependencies(server, conn);\n registerAddDependency(server, conn);\n registerRemoveDependency(server, conn);\n}\n","import { z } from \"zod\";\nimport type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport type { ConveyorConnection } from \"../connection.js\";\n\nexport function registerSuggestionTools(server: McpServer, conn: ConveyorConnection): void {\n server.tool(\n \"create_suggestion\",\n \"Suggest a feature, improvement, rule, or idea for the project. Duplicates are deduped and your upvote is recorded.\",\n {\n title: z.string().describe(\"Suggestion title\"),\n description: z.string().optional().describe(\"Suggestion details (markdown)\"),\n tagNames: z\n .array(z.string())\n .optional()\n .describe('Tag names to categorize the suggestion (e.g., [\"agent-runner\"])'),\n },\n async (params) => {\n const result = await conn.createSuggestion(params);\n const text = result.merged\n ? `Suggestion merged into existing suggestion ${result.mergedIntoId} (upvote recorded)`\n : `Suggestion created: ${result.id}`;\n return { content: [{ type: \"text\", text }] };\n },\n );\n}\n","import type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport type { ConveyorConnection } from \"../connection.js\";\nimport { registerProjectTools } from \"./project.js\";\nimport { registerTaskTools } from \"./tasks.js\";\nimport { registerBuildTools } from \"./builds.js\";\nimport { registerAttachmentTools } from \"./attachments.js\";\nimport { registerPullRequestTools } from \"./pull-request.js\";\nimport { registerSubtaskTools } from \"./subtasks.js\";\nimport { registerDependencyTools } from \"./dependencies.js\";\nimport { registerSuggestionTools } from \"./suggestions.js\";\n\nexport function registerAllTools(server: McpServer, conn: ConveyorConnection): void {\n registerProjectTools(server, conn);\n registerTaskTools(server, conn);\n registerBuildTools(server, conn);\n registerAttachmentTools(server, conn);\n registerPullRequestTools(server, conn);\n registerSubtaskTools(server, conn);\n registerDependencyTools(server, conn);\n registerSuggestionTools(server, conn);\n}\n"],"mappings":"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","names":["server","conn","server","conn","z","server","conn","z","server","conn","z","server","conn","z","STATUS_ENUM","server","conn","z","server","conn","z","server","conn","server","conn"]}
|
|
1
|
+
{"version":3,"sources":["../src/cli.ts","../src/tools/project.ts","../src/tools/tasks.ts","../src/tools/builds.ts","../src/tools/attachments.ts","../src/tools/pull-request.ts","../src/tools/subtasks.ts","../src/tools/dependencies.ts","../src/tools/suggestions.ts","../src/tools/index.ts"],"sourcesContent":["#!/usr/bin/env node\n\nimport { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { StdioServerTransport } from \"@modelcontextprotocol/sdk/server/stdio.js\";\nimport { ConveyorConnection } from \"./connection.js\";\nimport { registerAllTools } from \"./tools/index.js\";\n\nconst apiUrl = process.env.CONVEYOR_API_URL;\nconst projectToken = process.env.CONVEYOR_PROJECT_TOKEN;\nconst projectId = process.env.CONVEYOR_PROJECT_ID;\n\nif (!apiUrl || !projectToken || !projectId) {\n process.stderr.write(\n \"Error: CONVEYOR_API_URL, CONVEYOR_PROJECT_TOKEN, and CONVEYOR_PROJECT_ID environment variables are required.\\n\",\n );\n process.exit(1);\n}\n\nconst conn = new ConveyorConnection({ apiUrl, projectToken, projectId });\n\ntry {\n await conn.connect();\n process.stderr.write(\"Connected to Conveyor API\\n\");\n} catch (err) {\n process.stderr.write(`Failed to connect to Conveyor API: ${err}\\n`);\n process.exit(1);\n}\n\nconst server = new McpServer({\n name: \"conveyor\",\n version: \"2.1.2\",\n});\n\nregisterAllTools(server, conn);\n\nconst transport = new StdioServerTransport();\nawait server.connect(transport);\n\nprocess.on(\"SIGINT\", () => {\n conn.disconnect();\n process.exit(0);\n});\n\nprocess.on(\"SIGTERM\", () => {\n conn.disconnect();\n process.exit(0);\n});\n","import type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport type { ConveyorConnection } from \"../connection.js\";\n\nexport function registerProjectTools(server: McpServer, conn: ConveyorConnection): void {\n server.tool(\n \"get_project_summary\",\n \"Get overall project status: task counts by status, active builds, repo info\",\n {},\n async () => {\n const summary = await conn.getProjectSummary();\n return { content: [{ type: \"text\", text: JSON.stringify(summary, null, 2) }] };\n },\n );\n}\n","import { z } from \"zod\";\nimport type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport type { ConveyorConnection } from \"../connection.js\";\n\nconst CLI_EVENT_FORMATTERS: Record<string, (data: Record<string, unknown>) => string> = {\n thinking: (data) => String(data.message ?? \"\"),\n tool_use: (data) => `${data.tool}: ${String(data.input ?? \"\").slice(0, 1000)}`,\n tool_result: (data) =>\n `${data.tool} → ${String(data.output ?? \"\").slice(0, 500)}${data.isError ? \" [ERROR]\" : \"\"}`,\n message: (data) => String(data.content ?? \"\"),\n error: (data) => `ERROR: ${String(data.message ?? \"\")}`,\n completed: (data) =>\n `Completed: ${data.summary ?? \"\"} (cost: $${data.costUsd ?? \"?\"}, duration: ${data.durationMs ?? \"?\"}ms)`,\n setup_output: (data) => `[${data.stream ?? \"stdout\"}] ${String(data.data ?? \"\")}`,\n start_command_output: (data) => `[${data.stream ?? \"stdout\"}] ${String(data.data ?? \"\")}`,\n turn_end: (data) =>\n `Turn complete (${Array.isArray(data.toolCalls) ? data.toolCalls.length : 0} tool calls)`,\n};\n\nfunction formatCliEventSummary(type: string, data: Record<string, unknown>): string {\n const formatter = CLI_EVENT_FORMATTERS[type];\n return formatter ? formatter(data) : JSON.stringify(data);\n}\n\nconst STATUS_ENUM = [\n \"Planning\",\n \"Open\",\n \"InProgress\",\n \"ReviewPR\",\n \"ReviewDev\",\n \"ReviewLive\",\n \"Complete\",\n \"Cancelled\",\n] as const;\n\nfunction registerListTasks(server: McpServer, conn: ConveyorConnection): void {\n server.tool(\n \"list_tasks\",\n \"List project tasks, optionally filtered by status or assignee\",\n {\n status: z.enum(STATUS_ENUM).optional().describe(\"Filter by task status\"),\n assigneeId: z.string().optional().describe(\"Filter by assigned user ID\"),\n limit: z.number().optional().describe(\"Max tasks to return (default 50)\"),\n },\n async (params) => {\n const tasks = await conn.listTasks(params);\n return { content: [{ type: \"text\", text: JSON.stringify(tasks, null, 2) }] };\n },\n );\n}\n\nfunction registerGetTask(server: McpServer, conn: ConveyorConnection): void {\n server.tool(\n \"get_task\",\n \"Get full task details including plan, chat history, PR info, subtasks, and build status\",\n {\n taskId: z.string().describe(\"The task ID or slug (the value in a card URL, /cards/<slug>)\"),\n },\n async (params) => {\n const task = await conn.getTask(params.taskId);\n return { content: [{ type: \"text\", text: JSON.stringify(task, null, 2) }] };\n },\n );\n}\n\nfunction registerCreateTask(server: McpServer, conn: ConveyorConnection): void {\n server.tool(\n \"create_task\",\n \"Create a new task with title, description, and optional plan\",\n {\n title: z.string().describe(\"Task title\"),\n description: z.string().optional().describe(\"Task description\"),\n plan: z.string().optional().describe(\"Task implementation plan (markdown)\"),\n status: z\n .enum([\"Planning\", \"Open\"])\n .optional()\n .describe(\"Initial status (default: Planning)\"),\n },\n async (params) => {\n const task = await conn.createTask(params);\n return {\n content: [{ type: \"text\", text: `Task created: ${task.id} (slug: ${task.slug})` }],\n };\n },\n );\n}\n\nfunction registerUpdateTask(server: McpServer, conn: ConveyorConnection): void {\n server.tool(\n \"update_task\",\n \"Update task fields: title, description, plan, status, or assignment\",\n {\n taskId: z.string().describe(\"The task ID\"),\n title: z.string().optional().describe(\"New title\"),\n description: z.string().optional().describe(\"New description\"),\n plan: z.string().optional().describe(\"New plan (markdown)\"),\n status: z.enum(STATUS_ENUM).optional().describe(\"New status\"),\n assignedUserId: z.string().nullable().optional().describe(\"User ID to assign, or null\"),\n },\n async (params) => {\n const result = await conn.updateTask(params);\n return {\n content: [{ type: \"text\", text: `Task ${result.id} updated (status: ${result.status})` }],\n };\n },\n );\n}\n\nfunction registerChatTools(server: McpServer, conn: ConveyorConnection): void {\n server.tool(\n \"get_task_chat\",\n \"Read messages from a task's chat\",\n {\n taskId: z.string().describe(\"The task ID\"),\n limit: z.number().optional().describe(\"Max messages to return (default 50)\"),\n },\n async (params) => {\n const messages = await conn.getTaskChat(params.taskId, params.limit);\n return { content: [{ type: \"text\", text: JSON.stringify(messages, null, 2) }] };\n },\n );\n\n server.tool(\n \"post_to_task_chat\",\n \"Post a message to a task's chat\",\n {\n taskId: z.string().describe(\"The task ID\"),\n content: z.string().describe(\"Message content\"),\n },\n async (params) => {\n await conn.postToTaskChat(params.taskId, params.content);\n return { content: [{ type: \"text\", text: \"Message posted\" }] };\n },\n );\n}\n\nfunction registerGetTaskCli(server: McpServer, conn: ConveyorConnection): void {\n server.tool(\n \"get_task_cli\",\n \"Read CLI execution logs from a task. Returns agent reasoning, tool calls, setup output, and other execution events.\",\n {\n taskId: z.string().describe(\"The task ID or slug\"),\n source: z\n .enum([\"agent\", \"application\"])\n .optional()\n .describe(\n \"Filter by log source: 'agent' for reasoning/tool calls, 'application' for setup/dev-server output\",\n ),\n limit: z.number().optional().describe(\"Max entries to return (default 50, max 500)\"),\n },\n async ({ taskId, source, limit }) => {\n const effectiveLimit = Math.min(limit ?? 50, 500);\n const logs = await conn.getTaskCli(taskId, effectiveLimit, source);\n const formatted = logs\n .map((log) => {\n return `[${log.timestamp}] [${log.type}] ${formatCliEventSummary(log.type, log.data)}`;\n })\n .join(\"\\n\");\n return {\n content: [{ type: \"text\" as const, text: formatted || \"No CLI logs found for this task.\" }],\n };\n },\n );\n}\n\nfunction registerSearchTasks(server: McpServer, conn: ConveyorConnection): void {\n server.tool(\n \"search_tasks\",\n \"Search tasks by tag name, text query, and/or status. Use tag names like 'agent-runner', not IDs.\",\n {\n tagNames: z\n .array(z.string())\n .optional()\n .describe('Tag names to filter by (e.g., [\"agent-runner\", \"chat\"])'),\n searchQuery: z.string().optional().describe(\"Text search on title and description\"),\n statusFilters: z\n .array(z.enum(STATUS_ENUM))\n .optional()\n .describe(\"Filter by one or more statuses\"),\n limit: z.number().optional().describe(\"Max results to return (default 20)\"),\n },\n async (params) => {\n const tasks = await conn.searchTasks(params);\n return { content: [{ type: \"text\", text: JSON.stringify(tasks, null, 2) }] };\n },\n );\n}\n\nfunction registerListTags(server: McpServer, conn: ConveyorConnection): void {\n server.tool(\n \"list_tags\",\n \"List all project tags with their names, IDs, and colors\",\n {},\n async () => {\n const tags = await conn.listTags();\n return { content: [{ type: \"text\", text: JSON.stringify(tags, null, 2) }] };\n },\n );\n}\n\nfunction registerReviewTools(server: McpServer, conn: ConveyorConnection): void {\n server.tool(\n \"approve_task\",\n \"Move a task forward in the review flow (ReviewPR -> ReviewDev, or -> Complete)\",\n {\n taskId: z.string().describe(\"The task ID\"),\n },\n async (params) => {\n const result = await conn.approveTask(params.taskId);\n return {\n content: [{ type: \"text\", text: `Task approved, new status: ${result.status}` }],\n };\n },\n );\n\n server.tool(\n \"approve_and_merge_pr\",\n \"Approve and merge a child task's pull request. Only succeeds if all CI/CD checks are passing. The child task must be in ReviewPR status with a PR.\",\n {\n childTaskId: z.string().describe(\"The child task ID whose PR should be approved and merged\"),\n },\n async (params) => {\n const result = await conn.approveAndMergePR(params.childTaskId);\n return {\n content: [\n {\n type: \"text\",\n text: `PR #${result.prNumber} approved and merged for task ${result.childTaskId}`,\n },\n ],\n };\n },\n );\n\n server.tool(\n \"request_changes\",\n \"Post feedback and send task back to InProgress for more work\",\n {\n taskId: z.string().describe(\"The task ID\"),\n feedback: z.string().describe(\"Feedback message describing requested changes\"),\n },\n async (params) => {\n await conn.requestChanges(params.taskId, params.feedback);\n return { content: [{ type: \"text\", text: \"Changes requested, task moved to InProgress\" }] };\n },\n );\n}\n\nexport function registerTaskTools(server: McpServer, conn: ConveyorConnection): void {\n registerListTasks(server, conn);\n registerGetTask(server, conn);\n registerCreateTask(server, conn);\n registerUpdateTask(server, conn);\n registerChatTools(server, conn);\n registerGetTaskCli(server, conn);\n registerSearchTasks(server, conn);\n registerListTags(server, conn);\n registerReviewTools(server, conn);\n}\n","import { z } from \"zod\";\nimport type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport type { ConveyorConnection } from \"../connection.js\";\n\nexport function registerBuildTools(server: McpServer, conn: ConveyorConnection): void {\n server.tool(\n \"start_build\",\n \"Start a cloud build (codespace) for a task\",\n {\n taskId: z.string().describe(\"The task ID\"),\n },\n async (params) => {\n const result = await conn.startBuild(params.taskId);\n return { content: [{ type: \"text\", text: JSON.stringify(result, null, 2) }] };\n },\n );\n\n server.tool(\n \"stop_build\",\n \"Stop a running cloud build for a task\",\n {\n taskId: z.string().describe(\"The task ID\"),\n },\n async (params) => {\n const result = await conn.stopBuild(params.taskId);\n return { content: [{ type: \"text\", text: JSON.stringify(result, null, 2) }] };\n },\n );\n\n server.tool(\n \"get_build_status\",\n \"Check codespace and agent status for a task\",\n {\n taskId: z.string().describe(\"The task ID\"),\n },\n async (params) => {\n const status = await conn.getBuildStatus(params.taskId);\n return { content: [{ type: \"text\", text: JSON.stringify(status, null, 2) }] };\n },\n );\n}\n","import { z } from \"zod\";\nimport type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport type { ConveyorConnection } from \"../connection.js\";\n\nfunction registerListTaskFiles(server: McpServer, conn: ConveyorConnection): void {\n server.tool(\n \"list_task_files\",\n \"List all files attached to a task with metadata (no contents — fast and small). Use before fetching a specific file to see what is available and how large each is. For file contents use get_attachment.\",\n {\n taskId: z.string().describe(\"The task ID or slug\"),\n },\n async (params) => {\n const files = await conn.listTaskFiles(params.taskId);\n return { content: [{ type: \"text\", text: JSON.stringify(files, null, 2) }] };\n },\n );\n}\n\nexport interface AttachmentResult {\n fileName?: string;\n mimeType?: string;\n fileSize?: number;\n content?: string;\n contentEncoding?: string;\n contentByteOffset?: number;\n contentTotalBytes?: number;\n contentTruncated?: boolean;\n downloadUrl?: string;\n}\n\nexport type AttachmentContentBlock =\n | { type: \"text\"; text: string }\n | { type: \"image\"; data: string; mimeType: string };\n\nfunction buildTextContent(file: AttachmentResult, content: string): AttachmentContentBlock[] {\n const start = file.contentByteOffset ?? 0;\n const shown = Buffer.byteLength(content, \"utf-8\");\n const total = file.contentTotalBytes ?? shown;\n const more = file.contentTruncated\n ? ` — showing bytes ${start}–${start + shown} of ${total}; pass offset=${start + shown} for the next page, or fetch the full file at downloadUrl`\n : \"\";\n const header = `${file.fileName ?? \"file\"} (${file.mimeType ?? \"?\"}, ${total} bytes)${more}\\n${file.downloadUrl ? `downloadUrl: ${file.downloadUrl}\\n` : \"\"}---\\n`;\n return [{ type: \"text\", text: header + content }];\n}\n\nfunction buildImageContent(\n file: AttachmentResult,\n content: string,\n mimeType: string,\n): AttachmentContentBlock[] {\n const header = `${file.fileName ?? \"file\"} (${mimeType}, ${file.fileSize ?? \"?\"} bytes)${file.downloadUrl ? `\\ndownloadUrl: ${file.downloadUrl}` : \"\"}`;\n return [\n { type: \"text\", text: header },\n { type: \"image\", data: content, mimeType },\n ];\n}\n\n/**\n * Convert an attachment DTO into MCP content blocks.\n *\n * - utf-8 text → metadata/paging header + raw text (not JSON.stringify'd —\n * that double-escapes it).\n * - base64 images → metadata header + a proper MCP image block so the model\n * actually sees the image. Dumping base64 into a text block both blows the\n * client's token limit and is unviewable.\n * - anything else → metadata JSON with `content` stripped, so inlined bytes\n * can never leak into a text block.\n */\nexport function buildAttachmentContent(file: AttachmentResult): AttachmentContentBlock[] {\n if (typeof file.content === \"string\" && file.contentEncoding === \"utf-8\") {\n return buildTextContent(file, file.content);\n }\n if (\n typeof file.content === \"string\" &&\n file.contentEncoding === \"base64\" &&\n file.mimeType?.startsWith(\"image/\")\n ) {\n return buildImageContent(file, file.content, file.mimeType);\n }\n const { content: _content, ...metadata } = file;\n return [{ type: \"text\", text: JSON.stringify(metadata, null, 2) }];\n}\n\nfunction registerGetAttachment(server: McpServer, conn: ConveyorConnection): void {\n server.tool(\n \"get_attachment\",\n \"Fetch one task file's content plus metadata by file ID (accepts task id or slug). Images are returned as viewable image blocks. Large text files (logs, JSON) are returned in pages — use `offset`/`maxBytes` to read more, or fetch `downloadUrl` for the whole file. Call list_task_files first to discover IDs and sizes.\",\n {\n taskId: z.string().describe(\"The task ID or slug\"),\n fileId: z.string().describe(\"The file ID to fetch\"),\n offset: z\n .number()\n .int()\n .nonnegative()\n .optional()\n .describe(\"Byte offset into text content (paging). Default 0.\"),\n maxBytes: z\n .number()\n .int()\n .positive()\n .optional()\n .describe(\"Max bytes of text content to return from offset.\"),\n },\n async (params) => {\n const file = (await conn.getAttachment(params.taskId, params.fileId, {\n offset: params.offset,\n maxBytes: params.maxBytes,\n })) as AttachmentResult;\n return { content: buildAttachmentContent(file) };\n },\n );\n}\n\nexport function registerAttachmentTools(server: McpServer, conn: ConveyorConnection): void {\n registerListTaskFiles(server, conn);\n registerGetAttachment(server, conn);\n}\n","import { z } from \"zod\";\nimport type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport type { ConveyorConnection } from \"../connection.js\";\n\nexport function registerPullRequestTools(server: McpServer, conn: ConveyorConnection): void {\n server.tool(\n \"create_pull_request\",\n \"Open a GitHub pull request for a task's existing branch (the branch must already be pushed to origin). Moves the task to ReviewPR. Returns the PR number and URL.\",\n {\n taskId: z.string().describe(\"The task ID whose branch should be opened as a PR\"),\n title: z.string().describe(\"Pull request title\"),\n body: z.string().describe(\"Pull request body (markdown)\"),\n head: z\n .string()\n .optional()\n .describe(\"Source branch for the PR (defaults to the task's branch)\"),\n base: z\n .string()\n .optional()\n .describe(\"Target branch for the PR (defaults to the repo default)\"),\n },\n async (params) => {\n const result = await conn.createPullRequest(params);\n return {\n content: [{ type: \"text\", text: `PR #${result.prNumber} opened: ${result.prUrl}` }],\n };\n },\n );\n}\n","import { z } from \"zod\";\nimport type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport type { ConveyorConnection } from \"../connection.js\";\n\nconst STATUS_ENUM = [\n \"Planning\",\n \"Open\",\n \"InProgress\",\n \"ReviewPR\",\n \"ReviewDev\",\n \"ReviewLive\",\n \"Complete\",\n \"Cancelled\",\n] as const;\n\nconst SP_DESCRIPTION = \"Story point value (1=Common, 2=Magic, 3=Rare, 5=Unique)\";\n\nfunction registerCreateSubtask(server: McpServer, conn: ConveyorConnection): void {\n server.tool(\n \"create_subtask\",\n \"Create a subtask under a parent task. Subtasks break a larger task into independently buildable pieces.\",\n {\n parentTaskId: z.string().describe(\"The parent task ID\"),\n title: z.string().describe(\"Subtask title\"),\n description: z.string().optional().describe(\"Subtask description\"),\n plan: z.string().optional().describe(\"Subtask implementation plan (markdown)\"),\n ordinal: z.number().optional().describe(\"Ordering position among siblings\"),\n storyPointValue: z.number().optional().describe(SP_DESCRIPTION),\n },\n async (params) => {\n const subtask = await conn.createSubtask(params);\n return {\n content: [{ type: \"text\", text: `Subtask created: ${subtask.id} (slug: ${subtask.slug})` }],\n };\n },\n );\n}\n\nfunction registerUpdateSubtask(server: McpServer, conn: ConveyorConnection): void {\n server.tool(\n \"update_subtask\",\n \"Update a subtask's fields: title, description, plan, status, ordering, or story points.\",\n {\n subtaskId: z.string().describe(\"The subtask ID\"),\n title: z.string().optional().describe(\"New title\"),\n description: z.string().optional().describe(\"New description\"),\n plan: z.string().optional().describe(\"New plan (markdown)\"),\n status: z.enum(STATUS_ENUM).optional().describe(\"New status\"),\n ordinal: z.number().optional().describe(\"New ordering position among siblings\"),\n storyPointValue: z.number().optional().describe(SP_DESCRIPTION),\n },\n async (params) => {\n const result = await conn.updateSubtask(params);\n return {\n content: [\n { type: \"text\", text: `Subtask ${result.id} updated (status: ${result.status})` },\n ],\n };\n },\n );\n}\n\nfunction registerListSubtasks(server: McpServer, conn: ConveyorConnection): void {\n server.tool(\n \"list_subtasks\",\n \"List all subtasks of a parent task with their status and ordering.\",\n {\n taskId: z.string().describe(\"The parent task ID\"),\n },\n async (params) => {\n const subtasks = await conn.listSubtasks(params.taskId);\n return { content: [{ type: \"text\", text: JSON.stringify(subtasks, null, 2) }] };\n },\n );\n}\n\nfunction registerDeleteSubtask(server: McpServer, conn: ConveyorConnection): void {\n server.tool(\n \"delete_subtask\",\n \"Delete a subtask by ID. This is permanent — use update_subtask to set status to Cancelled if you only want to close it.\",\n {\n subtaskId: z.string().describe(\"The subtask ID to delete\"),\n },\n async (params) => {\n const result = await conn.deleteSubtask(params.subtaskId);\n return {\n content: [\n { type: \"text\", text: result.deleted ? \"Subtask deleted\" : \"Subtask not deleted\" },\n ],\n };\n },\n );\n}\n\nexport function registerSubtaskTools(server: McpServer, conn: ConveyorConnection): void {\n registerCreateSubtask(server, conn);\n registerUpdateSubtask(server, conn);\n registerListSubtasks(server, conn);\n registerDeleteSubtask(server, conn);\n}\n","import { z } from \"zod\";\nimport type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport type { ConveyorConnection } from \"../connection.js\";\n\nfunction registerGetDependencies(server: McpServer, conn: ConveyorConnection): void {\n server.tool(\n \"get_dependencies\",\n \"Get a task's dependencies and their met/unmet status (met = merged to dev). Use to confirm blockers merged, or see why a task cannot start. For task state use get_task.\",\n {\n taskId: z.string().describe(\"The task ID\"),\n },\n async (params) => {\n const deps = await conn.getDependencies(params.taskId);\n return { content: [{ type: \"text\", text: JSON.stringify(deps, null, 2) }] };\n },\n );\n}\n\nfunction registerAddDependency(server: McpServer, conn: ConveyorConnection): void {\n server.tool(\n \"add_dependency\",\n \"Add a blocking dependency — this task cannot start until the named task is merged to dev.\",\n {\n taskId: z.string().describe(\"The task ID that will be blocked\"),\n dependsOnSlugOrId: z.string().describe(\"Slug or ID of the task this one depends on\"),\n },\n async (params) => {\n await conn.addDependency(params);\n return { content: [{ type: \"text\", text: \"Dependency added\" }] };\n },\n );\n}\n\nfunction registerRemoveDependency(server: McpServer, conn: ConveyorConnection): void {\n server.tool(\n \"remove_dependency\",\n \"Remove a previously added dependency from a task. The task is no longer blocked by the named task. Returns: confirmation string.\",\n {\n taskId: z.string().describe(\"The task ID to unblock\"),\n dependsOnSlugOrId: z.string().describe(\"Slug or ID of the dependency to remove\"),\n },\n async (params) => {\n await conn.removeDependency(params);\n return { content: [{ type: \"text\", text: \"Dependency removed\" }] };\n },\n );\n}\n\nexport function registerDependencyTools(server: McpServer, conn: ConveyorConnection): void {\n registerGetDependencies(server, conn);\n registerAddDependency(server, conn);\n registerRemoveDependency(server, conn);\n}\n","import { z } from \"zod\";\nimport type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport type { ConveyorConnection } from \"../connection.js\";\n\nexport function registerSuggestionTools(server: McpServer, conn: ConveyorConnection): void {\n server.tool(\n \"create_suggestion\",\n \"Suggest a feature, improvement, rule, or idea for the project. Duplicates are deduped and your upvote is recorded.\",\n {\n title: z.string().describe(\"Suggestion title\"),\n description: z.string().optional().describe(\"Suggestion details (markdown)\"),\n tagNames: z\n .array(z.string())\n .optional()\n .describe('Tag names to categorize the suggestion (e.g., [\"agent-runner\"])'),\n },\n async (params) => {\n const result = await conn.createSuggestion(params);\n const text = result.merged\n ? `Suggestion merged into existing suggestion ${result.mergedIntoId} (upvote recorded)`\n : `Suggestion created: ${result.id}`;\n return { content: [{ type: \"text\", text }] };\n },\n );\n}\n","import type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport type { ConveyorConnection } from \"../connection.js\";\nimport { registerProjectTools } from \"./project.js\";\nimport { registerTaskTools } from \"./tasks.js\";\nimport { registerBuildTools } from \"./builds.js\";\nimport { registerAttachmentTools } from \"./attachments.js\";\nimport { registerPullRequestTools } from \"./pull-request.js\";\nimport { registerSubtaskTools } from \"./subtasks.js\";\nimport { registerDependencyTools } from \"./dependencies.js\";\nimport { registerSuggestionTools } from \"./suggestions.js\";\n\nexport function registerAllTools(server: McpServer, conn: ConveyorConnection): void {\n registerProjectTools(server, conn);\n registerTaskTools(server, conn);\n registerBuildTools(server, conn);\n registerAttachmentTools(server, conn);\n registerPullRequestTools(server, conn);\n registerSubtaskTools(server, conn);\n registerDependencyTools(server, conn);\n registerSuggestionTools(server, conn);\n}\n"],"mappings":"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","names":["server","conn","server","conn","z","server","conn","z","server","conn","z","server","conn","z","STATUS_ENUM","server","conn","z","server","conn","z","server","conn","server","conn"]}
|