mcp-bitbucket-server 1.7.0 → 1.8.0

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.
Files changed (39) hide show
  1. package/CLAUDE.md +120 -179
  2. package/dist/index.d.ts +1 -1
  3. package/dist/index.d.ts.map +1 -1
  4. package/dist/index.js +2 -2
  5. package/dist/index.js.map +1 -1
  6. package/dist/services/bitbucket.d.ts +3 -3
  7. package/dist/services/bitbucket.d.ts.map +1 -1
  8. package/dist/services/bitbucket.js +3 -3
  9. package/dist/services/bitbucket.js.map +1 -1
  10. package/dist/tools/index.d.ts.map +1 -1
  11. package/dist/tools/index.js +2 -1
  12. package/dist/tools/index.js.map +1 -1
  13. package/dist/tools/pull-requests/add_pr_comment_reaction.js +3 -3
  14. package/dist/tools/pull-requests/add_pr_comment_reaction.js.map +1 -1
  15. package/dist/tools/pull-requests/create_pull_request.d.ts +3 -0
  16. package/dist/tools/pull-requests/create_pull_request.d.ts.map +1 -0
  17. package/dist/tools/pull-requests/create_pull_request.js +37 -0
  18. package/dist/tools/pull-requests/create_pull_request.js.map +1 -0
  19. package/dist/tools/pull-requests/get_pr_activities.js.map +1 -1
  20. package/dist/tools/pull-requests/index.d.ts +1 -0
  21. package/dist/tools/pull-requests/index.d.ts.map +1 -1
  22. package/dist/tools/pull-requests/index.js +1 -0
  23. package/dist/tools/pull-requests/index.js.map +1 -1
  24. package/dist/tools/pull-requests/remove_pr_comment_reaction.js +3 -3
  25. package/dist/tools/pull-requests/remove_pr_comment_reaction.js.map +1 -1
  26. package/dist/tools/tools.types.d.ts +1 -1
  27. package/package.json +2 -1
  28. package/dist/client/bitbucket.client.d.ts +0 -79
  29. package/dist/client/bitbucket.client.d.ts.map +0 -1
  30. package/dist/client/bitbucket.client.js +0 -176
  31. package/dist/client/bitbucket.client.js.map +0 -1
  32. package/dist/client/bitbucket.types.d.ts +0 -823
  33. package/dist/client/bitbucket.types.d.ts.map +0 -1
  34. package/dist/client/bitbucket.types.js +0 -5
  35. package/dist/client/bitbucket.types.js.map +0 -1
  36. package/dist/client/index.d.ts +0 -3
  37. package/dist/client/index.d.ts.map +0 -1
  38. package/dist/client/index.js +0 -4
  39. package/dist/client/index.js.map +0 -1
package/CLAUDE.md CHANGED
@@ -8,21 +8,22 @@ This is an MCP (Model Context Protocol) server for Bitbucket Server/Data Center
8
8
  - **User management**: Get user profile, list all users
9
9
  - **Project operations**: List projects with filtering
10
10
  - **Repository operations**: List repositories in a project
11
- - **Pull request operations**: Get PR details, get inbox PRs, get changed files, get full/file diffs (text and structured), add comments (three separate tools: general, file-level, and line-level), delete comments, add/remove emoticon reactions, get activities, update review status (approve/request changes)
11
+ - **Pull request operations**: Create PR, get PR details, get inbox PRs, get changed files, get full/file diffs (text and structured), add comments (three separate tools: general, file-level, and line-level), delete comments, add/remove emoticon reactions, get activities, update review status (approve/request changes)
12
12
 
13
13
  ## Architecture
14
14
 
15
- This is a **simple, straightforward implementation** with minimal abstraction:
15
+ This is a **simple, straightforward implementation** using the `bitbucket-data-center-client` library:
16
16
 
17
17
  ```
18
- Tool → bitbucketClient (axios) → Bitbucket Server REST API
18
+ Tool → bitbucketService (BitbucketClient) → Bitbucket Server REST API
19
19
  ```
20
20
 
21
21
  **Key principles:**
22
- - Direct axios client usage (no wrapper classes)
22
+ - Use the `bitbucket-data-center-client` library for all API calls
23
+ - Type-safe client methods (no manual endpoint construction)
23
24
  - Minimal error handling (let errors bubble up)
24
25
  - Simple, readable code
25
- - Verify all endpoints against Swagger documentation
26
+ - Verify endpoint capabilities against Swagger documentation when needed
26
27
 
27
28
  ## Bitbucket Server API Documentation
28
29
 
@@ -40,23 +41,15 @@ grep -n '"/api/latest/users"' BitbucketServerSwagger.json
40
41
  # Use the line number from grep, then read ~80 lines
41
42
  ```
42
43
 
43
- ### API Base URL
44
-
45
- All endpoints use: `${BITBUCKET_URL}/rest/api/latest`
46
-
47
- Example: `https://your-bitbucket-server.com/rest/api/latest/users`
48
-
49
44
  ### Authentication
50
45
 
51
- Uses **Bearer token** authentication:
46
+ The `bitbucket-data-center-client` library handles authentication automatically using Bearer tokens.
52
47
 
53
- ```typescript
54
- headers: {
55
- Authorization: `Bearer ${token}`
56
- }
57
- ```
48
+ Configuration is done via environment variables in `.env`:
49
+ - `BITBUCKET_URL`: Your Bitbucket Server base URL
50
+ - `BITBUCKET_TOKEN`: Personal Access Token from Bitbucket Server
58
51
 
59
- The token is a Bitbucket Personal Access Token configured in `.env`.
52
+ The library automatically adds the `Authorization: Bearer ${token}` header to all requests.
60
53
 
