@testchimp/cli 0.1.80 → 0.1.82
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/program.js +41 -0
- package/dist/core/schemas.d.ts +7 -0
- package/dist/core/schemas.js +10 -0
- package/dist/core/tools.js +30 -0
- package/dist/core/tools.test.js +45 -0
- package/package.json +1 -1
package/dist/cli/program.js
CHANGED
|
@@ -480,6 +480,47 @@ export function buildCliProgram() {
|
|
|
480
480
|
const out = await runTool("get-manual-session-details", merged, { postMcp });
|
|
481
481
|
console.log(out);
|
|
482
482
|
});
|
|
483
|
+
program
|
|
484
|
+
.command("get-meeting-transcript")
|
|
485
|
+
.description(TOOL_DEFINITIONS.find((t) => t.kebab === "get-meeting-transcript").description)
|
|
486
|
+
.addOption(jsonInputOption())
|
|
487
|
+
.option("--meeting-id <id>", "meeting id (calendar event id, or URL hash for ad-hoc; same as Studio folder under ~/.testchimp/data/meetings/)")
|
|
488
|
+
.option("--summary-only", "return only the post-meeting summary (omit the transcript body)")
|
|
489
|
+
.action(async (opts) => {
|
|
490
|
+
const body = {};
|
|
491
|
+
if (opts.meetingId) {
|
|
492
|
+
body.meetingId = String(opts.meetingId).trim();
|
|
493
|
+
}
|
|
494
|
+
if (opts.summaryOnly) {
|
|
495
|
+
body.summaryOnly = true;
|
|
496
|
+
}
|
|
497
|
+
const merged = mergeBodies(body, opts.jsonInput);
|
|
498
|
+
if (!merged.meetingId || String(merged.meetingId).trim() === "") {
|
|
499
|
+
throw new Error("meetingId is required (--meeting-id)");
|
|
500
|
+
}
|
|
501
|
+
const out = await runTool("get-meeting-transcript", {
|
|
502
|
+
meetingId: String(merged.meetingId).trim(),
|
|
503
|
+
...(merged.summaryOnly ? { summaryOnly: true } : {}),
|
|
504
|
+
}, { postMcp });
|
|
505
|
+
console.log(out);
|
|
506
|
+
});
|
|
507
|
+
program
|
|
508
|
+
.command("get-meeting-set")
|
|
509
|
+
.description(TOOL_DEFINITIONS.find((t) => t.kebab === "get-meeting-set").description)
|
|
510
|
+
.addOption(jsonInputOption())
|
|
511
|
+
.option("--meeting-set-id <id>", "meeting-set ULID (from `/testchimp using meeting-set context <id>`)")
|
|
512
|
+
.action(async (opts) => {
|
|
513
|
+
const body = {};
|
|
514
|
+
if (opts.meetingSetId) {
|
|
515
|
+
body.meetingSetId = String(opts.meetingSetId).trim();
|
|
516
|
+
}
|
|
517
|
+
const merged = mergeBodies(body, opts.jsonInput);
|
|
518
|
+
if (!merged.meetingSetId || String(merged.meetingSetId).trim() === "") {
|
|
519
|
+
throw new Error("meetingSetId is required (--meeting-set-id)");
|
|
520
|
+
}
|
|
521
|
+
const out = await runTool("get-meeting-set", { meetingSetId: String(merged.meetingSetId).trim() }, { postMcp });
|
|
522
|
+
console.log(out);
|
|
523
|
+
});
|
|
483
524
|
program
|
|
484
525
|
.command("get-issue-details")
|
|
485
526
|
.description(TOOL_DEFINITIONS.find((t) => t.kebab === "get-issue-details").description)
|
package/dist/core/schemas.d.ts
CHANGED
|
@@ -289,6 +289,13 @@ export declare const listTestScenariosForScopeInput: z.ZodObject<{
|
|
|
289
289
|
export declare const getManualSessionDetailsInput: z.ZodObject<{
|
|
290
290
|
manualSessionId: z.ZodString;
|
|
291
291
|
}, z.core.$strip>;
|
|
292
|
+
export declare const getMeetingTranscriptInput: z.ZodObject<{
|
|
293
|
+
meetingId: z.ZodString;
|
|
294
|
+
summaryOnly: z.ZodOptional<z.ZodBoolean>;
|
|
295
|
+
}, z.core.$strip>;
|
|
296
|
+
export declare const getMeetingSetInput: z.ZodObject<{
|
|
297
|
+
meetingSetId: z.ZodString;
|
|
298
|
+
}, z.core.$strip>;
|
|
292
299
|
export declare const getIssueDetailsInput: z.ZodObject<{
|
|
293
300
|
issueId: z.ZodString;
|
|
294
301
|
}, z.core.$strip>;
|
package/dist/core/schemas.js
CHANGED
|
@@ -167,6 +167,16 @@ export const listTestScenariosForScopeInput = z
|
|
|
167
167
|
export const getManualSessionDetailsInput = z.object({
|
|
168
168
|
manualSessionId: z.string().min(1),
|
|
169
169
|
});
|
|
170
|
+
export const getMeetingTranscriptInput = z.object({
|
|
171
|
+
/** Calendar event id, or URL hash for ad-hoc meetings */
|
|
172
|
+
meetingId: z.string().min(1),
|
|
173
|
+
/** Return only the post-meeting summary (transcript body omitted). */
|
|
174
|
+
summaryOnly: z.boolean().optional(),
|
|
175
|
+
});
|
|
176
|
+
export const getMeetingSetInput = z.object({
|
|
177
|
+
/** ULID from `/testchimp using meeting-set context <id>` (Meetings page → Start Chat) */
|
|
178
|
+
meetingSetId: z.string().min(1),
|
|
179
|
+
});
|
|
170
180
|
export const getIssueDetailsInput = z.object({
|
|
171
181
|
/** Accepts #B-123, B-123, #B123, B123, or plain 123 */
|
|
172
182
|
issueId: z.string().min(1),
|
package/dist/core/tools.js
CHANGED
|
@@ -385,6 +385,36 @@ export const TOOL_DEFINITIONS = [
|
|
|
385
385
|
});
|
|
386
386
|
},
|
|
387
387
|
},
|
|
388
|
+
{
|
|
389
|
+
kebab: "get-meeting-transcript",
|
|
390
|
+
description: "Fetch a cloud-synced Meeting Bots transcript by meeting id (calendar event id, or URL hash " +
|
|
391
|
+
"for ad-hoc meetings). Returns title, start time, post-meeting summary, and transcript. " +
|
|
392
|
+
"Use summaryOnly to fetch just the summary (much smaller) and pull the full transcript only " +
|
|
393
|
+
"when the summary is not enough. Prefer local ~/.testchimp/data/meetings/<meeting-id>/transcript.md " +
|
|
394
|
+
"when present on Studio / the recording machine.",
|
|
395
|
+
inputSchema: S.getMeetingTranscriptInput,
|
|
396
|
+
execute: async (args, { postMcp }) => {
|
|
397
|
+
const a = args;
|
|
398
|
+
return postMcp("/api/mcp/get_meeting_transcript", {
|
|
399
|
+
meetingId: a.meetingId,
|
|
400
|
+
...(a.summaryOnly ? { summaryOnly: true } : {}),
|
|
401
|
+
});
|
|
402
|
+
},
|
|
403
|
+
},
|
|
404
|
+
{
|
|
405
|
+
kebab: "get-meeting-set",
|
|
406
|
+
description: "Fetch a meeting-set context by id (ULID from `/testchimp using meeting-set context <id>`, " +
|
|
407
|
+
"created on the Meetings page via Start Chat). Returns the filters / search text applied and " +
|
|
408
|
+
"the meetings in scope (id, title, start). Fetch each meeting with get-meeting-transcript " +
|
|
409
|
+
"(summaryOnly first). Sets expire after 7 days.",
|
|
410
|
+
inputSchema: S.getMeetingSetInput,
|
|
411
|
+
execute: async (args, { postMcp }) => {
|
|
412
|
+
const a = args;
|
|
413
|
+
return postMcp("/api/mcp/get_meeting_set", {
|
|
414
|
+
meetingSetId: a.meetingSetId,
|
|
415
|
+
});
|
|
416
|
+
},
|
|
417
|
+
},
|
|
388
418
|
{
|
|
389
419
|
kebab: "get-issue-details",
|
|
390
420
|
description: "Fetch a TestChimp issue (bug) by ordinal id. Accepts flexible issueId formats: " +
|
package/dist/core/tools.test.js
CHANGED
|
@@ -54,3 +54,48 @@ describe("API operation observability", () => {
|
|
|
54
54
|
assert.match(getToolDefinition("get-api-operation-detail")?.description ?? "", /p95\/p99 latency/);
|
|
55
55
|
});
|
|
56
56
|
});
|
|
57
|
+
describe("get-meeting-transcript", () => {
|
|
58
|
+
it("posts meetingId to get_meeting_transcript", async () => {
|
|
59
|
+
const response = JSON.stringify({
|
|
60
|
+
meetingId: "evt-123",
|
|
61
|
+
transcriptMarkdown: "# Meeting\n\nP1: hello",
|
|
62
|
+
});
|
|
63
|
+
let request;
|
|
64
|
+
const result = await runTool("get-meeting-transcript", { meetingId: "evt-123" }, {
|
|
65
|
+
postMcp: async (path, body) => {
|
|
66
|
+
request = { path, body };
|
|
67
|
+
return response;
|
|
68
|
+
},
|
|
69
|
+
});
|
|
70
|
+
assert.deepEqual(request, {
|
|
71
|
+
path: "/api/mcp/get_meeting_transcript",
|
|
72
|
+
body: { meetingId: "evt-123" },
|
|
73
|
+
});
|
|
74
|
+
assert.deepEqual(JSON.parse(result), JSON.parse(response));
|
|
75
|
+
});
|
|
76
|
+
it("passes summaryOnly when requested", async () => {
|
|
77
|
+
let body;
|
|
78
|
+
await runTool("get-meeting-transcript", { meetingId: "evt-123", summaryOnly: true }, {
|
|
79
|
+
postMcp: async (_path, b) => {
|
|
80
|
+
body = b;
|
|
81
|
+
return "{}";
|
|
82
|
+
},
|
|
83
|
+
});
|
|
84
|
+
assert.deepEqual(body, { meetingId: "evt-123", summaryOnly: true });
|
|
85
|
+
});
|
|
86
|
+
});
|
|
87
|
+
describe("get-meeting-set", () => {
|
|
88
|
+
it("posts meetingSetId to get_meeting_set", async () => {
|
|
89
|
+
let request;
|
|
90
|
+
await runTool("get-meeting-set", { meetingSetId: "01J9Z3X5V4ABCDEF0123456789" }, {
|
|
91
|
+
postMcp: async (path, body) => {
|
|
92
|
+
request = { path, body };
|
|
93
|
+
return "{}";
|
|
94
|
+
},
|
|
95
|
+
});
|
|
96
|
+
assert.deepEqual(request, {
|
|
97
|
+
path: "/api/mcp/get_meeting_set",
|
|
98
|
+
body: { meetingSetId: "01J9Z3X5V4ABCDEF0123456789" },
|
|
99
|
+
});
|
|
100
|
+
});
|
|
101
|
+
});
|
package/package.json
CHANGED