@tugudush/bitbucket-mcp 1.4.13 → 1.5.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.
- package/build/api.d.ts +20 -0
- package/build/api.d.ts.map +1 -1
- package/build/api.js +108 -37
- package/build/api.js.map +1 -1
- package/build/handlers/index.d.ts +16 -0
- package/build/handlers/index.d.ts.map +1 -0
- package/build/handlers/index.js +50 -0
- package/build/handlers/index.js.map +1 -0
- package/build/handlers/issue.d.ts +13 -0
- package/build/handlers/issue.d.ts.map +1 -0
- package/build/handlers/issue.js +48 -0
- package/build/handlers/issue.js.map +1 -0
- package/build/handlers/pullrequest.d.ts +21 -0
- package/build/handlers/pullrequest.d.ts.map +1 -0
- package/build/handlers/pullrequest.js +103 -0
- package/build/handlers/pullrequest.js.map +1 -0
- package/build/handlers/repository.d.ts +29 -0
- package/build/handlers/repository.d.ts.map +1 -0
- package/build/handlers/repository.js +236 -0
- package/build/handlers/repository.js.map +1 -0
- package/build/handlers/search.d.ts +13 -0
- package/build/handlers/search.d.ts.map +1 -0
- package/build/handlers/search.js +78 -0
- package/build/handlers/search.js.map +1 -0
- package/build/handlers/types.d.ts +27 -0
- package/build/handlers/types.d.ts.map +1 -0
- package/build/handlers/types.js +21 -0
- package/build/handlers/types.js.map +1 -0
- package/build/handlers/workspace.d.ts +21 -0
- package/build/handlers/workspace.d.ts.map +1 -0
- package/build/handlers/workspace.js +71 -0
- package/build/handlers/workspace.js.map +1 -0
- package/build/index.d.ts +5 -1
- package/build/index.d.ts.map +1 -1
- package/build/index.js +3 -1
- package/build/index.js.map +1 -1
- package/build/tools.d.ts +13 -0
- package/build/tools.d.ts.map +1 -1
- package/build/tools.js +26 -595
- package/build/tools.js.map +1 -1
- package/package.json +1 -1
package/build/api.d.ts
CHANGED
|
@@ -1,7 +1,27 @@
|
|
|
1
|
+
import { Config } from './config.js';
|
|
2
|
+
/**
|
|
3
|
+
* Bitbucket API configuration and request handling
|
|
4
|
+
*/
|
|
5
|
+
export declare const VERSION = "1.5.0";
|
|
1
6
|
export declare const BITBUCKET_API_BASE = "https://api.bitbucket.org/2.0";
|
|
7
|
+
/**
|
|
8
|
+
* Build authentication headers based on available credentials
|
|
9
|
+
* Priority: API Token (with email) > App Password (with username)
|
|
10
|
+
* @param config - Configuration object (optional, will load from env if not provided)
|
|
11
|
+
* @returns Headers object with Authorization if credentials available
|
|
12
|
+
*/
|
|
13
|
+
export declare function buildAuthHeaders(config?: Config): Record<string, string>;
|
|
14
|
+
/**
|
|
15
|
+
* Build standard request headers for Bitbucket API
|
|
16
|
+
* @param accept - Accept header value (default: 'application/json')
|
|
17
|
+
* @param config - Configuration object (optional)
|
|
18
|
+
* @returns Complete headers object
|
|
19
|
+
*/
|
|
20
|
+
export declare function buildRequestHeaders(accept?: string, config?: Config): Record<string, string>;
|
|
2
21
|
/**
|
|
3
22
|
* Helper function to make authenticated requests to Bitbucket API
|
|
4
23
|
* Enforces read-only behavior by blocking non-GET requests
|
|
24
|
+
* Includes timeout and retry logic for improved reliability
|
|
5
25
|
*/
|
|
6
26
|
export declare function makeRequest<T = unknown>(url: string, options?: RequestInit): Promise<T>;
|
|
7
27
|
/**
|
package/build/api.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../src/api.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../src/api.ts"],"names":[],"mappings":"AAAA,OAAO,EAAc,MAAM,EAAE,MAAM,aAAa,CAAC;AAIjD;;GAEG;AAGH,eAAO,MAAM,OAAO,UAAU,CAAC;AAQ/B,eAAO,MAAM,kBAAkB,kCAAkC,CAAC;AAElE;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAmBxE;AAED;;;;;GAKG;AACH,wBAAgB,mBAAmB,CACjC,MAAM,GAAE,MAA2B,EACnC,MAAM,CAAC,EAAE,MAAM,GACd,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAMxB;AAiBD;;;;GAIG;AACH,wBAAsB,WAAW,CAAC,CAAC,GAAG,OAAO,EAC3C,GAAG,EAAE,MAAM,EACX,OAAO,GAAE,WAAgB,GACxB,OAAO,CAAC,CAAC,CAAC,CAkGZ;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAEpD;AAED;;GAEG;AACH,wBAAgB,cAAc,CAC5B,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC9B,eAAe,CAgBjB;AAED;;GAEG;AACH,wBAAgB,cAAc,CAC5B,GAAG,EAAE,MAAM,EACX,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC9B,MAAM,CAUR"}
|
package/build/api.js
CHANGED
|
@@ -4,15 +4,65 @@ import { API_CONSTANTS } from './schemas.js';
|
|
|
4
4
|
/**
|
|
5
5
|
* Bitbucket API configuration and request handling
|
|
6
6
|
*/
|
|
7
|
+
// Package version - kept in sync with package.json
|
|
8
|
+
export const VERSION = '1.5.0';
|
|
7
9
|
// Get config dynamically to handle environment changes
|
|
8
10
|
function getConfig() {
|
|
9
11
|
return loadConfig();
|
|
10
12
|
}
|
|
11
13
|
// Bitbucket API base URL
|
|
12
14
|
export const BITBUCKET_API_BASE = 'https://api.bitbucket.org/2.0';
|
|
15
|
+
/**
|
|
16
|
+
* Build authentication headers based on available credentials
|
|
17
|
+
* Priority: API Token (with email) > App Password (with username)
|
|
18
|
+
* @param config - Configuration object (optional, will load from env if not provided)
|
|
19
|
+
* @returns Headers object with Authorization if credentials available
|
|
20
|
+
*/
|
|
21
|
+
export function buildAuthHeaders(config) {
|
|
22
|
+
const cfg = config || getConfig();
|
|
23
|
+
const headers = {};
|
|
24
|
+
if (cfg.BITBUCKET_API_TOKEN && cfg.BITBUCKET_EMAIL) {
|
|
25
|
+
// Use API Token with Basic authentication (recommended)
|
|
26
|
+
const auth = Buffer.from(`${cfg.BITBUCKET_EMAIL}:${cfg.BITBUCKET_API_TOKEN}`).toString('base64');
|
|
27
|
+
headers.Authorization = `Basic ${auth}`;
|
|
28
|
+
}
|
|
29
|
+
else if (cfg.BITBUCKET_USERNAME && cfg.BITBUCKET_APP_PASSWORD) {
|
|
30
|
+
// Fallback to App Password with Basic authentication (legacy)
|
|
31
|
+
const auth = Buffer.from(`${cfg.BITBUCKET_USERNAME}:${cfg.BITBUCKET_APP_PASSWORD}`).toString('base64');
|
|
32
|
+
headers.Authorization = `Basic ${auth}`;
|
|
33
|
+
}
|
|
34
|
+
return headers;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Build standard request headers for Bitbucket API
|
|
38
|
+
* @param accept - Accept header value (default: 'application/json')
|
|
39
|
+
* @param config - Configuration object (optional)
|
|
40
|
+
* @returns Complete headers object
|
|
41
|
+
*/
|
|
42
|
+
export function buildRequestHeaders(accept = 'application/json', config) {
|
|
43
|
+
return {
|
|
44
|
+
Accept: accept,
|
|
45
|
+
'User-Agent': `bitbucket-mcp-server/${VERSION}`,
|
|
46
|
+
...buildAuthHeaders(config),
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Check if an error is retryable (transient failures)
|
|
51
|
+
*/
|
|
52
|
+
function isRetryableError(status) {
|
|
53
|
+
// Retry on server errors (5xx) and rate limiting (429)
|
|
54
|
+
return status >= 500 || status === 429;
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Sleep for a specified duration
|
|
58
|
+
*/
|
|
59
|
+
function sleep(ms) {
|
|
60
|
+
return new Promise(resolve => setTimeout(resolve, ms));
|
|
61
|
+
}
|
|
13
62
|
/**
|
|
14
63
|
* Helper function to make authenticated requests to Bitbucket API
|
|
15
64
|
* Enforces read-only behavior by blocking non-GET requests
|
|
65
|
+
* Includes timeout and retry logic for improved reliability
|
|
16
66
|
*/
|
|
17
67
|
export async function makeRequest(url, options = {}) {
|
|
18
68
|
// Enforce read-only behavior: block any non-GET methods at runtime
|
|
@@ -20,50 +70,71 @@ export async function makeRequest(url, options = {}) {
|
|
|
20
70
|
if (requestedMethod !== 'GET') {
|
|
21
71
|
throw new Error(`Only GET requests are allowed. Attempted: ${requestedMethod} ${url}`);
|
|
22
72
|
}
|
|
73
|
+
const config = getConfig();
|
|
23
74
|
const headers = {
|
|
24
|
-
|
|
25
|
-
'User-Agent': 'bitbucket-mcp-server/1.0.0',
|
|
75
|
+
...buildRequestHeaders('application/json', config),
|
|
26
76
|
...(options.headers || {}),
|
|
27
77
|
};
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
if (apiToken && email) {
|
|
36
|
-
// Use API Token with Basic authentication (recommended)
|
|
37
|
-
// Username should be your Atlassian email, password is the API token
|
|
38
|
-
const auth = Buffer.from(`${email}:${apiToken}`).toString('base64');
|
|
39
|
-
headers.Authorization = `Basic ${auth}`;
|
|
40
|
-
}
|
|
41
|
-
else if (username && appPassword) {
|
|
42
|
-
// Fallback to App Password with Basic authentication (legacy)
|
|
43
|
-
const auth = Buffer.from(`${username}:${appPassword}`).toString('base64');
|
|
44
|
-
headers.Authorization = `Basic ${auth}`;
|
|
45
|
-
}
|
|
46
|
-
const response = await fetch(url, {
|
|
47
|
-
...options,
|
|
48
|
-
// Force GET to prevent accidental method overrides downstream
|
|
49
|
-
method: 'GET',
|
|
50
|
-
headers,
|
|
51
|
-
});
|
|
52
|
-
if (!response.ok) {
|
|
53
|
-
const errorText = await response.text();
|
|
54
|
-
// Try to parse error details
|
|
55
|
-
let errorData;
|
|
78
|
+
const timeout = config.BITBUCKET_REQUEST_TIMEOUT;
|
|
79
|
+
let lastError = null;
|
|
80
|
+
// Retry loop for transient failures
|
|
81
|
+
for (let attempt = 1; attempt <= API_CONSTANTS.RETRY_ATTEMPTS; attempt++) {
|
|
82
|
+
// Create abort controller for timeout
|
|
83
|
+
const controller = new AbortController();
|
|
84
|
+
const timeoutId = setTimeout(() => controller.abort(), timeout);
|
|
56
85
|
try {
|
|
57
|
-
|
|
86
|
+
const response = await fetch(url, {
|
|
87
|
+
...options,
|
|
88
|
+
// Force GET to prevent accidental method overrides downstream
|
|
89
|
+
method: 'GET',
|
|
90
|
+
headers,
|
|
91
|
+
signal: controller.signal,
|
|
92
|
+
});
|
|
93
|
+
clearTimeout(timeoutId);
|
|
94
|
+
if (!response.ok) {
|
|
95
|
+
const errorText = await response.text();
|
|
96
|
+
// Try to parse error details
|
|
97
|
+
let errorData;
|
|
98
|
+
try {
|
|
99
|
+
errorData = JSON.parse(errorText);
|
|
100
|
+
}
|
|
101
|
+
catch {
|
|
102
|
+
// If JSON parsing fails, use raw error text
|
|
103
|
+
errorData = { message: errorText };
|
|
104
|
+
}
|
|
105
|
+
// Check if we should retry
|
|
106
|
+
if (isRetryableError(response.status) &&
|
|
107
|
+
attempt < API_CONSTANTS.RETRY_ATTEMPTS) {
|
|
108
|
+
// Exponential backoff: 1s, 2s, 4s...
|
|
109
|
+
const backoffMs = Math.pow(2, attempt - 1) * 1000;
|
|
110
|
+
await sleep(backoffMs);
|
|
111
|
+
lastError = createApiError(response.status, response.statusText, errorData, url);
|
|
112
|
+
continue;
|
|
113
|
+
}
|
|
114
|
+
// Create and throw appropriate error type
|
|
115
|
+
throw createApiError(response.status, response.statusText, errorData, url);
|
|
116
|
+
}
|
|
117
|
+
return await response.json();
|
|
58
118
|
}
|
|
59
|
-
catch {
|
|
60
|
-
|
|
61
|
-
|
|
119
|
+
catch (error) {
|
|
120
|
+
clearTimeout(timeoutId);
|
|
121
|
+
// Handle abort/timeout errors
|
|
122
|
+
if (error instanceof Error && error.name === 'AbortError') {
|
|
123
|
+
lastError = new Error(`Request timeout after ${timeout}ms: ${url}`);
|
|
124
|
+
if (attempt < API_CONSTANTS.RETRY_ATTEMPTS) {
|
|
125
|
+
const backoffMs = Math.pow(2, attempt - 1) * 1000;
|
|
126
|
+
await sleep(backoffMs);
|
|
127
|
+
continue;
|
|
128
|
+
}
|
|
129
|
+
throw lastError;
|
|
130
|
+
}
|
|
131
|
+
// Re-throw non-retryable errors
|
|
132
|
+
throw error;
|
|
62
133
|
}
|
|
63
|
-
// Create and throw appropriate error type
|
|
64
|
-
throw createApiError(response.status, response.statusText, errorData, url);
|
|
65
134
|
}
|
|
66
|
-
|
|
135
|
+
// Should not reach here, but throw last error if we do
|
|
136
|
+
throw (lastError ||
|
|
137
|
+
new Error(`Request failed after ${API_CONSTANTS.RETRY_ATTEMPTS} attempts`));
|
|
67
138
|
}
|
|
68
139
|
/**
|
|
69
140
|
* Build URL for Bitbucket API endpoints
|
package/build/api.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api.js","sourceRoot":"","sources":["../src/api.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,
|
|
1
|
+
{"version":3,"file":"api.js","sourceRoot":"","sources":["../src/api.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Handlers module - exports all tool handlers and registry
|
|
3
|
+
*/
|
|
4
|
+
export * from './types.js';
|
|
5
|
+
export { handleGetRepository, handleListRepositories, handleGetBranches, handleGetCommits, handleBrowseRepository, handleGetFileContent, } from './repository.js';
|
|
6
|
+
export { handleGetPullRequests, handleGetPullRequest, handleGetPullRequestComments, handleGetPullRequestActivity, } from './pullrequest.js';
|
|
7
|
+
export { handleGetIssues, handleGetIssue } from './issue.js';
|
|
8
|
+
export { handleListWorkspaces, handleGetWorkspace, handleGetUser, handleGetCurrentUser, } from './workspace.js';
|
|
9
|
+
export { handleSearchRepositories, handleSearchCode } from './search.js';
|
|
10
|
+
import type { ToolHandler } from './types.js';
|
|
11
|
+
/**
|
|
12
|
+
* Registry mapping tool names to their handler functions
|
|
13
|
+
* This eliminates the need for a large switch statement
|
|
14
|
+
*/
|
|
15
|
+
export declare const toolHandlers: Record<string, ToolHandler>;
|
|
16
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/handlers/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,cAAc,YAAY,CAAC;AAG3B,OAAO,EACL,mBAAmB,EACnB,sBAAsB,EACtB,iBAAiB,EACjB,gBAAgB,EAChB,sBAAsB,EACtB,oBAAoB,GACrB,MAAM,iBAAiB,CAAC;AAGzB,OAAO,EACL,qBAAqB,EACrB,oBAAoB,EACpB,4BAA4B,EAC5B,4BAA4B,GAC7B,MAAM,kBAAkB,CAAC;AAG1B,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAG7D,OAAO,EACL,oBAAoB,EACpB,kBAAkB,EAClB,aAAa,EACb,oBAAoB,GACrB,MAAM,gBAAgB,CAAC;AAGxB,OAAO,EAAE,wBAAwB,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAGzE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAwB9C;;;GAGG;AACH,eAAO,MAAM,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,WAAW,CA4BpD,CAAC"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Handlers module - exports all tool handlers and registry
|
|
3
|
+
*/
|
|
4
|
+
// Re-export types
|
|
5
|
+
export * from './types.js';
|
|
6
|
+
// Repository handlers
|
|
7
|
+
export { handleGetRepository, handleListRepositories, handleGetBranches, handleGetCommits, handleBrowseRepository, handleGetFileContent, } from './repository.js';
|
|
8
|
+
// Pull request handlers
|
|
9
|
+
export { handleGetPullRequests, handleGetPullRequest, handleGetPullRequestComments, handleGetPullRequestActivity, } from './pullrequest.js';
|
|
10
|
+
// Issue handlers
|
|
11
|
+
export { handleGetIssues, handleGetIssue } from './issue.js';
|
|
12
|
+
// Workspace/user handlers
|
|
13
|
+
export { handleListWorkspaces, handleGetWorkspace, handleGetUser, handleGetCurrentUser, } from './workspace.js';
|
|
14
|
+
// Search handlers
|
|
15
|
+
export { handleSearchRepositories, handleSearchCode } from './search.js';
|
|
16
|
+
import { handleGetRepository, handleListRepositories, handleGetBranches, handleGetCommits, handleBrowseRepository, handleGetFileContent, } from './repository.js';
|
|
17
|
+
import { handleGetPullRequests, handleGetPullRequest, handleGetPullRequestComments, handleGetPullRequestActivity, } from './pullrequest.js';
|
|
18
|
+
import { handleGetIssues, handleGetIssue } from './issue.js';
|
|
19
|
+
import { handleListWorkspaces, handleGetWorkspace, handleGetUser, handleGetCurrentUser, } from './workspace.js';
|
|
20
|
+
import { handleSearchRepositories, handleSearchCode } from './search.js';
|
|
21
|
+
/**
|
|
22
|
+
* Registry mapping tool names to their handler functions
|
|
23
|
+
* This eliminates the need for a large switch statement
|
|
24
|
+
*/
|
|
25
|
+
export const toolHandlers = {
|
|
26
|
+
// Repository tools
|
|
27
|
+
bb_get_repository: handleGetRepository,
|
|
28
|
+
bb_list_repositories: handleListRepositories,
|
|
29
|
+
bb_get_branches: handleGetBranches,
|
|
30
|
+
bb_get_commits: handleGetCommits,
|
|
31
|
+
bb_browse_repository: handleBrowseRepository,
|
|
32
|
+
bb_get_file_content: handleGetFileContent,
|
|
33
|
+
// Pull request tools
|
|
34
|
+
bb_get_pull_requests: handleGetPullRequests,
|
|
35
|
+
bb_get_pull_request: handleGetPullRequest,
|
|
36
|
+
bb_get_pull_request_comments: handleGetPullRequestComments,
|
|
37
|
+
bb_get_pull_request_activity: handleGetPullRequestActivity,
|
|
38
|
+
// Issue tools
|
|
39
|
+
bb_get_issues: handleGetIssues,
|
|
40
|
+
bb_get_issue: handleGetIssue,
|
|
41
|
+
// Workspace/user tools
|
|
42
|
+
bb_list_workspaces: handleListWorkspaces,
|
|
43
|
+
bb_get_workspace: handleGetWorkspace,
|
|
44
|
+
bb_get_user: handleGetUser,
|
|
45
|
+
bb_get_current_user: handleGetCurrentUser,
|
|
46
|
+
// Search tools
|
|
47
|
+
bb_search_repositories: handleSearchRepositories,
|
|
48
|
+
bb_search_code: handleSearchCode,
|
|
49
|
+
};
|
|
50
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/handlers/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,kBAAkB;AAClB,cAAc,YAAY,CAAC;AAE3B,sBAAsB;AACtB,OAAO,EACL,mBAAmB,EACnB,sBAAsB,EACtB,iBAAiB,EACjB,gBAAgB,EAChB,sBAAsB,EACtB,oBAAoB,GACrB,MAAM,iBAAiB,CAAC;AAEzB,wBAAwB;AACxB,OAAO,EACL,qBAAqB,EACrB,oBAAoB,EACpB,4BAA4B,EAC5B,4BAA4B,GAC7B,MAAM,kBAAkB,CAAC;AAE1B,iBAAiB;AACjB,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAE7D,0BAA0B;AAC1B,OAAO,EACL,oBAAoB,EACpB,kBAAkB,EAClB,aAAa,EACb,oBAAoB,GACrB,MAAM,gBAAgB,CAAC;AAExB,kBAAkB;AAClB,OAAO,EAAE,wBAAwB,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAIzE,OAAO,EACL,mBAAmB,EACnB,sBAAsB,EACtB,iBAAiB,EACjB,gBAAgB,EAChB,sBAAsB,EACtB,oBAAoB,GACrB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EACL,qBAAqB,EACrB,oBAAoB,EACpB,4BAA4B,EAC5B,4BAA4B,GAC7B,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAC7D,OAAO,EACL,oBAAoB,EACpB,kBAAkB,EAClB,aAAa,EACb,oBAAoB,GACrB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,wBAAwB,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAEzE;;;GAGG;AACH,MAAM,CAAC,MAAM,YAAY,GAAgC;IACvD,mBAAmB;IACnB,iBAAiB,EAAE,mBAAmB;IACtC,oBAAoB,EAAE,sBAAsB;IAC5C,eAAe,EAAE,iBAAiB;IAClC,cAAc,EAAE,gBAAgB;IAChC,oBAAoB,EAAE,sBAAsB;IAC5C,mBAAmB,EAAE,oBAAoB;IAEzC,qBAAqB;IACrB,oBAAoB,EAAE,qBAAqB;IAC3C,mBAAmB,EAAE,oBAAoB;IACzC,4BAA4B,EAAE,4BAA4B;IAC1D,4BAA4B,EAAE,4BAA4B;IAE1D,cAAc;IACd,aAAa,EAAE,eAAe;IAC9B,YAAY,EAAE,cAAc;IAE5B,uBAAuB;IACvB,kBAAkB,EAAE,oBAAoB;IACxC,gBAAgB,EAAE,kBAAkB;IACpC,WAAW,EAAE,aAAa;IAC1B,mBAAmB,EAAE,oBAAoB;IAEzC,eAAe;IACf,sBAAsB,EAAE,wBAAwB;IAChD,cAAc,EAAE,gBAAgB;CACjC,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Issue-related tool handlers
|
|
3
|
+
*/
|
|
4
|
+
import { ToolResponse } from './types.js';
|
|
5
|
+
/**
|
|
6
|
+
* Get issues for a repository
|
|
7
|
+
*/
|
|
8
|
+
export declare function handleGetIssues(args: unknown): Promise<ToolResponse>;
|
|
9
|
+
/**
|
|
10
|
+
* Get detailed information about a specific issue
|
|
11
|
+
*/
|
|
12
|
+
export declare function handleGetIssue(args: unknown): Promise<ToolResponse>;
|
|
13
|
+
//# sourceMappingURL=issue.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"issue.d.ts","sourceRoot":"","sources":["../../src/handlers/issue.ts"],"names":[],"mappings":"AAAA;;GAEG;AAKH,OAAO,EAAkB,YAAY,EAAE,MAAM,YAAY,CAAC;AAE1D;;GAEG;AACH,wBAAsB,eAAe,CAAC,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC,YAAY,CAAC,CA8B1E;AAED;;GAEG;AACH,wBAAsB,cAAc,CAAC,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC,YAAY,CAAC,CAkBzE"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Issue-related tool handlers
|
|
3
|
+
*/
|
|
4
|
+
import { GetIssuesSchema, GetIssueSchema } from '../schemas.js';
|
|
5
|
+
import { makeRequest, buildApiUrl, addQueryParams } from '../api.js';
|
|
6
|
+
import { createResponse } from './types.js';
|
|
7
|
+
/**
|
|
8
|
+
* Get issues for a repository
|
|
9
|
+
*/
|
|
10
|
+
export async function handleGetIssues(args) {
|
|
11
|
+
const parsed = GetIssuesSchema.parse(args);
|
|
12
|
+
const params = {
|
|
13
|
+
state: parsed.state,
|
|
14
|
+
kind: parsed.kind,
|
|
15
|
+
page: parsed.page,
|
|
16
|
+
pagelen: parsed.pagelen,
|
|
17
|
+
};
|
|
18
|
+
const url = addQueryParams(buildApiUrl(`/repositories/${parsed.workspace}/${parsed.repo_slug}/issues`), params);
|
|
19
|
+
const data = await makeRequest(url);
|
|
20
|
+
const issueList = data.values
|
|
21
|
+
.map((issue) => `- #${issue.id}: ${issue.title}\n` +
|
|
22
|
+
` State: ${issue.state}\n` +
|
|
23
|
+
` Kind: ${issue.kind}\n` +
|
|
24
|
+
` Priority: ${issue.priority}\n` +
|
|
25
|
+
` Reporter: ${issue.reporter.display_name}\n` +
|
|
26
|
+
` Assignee: ${issue.assignee?.display_name || 'Unassigned'}\n` +
|
|
27
|
+
` Created: ${issue.created_on}`)
|
|
28
|
+
.join('\n\n');
|
|
29
|
+
return createResponse(`Issues for ${parsed.workspace}/${parsed.repo_slug} (${data.size} total):\n\n${issueList}`);
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Get detailed information about a specific issue
|
|
33
|
+
*/
|
|
34
|
+
export async function handleGetIssue(args) {
|
|
35
|
+
const parsed = GetIssueSchema.parse(args);
|
|
36
|
+
const url = buildApiUrl(`/repositories/${parsed.workspace}/${parsed.repo_slug}/issues/${parsed.issue_id}`);
|
|
37
|
+
const data = await makeRequest(url);
|
|
38
|
+
return createResponse(`Issue #${data.id}: ${data.title}\n` +
|
|
39
|
+
`State: ${data.state}\n` +
|
|
40
|
+
`Kind: ${data.kind}\n` +
|
|
41
|
+
`Priority: ${data.priority}\n` +
|
|
42
|
+
`Reporter: ${data.reporter.display_name}\n` +
|
|
43
|
+
`Assignee: ${data.assignee?.display_name || 'Unassigned'}\n` +
|
|
44
|
+
`Created: ${data.created_on}\n` +
|
|
45
|
+
`Updated: ${data.updated_on}\n` +
|
|
46
|
+
`Content:\n${data.content?.raw || 'No content'}`);
|
|
47
|
+
}
|
|
48
|
+
//# sourceMappingURL=issue.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"issue.js","sourceRoot":"","sources":["../../src/handlers/issue.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAChE,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAErE,OAAO,EAAE,cAAc,EAAgB,MAAM,YAAY,CAAC;AAE1D;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,IAAa;IACjD,MAAM,MAAM,GAAG,eAAe,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC3C,MAAM,MAAM,GAAG;QACb,KAAK,EAAE,MAAM,CAAC,KAAK;QACnB,IAAI,EAAE,MAAM,CAAC,IAAI;QACjB,IAAI,EAAE,MAAM,CAAC,IAAI;QACjB,OAAO,EAAE,MAAM,CAAC,OAAO;KACxB,CAAC;IACF,MAAM,GAAG,GAAG,cAAc,CACxB,WAAW,CAAC,iBAAiB,MAAM,CAAC,SAAS,IAAI,MAAM,CAAC,SAAS,SAAS,CAAC,EAC3E,MAAM,CACP,CAAC;IACF,MAAM,IAAI,GAAG,MAAM,WAAW,CAAuC,GAAG,CAAC,CAAC;IAE1E,MAAM,SAAS,GAAG,IAAI,CAAC,MAAM;SAC1B,GAAG,CACF,CAAC,KAAqB,EAAE,EAAE,CACxB,MAAM,KAAK,CAAC,EAAE,KAAK,KAAK,CAAC,KAAK,IAAI;QAClC,YAAY,KAAK,CAAC,KAAK,IAAI;QAC3B,WAAW,KAAK,CAAC,IAAI,IAAI;QACzB,eAAe,KAAK,CAAC,QAAQ,IAAI;QACjC,eAAe,KAAK,CAAC,QAAQ,CAAC,YAAY,IAAI;QAC9C,eAAe,KAAK,CAAC,QAAQ,EAAE,YAAY,IAAI,YAAY,IAAI;QAC/D,cAAc,KAAK,CAAC,UAAU,EAAE,CACnC;SACA,IAAI,CAAC,MAAM,CAAC,CAAC;IAEhB,OAAO,cAAc,CACnB,cAAc,MAAM,CAAC,SAAS,IAAI,MAAM,CAAC,SAAS,KAAK,IAAI,CAAC,IAAI,eAAe,SAAS,EAAE,CAC3F,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,IAAa;IAChD,MAAM,MAAM,GAAG,cAAc,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC1C,MAAM,GAAG,GAAG,WAAW,CACrB,iBAAiB,MAAM,CAAC,SAAS,IAAI,MAAM,CAAC,SAAS,WAAW,MAAM,CAAC,QAAQ,EAAE,CAClF,CAAC;IACF,MAAM,IAAI,GAAG,MAAM,WAAW,CAAiB,GAAG,CAAC,CAAC;IAEpD,OAAO,cAAc,CACnB,UAAU,IAAI,CAAC,EAAE,KAAK,IAAI,CAAC,KAAK,IAAI;QAClC,UAAU,IAAI,CAAC,KAAK,IAAI;QACxB,SAAS,IAAI,CAAC,IAAI,IAAI;QACtB,aAAa,IAAI,CAAC,QAAQ,IAAI;QAC9B,aAAa,IAAI,CAAC,QAAQ,CAAC,YAAY,IAAI;QAC3C,aAAa,IAAI,CAAC,QAAQ,EAAE,YAAY,IAAI,YAAY,IAAI;QAC5D,YAAY,IAAI,CAAC,UAAU,IAAI;QAC/B,YAAY,IAAI,CAAC,UAAU,IAAI;QAC/B,aAAa,IAAI,CAAC,OAAO,EAAE,GAAG,IAAI,YAAY,EAAE,CACnD,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pull request-related tool handlers
|
|
3
|
+
*/
|
|
4
|
+
import { ToolResponse } from './types.js';
|
|
5
|
+
/**
|
|
6
|
+
* Get pull requests for a repository
|
|
7
|
+
*/
|
|
8
|
+
export declare function handleGetPullRequests(args: unknown): Promise<ToolResponse>;
|
|
9
|
+
/**
|
|
10
|
+
* Get detailed information about a specific pull request
|
|
11
|
+
*/
|
|
12
|
+
export declare function handleGetPullRequest(args: unknown): Promise<ToolResponse>;
|
|
13
|
+
/**
|
|
14
|
+
* Get comments for a specific pull request
|
|
15
|
+
*/
|
|
16
|
+
export declare function handleGetPullRequestComments(args: unknown): Promise<ToolResponse>;
|
|
17
|
+
/**
|
|
18
|
+
* Get activity for a specific pull request
|
|
19
|
+
*/
|
|
20
|
+
export declare function handleGetPullRequestActivity(args: unknown): Promise<ToolResponse>;
|
|
21
|
+
//# sourceMappingURL=pullrequest.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pullrequest.d.ts","sourceRoot":"","sources":["../../src/handlers/pullrequest.ts"],"names":[],"mappings":"AAAA;;GAEG;AAeH,OAAO,EAAkB,YAAY,EAAE,MAAM,YAAY,CAAC;AAE1D;;GAEG;AACH,wBAAsB,qBAAqB,CACzC,IAAI,EAAE,OAAO,GACZ,OAAO,CAAC,YAAY,CAAC,CA8BvB;AAED;;GAEG;AACH,wBAAsB,oBAAoB,CACxC,IAAI,EAAE,OAAO,GACZ,OAAO,CAAC,YAAY,CAAC,CAiBvB;AAED;;GAEG;AACH,wBAAsB,4BAA4B,CAChD,IAAI,EAAE,OAAO,GACZ,OAAO,CAAC,YAAY,CAAC,CA4BvB;AAED;;GAEG;AACH,wBAAsB,4BAA4B,CAChD,IAAI,EAAE,OAAO,GACZ,OAAO,CAAC,YAAY,CAAC,CAmDvB"}
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pull request-related tool handlers
|
|
3
|
+
*/
|
|
4
|
+
import { GetPullRequestsSchema, GetPullRequestSchema, GetPullRequestCommentsSchema, GetPullRequestActivitySchema, } from '../schemas.js';
|
|
5
|
+
import { makeRequest, buildApiUrl, addQueryParams } from '../api.js';
|
|
6
|
+
import { createResponse } from './types.js';
|
|
7
|
+
/**
|
|
8
|
+
* Get pull requests for a repository
|
|
9
|
+
*/
|
|
10
|
+
export async function handleGetPullRequests(args) {
|
|
11
|
+
const parsed = GetPullRequestsSchema.parse(args);
|
|
12
|
+
const params = {
|
|
13
|
+
state: parsed.state,
|
|
14
|
+
page: parsed.page,
|
|
15
|
+
pagelen: parsed.pagelen,
|
|
16
|
+
};
|
|
17
|
+
const url = addQueryParams(buildApiUrl(`/repositories/${parsed.workspace}/${parsed.repo_slug}/pullrequests`), params);
|
|
18
|
+
const data = await makeRequest(url);
|
|
19
|
+
const prList = data.values
|
|
20
|
+
.map((pr) => `- #${pr.id}: ${pr.title}\n` +
|
|
21
|
+
` Author: ${pr.author.display_name}\n` +
|
|
22
|
+
` State: ${pr.state}\n` +
|
|
23
|
+
` Created: ${pr.created_on}\n` +
|
|
24
|
+
` Source: ${pr.source.branch.name} → ${pr.destination.branch.name}`)
|
|
25
|
+
.join('\n\n');
|
|
26
|
+
return createResponse(`Pull requests for ${parsed.workspace}/${parsed.repo_slug} (${data.size} total):\n\n${prList}`);
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Get detailed information about a specific pull request
|
|
30
|
+
*/
|
|
31
|
+
export async function handleGetPullRequest(args) {
|
|
32
|
+
const parsed = GetPullRequestSchema.parse(args);
|
|
33
|
+
const url = buildApiUrl(`/repositories/${parsed.workspace}/${parsed.repo_slug}/pullrequests/${parsed.pull_request_id}`);
|
|
34
|
+
const data = await makeRequest(url);
|
|
35
|
+
return createResponse(`Pull Request #${data.id}: ${data.title}\n` +
|
|
36
|
+
`Author: ${data.author.display_name}\n` +
|
|
37
|
+
`State: ${data.state}\n` +
|
|
38
|
+
`Created: ${data.created_on}\n` +
|
|
39
|
+
`Updated: ${data.updated_on}\n` +
|
|
40
|
+
`Source: ${data.source.branch.name} → ${data.destination.branch.name}\n` +
|
|
41
|
+
`Description:\n${data.description || 'No description'}\n` +
|
|
42
|
+
`Reviewers: ${data.reviewers?.map(r => r.display_name).join(', ') || 'None'}`);
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Get comments for a specific pull request
|
|
46
|
+
*/
|
|
47
|
+
export async function handleGetPullRequestComments(args) {
|
|
48
|
+
const parsed = GetPullRequestCommentsSchema.parse(args);
|
|
49
|
+
const params = {
|
|
50
|
+
page: parsed.page,
|
|
51
|
+
pagelen: parsed.pagelen,
|
|
52
|
+
};
|
|
53
|
+
const url = addQueryParams(buildApiUrl(`/repositories/${parsed.workspace}/${parsed.repo_slug}/pullrequests/${parsed.pull_request_id}/comments`), params);
|
|
54
|
+
const data = await makeRequest(url);
|
|
55
|
+
const commentList = data.values
|
|
56
|
+
.map((comment) => `- ${comment.user.display_name} (${comment.created_on}):\n` +
|
|
57
|
+
` ${comment.content?.raw || 'No content'}\n` +
|
|
58
|
+
(comment.inline
|
|
59
|
+
? ` File: ${comment.inline.path}, Line: ${comment.inline.to || comment.inline.from}`
|
|
60
|
+
: ''))
|
|
61
|
+
.join('\n\n');
|
|
62
|
+
return createResponse(`Comments for PR #${parsed.pull_request_id} (${data.size} total):\n\n${commentList}`);
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Get activity for a specific pull request
|
|
66
|
+
*/
|
|
67
|
+
export async function handleGetPullRequestActivity(args) {
|
|
68
|
+
const parsed = GetPullRequestActivitySchema.parse(args);
|
|
69
|
+
const params = {
|
|
70
|
+
page: parsed.page,
|
|
71
|
+
pagelen: parsed.pagelen,
|
|
72
|
+
};
|
|
73
|
+
const url = addQueryParams(buildApiUrl(`/repositories/${parsed.workspace}/${parsed.repo_slug}/pullrequests/${parsed.pull_request_id}/activity`), params);
|
|
74
|
+
const data = await makeRequest(url);
|
|
75
|
+
const activityList = data.values
|
|
76
|
+
.map((activity) => {
|
|
77
|
+
// Handle cases where user might be undefined/null (system activities)
|
|
78
|
+
const userName = activity.user?.display_name || 'System';
|
|
79
|
+
const actionDate = activity.created_on || activity.update?.date || 'Unknown date';
|
|
80
|
+
const action = activity.action || 'Activity';
|
|
81
|
+
let activityText = `- ${userName} (${actionDate}):\n` + ` Action: ${action}`;
|
|
82
|
+
// Add comment if present
|
|
83
|
+
if (activity.comment) {
|
|
84
|
+
activityText += `\n Comment: ${activity.comment.content?.raw || 'No content'}`;
|
|
85
|
+
}
|
|
86
|
+
// Add approval if present
|
|
87
|
+
if (activity.approval) {
|
|
88
|
+
activityText += `\n Approval: ${activity.approval.state || 'Unknown state'}`;
|
|
89
|
+
}
|
|
90
|
+
// Add update if present
|
|
91
|
+
if (activity.update) {
|
|
92
|
+
const updateAuthor = activity.update.author?.display_name || 'Unknown';
|
|
93
|
+
activityText += `\n Update: ${activity.update.state || 'Updated'} by ${updateAuthor}`;
|
|
94
|
+
if (activity.update.title) {
|
|
95
|
+
activityText += `\n Title changed to: ${activity.update.title}`;
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
return activityText;
|
|
99
|
+
})
|
|
100
|
+
.join('\n\n');
|
|
101
|
+
return createResponse(`Activity for PR #${parsed.pull_request_id} (${data.size} total):\n\n${activityList}`);
|
|
102
|
+
}
|
|
103
|
+
//# sourceMappingURL=pullrequest.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pullrequest.js","sourceRoot":"","sources":["../../src/handlers/pullrequest.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Repository-related tool handlers
|
|
3
|
+
*/
|
|
4
|
+
import { ToolResponse } from './types.js';
|
|
5
|
+
/**
|
|
6
|
+
* Get detailed information about a specific repository
|
|
7
|
+
*/
|
|
8
|
+
export declare function handleGetRepository(args: unknown): Promise<ToolResponse>;
|
|
9
|
+
/**
|
|
10
|
+
* List repositories in a workspace
|
|
11
|
+
*/
|
|
12
|
+
export declare function handleListRepositories(args: unknown): Promise<ToolResponse>;
|
|
13
|
+
/**
|
|
14
|
+
* Get branches for a repository
|
|
15
|
+
*/
|
|
16
|
+
export declare function handleGetBranches(args: unknown): Promise<ToolResponse>;
|
|
17
|
+
/**
|
|
18
|
+
* Get commits for a repository branch
|
|
19
|
+
*/
|
|
20
|
+
export declare function handleGetCommits(args: unknown): Promise<ToolResponse>;
|
|
21
|
+
/**
|
|
22
|
+
* Browse files and directories in a repository
|
|
23
|
+
*/
|
|
24
|
+
export declare function handleBrowseRepository(args: unknown): Promise<ToolResponse>;
|
|
25
|
+
/**
|
|
26
|
+
* Get the content of a file from a repository
|
|
27
|
+
*/
|
|
28
|
+
export declare function handleGetFileContent(args: unknown): Promise<ToolResponse>;
|
|
29
|
+
//# sourceMappingURL=repository.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"repository.d.ts","sourceRoot":"","sources":["../../src/handlers/repository.ts"],"names":[],"mappings":"AAAA;;GAEG;AAyBH,OAAO,EAAkB,YAAY,EAAE,MAAM,YAAY,CAAC;AAE1D;;GAEG;AACH,wBAAsB,mBAAmB,CACvC,IAAI,EAAE,OAAO,GACZ,OAAO,CAAC,YAAY,CAAC,CAmBvB;AAED;;GAEG;AACH,wBAAsB,sBAAsB,CAC1C,IAAI,EAAE,OAAO,GACZ,OAAO,CAAC,YAAY,CAAC,CAyBvB;AAED;;GAEG;AACH,wBAAsB,iBAAiB,CAAC,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC,YAAY,CAAC,CA2B5E;AAED;;GAEG;AACH,wBAAsB,gBAAgB,CAAC,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC,YAAY,CAAC,CA2B3E;AAED;;GAEG;AACH,wBAAsB,sBAAsB,CAC1C,IAAI,EAAE,OAAO,GACZ,OAAO,CAAC,YAAY,CAAC,CA2GvB;AAED;;GAEG;AACH,wBAAsB,oBAAoB,CACxC,IAAI,EAAE,OAAO,GACZ,OAAO,CAAC,YAAY,CAAC,CA+EvB"}
|