61
54
  ## Project Structure
62
55
 
@@ -65,134 +58,71 @@ src/
65
58
  ├── config.ts # Environment validation (BITBUCKET_URL, BITBUCKET_TOKEN)
66
59
  ├── index.ts # Main entry point, MCP server setup
67
60
  ├── services/
68
- │ └── bitbucket.ts # Axios client instance (export const bitbucketClient)
69
- ├── types/
70
- │ ├── index.ts # Barrel export for all types
71
- │ ├── common.ts # Shared types (PaginatedResponse)
72
- │ ├── pull-request.ts # Pull request types (RestComment, RestPullRequest, etc.)
73
- │ └── repository.ts # Repository-specific types
61
+ │ └── bitbucket.ts # BitbucketClient singleton (export const bitbucketService)
74
62
  └── tools/
75
63
  ├── index.ts # Tool registration
76
64
  ├── users/
77
65
  │ ├── index.ts # Barrel export
78
- │ ├── get_user_profile.ts # GET /users/{username}
79
- │ └── get_all_users.ts # GET /users
66
+ │ ├── get_user_profile.ts # User profile operations
67
+ │ └── get_all_users.ts # List all users
80
68
  ├── projects/
81
69
  │ ├── index.ts # Barrel export
82
- │ └── list_projects.ts # GET /projects
70
+ │ └── list_projects.ts # List projects with filtering
83
71
  ├── repositories/
84
72
  │ ├── index.ts # Barrel export
85
- │ └── list_repositories.ts # GET /projects/{projectKey}/repos
73
+ │ └── list_repositories.ts # List repositories in a project
86
74
  └── pull-requests/
87
- ├── index.ts # Barrel export
88
- ├── get_inbox_pull_requests.ts # GET /inbox/pull-requests
89
- ├── add_pr_comment.ts # POST /projects/.../pull-requests/.../comments
90
- ├── get_pr_changes.ts # GET /projects/.../pull-requests/.../changes
91
- ├── get_pr_file_diff.ts # GET /projects/.../pull-requests/.../diff/{path}
92
- ├── get_pr_activities.ts # GET /projects/.../pull-requests/.../activities
93
- └── update_review_status.ts # PUT /projects/.../pull-requests/.../participants/{userSlug}
75
+ ├── index.ts # Barrel export
76
+ ├── get_inbox_pull_requests.ts # Get PRs in reviewer's inbox
77
+ ├── get_pr_details.ts # Get full PR details
78
+ ├── get_pr_diff.ts # Get PR diff (text or JSON)
79
+ ├── add_pr_comment.ts # Add general/reply comment
80
+ ├── add_pr_file_comment.ts # Add file-level comment
81
+ ├── add_pr_line_comment.ts # Add line-specific comment
82
+ ├── delete_pr_comment.ts # Delete comment
83
+ ├── add_pr_comment_reaction.ts # Add emoticon reaction
84
+ ├── remove_pr_comment_reaction.ts # Remove emoticon reaction
85
+ ├── get_pr_changes.ts # Get changed files list
86
+ ├── get_pr_file_diff.ts # Get structured file diff
87
+ ├── get_pr_activities.ts # Get PR activities/comments
88
+ └── update_review_status.ts # Approve/request changes
94
89
  ```
95
90
 
96
91
  ## TypeScript Types
97
92
 
98
- TypeScript type definitions for Bitbucket Server API responses are located in `src/types/`:
99
-
100
- ```
101
- src/types/
102
- ├── index.ts # Barrel export (import from here)
103
- ├── common.ts # Shared types (PaginatedResponse)
104
- ├── pull-request.ts # Pull request types (RestComment, RestPullRequest, RestPullRequestParticipant, etc.)
105
- └── repository.ts # Repository-specific types
106
- ```
107
-
108
- ### Type Naming Conventions
109
-
110
- - **Match Swagger schema names exactly**: `RestRepository`, `RestProject`, `RestPullRequest`
111
- - **Use interfaces for objects**: `interface RestRepository { ... }`
112
- - **Use union types for enums**: `type RepositoryState = "AVAILABLE" | "OFFLINE"`
113
- - **Generic wrapper types**: `PaginatedResponse<T>` for paginated endpoints
114
- - **Response type aliases**: `RepositoriesResponse = PaginatedResponse<RestRepository>`
115
-
116
- ### Adding New Types
117
-
118
- 1. **Find the schema in Swagger**:
119
- ```bash
120
- grep -n '"RestTypeName"' BitbucketServerSwagger.json
121
- ```
122
-
123
- 2. **Create/update type file** (e.g., `src/types/domain.ts`):
124
- ```typescript
125
- // Focus on readonly properties (what API returns)
126
- export interface RestTypeName {
127
- id: number;
128
- name: string;
129
- // ... other fields
130
- }
131
-
132
- export type DomainResponse = PaginatedResponse<RestTypeName>;
133
- ```
134
-
135
- 3. **Export from barrel file** (`src/types/index.ts`):
136
- ```typescript
137
- export type { RestTypeName, DomainResponse } from "./domain.js";
138
- ```
139
-
140
- 4. **Use in tool**:
141
- ```typescript
142
- import type { DomainResponse } from "../../types/index.js";
143
-
144
- const response = await bitbucketClient.get<DomainResponse>("/endpoint");
145
- ```
146
-
147
- ### Type Design Principles
148
-
149
- Following the project's simplicity philosophy:
150
-
151
- **✅ DO:**
152
- - Map types directly from Swagger schemas
153
- - Focus on readonly properties (API responses)
154
- - Keep types simple and minimal
155
- - Use generic `PaginatedResponse<T>` for all paginated endpoints
156
-
157
- **❌ DON'T:**
158
- - Over-engineer with complex utility types
159
- - Include writeOnly properties (used for requests)
160
- - Add properties that aren't useful
161
- - Create unnecessary type abstractions
162
-
163
- ## Tool Development Workflow
93
+ All TypeScript types are provided by the `bitbucket-data-center-client` library. You don't need to define or maintain types manually.
164
94
 
165
- ### 1. Find the Endpoint in Swagger
95
+ The library exports comprehensive types for:
96
+ - Users, projects, repositories
97
+ - Pull requests, comments, activities
98
+ - Diffs, changes, and review statuses
99
+ - Paginated responses
166
100
 
167
- ```bash
168
- # Search for the endpoint
169
- grep -n '"/api/latest/your-endpoint"' BitbucketServerSwagger.json
101
+ Simply import types from the library when needed:
170
102
 
