@rallycry/conveyor-mcp 5.0.5 → 5.0.6

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 CHANGED
@@ -1118,6 +1118,11 @@ var uploadAttachmentContract = defineToolContract({
1118
1118
  title: f.optional(
1119
1119
  f.string({ desc: "Short caption posted with the file (defaults to the file name)" })
1120
1120
  ),
1121
+ comment: f.optional(
1122
+ f.string({
1123
+ desc: "Alias of `title` (the external conveyor-mcp surface names this field `comment`). Provide at most one of the two."
1124
+ })
1125
+ ),
1121
1126
  tags: attachmentTags
1122
1127
  }
1123
1128
  },
@@ -1130,6 +1135,11 @@ var uploadAttachmentContract = defineToolContract({
1130
1135
  comment: f.optional(
1131
1136
  f.string({ desc: "When set, also posts the attachment to the task chat with this text" })
1132
1137
  ),
1138
+ title: f.optional(
1139
+ f.string({
1140
+ desc: "Alias of `comment` (the in-pod agent surface names this field `title`). Provide at most one of the two."
1141
+ })
1142
+ ),
1133
1143
  tags: attachmentTags,
1134
1144
  mimeType: f.optional(
1135
1145
  f.string({ desc: "Override the mime type inferred from the file extension" })
@@ -1189,7 +1199,7 @@ var agentOption = f.object(
1189
1199
  var createDecisionContract = defineToolContract({
1190
1200
  name: "create_decision",
1191
1201
  agent: {
1192
- description: `Raise a product decision: a fork the plan cannot be right without. Two or three options, one default, a deadline. Run list_decisions FIRST \u2014 an answered decision is the answer, and re-asking it wastes everybody's time. Do NOT file a decision for an assumption you can simply state: an assumed behaviour belongs in the plan as a GIVEN / WHEN / THEN line under "Assumed behaviours". Returns the decision's id, slug, and url.`,
1202
+ description: `Raise a product decision: a fork the plan cannot be right without. Two or three options, one default, a deadline. Run list_decisions FIRST \u2014 an answered decision is the answer, and re-asking it wastes everybody's time. Do NOT file a decision for an assumption you can simply state: an assumed behaviour belongs in the plan as a GIVEN / WHEN / THEN line under "Assumed behaviours". Returns the decision in full (the same JSON as get_decision, with option ids and the deadline) plus which cards were linked.`,
1193
1203
  fields: {
1194
1204
  question: f.string({
1195
1205
  min: 1,
@@ -1226,6 +1236,16 @@ var createDecisionContract = defineToolContract({
1226
1236
  ),
1227
1237
  raised_by_pr: f.optional(
1228
1238
  f.number({ int: true, min: 1, desc: "PR number that surfaced the question" })
1239
+ ),
1240
+ raised_by_card: f.optional(
1241
+ f.string({
1242
+ desc: "Slug or id of the card that raised the question. A link back, not a block \u2014 use impacted_cards to block a card."
1243
+ })
1244
+ ),
1245
+ deadline_at: f.optional(
1246
+ f.string({
1247
+ desc: "Absolute deadline as an ISO 8601 timestamp, e.g. 2026-09-25T17:00:00Z. Wins over deadline_hours when both are given; must be in the future and within 720 hours."
1248
+ })
1229
1249
  )
1230
1250
  }
1231
1251
  },
@@ -1249,6 +1269,16 @@ var createDecisionContract = defineToolContract({
1249
1269
  tagNames: f.optional(f.array(f.string(), { desc: "Tag names to categorize the decision" })),
1250
1270
  raisedByPr: f.optional(
1251
1271
  f.number({ int: true, min: 1, desc: "PR number that surfaced the question" })
1272
+ ),
1273
+ raisedByCard: f.optional(
1274
+ f.string({
1275
+ desc: "Slug or id of the card that raised the question. A link back, not a block \u2014 use impactedCards to block a card."
1276
+ })
1277
+ ),
1278
+ deadlineAt: f.optional(
1279
+ f.string({
1280
+ desc: "Absolute deadline (ISO 8601). Wins over deadlineHours when both are given; must be in the future and within 720 hours."
1281
+ })
1252
1282
  )
1253
1283
  }
1254
1284
  }
@@ -1256,7 +1286,7 @@ var createDecisionContract = defineToolContract({
1256
1286
  var listDecisionsContract = defineToolContract({
1257
1287
  name: "list_decisions",
1258
1288
  agent: {
1259
- description: `Search this project's decisions. Run this BEFORE planning anything in an area: "have we already decided how X behaves?" Decided rows carry their resolution, so the list doubles as the decision log. Filter by card to see what is blocking a specific card.`,
1289
+ description: `Search this project's decisions. Run this BEFORE planning anything in an area: "have we already decided how X behaves?" Each row carries the summary, who raised it (and from which card or PR), when, and \u2014 once settled \u2014 the resolution, so the list doubles as the decision log. Filter by card to see what is blocking a specific card.`,
1260
1290
  fields: {
1261
1291
  status: f.optional(
1262
1292
  f.enum(STATUS_LABELS, {
@@ -1288,7 +1318,7 @@ var listDecisionsContract = defineToolContract({
1288
1318
  var getDecisionContract = defineToolContract({
1289
1319
  name: "get_decision",
1290
1320
  agent: {
1291
- description: "Read one decision in full: its context, every option with its GIVEN / WHEN / THEN, every vote with who cast it and why, the running tally, the cards it blocks, and the resolution once there is one. Use read_task_chat with the same id for the discussion thread.",
1321
+ description: "Read one decision in full: its summary and context, who raised it and from where, every option with its GIVEN / WHEN / THEN, every vote with who cast it and why, the running tally, the cards it blocks, and the resolution once there is one. Use read_task_chat with the same id for the discussion thread.",
1292
1322
  fields: {
1293
1323
  decision: f.string({ min: 1, desc: "Decision slug or id" })
1294
1324
  }
@@ -1353,10 +1383,32 @@ var resolveDecisionContract = defineToolContract({
1353
1383
  var updateDecisionContract = defineToolContract({
1354
1384
  name: "update_decision",
1355
1385
  agent: {
1356
- description: "Change an open decision: extend its deadline, link or unlink the cards it blocks, or cancel it. Cancelling un-blocks the impacted cards without answering the question, so only do it when the question stopped mattering.",
1386
+ description: "Change an open decision: fix the question, summary, context or tags, rewrite the options while nobody has voted, move the deadline, link or unlink the cards it blocks, or cancel it. Cancelling un-blocks the impacted cards without answering the question, so only do it when the question stopped mattering.",
1357
1387
  fields: {
1358
1388
  decision: f.string({ min: 1, desc: "Decision slug or id" }),
1389
+ question: f.optional(f.string({ min: 1, desc: "New question, one plain sentence" })),
1390
+ summary: f.optional(
1391
+ f.string({ desc: cardDescriptionDesc("New one- or two-sentence summary") })
1392
+ ),
1393
+ context: f.optional(f.string({ min: 1, desc: "New markdown background" })),
1394
+ options: f.optional(
1395
+ f.array(agentOption, {
1396
+ min: 2,
1397
+ desc: "Replacement options. Accepted only while the decision has no votes \u2014 once somebody has voted, cancel it and raise a new one instead. Send default_option with it: the old default no longer exists."
1398
+ })
1399
+ ),
1400
+ default_option: f.optional(
1401
+ f.number({ int: true, min: 1, max: 3, desc: "1-based position of the new default" })
1402
+ ),
1403
+ tag_names: f.optional(
1404
+ f.array(f.string(), { desc: "Replacement tag names (replaces the current set)" })
1405
+ ),
1359
1406
  deadline_hours: f.optional(f.number({ desc: "New deadline, in hours from now. 1 to 720." })),
1407
+ deadline_at: f.optional(
1408
+ f.string({
1409
+ desc: "New absolute deadline (ISO 8601). Wins over deadline_hours; must be in the future and within 720 hours."
1410
+ })
1411
+ ),
1360
1412
  add_impacted_cards: f.optional(
1361
1413
  f.array(f.string(), { desc: "Slugs or ids of cards to block on this decision" })
1362
1414
  ),
@@ -1371,13 +1423,29 @@ var updateDecisionContract = defineToolContract({
1371
1423
  }
1372
1424
  },
1373
1425
  mcp: {
1374
- description: "Change an open Conveyor decision: extend the deadline, link or unlink impacted cards, cancel it, or reopen a settled one.",
1426
+ description: "Change an open Conveyor decision: fix the question, summary, context or tags, rewrite the options while nobody has voted, move the deadline, link or unlink impacted cards, cancel it, or reopen a settled one.",
1375
1427
  fields: {
1376
1428
  projectId: mcpProjectId,
1377
1429
  decision: f.string({ desc: "Decision slug or id" }),
1430
+ question: f.optional(f.string({ desc: "New question" })),
1431
+ summary: f.optional(f.string({ desc: cardDescriptionDesc("New summary") })),
1432
+ context: f.optional(f.string({ desc: "New markdown background" })),
1433
+ options: f.optional(
1434
+ f.array(agentOption, {
1435
+ min: 2,
1436
+ desc: "Replacement options. Accepted only while the decision has no votes. Send defaultOption with it: the old default no longer exists."
1437
+ })
1438
+ ),
1439
+ defaultOption: f.optional(
1440
+ f.number({ int: true, min: 1, max: 3, desc: "1-based position of the new default" })
1441
+ ),
1442
+ tagNames: f.optional(f.array(f.string(), { desc: "Replacement tag names" })),
1378
1443
  deadlineHours: f.optional(
1379
1444
  f.number({ min: 1, max: 720, desc: "New deadline, in hours from now" })
1380
1445
  ),
1446
+ deadlineAt: f.optional(
1447
+ f.string({ desc: "New absolute deadline (ISO 8601). Wins over deadlineHours." })
1448
+ ),
1381
1449
  addImpactedCards: f.optional(
1382
1450
  f.array(f.string(), { desc: "Slugs or ids of cards to block on this decision" })
1383
1451
  ),
@@ -2376,13 +2444,22 @@ function registerProjectConfigTools(server2, conn2) {
2376
2444
  import { z as z6 } from "zod";
2377
2445
 
2378
2446
  // src/tools/tasks-format.ts
2447
+ function formatCompletedMeta(data) {
2448
+ const parts = [];
2449
+ const usage = data.usage;
2450
+ const total = typeof usage === "object" && usage !== null ? usage.totalTokens : void 0;
2451
+ if (typeof total === "number" && total > 0) parts.push(`tokens: ${total}`);
2452
+ if (typeof data.costUsd === "number") parts.push(`cost: $${data.costUsd}`);
2453
+ parts.push(`duration: ${typeof data.durationMs === "number" ? data.durationMs : "?"}ms`);
2454
+ return parts.join(", ");
2455
+ }
2379
2456
  var CLI_EVENT_FORMATTERS = {
2380
2457
  thinking: (data) => String(data.message ?? ""),
2381
2458
  tool_use: (data) => `${data.tool}: ${String(data.input ?? "").slice(0, 1e3)}`,
2382
2459
  tool_result: (data) => `${data.tool} \u2192 ${String(data.output ?? "").slice(0, 500)}${data.isError ? " [ERROR]" : ""}`,
2383
2460
  message: (data) => String(data.content ?? ""),
2384
2461
  error: (data) => `ERROR: ${String(data.message ?? "")}`,
2385
- completed: (data) => `Completed: ${data.summary ?? ""} (cost: $${data.costUsd ?? "?"}, duration: ${data.durationMs ?? "?"}ms)`,
2462
+ completed: (data) => `Completed: ${data.summary ?? ""} (${formatCompletedMeta(data)})`,
2386
2463
  setup_output: (data) => `[${data.stream ?? "stdout"}] ${String(data.data ?? "")}`,
2387
2464
  start_command_output: (data) => `[${data.stream ?? "stdout"}] ${String(data.data ?? "")}`,
2388
2465
  turn_end: (data) => `Turn complete (${Array.isArray(data.toolCalls) ? data.toolCalls.length : 0} tool calls)`
@@ -2406,7 +2483,7 @@ function compactChatMessage(message) {
2406
2483
  return obj;
2407
2484
  }
2408
2485
  function formatLegacyComputeSession(s) {
2409
- return ` - session ${s.id} [${s.provider}] pod=${s.instanceName ?? "-"} status=${s.status} runner=${s.agentRunnerStatus ?? "-"} lastHeartbeat=${s.lastHeartbeatAt ?? "-"} created=${s.createdAt} stopped=${s.stoppedAt ?? "-"}` + (s.deletionRequestedAt ? ` deletionRequested=${s.deletionRequestedAt} (attempts ${s.deletionAttempts})` : "") + (s.lastAgentEvent ? ` lastAgentEvent=${s.lastAgentEvent}` : "");
2486
+ return ` - session ${s.id} [${s.provider}] pod=${s.instanceName ?? "-"} status=${s.status} runner=${s.agentRunnerStatus ?? "-"} lastHeartbeat=${s.lastHeartbeatAt ?? "-"} created=${s.createdAt} stopped=${s.stoppedAt ?? "-"}` + (s.deletionRequestedAt ? ` deletionRequested=${s.deletionRequestedAt} (attempts ${s.deletionAttempts})` : "") + (s.lastAgentEvent ? ` lastAgentEvent=${s.lastAgentEvent}` : "") + (s.tokenUsage ? ` tokens=${s.tokenUsage.totalTokens} (${s.tokenUsage.turns} turns)` : "");
2410
2487
  }
2411
2488
  function formatWorkspaceSession(s) {
2412
2489
  return ` - workspaceSession ${s.id} role=${s.role} mode=${s.mode} status=${s.status} leaseUntil=${s.leaseUntil ?? "-"} created=${s.createdAt}`;
@@ -2471,7 +2548,7 @@ var STATUS_ENUM2 = [
2471
2548
  "Complete",
2472
2549
  "Cancelled"
2473
2550
  ];
2474
- var CARD_TYPE_ENUM = ["task", "incident", "suggestion"];
2551
+ var CARD_TYPE_ENUM = ["task", "incident", "suggestion", "decision"];
2475
2552
  var RISK_ENUM2 = ["critical", "high", "medium", "low"];
2476
2553
  var BOARD_FILTER = z6.string().nullable().optional().describe(
2477
2554
  "Filter to a sub-project board. Omit to use the connection's default board (CONVEYOR_SUBPROJECT_ID) when set, else the whole project; pass null to force the whole project. Use list_accessible_subprojects to find board IDs."
@@ -2483,7 +2560,7 @@ function registerListTasks(server2, conn2) {
2483
2560
  registerHotTool(
2484
2561
  server2,
2485
2562
  "list_tasks",
2486
- "List project cards, optionally filtered by card type, status, or assignment (a specific assignee, or unassigned tasks). Defaults to type=task \u2014 pass typeFilters to list incidents/suggestions. Results are relevance-ordered: highest priority first then newest; suggestions-only queries rank by upvote score. Pass projectId to target a specific project; otherwise the configured default project is used. Returns summaries \u2014 plan omitted, description truncated; use get_task for full details.",
2563
+ "List project cards, optionally filtered by card type, status, or assignment (a specific assignee, or unassigned tasks). Defaults to type=task \u2014 pass typeFilters to list incidents, suggestions or decisions. Results are relevance-ordered: highest priority first then newest; suggestions-only queries rank by upvote score. Pass projectId to target a specific project; otherwise the configured default project is used. Returns summaries \u2014 plan omitted, description truncated; use get_task for full details.",
2487
2564
  {
2488
2565
  projectId: z6.string().optional().describe("Target Conveyor project ID"),
2489
2566
  status: z6.enum(STATUS_ENUM2).optional().describe("Filter by task status"),
@@ -3029,10 +3106,11 @@ function registerUploadAttachment(server2, conn2) {
3029
3106
  ]
3030
3107
  };
3031
3108
  }
3109
+ const comment = params.comment ?? params.title;
3032
3110
  const result = await conn2.confirmFileUpload(
3033
3111
  params.taskId,
3034
3112
  fileId,
3035
- params.comment,
3113
+ comment,
3036
3114
  params.projectId,
3037
3115
  params.tags
3038
3116
  );
@@ -3041,6 +3119,11 @@ function registerUploadAttachment(server2, conn2) {
3041
3119
  ];
3042
3120
  if (result.downloadUrl) lines.push(`downloadUrl: ${result.downloadUrl}`);
3043
3121
  if (result.messageId) lines.push("Posted to the task chat.");
3122
+ else if (comment === void 0) {
3123
+ lines.push(
3124
+ "Not posted to the task chat \u2014 pass `comment` (or `title`) to show it in the card thread."
3125
+ );
3126
+ }
3044
3127
  if (result.appliedTags?.length) lines.push(`Tagged: ${result.appliedTags.join(", ")}.`);
3045
3128
  if (result.unknownTags?.length) {
3046
3129
  lines.push(
@@ -3627,6 +3710,13 @@ var TurnEndToolCallSchema = z22.object({
3627
3710
  output: z22.string().optional(),
3628
3711
  timestamp: z22.string().optional()
3629
3712
  }).passthrough();
3713
+ var AgentTurnUsageSchema = z22.object({
3714
+ inputTokens: z22.number(),
3715
+ outputTokens: z22.number(),
3716
+ cacheReadInputTokens: z22.number(),
3717
+ cacheCreationInputTokens: z22.number(),
3718
+ totalTokens: z22.number()
3719
+ });
3630
3720
  var KnownAgentEventSchema = z22.discriminatedUnion("type", [
3631
3721
  // ── Lifecycle / connection ────────────────────────────────────────────
3632
3722
  z22.object({
@@ -3666,7 +3756,11 @@ var KnownAgentEventSchema = z22.discriminatedUnion("type", [
3666
3756
  z22.object({
3667
3757
  type: z22.literal("completed"),
3668
3758
  summary: z22.string().optional(),
3669
- durationMs: z22.number().optional()
3759
+ durationMs: z22.number().optional(),
3760
+ /** Tokens this turn consumed, summed from the transcript's assistant
3761
+ * records. Optional: an older agent build sends none, and the server
3762
+ * then records nothing rather than zeroing the session's totals. */
3763
+ usage: AgentTurnUsageSchema.optional()
3670
3764
  }).passthrough(),
3671
3765
  z22.object({ type: z22.literal("error"), message: z22.string() }).passthrough(),
3672
3766
  z22.object({ type: z22.literal("agent_typing_start") }).passthrough(),
@@ -5147,6 +5241,10 @@ var CreateProjectDecisionRequestSchema = z11.object({
5147
5241
  sessionId: z11.string().optional(),
5148
5242
  tagNames: z11.array(z11.string().min(1)).max(10).optional(),
5149
5243
  raisedByPr: z11.number().int().positive().optional(),
5244
+ /** Slug or id of the card that raised the question. A link back, not a block. */
5245
+ raisedByCard: z11.string().min(1).optional(),
5246
+ /** Absolute deadline (ISO 8601). Wins over `deadlineHours` when both are sent. */
5247
+ deadlineAt: z11.string().datetime({ offset: true }).optional(),
5150
5248
  requestingUserId: z11.string().optional()
5151
5249
  });
5152
5250
  var ListProjectDecisionsRequestSchema = z11.object({
@@ -5182,7 +5280,16 @@ var ResolveProjectDecisionRequestSchema = z11.object({
5182
5280
  var UpdateProjectDecisionRequestSchema = z11.object({
5183
5281
  projectId: z11.string(),
5184
5282
  decision: z11.string().min(1),
5283
+ question: z11.string().min(1).max(200).optional(),
5284
+ summary: z11.string().max(CARD_DESCRIPTION_MAX).optional(),
5285
+ context: z11.string().min(1).optional(),
5286
+ /** Accepted only while nobody has voted. */
5287
+ options: optionsInput.optional(),
5288
+ defaultOption: z11.number().int().min(1).max(DECISION_OPTIONS_MAX).optional(),
5289
+ tagNames: z11.array(z11.string().min(1)).max(10).optional(),
5185
5290
  deadlineHours,
5291
+ /** Absolute deadline (ISO 8601). Wins over `deadlineHours` when both are sent. */
5292
+ deadlineAt: z11.string().datetime({ offset: true }).optional(),
5186
5293
  addImpactedCards: z11.array(z11.string().min(1)).max(50).optional(),
5187
5294
  removeImpactedCards: z11.array(z11.string().min(1)).max(50).optional(),
5188
5295
  status: z11.enum(["Cancelled", "Open"]).optional(),
@@ -5867,23 +5974,18 @@ function registerDecisionReads(server2, conn2) {
5867
5974
  }
5868
5975
  function registerDecisionWrites(server2, conn2) {
5869
5976
  registerContractTool(server2, createDecisionContract, async (params) => {
5870
- const { defaultOption, deadlineHours: deadlineHours2, impactedCards, tagNames, raisedByPr, ...rest } = params;
5871
- const res = await conn2.createDecision({
5872
- ...rest,
5873
- defaultOption,
5874
- deadlineHours: deadlineHours2,
5875
- impactedCards,
5876
- tagNames,
5877
- raisedByPr
5878
- });
5879
- const refused = res.refused.length > 0 ? `
5880
- Not linked: ${res.refused.map((r) => `${r.ref} (${r.reason})`).join("; ")}` : "";
5977
+ const res = await conn2.createDecision(params);
5978
+ const { impactedLinked, refused, ...detail } = res;
5979
+ const refusedLine = refused.length > 0 ? `
5980
+ Not linked: ${refused.map((r) => `${r.ref} (${r.reason})`).join("; ")}` : "";
5881
5981
  return {
5882
5982
  content: [
5883
5983
  {
5884
5984
  type: "text",
5885
5985
  text: `Raised decision ${res.slug} \u2014 ${res.url}
5886
- Blocking ${res.impactedLinked.length} card(s).${refused}`
5986
+ Blocking ${impactedLinked.length} card(s).${refusedLine}
5987
+
5988
+ ${JSON.stringify(detail, null, 2)}`
5887
5989
  }
5888
5990
  ]
5889
5991
  };
@@ -585,6 +585,15 @@ declare class ConveyorConnection {
585
585
  lastHeartbeatAt: string | null;
586
586
  agentRunningAt: string | null;
587
587
  lastAgentEvent: string | null;
588
+ /** Tokens this session's turns consumed, or null when none recorded. */
589
+ tokenUsage: {
590
+ inputTokens: number;
591
+ outputTokens: number;
592
+ cacheReadInputTokens: number;
593
+ cacheCreationInputTokens: number;
594
+ totalTokens: number;
595
+ turns: number;
596
+ } | null;
588
597
  deletionRequestedAt: string | null;
589
598
  deletionAttempts: number;
590
599
  createdAt: string;
package/dist/index.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- export { A as ActivePtySession, d as ConveyorConnection, e as ConveyorMcpConfig, P as PtyAttachSnapshot, c as PtyDataChunk } from './connection-DclP31lm.js';
1
+ export { A as ActivePtySession, d as ConveyorConnection, e as ConveyorMcpConfig, P as PtyAttachSnapshot, c as PtyDataChunk } from './connection-DeBZ_T6f.js';
2
2
  export { AttachTunnelOptions, ResolvedPtySession, RunTunnelOptions, TunnelConnection, TunnelHandle, TunnelSession, TunnelTty, WaitForPtySessionOptions, attachTunnel, runTunnel, waitForPtySession } from './tunnel.js';
3
3
  import 'socket.io-client';
4
4
  import '@project/shared';
package/dist/tunnel.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { A as ActivePtySession, P as PtyAttachSnapshot, c as PtyDataChunk } from './connection-DclP31lm.js';
1
+ import { A as ActivePtySession, P as PtyAttachSnapshot, c as PtyDataChunk } from './connection-DeBZ_T6f.js';
2
2
  import 'socket.io-client';
3
3
  import '@project/shared';
4
4
 
@@ -1,4 +1,4 @@
1
- import { C as CardCollectionPage, a as CardCollectionDelta } from './connection-DclP31lm.js';
1
+ import { C as CardCollectionPage, a as CardCollectionDelta } from './connection-DeBZ_T6f.js';
2
2
  import { WaitFilter, WaitResult } from './wait.js';
3
3
  import 'socket.io-client';
4
4
  import '@project/shared';
package/dist/wait.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { b as CardCollectionItem } from './connection-DclP31lm.js';
1
+ import { b as CardCollectionItem } from './connection-DeBZ_T6f.js';
2
2
  import 'socket.io-client';
3
3
  import '@project/shared';
4
4
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@rallycry/conveyor-mcp",
3
- "version": "5.0.5",
3
+ "version": "5.0.6",
4
4
  "description": "Conveyor MCP server for Claude Code PM integration",
5
5
  "keywords": [
6
6
  "claude",