@rallycry/conveyor-mcp 5.0.15 → 5.0.17

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.
@@ -1,9 +1,11 @@
1
1
  import { io, Socket } from 'socket.io-client';
2
- import { ListProjectTagsDetail, ListedProjectTag, ListDriveFilesResponse, ReadDriveFileResponse, DriveFileDTO, DeleteDriveFileResponse, ProjectIntegrationsSummary, GaAnalyticsSummaryDTO, ProjectChannelDTO, ReadChannelMessagesResponse, PostChannelMessageResponse, CreateProjectDecisionRequest, CreateProjectDecisionResponse, EvaluateQuestionsRequest, EvaluateQuestionsResponse, ListProjectDecisionsRequest, ProjectDecisionRow, ProjectDecisionDetail, VoteProjectDecisionRequest, ResolveProjectDecisionRequest, UpdateProjectDecisionRequest, ListMeetingsResponse, MeetingForAgent, ReadMeetingTranscriptResponse, MeetingChecklistItemForAgent, DeletedTaskFile, ShowcasedTaskFile, UpdateIncidentInput, SetManualTestsResult } from '@project/shared';
2
+ import { ListProjectTagsDetail, ListedProjectTag, ListDriveFilesResponse, ReadDriveFileResponse, DriveFileDTO, DeleteDriveFileResponse, ProjectIntegrationsSummary, SiteAssetTargetDTO, SiteAssetUploadCapability, GaAnalyticsSummaryDTO, ProjectChannelDTO, ReadChannelMessagesResponse, PostChannelMessageResponse, CreateProjectDecisionRequest, CreateProjectDecisionResponse, EvaluateQuestionsRequest, EvaluateQuestionsResponse, ListProjectDecisionsRequest, ProjectDecisionRow, ProjectDecisionDetail, VoteProjectDecisionRequest, ResolveProjectDecisionRequest, UpdateProjectDecisionRequest, ListMeetingsResponse, MeetingForAgent, ReadMeetingTranscriptResponse, MeetingChecklistItemForAgent, DeletedTaskFile, ShowcasedTaskFile, UpdateIncidentInput, SetManualTestsResult } from '@project/shared';
3
3
 