171
- # Read the specification
172
- # Note the line number, then read from that line
103
+ ```typescript
104
+ import type { RestPullRequest, RestComment } from 'bitbucket-data-center-client';
173
105
  ```
174
106
 
175
- ### 2. Verify Parameters
107
+ ## Tool Development Workflow
176
108
 
177
- **Check what parameters are actually supported:**
178
- - Path parameters (required in the URL)
179
- - Query parameters (optional filters, pagination)
180
- - Request body (for POST/PUT)
109
+ ### 1. Check the Library Documentation
181
110
 
182
- **Don't assume parameters exist** - the Swagger spec is the source of truth.
111
+ The `bitbucket-data-center-client` library provides all necessary methods. Check:
112
+ - Library README: https://github.com/evrimalacan/bitbucket-data-center-client
113
+ - Existing tools in `src/tools/` for examples
183
114
 
184
- ### 3. Implement the Tool
115
+ ### 2. Implement the Tool
185
116
 
186
- Follow this simple pattern:
117
+ Follow this simple pattern using the client library:
187
118
 
188
119
  ```typescript
189
120
  import { z } from "zod";
190
121
  import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
191
- import { bitbucketClient } from "../../services/bitbucket.js";
192
- import type { YourResponseType } from "../../types/index.js";
122
+ import { bitbucketService } from "../../services/bitbucket.js";
193
123
 
194
124
  const schema = z.object({
195
- requiredParam: z.string().describe("Description from Swagger"),
125
+ requiredParam: z.string().describe("Description of parameter"),
196
126
  optionalParam: z.string().optional().describe("Optional parameter"),
197
127
  });
198
128
 
@@ -201,21 +131,21 @@ export const toolNameTool = (server: McpServer) => {
201
131
  "bitbucket_tool_name",
202
132
  {
203
133
  title: "Human Readable Title",
204
- description: "Description from Swagger documentation",
134
+ description: "Clear description of what this tool does",
205
135
  inputSchema: schema.shape,
206
136
  },
207
- async (params) => {
208
- const { requiredParam, optionalParam } = schema.parse(params);
209
-
210
- const response = await bitbucketClient.get<YourResponseType>("/endpoint", {
211
- params: optionalParam ? { optionalParam } : {},
137
+ async ({ requiredParam, optionalParam }) => {
138
+ // Call the appropriate library method
139
+ const result = await bitbucketService.someMethod({
140
+ requiredParam,
141
+ optionalParam,
212
142
  });
213
143
 
214
144
  return {
215
145
  content: [
216
146
  {
217
147
  type: "text",
218
- text: JSON.stringify(response.data, null, 2),
148
+ text: JSON.stringify(result, null, 2),
219
149
  },
220
150
  ],
221
151
  };
@@ -224,7 +154,7 @@ export const toolNameTool = (server: McpServer) => {
224
154
  };
225
155
  ```
226
156
 
227
- ### 4. Register the Tool
157
+ ### 3. Register the Tool
228
158
 
229
159
  ```typescript
230
160
  // 1. Export from domain barrel file (e.g., src/tools/users/index.ts)
@@ -239,7 +169,7 @@ export function registerTools(server: McpServer) {
239
169
  }
240
170
  ```
241
171
 
242
- ### 5. Run the Linter
172
+ ### 4. Run the Linter
243
173
 
244
174
  Always run the linter after implementing a new tool:
245
175
 
@@ -254,48 +184,51 @@ The linter will auto-fix formatting, catch unused variables, and ensure code qua
254
184
  ### Keep It Simple
255
185
 
256
186
  **✅ DO:**
257
- - Use direct axios calls: `bitbucketClient.get(...)`
258
- - Minimal error handling (only when necessary)
187
+ - Use `bitbucketService` client methods: `bitbucketService.getUserProfile(...)`
188
+ - Minimal error handling (let errors bubble up)
259
189
  - Short, focused functions
260
190
  - Clear parameter names
191
+ - Destructure parameters directly in async handler
261
192
 
262
193
  **❌ DON'T:**
263
- - Add wrapper classes
194
+ - Add wrapper functions around the library
264
195
  - Over-engineer error handling
265
196
  - Add unnecessary abstractions
266
- - Use try-catch unless required
197
+ - Use try-catch unless absolutely required
267
198
 
268
199
  ### Example: Simple Tool
269
200
 
