@rallycry/conveyor-mcp 2.1.1
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/chunk-N2XC2PGJ.js +119 -0
- package/dist/chunk-N2XC2PGJ.js.map +1 -0
- package/dist/chunk-UIDBFQNZ.js +315 -0
- package/dist/chunk-UIDBFQNZ.js.map +1 -0
- package/dist/cli.d.ts +1 -0
- package/dist/cli.js +550 -0
- package/dist/cli.js.map +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.js +15 -0
- package/dist/index.js.map +1 -0
- package/dist/tunnel-cli.d.ts +1 -0
- package/dist/tunnel-cli.js +161 -0
- package/dist/tunnel-cli.js.map +1 -0
- package/dist/tunnel.d.ts +322 -0
- package/dist/tunnel.js +11 -0
- package/dist/tunnel.js.map +1 -0
- package/package.json +46 -0
package/dist/cli.js
ADDED
|
@@ -0,0 +1,550 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import {
|
|
3
|
+
ConveyorConnection
|
|
4
|
+
} from "./chunk-UIDBFQNZ.js";
|
|
5
|
+
|
|
6
|
+
// src/cli.ts
|
|
7
|
+
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
8
|
+
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
|
|
9
|
+
|
|
10
|
+
// src/tools/project.ts
|
|
11
|
+
function registerProjectTools(server2, conn2) {
|
|
12
|
+
server2.tool(
|
|
13
|
+
"get_project_summary",
|
|
14
|
+
"Get overall project status: task counts by status, active builds, repo info",
|
|
15
|
+
{},
|
|
16
|
+
async () => {
|
|
17
|
+
const summary = await conn2.getProjectSummary();
|
|
18
|
+
return { content: [{ type: "text", text: JSON.stringify(summary, null, 2) }] };
|
|
19
|
+
}
|
|
20
|
+
);
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
// src/tools/tasks.ts
|
|
24
|
+
import { z } from "zod";
|
|
25
|
+
var CLI_EVENT_FORMATTERS = {
|
|
26
|
+
thinking: (data) => String(data.message ?? ""),
|
|
27
|
+
tool_use: (data) => `${data.tool}: ${String(data.input ?? "").slice(0, 1e3)}`,
|
|
28
|
+
tool_result: (data) => `${data.tool} \u2192 ${String(data.output ?? "").slice(0, 500)}${data.isError ? " [ERROR]" : ""}`,
|
|
29
|
+
message: (data) => String(data.content ?? ""),
|
|
30
|
+
error: (data) => `ERROR: ${String(data.message ?? "")}`,
|
|
31
|
+
completed: (data) => `Completed: ${data.summary ?? ""} (cost: $${data.costUsd ?? "?"}, duration: ${data.durationMs ?? "?"}ms)`,
|
|
32
|
+
setup_output: (data) => `[${data.stream ?? "stdout"}] ${String(data.data ?? "")}`,
|
|
33
|
+
start_command_output: (data) => `[${data.stream ?? "stdout"}] ${String(data.data ?? "")}`,
|
|
34
|
+
turn_end: (data) => `Turn complete (${Array.isArray(data.toolCalls) ? data.toolCalls.length : 0} tool calls)`
|
|
35
|
+
};
|
|
36
|
+
function formatCliEventSummary(type, data) {
|
|
37
|
+
const formatter = CLI_EVENT_FORMATTERS[type];
|
|
38
|
+
return formatter ? formatter(data) : JSON.stringify(data);
|
|
39
|
+
}
|
|
40
|
+
var STATUS_ENUM = [
|
|
41
|
+
"Planning",
|
|
42
|
+
"Open",
|
|
43
|
+
"InProgress",
|
|
44
|
+
"ReviewPR",
|
|
45
|
+
"ReviewDev",
|
|
46
|
+
"ReviewLive",
|
|
47
|
+
"Complete",
|
|
48
|
+
"Cancelled"
|
|
49
|
+
];
|
|
50
|
+
function registerListTasks(server2, conn2) {
|
|
51
|
+
server2.tool(
|
|
52
|
+
"list_tasks",
|
|
53
|
+
"List project tasks, optionally filtered by status or assignee",
|
|
54
|
+
{
|
|
55
|
+
status: z.enum(STATUS_ENUM).optional().describe("Filter by task status"),
|
|
56
|
+
assigneeId: z.string().optional().describe("Filter by assigned user ID"),
|
|
57
|
+
limit: z.number().optional().describe("Max tasks to return (default 50)")
|
|
58
|
+
},
|
|
59
|
+
async (params) => {
|
|
60
|
+
const tasks = await conn2.listTasks(params);
|
|
61
|
+
return { content: [{ type: "text", text: JSON.stringify(tasks, null, 2) }] };
|
|
62
|
+
}
|
|
63
|
+
);
|
|
64
|
+
}
|
|
65
|
+
function registerGetTask(server2, conn2) {
|
|
66
|
+
server2.tool(
|
|
67
|
+
"get_task",
|
|
68
|
+
"Get full task details including plan, chat history, PR info, subtasks, and build status",
|
|
69
|
+
{
|
|
70
|
+
taskId: z.string().describe("The task ID")
|
|
71
|
+
},
|
|
72
|
+
async (params) => {
|
|
73
|
+
const task = await conn2.getTask(params.taskId);
|
|
74
|
+
return { content: [{ type: "text", text: JSON.stringify(task, null, 2) }] };
|
|
75
|
+
}
|
|
76
|
+
);
|
|
77
|
+
}
|
|
78
|
+
function registerCreateTask(server2, conn2) {
|
|
79
|
+
server2.tool(
|
|
80
|
+
"create_task",
|
|
81
|
+
"Create a new task with title, description, and optional plan",
|
|
82
|
+
{
|
|
83
|
+
title: z.string().describe("Task title"),
|
|
84
|
+
description: z.string().optional().describe("Task description"),
|
|
85
|
+
plan: z.string().optional().describe("Task implementation plan (markdown)"),
|
|
86
|
+
status: z.enum(["Planning", "Open"]).optional().describe("Initial status (default: Planning)")
|
|
87
|
+
},
|
|
88
|
+
async (params) => {
|
|
89
|
+
const task = await conn2.createTask(params);
|
|
90
|
+
return {
|
|
91
|
+
content: [{ type: "text", text: `Task created: ${task.id} (slug: ${task.slug})` }]
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
);
|
|
95
|
+
}
|
|
96
|
+
function registerUpdateTask(server2, conn2) {
|
|
97
|
+
server2.tool(
|
|
98
|
+
"update_task",
|
|
99
|
+
"Update task fields: title, description, plan, status, or assignment",
|
|
100
|
+
{
|
|
101
|
+
taskId: z.string().describe("The task ID"),
|
|
102
|
+
title: z.string().optional().describe("New title"),
|
|
103
|
+
description: z.string().optional().describe("New description"),
|
|
104
|
+
plan: z.string().optional().describe("New plan (markdown)"),
|
|
105
|
+
status: z.enum(STATUS_ENUM).optional().describe("New status"),
|
|
106
|
+
assignedUserId: z.string().nullable().optional().describe("User ID to assign, or null")
|
|
107
|
+
},
|
|
108
|
+
async (params) => {
|
|
109
|
+
const result = await conn2.updateTask(params);
|
|
110
|
+
return {
|
|
111
|
+
content: [{ type: "text", text: `Task ${result.id} updated (status: ${result.status})` }]
|
|
112
|
+
};
|
|
113
|
+
}
|
|
114
|
+
);
|
|
115
|
+
}
|
|
116
|
+
function registerChatTools(server2, conn2) {
|
|
117
|
+
server2.tool(
|
|
118
|
+
"get_task_chat",
|
|
119
|
+
"Read messages from a task's chat",
|
|
120
|
+
{
|
|
121
|
+
taskId: z.string().describe("The task ID"),
|
|
122
|
+
limit: z.number().optional().describe("Max messages to return (default 50)")
|
|
123
|
+
},
|
|
124
|
+
async (params) => {
|
|
125
|
+
const messages = await conn2.getTaskChat(params.taskId, params.limit);
|
|
126
|
+
return { content: [{ type: "text", text: JSON.stringify(messages, null, 2) }] };
|
|
127
|
+
}
|
|
128
|
+
);
|
|
129
|
+
server2.tool(
|
|
130
|
+
"post_to_task_chat",
|
|
131
|
+
"Post a message to a task's chat",
|
|
132
|
+
{
|
|
133
|
+
taskId: z.string().describe("The task ID"),
|
|
134
|
+
content: z.string().describe("Message content")
|
|
135
|
+
},
|
|
136
|
+
async (params) => {
|
|
137
|
+
await conn2.postToTaskChat(params.taskId, params.content);
|
|
138
|
+
return { content: [{ type: "text", text: "Message posted" }] };
|
|
139
|
+
}
|
|
140
|
+
);
|
|
141
|
+
}
|
|
142
|
+
function registerGetTaskCli(server2, conn2) {
|
|
143
|
+
server2.tool(
|
|
144
|
+
"get_task_cli",
|
|
145
|
+
"Read CLI execution logs from a task. Returns agent reasoning, tool calls, setup output, and other execution events.",
|
|
146
|
+
{
|
|
147
|
+
taskId: z.string().describe("The task ID"),
|
|
148
|
+
source: z.enum(["agent", "application"]).optional().describe(
|
|
149
|
+
"Filter by log source: 'agent' for reasoning/tool calls, 'application' for setup/dev-server output"
|
|
150
|
+
),
|
|
151
|
+
limit: z.number().optional().describe("Max entries to return (default 50, max 500)")
|
|
152
|
+
},
|
|
153
|
+
async ({ taskId, source, limit }) => {
|
|
154
|
+
const effectiveLimit = Math.min(limit ?? 50, 500);
|
|
155
|
+
const logs = await conn2.getTaskCli(taskId, effectiveLimit, source);
|
|
156
|
+
const formatted = logs.map((log) => {
|
|
157
|
+
return `[${log.timestamp}] [${log.type}] ${formatCliEventSummary(log.type, log.data)}`;
|
|
158
|
+
}).join("\n");
|
|
159
|
+
return {
|
|
160
|
+
content: [{ type: "text", text: formatted || "No CLI logs found for this task." }]
|
|
161
|
+
};
|
|
162
|
+
}
|
|
163
|
+
);
|
|
164
|
+
}
|
|
165
|
+
function registerSearchTasks(server2, conn2) {
|
|
166
|
+
server2.tool(
|
|
167
|
+
"search_tasks",
|
|
168
|
+
"Search tasks by tag name, text query, and/or status. Use tag names like 'agent-runner', not IDs.",
|
|
169
|
+
{
|
|
170
|
+
tagNames: z.array(z.string()).optional().describe('Tag names to filter by (e.g., ["agent-runner", "chat"])'),
|
|
171
|
+
searchQuery: z.string().optional().describe("Text search on title and description"),
|
|
172
|
+
statusFilters: z.array(z.enum(STATUS_ENUM)).optional().describe("Filter by one or more statuses"),
|
|
173
|
+
limit: z.number().optional().describe("Max results to return (default 20)")
|
|
174
|
+
},
|
|
175
|
+
async (params) => {
|
|
176
|
+
const tasks = await conn2.searchTasks(params);
|
|
177
|
+
return { content: [{ type: "text", text: JSON.stringify(tasks, null, 2) }] };
|
|
178
|
+
}
|
|
179
|
+
);
|
|
180
|
+
}
|
|
181
|
+
function registerListTags(server2, conn2) {
|
|
182
|
+
server2.tool(
|
|
183
|
+
"list_tags",
|
|
184
|
+
"List all project tags with their names, IDs, and colors",
|
|
185
|
+
{},
|
|
186
|
+
async () => {
|
|
187
|
+
const tags = await conn2.listTags();
|
|
188
|
+
return { content: [{ type: "text", text: JSON.stringify(tags, null, 2) }] };
|
|
189
|
+
}
|
|
190
|
+
);
|
|
191
|
+
}
|
|
192
|
+
function registerReviewTools(server2, conn2) {
|
|
193
|
+
server2.tool(
|
|
194
|
+
"approve_task",
|
|
195
|
+
"Move a task forward in the review flow (ReviewPR -> ReviewDev, or -> Complete)",
|
|
196
|
+
{
|
|
197
|
+
taskId: z.string().describe("The task ID")
|
|
198
|
+
},
|
|
199
|
+
async (params) => {
|
|
200
|
+
const result = await conn2.approveTask(params.taskId);
|
|
201
|
+
return {
|
|
202
|
+
content: [{ type: "text", text: `Task approved, new status: ${result.status}` }]
|
|
203
|
+
};
|
|
204
|
+
}
|
|
205
|
+
);
|
|
206
|
+
server2.tool(
|
|
207
|
+
"approve_and_merge_pr",
|
|
208
|
+
"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.",
|
|
209
|
+
{
|
|
210
|
+
childTaskId: z.string().describe("The child task ID whose PR should be approved and merged")
|
|
211
|
+
},
|
|
212
|
+
async (params) => {
|
|
213
|
+
const result = await conn2.approveAndMergePR(params.childTaskId);
|
|
214
|
+
return {
|
|
215
|
+
content: [
|
|
216
|
+
{
|
|
217
|
+
type: "text",
|
|
218
|
+
text: `PR #${result.prNumber} approved and merged for task ${result.childTaskId}`
|
|
219
|
+
}
|
|
220
|
+
]
|
|
221
|
+
};
|
|
222
|
+
}
|
|
223
|
+
);
|
|
224
|
+
server2.tool(
|
|
225
|
+
"request_changes",
|
|
226
|
+
"Post feedback and send task back to InProgress for more work",
|
|
227
|
+
{
|
|
228
|
+
taskId: z.string().describe("The task ID"),
|
|
229
|
+
feedback: z.string().describe("Feedback message describing requested changes")
|
|
230
|
+
},
|
|
231
|
+
async (params) => {
|
|
232
|
+
await conn2.requestChanges(params.taskId, params.feedback);
|
|
233
|
+
return { content: [{ type: "text", text: "Changes requested, task moved to InProgress" }] };
|
|
234
|
+
}
|
|
235
|
+
);
|
|
236
|
+
}
|
|
237
|
+
function registerTaskTools(server2, conn2) {
|
|
238
|
+
registerListTasks(server2, conn2);
|
|
239
|
+
registerGetTask(server2, conn2);
|
|
240
|
+
registerCreateTask(server2, conn2);
|
|
241
|
+
registerUpdateTask(server2, conn2);
|
|
242
|
+
registerChatTools(server2, conn2);
|
|
243
|
+
registerGetTaskCli(server2, conn2);
|
|
244
|
+
registerSearchTasks(server2, conn2);
|
|
245
|
+
registerListTags(server2, conn2);
|
|
246
|
+
registerReviewTools(server2, conn2);
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
// src/tools/builds.ts
|
|
250
|
+
import { z as z2 } from "zod";
|
|
251
|
+
function registerBuildTools(server2, conn2) {
|
|
252
|
+
server2.tool(
|
|
253
|
+
"start_build",
|
|
254
|
+
"Start a cloud build (codespace) for a task",
|
|
255
|
+
{
|
|
256
|
+
taskId: z2.string().describe("The task ID")
|
|
257
|
+
},
|
|
258
|
+
async (params) => {
|
|
259
|
+
const result = await conn2.startBuild(params.taskId);
|
|
260
|
+
return { content: [{ type: "text", text: JSON.stringify(result, null, 2) }] };
|
|
261
|
+
}
|
|
262
|
+
);
|
|
263
|
+
server2.tool(
|
|
264
|
+
"stop_build",
|
|
265
|
+
"Stop a running cloud build for a task",
|
|
266
|
+
{
|
|
267
|
+
taskId: z2.string().describe("The task ID")
|
|
268
|
+
},
|
|
269
|
+
async (params) => {
|
|
270
|
+
const result = await conn2.stopBuild(params.taskId);
|
|
271
|
+
return { content: [{ type: "text", text: JSON.stringify(result, null, 2) }] };
|
|
272
|
+
}
|
|
273
|
+
);
|
|
274
|
+
server2.tool(
|
|
275
|
+
"get_build_status",
|
|
276
|
+
"Check codespace and agent status for a task",
|
|
277
|
+
{
|
|
278
|
+
taskId: z2.string().describe("The task ID")
|
|
279
|
+
},
|
|
280
|
+
async (params) => {
|
|
281
|
+
const status = await conn2.getBuildStatus(params.taskId);
|
|
282
|
+
return { content: [{ type: "text", text: JSON.stringify(status, null, 2) }] };
|
|
283
|
+
}
|
|
284
|
+
);
|
|
285
|
+
}
|
|
286
|
+
|
|
287
|
+
// src/tools/attachments.ts
|
|
288
|
+
import { z as z3 } from "zod";
|
|
289
|
+
function registerListTaskFiles(server2, conn2) {
|
|
290
|
+
server2.tool(
|
|
291
|
+
"list_task_files",
|
|
292
|
+
"List all files attached to a task with metadata. Use before fetching a specific file to see what is available and how large each is. For file contents use get_attachment.",
|
|
293
|
+
{
|
|
294
|
+
taskId: z3.string().describe("The task ID")
|
|
295
|
+
},
|
|
296
|
+
async (params) => {
|
|
297
|
+
const files = await conn2.listTaskFiles(params.taskId);
|
|
298
|
+
return { content: [{ type: "text", text: JSON.stringify(files, null, 2) }] };
|
|
299
|
+
}
|
|
300
|
+
);
|
|
301
|
+
}
|
|
302
|
+
function registerGetAttachment(server2, conn2) {
|
|
303
|
+
server2.tool(
|
|
304
|
+
"get_attachment",
|
|
305
|
+
"Fetch one task file's content plus metadata by file ID. Call list_task_files first to discover IDs and check sizes \u2014 large binaries may be truncated by the service's size limit.",
|
|
306
|
+
{
|
|
307
|
+
taskId: z3.string().describe("The task ID"),
|
|
308
|
+
fileId: z3.string().describe("The file ID to fetch")
|
|
309
|
+
},
|
|
310
|
+
async (params) => {
|
|
311
|
+
const file = await conn2.getAttachment(params.taskId, params.fileId);
|
|
312
|
+
return { content: [{ type: "text", text: JSON.stringify(file, null, 2) }] };
|
|
313
|
+
}
|
|
314
|
+
);
|
|
315
|
+
}
|
|
316
|
+
function registerAttachmentTools(server2, conn2) {
|
|
317
|
+
registerListTaskFiles(server2, conn2);
|
|
318
|
+
registerGetAttachment(server2, conn2);
|
|
319
|
+
}
|
|
320
|
+
|
|
321
|
+
// src/tools/pull-request.ts
|
|
322
|
+
import { z as z4 } from "zod";
|
|
323
|
+
function registerPullRequestTools(server2, conn2) {
|
|
324
|
+
server2.tool(
|
|
325
|
+
"create_pull_request",
|
|
326
|
+
"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.",
|
|
327
|
+
{
|
|
328
|
+
taskId: z4.string().describe("The task ID whose branch should be opened as a PR"),
|
|
329
|
+
title: z4.string().describe("Pull request title"),
|
|
330
|
+
body: z4.string().describe("Pull request body (markdown)"),
|
|
331
|
+
head: z4.string().optional().describe("Source branch for the PR (defaults to the task's branch)"),
|
|
332
|
+
base: z4.string().optional().describe("Target branch for the PR (defaults to the repo default)")
|
|
333
|
+
},
|
|
334
|
+
async (params) => {
|
|
335
|
+
const result = await conn2.createPullRequest(params);
|
|
336
|
+
return {
|
|
337
|
+
content: [{ type: "text", text: `PR #${result.prNumber} opened: ${result.prUrl}` }]
|
|
338
|
+
};
|
|
339
|
+
}
|
|
340
|
+
);
|
|
341
|
+
}
|
|
342
|
+
|
|
343
|
+
// src/tools/subtasks.ts
|
|
344
|
+
import { z as z5 } from "zod";
|
|
345
|
+
var STATUS_ENUM2 = [
|
|
346
|
+
"Planning",
|
|
347
|
+
"Open",
|
|
348
|
+
"InProgress",
|
|
349
|
+
"ReviewPR",
|
|
350
|
+
"ReviewDev",
|
|
351
|
+
"ReviewLive",
|
|
352
|
+
"Complete",
|
|
353
|
+
"Cancelled"
|
|
354
|
+
];
|
|
355
|
+
var SP_DESCRIPTION = "Story point value (1=Common, 2=Magic, 3=Rare, 5=Unique)";
|
|
356
|
+
function registerCreateSubtask(server2, conn2) {
|
|
357
|
+
server2.tool(
|
|
358
|
+
"create_subtask",
|
|
359
|
+
"Create a subtask under a parent task. Subtasks break a larger task into independently buildable pieces.",
|
|
360
|
+
{
|
|
361
|
+
parentTaskId: z5.string().describe("The parent task ID"),
|
|
362
|
+
title: z5.string().describe("Subtask title"),
|
|
363
|
+
description: z5.string().optional().describe("Subtask description"),
|
|
364
|
+
plan: z5.string().optional().describe("Subtask implementation plan (markdown)"),
|
|
365
|
+
ordinal: z5.number().optional().describe("Ordering position among siblings"),
|
|
366
|
+
storyPointValue: z5.number().optional().describe(SP_DESCRIPTION)
|
|
367
|
+
},
|
|
368
|
+
async (params) => {
|
|
369
|
+
const subtask = await conn2.createSubtask(params);
|
|
370
|
+
return {
|
|
371
|
+
content: [{ type: "text", text: `Subtask created: ${subtask.id} (slug: ${subtask.slug})` }]
|
|
372
|
+
};
|
|
373
|
+
}
|
|
374
|
+
);
|
|
375
|
+
}
|
|
376
|
+
function registerUpdateSubtask(server2, conn2) {
|
|
377
|
+
server2.tool(
|
|
378
|
+
"update_subtask",
|
|
379
|
+
"Update a subtask's fields: title, description, plan, status, ordering, or story points.",
|
|
380
|
+
{
|
|
381
|
+
subtaskId: z5.string().describe("The subtask ID"),
|
|
382
|
+
title: z5.string().optional().describe("New title"),
|
|
383
|
+
description: z5.string().optional().describe("New description"),
|
|
384
|
+
plan: z5.string().optional().describe("New plan (markdown)"),
|
|
385
|
+
status: z5.enum(STATUS_ENUM2).optional().describe("New status"),
|
|
386
|
+
ordinal: z5.number().optional().describe("New ordering position among siblings"),
|
|
387
|
+
storyPointValue: z5.number().optional().describe(SP_DESCRIPTION)
|
|
388
|
+
},
|
|
389
|
+
async (params) => {
|
|
390
|
+
const result = await conn2.updateSubtask(params);
|
|
391
|
+
return {
|
|
392
|
+
content: [
|
|
393
|
+
{ type: "text", text: `Subtask ${result.id} updated (status: ${result.status})` }
|
|
394
|
+
]
|
|
395
|
+
};
|
|
396
|
+
}
|
|
397
|
+
);
|
|
398
|
+
}
|
|
399
|
+
function registerListSubtasks(server2, conn2) {
|
|
400
|
+
server2.tool(
|
|
401
|
+
"list_subtasks",
|
|
402
|
+
"List all subtasks of a parent task with their status and ordering.",
|
|
403
|
+
{
|
|
404
|
+
taskId: z5.string().describe("The parent task ID")
|
|
405
|
+
},
|
|
406
|
+
async (params) => {
|
|
407
|
+
const subtasks = await conn2.listSubtasks(params.taskId);
|
|
408
|
+
return { content: [{ type: "text", text: JSON.stringify(subtasks, null, 2) }] };
|
|
409
|
+
}
|
|
410
|
+
);
|
|
411
|
+
}
|
|
412
|
+
function registerDeleteSubtask(server2, conn2) {
|
|
413
|
+
server2.tool(
|
|
414
|
+
"delete_subtask",
|
|
415
|
+
"Delete a subtask by ID. This is permanent \u2014 use update_subtask to set status to Cancelled if you only want to close it.",
|
|
416
|
+
{
|
|
417
|
+
subtaskId: z5.string().describe("The subtask ID to delete")
|
|
418
|
+
},
|
|
419
|
+
async (params) => {
|
|
420
|
+
const result = await conn2.deleteSubtask(params.subtaskId);
|
|
421
|
+
return {
|
|
422
|
+
content: [
|
|
423
|
+
{ type: "text", text: result.deleted ? "Subtask deleted" : "Subtask not deleted" }
|
|
424
|
+
]
|
|
425
|
+
};
|
|
426
|
+
}
|
|
427
|
+
);
|
|
428
|
+
}
|
|
429
|
+
function registerSubtaskTools(server2, conn2) {
|
|
430
|
+
registerCreateSubtask(server2, conn2);
|
|
431
|
+
registerUpdateSubtask(server2, conn2);
|
|
432
|
+
registerListSubtasks(server2, conn2);
|
|
433
|
+
registerDeleteSubtask(server2, conn2);
|
|
434
|
+
}
|
|
435
|
+
|
|
436
|
+
// src/tools/dependencies.ts
|
|
437
|
+
import { z as z6 } from "zod";
|
|
438
|
+
function registerGetDependencies(server2, conn2) {
|
|
439
|
+
server2.tool(
|
|
440
|
+
"get_dependencies",
|
|
441
|
+
"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.",
|
|
442
|
+
{
|
|
443
|
+
taskId: z6.string().describe("The task ID")
|
|
444
|
+
},
|
|
445
|
+
async (params) => {
|
|
446
|
+
const deps = await conn2.getDependencies(params.taskId);
|
|
447
|
+
return { content: [{ type: "text", text: JSON.stringify(deps, null, 2) }] };
|
|
448
|
+
}
|
|
449
|
+
);
|
|
450
|
+
}
|
|
451
|
+
function registerAddDependency(server2, conn2) {
|
|
452
|
+
server2.tool(
|
|
453
|
+
"add_dependency",
|
|
454
|
+
"Add a blocking dependency \u2014 this task cannot start until the named task is merged to dev.",
|
|
455
|
+
{
|
|
456
|
+
taskId: z6.string().describe("The task ID that will be blocked"),
|
|
457
|
+
dependsOnSlugOrId: z6.string().describe("Slug or ID of the task this one depends on")
|
|
458
|
+
},
|
|
459
|
+
async (params) => {
|
|
460
|
+
await conn2.addDependency(params);
|
|
461
|
+
return { content: [{ type: "text", text: "Dependency added" }] };
|
|
462
|
+
}
|
|
463
|
+
);
|
|
464
|
+
}
|
|
465
|
+
function registerRemoveDependency(server2, conn2) {
|
|
466
|
+
server2.tool(
|
|
467
|
+
"remove_dependency",
|
|
468
|
+
"Remove a previously added dependency from a task. The task is no longer blocked by the named task. Returns: confirmation string.",
|
|
469
|
+
{
|
|
470
|
+
taskId: z6.string().describe("The task ID to unblock"),
|
|
471
|
+
dependsOnSlugOrId: z6.string().describe("Slug or ID of the dependency to remove")
|
|
472
|
+
},
|
|
473
|
+
async (params) => {
|
|
474
|
+
await conn2.removeDependency(params);
|
|
475
|
+
return { content: [{ type: "text", text: "Dependency removed" }] };
|
|
476
|
+
}
|
|
477
|
+
);
|
|
478
|
+
}
|
|
479
|
+
function registerDependencyTools(server2, conn2) {
|
|
480
|
+
registerGetDependencies(server2, conn2);
|
|
481
|
+
registerAddDependency(server2, conn2);
|
|
482
|
+
registerRemoveDependency(server2, conn2);
|
|
483
|
+
}
|
|
484
|
+
|
|
485
|
+
// src/tools/suggestions.ts
|
|
486
|
+
import { z as z7 } from "zod";
|
|
487
|
+
function registerSuggestionTools(server2, conn2) {
|
|
488
|
+
server2.tool(
|
|
489
|
+
"create_suggestion",
|
|
490
|
+
"Suggest a feature, improvement, rule, or idea for the project. Duplicates are deduped and your upvote is recorded.",
|
|
491
|
+
{
|
|
492
|
+
title: z7.string().describe("Suggestion title"),
|
|
493
|
+
description: z7.string().optional().describe("Suggestion details (markdown)"),
|
|
494
|
+
tagNames: z7.array(z7.string()).optional().describe('Tag names to categorize the suggestion (e.g., ["agent-runner"])')
|
|
495
|
+
},
|
|
496
|
+
async (params) => {
|
|
497
|
+
const result = await conn2.createSuggestion(params);
|
|
498
|
+
const text = result.merged ? `Suggestion merged into existing suggestion ${result.mergedIntoId} (upvote recorded)` : `Suggestion created: ${result.id}`;
|
|
499
|
+
return { content: [{ type: "text", text }] };
|
|
500
|
+
}
|
|
501
|
+
);
|
|
502
|
+
}
|
|
503
|
+
|
|
504
|
+
// src/tools/index.ts
|
|
505
|
+
function registerAllTools(server2, conn2) {
|
|
506
|
+
registerProjectTools(server2, conn2);
|
|
507
|
+
registerTaskTools(server2, conn2);
|
|
508
|
+
registerBuildTools(server2, conn2);
|
|
509
|
+
registerAttachmentTools(server2, conn2);
|
|
510
|
+
registerPullRequestTools(server2, conn2);
|
|
511
|
+
registerSubtaskTools(server2, conn2);
|
|
512
|
+
registerDependencyTools(server2, conn2);
|
|
513
|
+
registerSuggestionTools(server2, conn2);
|
|
514
|
+
}
|
|
515
|
+
|
|
516
|
+
// src/cli.ts
|
|
517
|
+
var apiUrl = process.env.CONVEYOR_API_URL;
|
|
518
|
+
var projectToken = process.env.CONVEYOR_PROJECT_TOKEN;
|
|
519
|
+
var projectId = process.env.CONVEYOR_PROJECT_ID;
|
|
520
|
+
if (!apiUrl || !projectToken || !projectId) {
|
|
521
|
+
process.stderr.write(
|
|
522
|
+
"Error: CONVEYOR_API_URL, CONVEYOR_PROJECT_TOKEN, and CONVEYOR_PROJECT_ID environment variables are required.\n"
|
|
523
|
+
);
|
|
524
|
+
process.exit(1);
|
|
525
|
+
}
|
|
526
|
+
var conn = new ConveyorConnection({ apiUrl, projectToken, projectId });
|
|
527
|
+
try {
|
|
528
|
+
await conn.connect();
|
|
529
|
+
process.stderr.write("Connected to Conveyor API\n");
|
|
530
|
+
} catch (err) {
|
|
531
|
+
process.stderr.write(`Failed to connect to Conveyor API: ${err}
|
|
532
|
+
`);
|
|
533
|
+
process.exit(1);
|
|
534
|
+
}
|
|
535
|
+
var server = new McpServer({
|
|
536
|
+
name: "conveyor",
|
|
537
|
+
version: "2.1.0"
|
|
538
|
+
});
|
|
539
|
+
registerAllTools(server, conn);
|
|
540
|
+
var transport = new StdioServerTransport();
|
|
541
|
+
await server.connect(transport);
|
|
542
|
+
process.on("SIGINT", () => {
|
|
543
|
+
conn.disconnect();
|
|
544
|
+
process.exit(0);
|
|
545
|
+
});
|
|
546
|
+
process.on("SIGTERM", () => {
|
|
547
|
+
conn.disconnect();
|
|
548
|
+
process.exit(0);
|
|
549
|
+
});
|
|
550
|
+
//# sourceMappingURL=cli.js.map
|
package/dist/cli.js.map
ADDED
|
@@ -0,0 +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.0\",\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\"),\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\"),\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. 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\"),\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\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. Call list_task_files first to discover IDs and check sizes — large binaries may be truncated by the service's size limit.\",\n {\n taskId: z.string().describe(\"The task ID\"),\n fileId: z.string().describe(\"The file ID to fetch\"),\n },\n async (params) => {\n const file = await conn.getAttachment(params.taskId, params.fileId);\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"]}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { A as ActivePtySession, AttachTunnelOptions, C as ConveyorConnection, a as ConveyorMcpConfig, P as PtyAttachSnapshot, b as PtyDataChunk, ResolvedPtySession, RunTunnelOptions, TunnelConnection, TunnelHandle, TunnelSession, TunnelTty, WaitForPtySessionOptions, attachTunnel, runTunnel, waitForPtySession } from './tunnel.js';
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import {
|
|
2
|
+
ConveyorConnection
|
|
3
|
+
} from "./chunk-UIDBFQNZ.js";
|
|
4
|
+
import {
|
|
5
|
+
attachTunnel,
|
|
6
|
+
runTunnel,
|
|
7
|
+
waitForPtySession
|
|
8
|
+
} from "./chunk-N2XC2PGJ.js";
|
|
9
|
+
export {
|
|
10
|
+
ConveyorConnection,
|
|
11
|
+
attachTunnel,
|
|
12
|
+
runTunnel,
|
|
13
|
+
waitForPtySession
|
|
14
|
+
};
|
|
15
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
#!/usr/bin/env node
|