4
4
  interface ConveyorMcpConfig {
5
5
  apiUrl: string;
6
6
  projectToken: string;
7
+ /** Task-scoped identity for the site-assets CLI running inside a card. */
8
+ taskToken?: string;
7
9
  projectId?: string;
8
10
  /**
9
11
  * Optional default board (sub-project) scope. When set, unqualified
@@ -162,9 +164,6 @@ interface WorkspaceAttachInfo {
162
164
  taskId: string;
163
165
  sessionId: string;
164
166
  workspaceRoot: string;
165
- /** "codespace" means preview-only — GitHub owns the VM's forwarded ports, so
166
- * `tunnelUrl`/`attachToken`/`ssh` are null/absent. Older servers omit it. */
167
- backend?: "gke" | "codespace";
168
167
  tunnelUrl: string | null;
169
168
  attachToken: string | null;
170
169
  expiresAt: string;
@@ -531,7 +530,8 @@ declare class ConveyorConnection {
531
530
  }>;
532
531
  sleepTask(taskId: string, projectId?: string): Promise<{
533
532
  taskId: string;
534
- codespaceStatus: string;
533
+ codespaceStatus?: string;
534
+ workspaceStatus?: string;
535
535
  }>;
536
536
  resumeTask(taskId: string, projectId?: string): Promise<{
537
537
  status: string;
@@ -676,6 +676,14 @@ declare class ConveyorConnection {
676
676
  * Credential-free — configuration booleans only.
677
677
  */
678
678
  listProjectIntegrations(projectId?: string): Promise<ProjectIntegrationsSummary>;
679
+ listSiteAssetTargets(projectId?: string): Promise<SiteAssetTargetDTO[]>;
680
+ requestSiteAssetUpload(params: {
681
+ projectId?: string;
682
+ siteId: string;
683
+ sha256: string;
684
+ ext: string;
685
+ sizeBytes: number;
686
+ }): Promise<SiteAssetUploadCapability>;
679
687
  /** GA4 traffic summary; an unconfigured project answers configured:false. */
680
688
  getProjectAnalyticsSummary(params: {
681
689
  projectId?: 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-eGuRasFp.js';
1
+ export { A as ActivePtySession, d as ConveyorConnection, e as ConveyorMcpConfig, P as PtyAttachSnapshot, c as PtyDataChunk } from './connection-Ctg-QM1s.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/index.js CHANGED
@@ -5,7 +5,7 @@ import {
5
5
  } from "./chunk-HIVOGGE3.js";
6
6
  import {
7
7
  ConveyorConnection
8
- } from "./chunk-CRHA7PSA.js";
8
+ } from "./chunk-6JLKJUYV.js";
9
9
  export {
10
10
  ConveyorConnection,
11
11
  attachTunnel,
@@ -0,0 +1 @@
1
+ #!/usr/bin/env node
@@ -0,0 +1,100 @@
1
+ #!/usr/bin/env node
2
+ import {
3
+ transferSiteAsset
4
+ } from "./chunk-IRVUONC3.js";
5
+ import {
6
+ ConveyorConnection
7
+ } from "./chunk-6JLKJUYV.js";
8
+
9
+ // src/site-assets-cli.ts
10
+ import crypto from "crypto";
11
+ import { readFile, stat } from "fs/promises";
12
+ import { extname, resolve } from "path";
13
+ var HELP = `Usage: conveyor-site-assets upload --site <siteId> [--project <projectId>] -- <files...>
14
+
15
+ Uploads static assets through Conveyor and emits one JSON result per input file.
16
+ Environment: CONVEYOR_API_URL, CONVEYOR_USER_TOKEN (or CONVEYOR_PROJECT_TOKEN), CONVEYOR_PROJECT_ID. Cards may use their existing CONVEYOR_TASK_TOKEN.`;
17
+ function parseArgs(argv2) {
18
+ const result = {
19
+ files: [],
20
+ help: false
21
+ };
22
+ for (let index = 0; index < argv2.length; index++) {
23
+ const arg = argv2[index];
24
+ if (arg === "--") {
25
+ result.files.push(...argv2.slice(index + 1));
26
+ break;
27
+ }
28
+ if (arg === "--help" || arg === "-h") result.help = true;
29
+ else if (arg === "--site") result.siteId = argv2[++index];
30
+ else if (arg === "--project") result.projectId = argv2[++index];
31
+ else if (arg.startsWith("--site=")) result.siteId = arg.slice(7);
32
+ else if (arg.startsWith("--project=")) result.projectId = arg.slice(10);
33
+ else throw new Error(`Unknown option: ${arg}; put file paths after --`);
34
+ }
35
+ return result;
36
+ }
37
+ var argv = process.argv.slice(2);
38
+ if (argv[0] === "upload") argv.shift();
39
+ var args = parseArgs(argv);
40
+ if (args.help) {
41
+ process.stdout.write(`${HELP}
42
+ `);
43
+ process.exit(0);
44
+ }
45
+ var apiUrl = process.env.CONVEYOR_API_URL;
46
+ var taskToken = process.env.CONVEYOR_TASK_TOKEN;
47
+ var projectToken = process.env.CONVEYOR_USER_TOKEN ?? process.env.CONVEYOR_PROJECT_TOKEN;
48
+ if (!apiUrl || !projectToken && !taskToken || !args.siteId || args.files.length === 0) {
49
+ process.stderr.write(`Error: --site and one or more files are required. ${HELP}
50
+ `);
51
+ process.exit(1);
52
+ }
53
+ if (args.files.length > 50) {
54
+ process.stderr.write("Error: at most 50 files may be uploaded in one invocation.\n");
55
+ process.exit(1);
56
+ }
57
+ var conn = new ConveyorConnection({
58
+ apiUrl,
59
+ projectToken: projectToken ?? "",
60
+ taskToken,
61
+ projectId: args.projectId ?? process.env.CONVEYOR_PROJECT_ID
62
+ });
63
+ await conn.connect();
64
+ try {
65
+ const results = [];
66
+ for (const input of args.files.sort()) {
67
+ const path = resolve(input);
68
+ try {
69
+ const info = await stat(path);
70
+ if (!info.isFile()) throw new Error("not a file");
71
+ if (info.size > 25 * 1024 * 1024) throw new Error("asset exceeds 25MiB limit");
72
+ const bytes = await readFile(path);
73
+ if (bytes.length !== info.size || bytes.length > 25 * 1024 * 1024)
74
+ throw new Error("asset changed during read or exceeds 25MiB limit");
75
+ const sha256 = crypto.createHash("sha256").update(bytes).digest("hex");
76
+ const ext = extname(path).slice(1).toLowerCase();
77
+ const capability = await conn.requestSiteAssetUpload({
78
+ siteId: args.siteId,
79
+ sha256,
80
+ ext,
81
+ sizeBytes: bytes.length
82
+ });
83
+ const result = await transferSiteAsset(capability, new Uint8Array(bytes), {
84
+ key: capability.key,
85
+ publicUrl: capability.publicUrl,
86
+ sha256,
87
+ sizeBytes: bytes.length,
88
+ mimeType: capability.headers["content-type"]
89
+ });
90
+ results.push({ path, ...result });
91
+ } catch (error) {
92
+ results.push({ path, error: error instanceof Error ? error.message : "Upload failed" });
93
+ }
94
+ }
95
+ process.stdout.write(`${JSON.stringify({ results })}
96
+ `);
97
+ if (results.some((result) => "error" in result)) process.exitCode = 1;
98
+ } finally {
99
+ conn.disconnect();
100
+ }
@@ -7,7 +7,7 @@ import {
7
7
  } from "./chunk-5KU3QS6A.js";
8
8
  import {
9
9
  ConveyorConnection
10
- } from "./chunk-CRHA7PSA.js";
10
+ } from "./chunk-6JLKJUYV.js";
11
11
 
12
12
  // src/tunnel-cli.ts
13
13
  var HELP = `conveyor-tunnel \u2014 attach your local terminal to a cloud Claude Code session.
package/dist/tunnel.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { A as ActivePtySession, P as PtyAttachSnapshot, c as PtyDataChunk } from './connection-eGuRasFp.js';
1
+ import { A as ActivePtySession, P as PtyAttachSnapshot, c as PtyDataChunk } from './connection-Ctg-QM1s.js';
2
2
  import 'socket.io-client';
3
3
  import '@project/shared';
4
4
 
package/dist/wait-cli.js CHANGED
@@ -4,7 +4,7 @@ import {
4
4
  } from "./chunk-5KU3QS6A.js";
5
5
  import {
6
6
  ConveyorConnection
7
- } from "./chunk-CRHA7PSA.js";
7
+ } from "./chunk-6JLKJUYV.js";
8
8
  import {
9
9
  runWait
10
10
  } from "./chunk-OPZL4NDT.js";
@@ -1,4 +1,4 @@
1
- import { C as CardCollectionPage, a as CardCollectionDelta } from './connection-eGuRasFp.js';
1
+ import { C as CardCollectionPage, a as CardCollectionDelta } from './connection-Ctg-QM1s.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-eGuRasFp.js';
1
+ import { b as CardCollectionItem } from './connection-Ctg-QM1s.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.15",
3
+ "version": "5.0.17",
4
4
  "description": "Conveyor MCP server for Claude Code PM integration",
5
5
  "keywords": [
6
6
  "claude",
@@ -11,6 +11,7 @@
11
11
  "license": "MIT",
12
12
  "bin": {
13
13
  "conveyor-mcp": "dist/cli.js",
14
+ "conveyor-site-assets": "dist/site-assets-cli.js",
14
15
  "conveyor-tunnel": "dist/tunnel-cli.js",
15
16
  "conveyor-wait": "dist/wait-cli.js"
16
17
  },
@@ -35,7 +36,7 @@
35
36
  "test:unit": "vitest run --passWithNoTests"
36
37
  },
37
38
  "dependencies": {
38
- "@modelcontextprotocol/sdk": "^1.30.1",
39
+ "@modelcontextprotocol/sdk": "^1.32.1",
39
40
  "socket.io-client": "^4.8.4",
40
41
  "ws": "8.22.0",
41
42
  "zod": "^4.6.5"