270
201
  ```typescript
271
- // ✅ Good - simple and direct
272
- export const getAllUsersTool = (server: McpServer) => {
273
- server.registerTool("bitbucket_get_all_users", { ... }, async (params) => {
274
- const { filter } = schema.parse(params);
275
-
276
- const response = await bitbucketClient.get("/users", {
277
- params: filter ? { filter } : {},
278
- });
279
-
280
- return {
281
- content: [{ type: "text", text: JSON.stringify(response.data, null, 2) }],
282
- };
283
- });
202
+ // ✅ Good - simple and direct using the library
203
+ export const getUserProfileTool = (server: McpServer) => {
204
+ server.registerTool(
205
+ "bitbucket_get_user_profile",
206
+ {
207
+ title: "Get Bitbucket User Profile",
208
+ description: "Gets Bitbucket Server user profile details by username",
209
+ inputSchema: schema.shape,
210
+ },
211
+ async ({ username }) => {
212
+ const user = await bitbucketService.getUserProfile({ username });
213
+
214
+ return {
215
+ content: [{ type: "text", text: JSON.stringify(user, null, 2) }],
216
+ };
217
+ }
218
+ );
284
219
  };
285
220
  ```
286
221
 
287
222
  ```typescript
288
223
  // ❌ Bad - over-engineered
289
- export const getAllUsersTool = (server: McpServer) => {
290
- server.registerTool("bitbucket_get_all_users", { ... }, async (params) => {
224
+ export const getUserProfileTool = (server: McpServer) => {
225
+ server.registerTool("bitbucket_get_user_profile", { ... }, async (params) => {
291
226
  try {
292
- const { filter } = schema.parse(params);
293
-
294
- const queryParams = buildQueryParams({ filter }); // Unnecessary
295
- const client = getClient(); // Unnecessary wrapper
296
- const response = await client.get("/users", queryParams);
227
+ const validated = validateParams(params); // Unnecessary - zod handles this
228
+ const client = getClient(); // Unnecessary - use bitbucketService directly
229
+ const response = await client.getUser(validated.username);
297
230
 
298
- return handleResponse(response); // Over-abstracted
231
+ return formatResponse(response); // Over-abstracted
299
232
  } catch (error) {
300
233
  return handleError(error); // Let errors bubble
301
234
  }
@@ -364,6 +297,28 @@ export const getAllUsersTool = (server: McpServer) => {
364
297
 
365
298
  **Purpose**: Discover all PRs across all projects and repositories that need your review in one call. Much more efficient than querying project by project. Use the `id`, `projectKey`, and `repositorySlug` from the response to review specific PRs with other tools.
366
299
 
300
+ ### bitbucket_create_pull_request
301
+ **File**: `src/tools/pull-requests/create_pull_request.ts`
302
+ **Endpoint**: `POST /projects/{projectKey}/repos/{repositorySlug}/pull-requests`
303
+ **Parameters**:
304
+ - `projectKey` (required): The Bitbucket Server project key
305
+ - `repositorySlug` (required): The repository slug
306
+ - `fromBranch` (required): Source branch name (e.g., "feature-x")
307
+ - `toBranch` (required): Target branch name (e.g., "main")
308
+ - `title` (required): PR title
309
+ - `description` (optional): PR description in markdown format
310
+ - `reviewers` (optional): Array of reviewer usernames to add
311
+
312
+ **Returns**: Created pull request object including `id`, `title`, `state`, `fromRef`, `toRef`, `author`, and web URL.
313
+
314
+ **Purpose**: Create a new pull request from a source branch to a target branch. Accepts simple branch names - they are automatically converted to full refs (e.g., "main" → "refs/heads/main").
315
+
316
+ **Error Cases**:
317
+ - 400: Malformed request
318
+ - 401: Insufficient permissions
319
+ - 404: Repository or branches don't exist
320
+ - 409: Branches are the same, PR already exists, or target repo is archived
321
+
367
322
  ### bitbucket_get_pull_request
368
323
  **File**: `src/tools/pull-requests/get_pr_details.ts`
369
324
  **Endpoint**: `GET /projects/{projectKey}/repos/{repositorySlug}/pull-requests/{pullRequestId}`
@@ -568,7 +523,7 @@ export const getAllUsersTool = (server: McpServer) => {
568
523
  - `repositorySlug` (required): The repository slug
569
524
  - `pullRequestId` (required): The pull request ID
570
525
  - `commentId` (required): The comment ID
571
- - `emoticon` (required): The emoticon identifier - one of: `thumbsup`, `thumbsdown`, `heart`, `thinking_face`, `laugh`
526
+ - `emoticon` (required): The emoticon identifier - one of: `thumbsup`, `thumbsdown`, `heart`, `thinking_face`, `laughing`
572
527
 
573
528
  **Returns**: RestUserReaction object with comment, emoticon details (shortcut, url), and user who reacted.
574
529
 
@@ -579,7 +534,7 @@ export const getAllUsersTool = (server: McpServer) => {
579
534
  - `thumbsdown` - Thumbs down 👎
580
535
  - `heart` - Heart ❤️
581
536
  - `thinking_face` - Thinking face 🤔
582
- - `laugh` - Laughing face 😄
537
+ - `laughing` - Laughing face 😄
583
538
 
584
539
  **Note**: Uses the Bitbucket Server comment-likes plugin API (`/rest/comment-likes/latest/`), not the core API.
585
540
 
@@ -591,7 +546,7 @@ export const getAllUsersTool = (server: McpServer) => {
591
546
  - `repositorySlug` (required): The repository slug
592
547
  - `pullRequestId` (required): The pull request ID
593
548
  - `commentId` (required): The comment ID
594
- - `emoticon` (required): The emoticon identifier to remove - one of: `thumbsup`, `thumbsdown`, `heart`, `thinking_face`, `laugh`
549
+ - `emoticon` (required): The emoticon identifier to remove - one of: `thumbsup`, `thumbsdown`, `heart`, `thinking_face`, `laughing`
595
550
 
596
551
  **Returns**: Simple success message (204 No Content).
597
552
 
@@ -709,42 +664,28 @@ See `.env.example` for template.
709
664
 
710
665
  ### Pagination
711
666
 
712
- Many endpoints support pagination:
667
+ The `bitbucket-data-center-client` library handles pagination automatically. Just pass the pagination parameters:
713
668
 
714
669
  ```typescript
