From f9dfe04613e4de193f1c8c2fbfb932e655b1afc9 Mon Sep 17 00:00:00 2001 From: Prashant-7718 Date: Thu, 23 Apr 2026 14:58:22 +0530 Subject: [PATCH 1/7] added mermaid pr suggestion --- packages/sdk/src/index.test.ts | 38 ++++++++++++++++++++++++++++++++++ packages/sdk/src/index.ts | 20 ++++++++++++++++++ packages/sdk/src/types.ts | 16 ++++++++++++++ packages/sdk/src/urls.ts | 1 + 4 files changed, 75 insertions(+) diff --git a/packages/sdk/src/index.test.ts b/packages/sdk/src/index.test.ts index fc89cb8..8e0ca7a 100644 --- a/packages/sdk/src/index.test.ts +++ b/packages/sdk/src/index.test.ts @@ -171,4 +171,42 @@ describe('MermaidChart', () => { ).rejects.toThrow(AICreditsLimitExceededError); }); }); + + describe('#mermaidPrSuggestion', () => { + beforeEach(async () => { + await client.setAccessToken('test-access-token'); + }); + + it('should return title and description from diagram diff', async () => { + vi.spyOn(client, 'mermaidPrSuggestion').mockResolvedValue({ + title: 'Add validation step to flowchart', + description: '## What changed\n- Added node C', + }); + + const result = await client.mermaidPrSuggestion({ + originalDiagram: 'flowchart TD\n A --> B', + editedDiagram: 'flowchart TD\n A --> B\n B --> C[Validate]', + }); + + expect(result.title).toContain('validation'); + expect(result.description).toContain('What changed'); + }); + + it('should throw AICreditsLimitExceededError on 402', async () => { + // eslint-disable-next-line @typescript-eslint/no-explicit-any + vi.spyOn((client as any).axios, 'post').mockRejectedValue({ + response: { + status: 402, + data: 'AI credits limit exceeded', + }, + }); + + await expect( + client.mermaidPrSuggestion({ + originalDiagram: 'flowchart TD\n A --> B', + editedDiagram: 'flowchart TD\n A --> B\n B --> C', + }), + ).rejects.toThrow(AICreditsLimitExceededError); + }); + }); }); diff --git a/packages/sdk/src/index.ts b/packages/sdk/src/index.ts index aeb4802..8ebdf18 100644 --- a/packages/sdk/src/index.ts +++ b/packages/sdk/src/index.ts @@ -19,6 +19,8 @@ import type { MCUser, RepairDiagramRequest, RepairDiagramResponse, + MermaidPrSuggestionRequest, + MermaidPrSuggestionResponse, AICreditsUsage, } from './types.js'; import { URLS } from './urls.js'; @@ -330,6 +332,24 @@ export class MermaidChart { } } + /** + * Suggests a pull request title and body (markdown) from a before/after diagram diff (Mermaid AI). + * + * @param request - `originalDiagram` and `editedDiagram` only + * @throws {@link AICreditsLimitExceededError} if credits limit exceeded (HTTP 402) + */ + public async mermaidPrSuggestion(request: MermaidPrSuggestionRequest): Promise { + try { + const response = await this.axios.post( + URLS.rest.openai.prSummary, + request, + ); + return response.data; + } catch (error: unknown) { + throwIfAICreditsExceeded(error); + } + } + /** * Chat with Mermaid AI about a diagram. * diff --git a/packages/sdk/src/types.ts b/packages/sdk/src/types.ts index 8cf930f..bd22ee6 100644 --- a/packages/sdk/src/types.ts +++ b/packages/sdk/src/types.ts @@ -96,6 +96,22 @@ export interface RepairDiagramRequest { userID?: string; } +/** + * Only the two diagram versions are sent; the server derives user plan and usage from the session. + */ +export interface MermaidPrSuggestionRequest { + originalDiagram: string; + editedDiagram: string; +} + +/** + * Public response: suggested PR title and markdown description + */ +export interface MermaidPrSuggestionResponse { + title: string; + description: string; +} + /** * Request parameters for chatting with the Mermaid AI about a diagram. */ diff --git a/packages/sdk/src/urls.ts b/packages/sdk/src/urls.ts index a074a18..54d53f3 100644 --- a/packages/sdk/src/urls.ts +++ b/packages/sdk/src/urls.ts @@ -41,6 +41,7 @@ export const URLS = { }, openai: { repair: `/rest-api/openai/repair`, + prSummary: `/rest-api/openai/pr-summary`, chat: `/rest-api/openai/chat`, }, }, From 189fac21cae60dfe3a19e7a012a9e3c679605226 Mon Sep 17 00:00:00 2001 From: Prashant-7718 Date: Thu, 23 Apr 2026 15:29:57 +0530 Subject: [PATCH 2/7] lint fix --- packages/sdk/src/index.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/packages/sdk/src/index.ts b/packages/sdk/src/index.ts index 8ebdf18..c99dfa8 100644 --- a/packages/sdk/src/index.ts +++ b/packages/sdk/src/index.ts @@ -338,7 +338,9 @@ export class MermaidChart { * @param request - `originalDiagram` and `editedDiagram` only * @throws {@link AICreditsLimitExceededError} if credits limit exceeded (HTTP 402) */ - public async mermaidPrSuggestion(request: MermaidPrSuggestionRequest): Promise { + public async mermaidPrSuggestion( + request: MermaidPrSuggestionRequest, + ): Promise { try { const response = await this.axios.post( URLS.rest.openai.prSummary, From 4ae649c3970670d8f218c17f0397371cd3f9938a Mon Sep 17 00:00:00 2001 From: Prashant-7718 Date: Thu, 23 Apr 2026 18:22:05 +0530 Subject: [PATCH 3/7] resolve comments --- packages/sdk/src/index.test.ts | 25 +++++++++++++++++-------- packages/sdk/src/index.ts | 10 ++++------ packages/sdk/src/types.ts | 6 +++--- 3 files changed, 24 insertions(+), 17 deletions(-) diff --git a/packages/sdk/src/index.test.ts b/packages/sdk/src/index.test.ts index 8e0ca7a..d02d52c 100644 --- a/packages/sdk/src/index.test.ts +++ b/packages/sdk/src/index.test.ts @@ -2,6 +2,7 @@ import { beforeEach, describe, expect, it, vi } from 'vitest'; import { MermaidChart } from './index.js'; import { AICreditsLimitExceededError } from './errors.js'; import type { AuthorizationData } from './types.js'; +import { URLS } from './urls.js'; import { OAuth2Client } from '@badgateway/oauth2-client'; @@ -172,27 +173,35 @@ describe('MermaidChart', () => { }); }); - describe('#mermaidPrSuggestion', () => { + describe('#suggestPrSummary', () => { beforeEach(async () => { await client.setAccessToken('test-access-token'); }); - it('should return title and description from diagram diff', async () => { - vi.spyOn(client, 'mermaidPrSuggestion').mockResolvedValue({ + it('should POST to the pr-summary endpoint with the request body and return response.data', async () => { + const jsonResponse = { title: 'Add validation step to flowchart', description: '## What changed\n- Added node C', + }; + + // eslint-disable-next-line @typescript-eslint/no-explicit-any + const postSpy = vi.spyOn((client as any).axios, 'post').mockResolvedValue({ + data: jsonResponse, }); - const result = await client.mermaidPrSuggestion({ + const requestBody = { originalDiagram: 'flowchart TD\n A --> B', editedDiagram: 'flowchart TD\n A --> B\n B --> C[Validate]', - }); + }; + + const result = await client.suggestPrSummary(requestBody); - expect(result.title).toContain('validation'); - expect(result.description).toContain('What changed'); + expect(postSpy).toHaveBeenCalledWith(URLS.rest.openai.prSummary, requestBody); + expect(result).toEqual(jsonResponse); }); it('should throw AICreditsLimitExceededError on 402', async () => { + // Mock the underlying axios call so the error mapping in suggestPrSummary is exercised. // eslint-disable-next-line @typescript-eslint/no-explicit-any vi.spyOn((client as any).axios, 'post').mockRejectedValue({ response: { @@ -202,7 +211,7 @@ describe('MermaidChart', () => { }); await expect( - client.mermaidPrSuggestion({ + client.suggestPrSummary({ originalDiagram: 'flowchart TD\n A --> B', editedDiagram: 'flowchart TD\n A --> B\n B --> C', }), diff --git a/packages/sdk/src/index.ts b/packages/sdk/src/index.ts index c99dfa8..406a015 100644 --- a/packages/sdk/src/index.ts +++ b/packages/sdk/src/index.ts @@ -19,8 +19,8 @@ import type { MCUser, RepairDiagramRequest, RepairDiagramResponse, - MermaidPrSuggestionRequest, - MermaidPrSuggestionResponse, + PrSummaryRequest, + PrSummaryResponse, AICreditsUsage, } from './types.js'; import { URLS } from './urls.js'; @@ -338,11 +338,9 @@ export class MermaidChart { * @param request - `originalDiagram` and `editedDiagram` only * @throws {@link AICreditsLimitExceededError} if credits limit exceeded (HTTP 402) */ - public async mermaidPrSuggestion( - request: MermaidPrSuggestionRequest, - ): Promise { + public async suggestPrSummary(request: PrSummaryRequest): Promise { try { - const response = await this.axios.post( + const response = await this.axios.post( URLS.rest.openai.prSummary, request, ); diff --git a/packages/sdk/src/types.ts b/packages/sdk/src/types.ts index bd22ee6..4aa25fc 100644 --- a/packages/sdk/src/types.ts +++ b/packages/sdk/src/types.ts @@ -97,9 +97,9 @@ export interface RepairDiagramRequest { } /** - * Only the two diagram versions are sent; the server derives user plan and usage from the session. + * Only the two diagram versions are sent; the server derives user plan and usage from the auth context provided by the access token. */ -export interface MermaidPrSuggestionRequest { +export interface PrSummaryRequest { originalDiagram: string; editedDiagram: string; } @@ -107,7 +107,7 @@ export interface MermaidPrSuggestionRequest { /** * Public response: suggested PR title and markdown description */ -export interface MermaidPrSuggestionResponse { +export interface PrSummaryResponse { title: string; description: string; } From e5be8ade24d06e22fb2c80bcd7e80ed07cd05ce4 Mon Sep 17 00:00:00 2001 From: Prashant-7718 Date: Mon, 27 Apr 2026 14:01:23 +0530 Subject: [PATCH 4/7] added branchname and commitmessage in response schema --- packages/sdk/src/index.test.ts | 2 ++ packages/sdk/src/index.ts | 1 + packages/sdk/src/types.ts | 4 +++- 3 files changed, 6 insertions(+), 1 deletion(-) diff --git a/packages/sdk/src/index.test.ts b/packages/sdk/src/index.test.ts index d02d52c..a3d9b3b 100644 --- a/packages/sdk/src/index.test.ts +++ b/packages/sdk/src/index.test.ts @@ -182,6 +182,8 @@ describe('MermaidChart', () => { const jsonResponse = { title: 'Add validation step to flowchart', description: '## What changed\n- Added node C', + branchName: 'feature/flowchart-validation', + commitMessage: 'Add validation node C', }; // eslint-disable-next-line @typescript-eslint/no-explicit-any diff --git a/packages/sdk/src/index.ts b/packages/sdk/src/index.ts index 406a015..f21049c 100644 --- a/packages/sdk/src/index.ts +++ b/packages/sdk/src/index.ts @@ -334,6 +334,7 @@ export class MermaidChart { /** * Suggests a pull request title and body (markdown) from a before/after diagram diff (Mermaid AI). + * The response also include `branchName` and `commitMessage`. * * @param request - `originalDiagram` and `editedDiagram` only * @throws {@link AICreditsLimitExceededError} if credits limit exceeded (HTTP 402) diff --git a/packages/sdk/src/types.ts b/packages/sdk/src/types.ts index 4aa25fc..7fbbb37 100644 --- a/packages/sdk/src/types.ts +++ b/packages/sdk/src/types.ts @@ -105,11 +105,13 @@ export interface PrSummaryRequest { } /** - * Public response: suggested PR title and markdown description + * Public response: suggested PR title and markdown description, branch name, and commit message. */ export interface PrSummaryResponse { title: string; description: string; + branchName?: string; + commitMessage?: string; } /** From a51316f8ddd5dc9c86b08702e2388c020c300c36 Mon Sep 17 00:00:00 2001 From: Prashant-7718 Date: Tue, 28 Apr 2026 13:32:13 +0530 Subject: [PATCH 5/7] resolve comments --- packages/sdk/src/index.ts | 2 +- packages/sdk/src/types.ts | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/sdk/src/index.ts b/packages/sdk/src/index.ts index f21049c..4ffe783 100644 --- a/packages/sdk/src/index.ts +++ b/packages/sdk/src/index.ts @@ -334,7 +334,7 @@ export class MermaidChart { /** * Suggests a pull request title and body (markdown) from a before/after diagram diff (Mermaid AI). - * The response also include `branchName` and `commitMessage`. + * The response also includes `branchName` and `commitMessage`. * * @param request - `originalDiagram` and `editedDiagram` only * @throws {@link AICreditsLimitExceededError} if credits limit exceeded (HTTP 402) diff --git a/packages/sdk/src/types.ts b/packages/sdk/src/types.ts index 7fbbb37..029733b 100644 --- a/packages/sdk/src/types.ts +++ b/packages/sdk/src/types.ts @@ -110,8 +110,8 @@ export interface PrSummaryRequest { export interface PrSummaryResponse { title: string; description: string; - branchName?: string; - commitMessage?: string; + branchName: string; + commitMessage: string; } /** From 072fd50121501a6ce03c22524fb8b0c88d31e708 Mon Sep 17 00:00:00 2001 From: Prashant-7718 Date: Tue, 28 Apr 2026 17:27:43 +0530 Subject: [PATCH 6/7] added e2e and changeset --- .changeset/calm-berries-check.md | 5 +++++ packages/sdk/src/index.e2e.test.ts | 25 +++++++++++++++++++++++++ 2 files changed, 30 insertions(+) create mode 100644 .changeset/calm-berries-check.md diff --git a/.changeset/calm-berries-check.md b/.changeset/calm-berries-check.md new file mode 100644 index 0000000..4f23dda --- /dev/null +++ b/.changeset/calm-berries-check.md @@ -0,0 +1,5 @@ +--- +'@mermaidchart/sdk': patch +--- + +Add a suggestPrSummary method to the SDK that generates PR details based on code changes, including the branch name, title, commit message, and description. diff --git a/packages/sdk/src/index.e2e.test.ts b/packages/sdk/src/index.e2e.test.ts index 65c64c7..99592e1 100644 --- a/packages/sdk/src/index.e2e.test.ts +++ b/packages/sdk/src/index.e2e.test.ts @@ -242,3 +242,28 @@ describe('repairDiagram', () => { } }, 60000); // 60 seconds timeout for AI repair operations }); + +describe('suggestPrSummary', () => { + it('should generate PR summary from diagram differences', async () => { + const originalDiagram = `flowchart TD\n A[Start] --> B[Process]\n B --> C[End]`; + const editedDiagram = `flowchart TD\n A[Start] --> B[Process]\n B --> D[Validate]\n D --> C[End]`; + + try { + const result = await client.suggestPrSummary({ + originalDiagram, + editedDiagram, + }); + + // Verify response structure + expect(result).toHaveProperty('title'); + expect(result).toHaveProperty('description'); + expect(result).toHaveProperty('branchName'); + expect(result).toHaveProperty('commitMessage'); + } catch (error) { + if (error instanceof AICreditsLimitExceededError) { + return; // Credits exceeded is acceptable for E2E test + } + throw error; + } + }, 60000); // 60 seconds timeout for AI operations +}); From 656f935c5dbdf7a4bbcbc90c2de9314aa57a8d03 Mon Sep 17 00:00:00 2001 From: Prashant-7718 Date: Tue, 28 Apr 2026 18:03:04 +0530 Subject: [PATCH 7/7] resolve comments --- .changeset/calm-berries-check.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.changeset/calm-berries-check.md b/.changeset/calm-berries-check.md index 4f23dda..5966980 100644 --- a/.changeset/calm-berries-check.md +++ b/.changeset/calm-berries-check.md @@ -2,4 +2,4 @@ '@mermaidchart/sdk': patch --- -Add a suggestPrSummary method to the SDK that generates PR details based on code changes, including the branch name, title, commit message, and description. +Add a suggestPrSummary method to the SDK that generates PR details based on Mermaid diagram changes, including the branch name, title, commit message, and description.