715
- const response = await bitbucketClient.get("/endpoint", {
716
- params: {
717
- start: 0,
718
- limit: 25,
719
- },
670
+ const result = await bitbucketService.listProjects({
671
+ start: 0,
672
+ limit: 25,
720
673
  });
721
674
  ```
722
675
 
723
- Response includes:
676
+ Paginated responses include:
724
677
  - `values`: Array of results
725
678
  - `size`: Number of results in this page
726
679
  - `limit`: Page size
727
680
  - `isLastPage`: Boolean
728
681
  - `nextPageStart`: Start value for next page
729
682
 
730
- ### Error Responses
683
+ ### Error Handling
731
684
 
732
- Bitbucket Server returns errors in this format:
733
-
734
- ```json
735
- {
736
- "errors": [
737
- {
738
- "context": "field_name",
739
- "message": "Error description",
740
- "exceptionName": "ExceptionType"
741
- }
742
- ]
743
- }
744
- ```
685
+ The library throws errors with Bitbucket Server's error format. Let them bubble up - the MCP SDK will handle them appropriately.
745
686
 
746
687
  ## Resources
747
688
 
748
- - **Swagger Documentation**: `BitbucketServerSwagger.json` in project root
749
- - **Bitbucket Server REST API**: `${BITBUCKET_URL}/rest/api/latest/`
750
- - **OpenAPI Spec**: Available via Bitbucket Server UI (triple dot menu)
689
+ - **Library Documentation**: https://github.com/evrimalacan/bitbucket-data-center-client
690
+ - **Swagger Documentation**: `BitbucketServerSwagger.json` in project root (for reference)
691
+ - **Bitbucket Server REST API Docs**: Available via Bitbucket Server UI (triple dot menu)
package/dist/index.d.ts CHANGED
@@ -1,3 +1,3 @@
1
1
  #!/usr/bin/env node
2
- export * from './client/index.js';
2
+ export * from 'bitbucket-data-center-client';
3
3
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAIA,cAAc,mBAAmB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAIA,cAAc,8BAA8B,CAAC"}
package/dist/index.js CHANGED
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
  // ============ Library Exports ============
3
- // Re-export everything from client for library usage
4
- export * from './client/index.js';
3
+ // Re-export the Bitbucket client library (use bitbucket-data-center-client directly for library usage)
4
+ export * from 'bitbucket-data-center-client';
5
5
  // ============ MCP Server Setup ============
6
6
  import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
7
7
  import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA,4CAA4C;AAC5C,qDAAqD;AACrD,cAAc,mBAAmB,CAAC;AAElC,6CAA6C;AAC7C,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAEjD,KAAK,UAAU,cAAc;IAC3B,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC;QAC3B,IAAI,EAAE,sBAAsB;QAC5B,OAAO,EAAE,OAAO;KACjB,CAAC,CAAC;IAEH,aAAa,CAAC,MAAM,CAAC,CAAC;IAEtB,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;IAC7C,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAChC,OAAO,CAAC,KAAK,CAAC,8BAA8B,CAAC,CAAC;AAChD,CAAC;AAED,KAAK,UAAU,IAAI;IACjB,MAAM,cAAc,EAAE,CAAC;AACzB,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;IACrB,OAAO,CAAC,KAAK,CAAC,QAAQ,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;IACvC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA,4CAA4C;AAC5C,uGAAuG;AACvG,cAAc,8BAA8B,CAAC;AAE7C,6CAA6C;AAC7C,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAEjD,KAAK,UAAU,cAAc;IAC3B,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC;QAC3B,IAAI,EAAE,sBAAsB;QAC5B,OAAO,EAAE,OAAO;KACjB,CAAC,CAAC;IAEH,aAAa,CAAC,MAAM,CAAC,CAAC;IAEtB,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;IAC7C,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAChC,OAAO,CAAC,KAAK,CAAC,8BAA8B,CAAC,CAAC;AAChD,CAAC;AAED,KAAK,UAAU,IAAI;IACjB,MAAM,cAAc,EAAE,CAAC;AACzB,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;IACrB,OAAO,CAAC,KAAK,CAAC,QAAQ,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;IACvC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
@@ -1,7 +1,7 @@
1
- import { BitbucketService } from '../client/bitbucket.client.js';
1
+ import { BitbucketClient } from 'bitbucket-data-center-client';
2
2
  /**
3
- * Singleton BitbucketService instance for MCP tools.
3
+ * Singleton BitbucketClient instance for MCP tools.
4
4
  * Created from environment configuration.
5
5
  */
6
- export declare const bitbucketService: BitbucketService;
6
+ export declare const bitbucketService: BitbucketClient;
7
7
  //# sourceMappingURL=bitbucket.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"bitbucket.d.ts","sourceRoot":"","sources":["../../src/services/bitbucket.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AAGjE;;;GAGG;AACH,eAAO,MAAM,gBAAgB,kBAG3B,CAAC"}
1
+ {"version":3,"file":"bitbucket.d.ts","sourceRoot":"","sources":["../../src/services/bitbucket.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AAG/D;;;GAGG;AACH,eAAO,MAAM,gBAAgB,iBAG3B,CAAC"}
@@ -1,10 +1,10 @@
1
- import { BitbucketService } from '../client/bitbucket.client.js';
1
+ import { BitbucketClient } from 'bitbucket-data-center-client';
2
2
  import { bitbucketConfig } from '../config.js';
3
3
  /**
4
- * Singleton BitbucketService instance for MCP tools.
4
+ * Singleton BitbucketClient instance for MCP tools.
5
5
  * Created from environment configuration.
6
6
  */
7
- export const bitbucketService = new BitbucketService({
7
+ export const bitbucketService = new BitbucketClient({
8
8
  baseUrl: bitbucketConfig.baseUrl,
9
9
  token: bitbucketConfig.token,
10
10
  });
@@ -1 +1 @@
1
- {"version":3,"file":"bitbucket.js","sourceRoot":"","sources":["../../src/services/bitbucket.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AACjE,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAE/C;;;GAGG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAG,IAAI,gBAAgB,CAAC;IACnD,OAAO,EAAE,eAAe,CAAC,OAAO;IAChC,KAAK,EAAE,eAAe,CAAC,KAAK;CAC7B,CAAC,CAAC"}
1
+ {"version":3,"file":"bitbucket.js","sourceRoot":"","sources":["../../src/services/bitbucket.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AAC/D,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAE/C;;;GAGG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAG,IAAI,eAAe,CAAC;IAClD,OAAO,EAAE,eAAe,CAAC,OAAO;IAChC,KAAK,EAAE,eAAe,CAAC,KAAK;CAC7B,CAAC,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAoBzE,wBAAgB,aAAa,CAAC,MAAM,EAAE,SAAS,QAyB9C"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAqBzE,wBAAgB,aAAa,CAAC,MAAM,EAAE,SAAS,QA0B9C"}
@@ -1,5 +1,5 @@
1
1
  import { listProjectsTool } from './projects/index.js';
2
- import { addPrCommentReactionTool, addPrCommentTool, addPrFileCommentTool, addPrLineCommentTool, deletePrCommentTool, getInboxPullRequestsTool, getPrActivitiesTool, getPrChangesTool, getPrFileDiffTool, getPullRequestDetailsTool, getPullRequestDiffTool, removePrCommentReactionTool, updateReviewStatusTool, } from './pull-requests/index.js';
2
+ import { addPrCommentReactionTool, addPrCommentTool, addPrFileCommentTool, addPrLineCommentTool, createPullRequestTool, deletePrCommentTool, getInboxPullRequestsTool, getPrActivitiesTool, getPrChangesTool, getPrFileDiffTool, getPullRequestDetailsTool, getPullRequestDiffTool, removePrCommentReactionTool, updateReviewStatusTool, } from './pull-requests/index.js';
3
3
  import { listRepositoriesTool } from './repositories/index.js';
4
4
  import { getAllUsersTool, getUserProfileTool } from './users/index.js';
5
5
  export function registerTools(server) {
@@ -11,6 +11,7 @@ export function registerTools(server) {
11
11
  // Repository tools
12
12
  listRepositoriesTool(server);
13
13
  // Pull request tools
14
+ createPullRequestTool(server);
14
15
  getInboxPullRequestsTool(server);
15
16
  getPullRequestDetailsTool(server);
16
17
  addPrCommentTool(server);
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,EACL,wBAAwB,EACxB,gBAAgB,EAChB,oBAAoB,EACpB,oBAAoB,EACpB,mBAAmB,EACnB,wBAAwB,EACxB,mBAAmB,EACnB,gBAAgB,EAChB,iBAAiB,EACjB,yBAAyB,EACzB,sBAAsB,EACtB,2BAA2B,EAC3B,sBAAsB,GACvB,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAE,oBAAoB,EAAE,MAAM,yBAAyB,CAAC;AAC/D,OAAO,EAAE,eAAe,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAEvE,MAAM,UAAU,aAAa,CAAC,MAAiB;IAC7C,aAAa;IACb,kBAAkB,CAAC,MAAM,CAAC,CAAC;IAC3B,eAAe,CAAC,MAAM,CAAC,CAAC;IAExB,gBAAgB;IAChB,gBAAgB,CAAC,MAAM,CAAC,CAAC;IAEzB,mBAAmB;IACnB,oBAAoB,CAAC,MAAM,CAAC,CAAC;IAE7B,qBAAqB;IACrB,wBAAwB,CAAC,MAAM,CAAC,CAAC;IACjC,yBAAyB,CAAC,MAAM,CAAC,CAAC;IAClC,gBAAgB,CAAC,MAAM,CAAC,CAAC;IACzB,wBAAwB,CAAC,MAAM,CAAC,CAAC;IACjC,oBAAoB,CAAC,MAAM,CAAC,CAAC;IAC7B,oBAAoB,CAAC,MAAM,CAAC,CAAC;IAC7B,mBAAmB,CAAC,MAAM,CAAC,CAAC;IAC5B,gBAAgB,CAAC,MAAM,CAAC,CAAC;IACzB,sBAAsB,CAAC,MAAM,CAAC,CAAC;IAC/B,iBAAiB,CAAC,MAAM,CAAC,CAAC;IAC1B,mBAAmB,CAAC,MAAM,CAAC,CAAC;IAC5B,2BAA2B,CAAC,MAAM,CAAC,CAAC;IACpC,sBAAsB,CAAC,MAAM,CAAC,CAAC;AACjC,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,EACL,wBAAwB,EACxB,gBAAgB,EAChB,oBAAoB,EACpB,oBAAoB,EACpB,qBAAqB,EACrB,mBAAmB,EACnB,wBAAwB,EACxB,mBAAmB,EACnB,gBAAgB,EAChB,iBAAiB,EACjB,yBAAyB,EACzB,sBAAsB,EACtB,2BAA2B,EAC3B,sBAAsB,GACvB,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAE,oBAAoB,EAAE,MAAM,yBAAyB,CAAC;AAC/D,OAAO,EAAE,eAAe,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAEvE,MAAM,UAAU,aAAa,CAAC,MAAiB;IAC7C,aAAa;IACb,kBAAkB,CAAC,MAAM,CAAC,CAAC;IAC3B,eAAe,CAAC,MAAM,CAAC,CAAC;IAExB,gBAAgB;IAChB,gBAAgB,CAAC,MAAM,CAAC,CAAC;IAEzB,mBAAmB;IACnB,oBAAoB,CAAC,MAAM,CAAC,CAAC;IAE7B,qBAAqB;IACrB,qBAAqB,CAAC,MAAM,CAAC,CAAC;IAC9B,wBAAwB,CAAC,MAAM,CAAC,CAAC;IACjC,yBAAyB,CAAC,MAAM,CAAC,CAAC;IAClC,gBAAgB,CAAC,MAAM,CAAC,CAAC;IACzB,wBAAwB,CAAC,MAAM,CAAC,CAAC;IACjC,oBAAoB,CAAC,MAAM,CAAC,CAAC;IAC7B,oBAAoB,CAAC,MAAM,CAAC,CAAC;IAC7B,mBAAmB,CAAC,MAAM,CAAC,CAAC;IAC5B,gBAAgB,CAAC,MAAM,CAAC,CAAC;IACzB,sBAAsB,CAAC,MAAM,CAAC,CAAC;IAC/B,iBAAiB,CAAC,MAAM,CAAC,CAAC;IAC1B,mBAAmB,CAAC,MAAM,CAAC,CAAC;IAC5B,2BAA2B,CAAC,MAAM,CAAC,CAAC;IACpC,sBAAsB,CAAC,MAAM,CAAC,CAAC;AACjC,CAAC"}
@@ -6,13 +6,13 @@ const schema = z.object({
6
6
  pullRequestId: z.number().describe('The pull request ID'),
7
7
  commentId: z.number().describe('The comment ID'),
8
8
  emoticon: z
9
- .enum(['thumbsup', 'thumbsdown', 'heart', 'thinking_face', 'laugh'])
10
- .describe('The emoticon to add (thumbsup, thumbsdown, heart, thinking_face, laugh)'),
9
+ .enum(['thumbsup', 'thumbsdown', 'heart', 'thinking_face', 'laughing'])
10
+ .describe('The emoticon to add (thumbsup, thumbsdown, heart, thinking_face, laughing)'),
11
11
  });
12
12
  export const addPrCommentReactionTool = (server) => {
13
13
  server.registerTool('bitbucket_add_pr_comment_reaction', {
14
14
  title: 'Add Emoticon Reaction to PR Comment',
15
- description: 'Add an emoticon reaction to a pull request comment. Supported emoticons: thumbsup, thumbsdown, heart, thinking_face, laugh. The operation is idempotent - adding the same reaction twice will succeed.',
15
+ description: 'Add an emoticon reaction to a pull request comment. Supported emoticons: thumbsup, thumbsdown, heart, thinking_face, laughing. The operation is idempotent - adding the same reaction twice will succeed.',
16
16
  inputSchema: schema.shape,
17
17
  }, async ({ projectKey, repositorySlug, pullRequestId, commentId, emoticon }) => {
18
18
  const result = await bitbucketService.addPullRequestCommentReaction({
@@ -1 +1 @@
1
- {"version":3,"file":"add_pr_comment_reaction.js","sourceRoot":"","sources":["../../../src/tools/pull-requests/add_pr_comment_reaction.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAC;AAE/D,MAAM,MAAM,GAAG,CAAC,CAAC,MAAM,CAAC;IACtB,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,2BAA2B,CAAC;IAC5D,cAAc,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,qBAAqB,CAAC;IAC1D,aAAa,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,qBAAqB,CAAC;IACzD,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,gBAAgB,CAAC;IAChD,QAAQ,EAAE,CAAC;SACR,IAAI,CAAC,CAAC,UAAU,EAAE,YAAY,EAAE,OAAO,EAAE,eAAe,EAAE,OAAO,CAAC,CAAC;SACnE,QAAQ,CAAC,yEAAyE,CAAC;CACvF,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,wBAAwB,GAAG,CAAC,MAAiB,EAAE,EAAE;IAC5D,MAAM,CAAC,YAAY,CACjB,mCAAmC,EACnC;QACE,KAAK,EAAE,qCAAqC;QAC5C,WAAW,EACT,wMAAwM;QAC1M,WAAW,EAAE,MAAM,CAAC,KAAK;KAC1B,EACD,KAAK,EAAE,EAAE,UAAU,EAAE,cAAc,EAAE,aAAa,EAAE,SAAS,EAAE,QAAQ,EAAE,EAAE,EAAE;QAC3E,MAAM,MAAM,GAAG,MAAM,gBAAgB,CAAC,6BAA6B,CAAC;YAClE,UAAU;YACV,cAAc;YACd,aAAa;YACb,SAAS;YACT,QAAQ;SACT,CAAC,CAAC;QAEH,OAAO;YACL,OAAO,EAAE;gBACP;oBACE,IAAI,EAAE,MAAM;oBACZ,IAAI,EAAE,aAAa,MAAM,CAAC,QAAQ,CAAC,QAAQ,mCAAmC,SAAS,OAAO,MAAM,CAAC,IAAI,CAAC,WAAW,GAAG;iBACzH;aACF;SACF,CAAC;IACJ,CAAC,CACF,CAAC;AACJ,CAAC,CAAC"}
1
+ {"version":3,"file":"add_pr_comment_reaction.js","sourceRoot":"","sources":["../../../src/tools/pull-requests/add_pr_comment_reaction.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAC;AAE/D,MAAM,MAAM,GAAG,CAAC,CAAC,MAAM,CAAC;IACtB,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,2BAA2B,CAAC;IAC5D,cAAc,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,qBAAqB,CAAC;IAC1D,aAAa,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,qBAAqB,CAAC;IACzD,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,gBAAgB,CAAC;IAChD,QAAQ,EAAE,CAAC;SACR,IAAI,CAAC,CAAC,UAAU,EAAE,YAAY,EAAE,OAAO,EAAE,eAAe,EAAE,UAAU,CAAC,CAAC;SACtE,QAAQ,CAAC,4EAA4E,CAAC;CAC1F,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,wBAAwB,GAAG,CAAC,MAAiB,EAAE,EAAE;IAC5D,MAAM,CAAC,YAAY,CACjB,mCAAmC,EACnC;QACE,KAAK,EAAE,qCAAqC;QAC5C,WAAW,EACT,2MAA2M;QAC7M,WAAW,EAAE,MAAM,CAAC,KAAK;KAC1B,EACD,KAAK,EAAE,EAAE,UAAU,EAAE,cAAc,EAAE,aAAa,EAAE,SAAS,EAAE,QAAQ,EAAE,EAAE,EAAE;QAC3E,MAAM,MAAM,GAAG,MAAM,gBAAgB,CAAC,6BAA6B,CAAC;YAClE,UAAU;YACV,cAAc;YACd,aAAa;YACb,SAAS;YACT,QAAQ;SACT,CAAC,CAAC;QAEH,OAAO;YACL,OAAO,EAAE;gBACP;oBACE,IAAI,EAAE,MAAM;oBACZ,IAAI,EAAE,aAAa,MAAM,CAAC,QAAQ,CAAC,QAAQ,mCAAmC,SAAS,OAAO,MAAM,CAAC,IAAI,CAAC,WAAW,GAAG;iBACzH;aACF;SACF,CAAC;IACJ,CAAC,CACF,CAAC;AACJ,CAAC,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ export declare const createPullRequestTool: (server: McpServer) => void;
3
+ //# sourceMappingURL=create_pull_request.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create_pull_request.d.ts","sourceRoot":"","sources":["../../../src/tools/pull-requests/create_pull_request.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAczE,eAAO,MAAM,qBAAqB,GAAI,QAAQ,SAAS,SA8BtD,CAAC"}
@@ -0,0 +1,37 @@
1
+ import { z } from 'zod';
2
+ import { bitbucketService } from '../../services/bitbucket.js';
3
+ const schema = z.object({
4
+ projectKey: z.string().describe('The Bitbucket project key'),
5
+ repositorySlug: z.string().describe('The repository slug'),
6
+ fromBranch: z.string().describe('Source branch name (e.g., "feature-x")'),
7
+ toBranch: z.string().describe('Target branch name (e.g., "main")'),
8
+ title: z.string().describe('PR title'),
9
+ description: z.string().optional().describe('PR description in markdown format'),
10
+ reviewers: z.array(z.string()).optional().describe('Array of reviewer usernames to add'),
11
+ });
12
+ export const createPullRequestTool = (server) => {
13
+ server.registerTool('bitbucket_create_pull_request', {
14
+ title: 'Create Pull Request',
15
+ description: 'Create a new pull request from a source branch to a target branch. Accepts simple branch names (e.g., "feature-x", "main") - they are automatically converted to full refs. Returns the created PR details including ID, title, state, and web URL.',
16
+ inputSchema: schema.shape,
17
+ }, async ({ projectKey, repositorySlug, fromBranch, toBranch, title, description, reviewers }) => {
18
+ const result = await bitbucketService.createPullRequest({
19
+ projectKey,
20
+ repositorySlug,
21
+ title,
22
+ description,
23
+ fromBranch,
24
+ toBranch,
25
+ reviewers,
26
+ });
27
+ return {
28
+ content: [
29
+ {
30
+ type: 'text',
31
+ text: JSON.stringify(result, null, 2),
32
+ },
33
+ ],
34
+ };
35
+ });
36
+ };
37
+ //# sourceMappingURL=create_pull_request.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create_pull_request.js","sourceRoot":"","sources":["../../../src/tools/pull-requests/create_pull_request.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAC;AAE/D,MAAM,MAAM,GAAG,CAAC,CAAC,MAAM,CAAC;IACtB,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,2BAA2B,CAAC;IAC5D,cAAc,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,qBAAqB,CAAC;IAC1D,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,wCAAwC,CAAC;IACzE,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,mCAAmC,CAAC;IAClE,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC;IACtC,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,mCAAmC,CAAC;IAChF,SAAS,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,oCAAoC,CAAC;CACzF,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC,MAAiB,EAAE,EAAE;IACzD,MAAM,CAAC,YAAY,CACjB,+BAA+B,EAC/B;QACE,KAAK,EAAE,qBAAqB;QAC5B,WAAW,EACT,qPAAqP;QACvP,WAAW,EAAE,MAAM,CAAC,KAAK;KAC1B,EACD,KAAK,EAAE,EAAE,UAAU,EAAE,cAAc,EAAE,UAAU,EAAE,QAAQ,EAAE,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,EAAE,EAAE;QAC5F,MAAM,MAAM,GAAG,MAAM,gBAAgB,CAAC,iBAAiB,CAAC;YACtD,UAAU;YACV,cAAc;YACd,KAAK;YACL,WAAW;YACX,UAAU;YACV,QAAQ;YACR,SAAS;SACV,CAAC,CAAC;QAEH,OAAO;YACL,OAAO,EAAE;gBACP;oBACE,IAAI,EAAE,MAAM;oBACZ,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;iBACtC;aACF;SACF,CAAC;IACJ,CAAC,CACF,CAAC;AACJ,CAAC,CAAC"}