@atlassian-dc-mcp/bitbucket 0.10.2 → 0.11.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/CHANGELOG.md +11 -0
- package/build/__tests__/bitbucket-service.test.js +111 -0
- package/build/__tests__/bitbucket-service.test.js.map +1 -1
- package/build/bitbucket-service.d.ts +36 -1
- package/build/bitbucket-service.d.ts.map +1 -1
- package/build/bitbucket-service.js +61 -2
- package/build/bitbucket-service.js.map +1 -1
- package/build/index.js +10 -2
- package/build/index.js.map +1 -1
- package/package.json +3 -3
- package/src/__tests__/bitbucket-service.test.ts +220 -0
- package/src/bitbucket-service.ts +88 -2
- package/src/index.ts +23 -3
- package/tsconfig.tsbuildinfo +1 -1
package/build/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,eAAe,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAC9F,OAAO,MAAM,MAAM,QAAQ,CAAC;AAC5B,OAAO,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAEhF,6BAA6B;AAC7B,MAAM,CAAC,MAAM,EAAE,CAAC;AAEhB,MAAM,WAAW,GAAG,gBAAgB,CAAC,cAAc,EAAE,CAAC;AACtD,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;IAC3B,OAAO,CAAC,KAAK,CAAC,2CAA2C,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACnF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC;AAED,MAAM,gBAAgB,GAAG,IAAI,gBAAgB,CAC3C,OAAO,CAAC,GAAG,CAAC,cAAe,EAC3B,OAAO,CAAC,GAAG,CAAC,mBAAoB,EAChC,OAAO,CAAC,GAAG,CAAC,uBAAuB,CACpC,CAAC;AAEF,MAAM,MAAM,GAAG,eAAe,CAAC;IAC7B,IAAI,EAAE,yBAAyB;IAC/B,OAAO,EAAE,OAAO;CACjB,CAAC,CAAC;AAEH,MAAM,CAAC,IAAI,CACT,uBAAuB,EACvB,kCAAkC,EAClC,oBAAoB,CAAC,WAAW,EAChC,KAAK,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,EAAE;IAC3C,MAAM,MAAM,GAAG,MAAM,gBAAgB,CAAC,WAAW,CAAC,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;IAClF,OAAO,kBAAkB,CAAC,MAAM,CAAC,CAAC;AACpC,CAAC,CACF,CAAC;AAEF,MAAM,CAAC,IAAI,CACT,sBAAsB,EACtB,yCAAyC,EACzC,oBAAoB,CAAC,UAAU,EAC/B,KAAK,EAAE,EAAE,UAAU,EAAE,EAAE,EAAE;IACvB,MAAM,MAAM,GAAG,MAAM,gBAAgB,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC;IAC7D,OAAO,kBAAkB,CAAC,MAAM,CAAC,CAAC;AACpC,CAAC,CACF,CAAC;AAEF,MAAM,CAAC,IAAI,CACT,2BAA2B,EAC3B,0CAA0C,EAC1C,oBAAoB,CAAC,eAAe,EACpC,KAAK,EAAE,EAAE,UAAU,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,EAAE;IACrC,MAAM,MAAM,GAAG,MAAM,gBAAgB,CAAC,eAAe,CAAC,UAAU,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;IAChF,OAAO,kBAAkB,CAAC,MAAM,CAAC,CAAC;AACpC,CAAC,CACF,CAAC;AAEF,MAAM,CAAC,IAAI,CACT,yBAAyB,EACzB,qCAAqC,EACrC,oBAAoB,CAAC,aAAa,EAClC,KAAK,EAAE,EAAE,UAAU,EAAE,cAAc,EAAE,EAAE,EAAE;IACvC,MAAM,MAAM,GAAG,MAAM,gBAAgB,CAAC,aAAa,CAAC,UAAU,EAAE,cAAc,CAAC,CAAC;IAChF,OAAO,kBAAkB,CAAC,MAAM,CAAC,CAAC;AACpC,CAAC,CACF,CAAC;AAEF,MAAM,CAAC,IAAI,CACT,sBAAsB,EACtB,wCAAwC,EACxC,oBAAoB,CAAC,UAAU,EAC/B,KAAK,EAAE,EAAE,UAAU,EAAE,cAAc,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,EAAE;IAClE,MAAM,MAAM,GAAG,MAAM,gBAAgB,CAAC,UAAU,CAAC,UAAU,EAAE,cAAc,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;IACxG,OAAO,kBAAkB,CAAC,MAAM,CAAC,CAAC;AACpC,CAAC,CACF,CAAC;AAEF,MAAM,CAAC,IAAI,CACT,2BAA2B,EAC3B,8CAA8C,EAC9C,oBAAoB,CAAC,eAAe,EACpC,KAAK,EAAE,EAAE,UAAU,EAAE,cAAc,EAAE,cAAc,EAAE,EAAE,EAAE,cAAc,EAAE,KAAK,EAAE,UAAU,EAAE,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,EAAE;IACrI,MAAM,MAAM,GAAG,MAAM,gBAAgB,CAAC,eAAe,CAAC,UAAU,EAAE,cAAc,EAAE,cAAc,EAAE,EAAE,EAAE,cAAc,EAAE,KAAK,EAAE,UAAU,EAAE,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;IAChL,OAAO,kBAAkB,CAAC,MAAM,CAAC,CAAC;AACpC,CAAC,CACF,CAAC;AAEF,MAAM,CAAC,IAAI,CACT,0BAA0B,EAC1B,mKAAmK,EACnK,oBAAoB,CAAC,cAAc,EACnC,KAAK,EAAE,EAAE,UAAU,EAAE,cAAc,EAAE,aAAa,EAAE,EAAE,EAAE;IACtD,MAAM,MAAM,GAAG,MAAM,gBAAgB,CAAC,cAAc,CAAC,UAAU,EAAE,cAAc,EAAE,aAAa,CAAC,CAAC;IAChG,OAAO,kBAAkB,CAAC,MAAM,CAAC,CAAC;AACpC,CAAC,CACF,CAAC;AAEF,MAAM,CAAC,IAAI,CACT,mCAAmC,EACnC,6EAA6E,EAC7E,oBAAoB,CAAC,sBAAsB,EAC3C,KAAK,EAAE,EAAE,UAAU,EAAE,cAAc,EAAE,aAAa,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,EAAE;IACpE,MAAM,MAAM,GAAG,MAAM,gBAAgB,CAAC,gCAAgC,CAAC,UAAU,EAAE,cAAc,EAAE,aAAa,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;IAChI,OAAO,kBAAkB,CAAC,MAAM,CAAC,CAAC;AACpC,CAAC,CACF,CAAC;AAEF,MAAM,CAAC,IAAI,CACT,iCAAiC,EACjC,8CAA8C,EAC9C,oBAAoB,CAAC,qBAAqB,EAC1C,KAAK,EAAE,EAAE,UAAU,EAAE,cAAc,EAAE,aAAa,EAAE,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE,YAAY,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,EAAE;IACjH,MAAM,MAAM,GAAG,MAAM,gBAAgB,CAAC,qBAAqB,CAAC,UAAU,EAAE,cAAc,EAAE,aAAa,EAAE,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE,YAAY,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;IAClK,OAAO,kBAAkB,CAAC,MAAM,CAAC,CAAC;AACpC,CAAC,CACF,CAAC;AAEF,MAAM,CAAC,IAAI,CACT,mBAAmB,EACnB,+OAA+O,EAC/O,oBAAoB,CAAC,OAAO,EAC5B,KAAK,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE;IAC7B,MAAM,MAAM,GAAG,MAAM,gBAAgB,CAAC,OAAO,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IAChE,OAAO,kBAAkB,CAAC,MAAM,CAAC,CAAC;AACpC,CAAC,CACF,CAAC;AAEF,MAAM,CAAC,IAAI,CACT,kCAAkC,EAClC,kVAAkV,EAClV,oBAAoB,CAAC,sBAAsB,EAC3C,KAAK,EAAE,EAAE,UAAU,EAAE,cAAc,EAAE,aAAa,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,EAAE,EAAE;IACzG,MAAM,MAAM,GAAG,MAAM,gBAAgB,CAAC,sBAAsB,CAAC,UAAU,EAAE,cAAc,EAAE,aAAa,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC;IAC3J,OAAO,kBAAkB,CAAC,MAAM,CAAC,CAAC;AACpC,CAAC,CACF,CAAC;AAEF,MAAM,CAAC,IAAI,CACT,mCAAmC,EACnC,ocAAoc,EACpc,oBAAoB,CAAC,uBAAuB,EAC5C,KAAK,EAAE,EAAE,UAAU,EAAE,cAAc,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,EAAE,kBAAkB,EAAE,EAAE,EAAE;IAC5F,MAAM,MAAM,GAAG,MAAM,gBAAgB,CAAC,uBAAuB,CAAC,UAAU,EAAE,cAAc,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,EAAE,kBAAkB,CAAC,CAAC;IAC/I,OAAO,kBAAkB,CAAC,MAAM,CAAC,CAAC;AACpC,CAAC,CACF,CAAC;AAGF,MAAM,CAAC,IAAI,CACT,8BAA8B,EAC9B,qMAAqM,EACrM,oBAAoB,CAAC,kBAAkB,EACvC,KAAK,EAAE,EAAE,UAAU,EAAE,cAAc,EAAE,aAAa,EAAE,IAAI,EAAE,YAAY,EAAE,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,UAAU,EAAE,EAAE,EAAE;IAC3H,MAAM,MAAM,GAAG,MAAM,gBAAgB,CAAC,kBAAkB,CAAC,UAAU,EAAE,cAAc,EAAE,aAAa,EAAE,IAAI,EAAE,YAAY,EAAE,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,UAAU,CAAC,CAAC;IACzK,OAAO,kBAAkB,CAAC,MAAM,CAAC,CAAC;AACpC,CAAC,CACF,CAAC;AAEF,MAAM,CAAC,IAAI,CACT,6BAA6B,EAC7B,sPAAsP,EACtP,oBAAoB,CAAC,iBAAiB,EACtC,KAAK,EAAE,EAAE,UAAU,EAAE,cAAc,EAAE,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,OAAO,EAAE,SAAS,EAAE,EAAE,EAAE;IAC1F,MAAM,MAAM,GAAG,MAAM,gBAAgB,CAAC,iBAAiB,CAAC,UAAU,EAAE,cAAc,EAAE,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,OAAO,EAAE,SAAS,CAAC,CAAC;IACvI,OAAO,kBAAkB,CAAC,MAAM,CAAC,CAAC;AACpC,CAAC,CACF,CAAC;AAEF,MAAM,CAAC,IAAI,CACT,6BAA6B,EAC7B,oXAAoX,EACpX,oBAAoB,CAAC,iBAAiB,EACtC,KAAK,EAAE,EAAE,UAAU,EAAE,cAAc,EAAE,aAAa,EAAE,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,EAAE,EAAE;IAC9F,MAAM,MAAM,GAAG,MAAM,gBAAgB,CAAC,iBAAiB,CAAC,UAAU,EAAE,cAAc,EAAE,aAAa,EAAE,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE,SAAS,CAAC,CAAC;IAC3I,OAAO,kBAAkB,CAAC,MAAM,CAAC,CAAC;AACpC,CAAC,CACF,CAAC;AAEF,MAAM,CAAC,IAAI,CACT,gCAAgC,EAChC,oNAAoN,EACpN,oBAAoB,CAAC,oBAAoB,EACzC,KAAK,EAAE,EAAE,UAAU,EAAE,cAAc,EAAE,WAAW,EAAE,WAAW,EAAE,YAAY,EAAE,YAAY,EAAE,EAAE,EAAE;IAC7F,MAAM,MAAM,GAAG,MAAM,gBAAgB,CAAC,oBAAoB,CAAC,UAAU,EAAE,cAAc,EAAE,WAAW,EAAE,WAAW,EAAE,YAAY,EAAE,YAAY,CAAC,CAAC;IAC7I,OAAO,kBAAkB,CAAC,MAAM,CAAC,CAAC;AACpC,CAAC,CACF,CAAC;AAEF,MAAM,CAAC,IAAI,CACT,gCAAgC,EAChC,iJAAiJ,EACjJ,oBAAoB,CAAC,oBAAoB,EACzC,KAAK,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,EAAE;IACzB,MAAM,MAAM,GAAG,MAAM,gBAAgB,CAAC,oBAAoB,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;IACzE,OAAO,kBAAkB,CAAC,MAAM,CAAC,CAAC;AACpC,CAAC,CACF,CAAC;AAEF,MAAM,aAAa,CAAC,MAAM,CAAC,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@atlassian-dc-mcp/bitbucket",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.11.0",
|
|
4
4
|
"main": "build/index.js",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": "./bin/run.js",
|
|
@@ -14,7 +14,7 @@
|
|
|
14
14
|
"test": "jest"
|
|
15
15
|
},
|
|
16
16
|
"dependencies": {
|
|
17
|
-
"@atlassian-dc-mcp/common": "^0.
|
|
17
|
+
"@atlassian-dc-mcp/common": "^0.11.0",
|
|
18
18
|
"@modelcontextprotocol/sdk": "^1.27.1",
|
|
19
19
|
"dotenv": "^16.4.7",
|
|
20
20
|
"node-fetch": "^3.3.2",
|
|
@@ -32,5 +32,5 @@
|
|
|
32
32
|
"publishConfig": {
|
|
33
33
|
"access": "public"
|
|
34
34
|
},
|
|
35
|
-
"gitHead": "
|
|
35
|
+
"gitHead": "d4c36b43da61b3395c89def4350ea99ea129d8b4"
|
|
36
36
|
}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { BitbucketService } from '../bitbucket-service.js';
|
|
2
2
|
import { PullRequestsService } from '../bitbucket-client/index.js';
|
|
3
|
+
import { request as mockRequest } from '../bitbucket-client/core/request.js';
|
|
3
4
|
|
|
4
5
|
// Mock the request function
|
|
5
6
|
jest.mock('../bitbucket-client/core/request.js', () => ({
|
|
@@ -14,6 +15,7 @@ jest.mock('../bitbucket-client/index.js', () => ({
|
|
|
14
15
|
streamChanges1: jest.fn(),
|
|
15
16
|
create: jest.fn(),
|
|
16
17
|
update: jest.fn(),
|
|
18
|
+
updateStatus: jest.fn(),
|
|
17
19
|
getPage: jest.fn(),
|
|
18
20
|
getReviewers: jest.fn(),
|
|
19
21
|
get3: jest.fn()
|
|
@@ -1649,4 +1651,222 @@ describe('BitbucketService', () => {
|
|
|
1649
1651
|
expect(missingVars).toEqual([]);
|
|
1650
1652
|
});
|
|
1651
1653
|
});
|
|
1654
|
+
|
|
1655
|
+
describe('postPullRequestComment - pending flag', () => {
|
|
1656
|
+
it('should include state: PENDING in the request body when pending is true', async () => {
|
|
1657
|
+
const mockComment = { id: 99, text: 'Draft comment', author: { displayName: 'Test User' } };
|
|
1658
|
+
(PullRequestsService.createComment2 as jest.Mock).mockResolvedValue(mockComment);
|
|
1659
|
+
|
|
1660
|
+
const result = await bitbucketService.postPullRequestComment(
|
|
1661
|
+
mockProjectKey,
|
|
1662
|
+
mockRepositorySlug,
|
|
1663
|
+
mockPullRequestId,
|
|
1664
|
+
'Draft comment',
|
|
1665
|
+
undefined, // parentId
|
|
1666
|
+
undefined, // filePath
|
|
1667
|
+
undefined, // line
|
|
1668
|
+
undefined, // lineType
|
|
1669
|
+
true // pending
|
|
1670
|
+
);
|
|
1671
|
+
|
|
1672
|
+
expect(result.success).toBe(true);
|
|
1673
|
+
expect(PullRequestsService.createComment2).toHaveBeenCalledWith(
|
|
1674
|
+
mockProjectKey,
|
|
1675
|
+
mockPullRequestId,
|
|
1676
|
+
mockRepositorySlug,
|
|
1677
|
+
{ text: 'Draft comment', state: 'PENDING' }
|
|
1678
|
+
);
|
|
1679
|
+
});
|
|
1680
|
+
|
|
1681
|
+
it('should NOT include pending in the request body when pending is false or omitted', async () => {
|
|
1682
|
+
const mockComment = { id: 100, text: 'Normal comment', author: { displayName: 'Test User' } };
|
|
1683
|
+
(PullRequestsService.createComment2 as jest.Mock).mockResolvedValue(mockComment);
|
|
1684
|
+
|
|
1685
|
+
await bitbucketService.postPullRequestComment(
|
|
1686
|
+
mockProjectKey,
|
|
1687
|
+
mockRepositorySlug,
|
|
1688
|
+
mockPullRequestId,
|
|
1689
|
+
'Normal comment'
|
|
1690
|
+
);
|
|
1691
|
+
|
|
1692
|
+
expect(PullRequestsService.createComment2).toHaveBeenCalledWith(
|
|
1693
|
+
mockProjectKey,
|
|
1694
|
+
mockPullRequestId,
|
|
1695
|
+
mockRepositorySlug,
|
|
1696
|
+
{ text: 'Normal comment' } // no pending field
|
|
1697
|
+
);
|
|
1698
|
+
});
|
|
1699
|
+
|
|
1700
|
+
it('should support state: PENDING combined with a file anchor', async () => {
|
|
1701
|
+
const mockComment = { id: 101, text: 'Pending file comment', author: { displayName: 'Test User' } };
|
|
1702
|
+
(PullRequestsService.createComment2 as jest.Mock).mockResolvedValue(mockComment);
|
|
1703
|
+
|
|
1704
|
+
await bitbucketService.postPullRequestComment(
|
|
1705
|
+
mockProjectKey,
|
|
1706
|
+
mockRepositorySlug,
|
|
1707
|
+
mockPullRequestId,
|
|
1708
|
+
'Pending file comment',
|
|
1709
|
+
undefined, // parentId
|
|
1710
|
+
'src/index.ts', // filePath
|
|
1711
|
+
10, // line
|
|
1712
|
+
'ADDED', // lineType
|
|
1713
|
+
true // pending
|
|
1714
|
+
);
|
|
1715
|
+
|
|
1716
|
+
expect(PullRequestsService.createComment2).toHaveBeenCalledWith(
|
|
1717
|
+
mockProjectKey,
|
|
1718
|
+
mockPullRequestId,
|
|
1719
|
+
mockRepositorySlug,
|
|
1720
|
+
{
|
|
1721
|
+
text: 'Pending file comment',
|
|
1722
|
+
state: 'PENDING',
|
|
1723
|
+
anchor: {
|
|
1724
|
+
path: 'src/index.ts',
|
|
1725
|
+
diffType: 'EFFECTIVE',
|
|
1726
|
+
line: 10,
|
|
1727
|
+
lineType: 'ADDED',
|
|
1728
|
+
fileType: 'TO'
|
|
1729
|
+
}
|
|
1730
|
+
}
|
|
1731
|
+
);
|
|
1732
|
+
});
|
|
1733
|
+
});
|
|
1734
|
+
|
|
1735
|
+
describe('submitPullRequestReview', () => {
|
|
1736
|
+
const mockUserSlug = 'test-user';
|
|
1737
|
+
|
|
1738
|
+
it('should submit a NEEDS_WORK review and call updateStatus with correct args', async () => {
|
|
1739
|
+
const mockParticipant = {
|
|
1740
|
+
user: { name: mockUserSlug },
|
|
1741
|
+
role: 'REVIEWER',
|
|
1742
|
+
status: 'NEEDS_WORK'
|
|
1743
|
+
};
|
|
1744
|
+
(PullRequestsService.updateStatus as jest.Mock).mockResolvedValue(mockParticipant);
|
|
1745
|
+
|
|
1746
|
+
const result = await bitbucketService.submitPullRequestReview(
|
|
1747
|
+
mockProjectKey,
|
|
1748
|
+
mockRepositorySlug,
|
|
1749
|
+
mockPullRequestId,
|
|
1750
|
+
mockUserSlug,
|
|
1751
|
+
'NEEDS_WORK'
|
|
1752
|
+
);
|
|
1753
|
+
|
|
1754
|
+
expect(result.success).toBe(true);
|
|
1755
|
+
expect(result.data).toBe(mockParticipant);
|
|
1756
|
+
expect(PullRequestsService.updateStatus).toHaveBeenCalledWith(
|
|
1757
|
+
mockProjectKey,
|
|
1758
|
+
mockUserSlug,
|
|
1759
|
+
mockPullRequestId,
|
|
1760
|
+
mockRepositorySlug,
|
|
1761
|
+
{ status: 'NEEDS_WORK' }
|
|
1762
|
+
);
|
|
1763
|
+
});
|
|
1764
|
+
|
|
1765
|
+
it('should submit an APPROVED review', async () => {
|
|
1766
|
+
const mockParticipant = { user: { name: mockUserSlug }, status: 'APPROVED' };
|
|
1767
|
+
(PullRequestsService.updateStatus as jest.Mock).mockResolvedValue(mockParticipant);
|
|
1768
|
+
|
|
1769
|
+
const result = await bitbucketService.submitPullRequestReview(
|
|
1770
|
+
mockProjectKey,
|
|
1771
|
+
mockRepositorySlug,
|
|
1772
|
+
mockPullRequestId,
|
|
1773
|
+
mockUserSlug,
|
|
1774
|
+
'APPROVED'
|
|
1775
|
+
);
|
|
1776
|
+
|
|
1777
|
+
expect(result.success).toBe(true);
|
|
1778
|
+
expect(PullRequestsService.updateStatus).toHaveBeenCalledWith(
|
|
1779
|
+
mockProjectKey,
|
|
1780
|
+
mockUserSlug,
|
|
1781
|
+
mockPullRequestId,
|
|
1782
|
+
mockRepositorySlug,
|
|
1783
|
+
{ status: 'APPROVED' }
|
|
1784
|
+
);
|
|
1785
|
+
});
|
|
1786
|
+
|
|
1787
|
+
it('should include lastReviewedCommit when provided', async () => {
|
|
1788
|
+
const mockParticipant = { user: { name: mockUserSlug }, status: 'NEEDS_WORK' };
|
|
1789
|
+
(PullRequestsService.updateStatus as jest.Mock).mockResolvedValue(mockParticipant);
|
|
1790
|
+
|
|
1791
|
+
await bitbucketService.submitPullRequestReview(
|
|
1792
|
+
mockProjectKey,
|
|
1793
|
+
mockRepositorySlug,
|
|
1794
|
+
mockPullRequestId,
|
|
1795
|
+
mockUserSlug,
|
|
1796
|
+
'NEEDS_WORK',
|
|
1797
|
+
'abc123def456'
|
|
1798
|
+
);
|
|
1799
|
+
|
|
1800
|
+
expect(PullRequestsService.updateStatus).toHaveBeenCalledWith(
|
|
1801
|
+
mockProjectKey,
|
|
1802
|
+
mockUserSlug,
|
|
1803
|
+
mockPullRequestId,
|
|
1804
|
+
mockRepositorySlug,
|
|
1805
|
+
{ status: 'NEEDS_WORK', lastReviewedCommit: 'abc123def456' }
|
|
1806
|
+
);
|
|
1807
|
+
});
|
|
1808
|
+
|
|
1809
|
+
it('should handle API errors gracefully', async () => {
|
|
1810
|
+
const mockError = new Error('Forbidden');
|
|
1811
|
+
(PullRequestsService.updateStatus as jest.Mock).mockRejectedValue(mockError);
|
|
1812
|
+
|
|
1813
|
+
const result = await bitbucketService.submitPullRequestReview(
|
|
1814
|
+
mockProjectKey,
|
|
1815
|
+
mockRepositorySlug,
|
|
1816
|
+
mockPullRequestId,
|
|
1817
|
+
mockUserSlug,
|
|
1818
|
+
'APPROVED'
|
|
1819
|
+
);
|
|
1820
|
+
|
|
1821
|
+
expect(result.success).toBe(false);
|
|
1822
|
+
expect(result.error).toBe('Forbidden');
|
|
1823
|
+
});
|
|
1824
|
+
});
|
|
1825
|
+
|
|
1826
|
+
describe('getUser', () => {
|
|
1827
|
+
it('should fetch a user by exact slug', async () => {
|
|
1828
|
+
const mockUser = { slug: 'jsmith', displayName: 'John Smith', emailAddress: 'jsmith@example.com' };
|
|
1829
|
+
(mockRequest as jest.Mock).mockResolvedValue(mockUser);
|
|
1830
|
+
|
|
1831
|
+
const result = await bitbucketService.getUser('jsmith', undefined);
|
|
1832
|
+
|
|
1833
|
+
expect(result.success).toBe(true);
|
|
1834
|
+
expect(result.data).toEqual(mockUser);
|
|
1835
|
+
expect(mockRequest).toHaveBeenCalledWith(
|
|
1836
|
+
expect.anything(),
|
|
1837
|
+
expect.objectContaining({
|
|
1838
|
+
method: 'GET',
|
|
1839
|
+
url: '/api/latest/users/{userSlug}',
|
|
1840
|
+
path: { userSlug: 'jsmith' }
|
|
1841
|
+
})
|
|
1842
|
+
);
|
|
1843
|
+
});
|
|
1844
|
+
|
|
1845
|
+
it('should search for users by filter string', async () => {
|
|
1846
|
+
const mockUsers = { values: [{ slug: 'jsmith', displayName: 'John Smith' }], size: 1, isLastPage: true };
|
|
1847
|
+
(mockRequest as jest.Mock).mockResolvedValue(mockUsers);
|
|
1848
|
+
|
|
1849
|
+
const result = await bitbucketService.getUser(undefined, 'John');
|
|
1850
|
+
|
|
1851
|
+
expect(result.success).toBe(true);
|
|
1852
|
+
expect(result.data).toEqual(mockUsers);
|
|
1853
|
+
expect(mockRequest).toHaveBeenCalledWith(
|
|
1854
|
+
expect.anything(),
|
|
1855
|
+
expect.objectContaining({
|
|
1856
|
+
method: 'GET',
|
|
1857
|
+
url: '/api/latest/users',
|
|
1858
|
+
query: { filter: 'John' }
|
|
1859
|
+
})
|
|
1860
|
+
);
|
|
1861
|
+
});
|
|
1862
|
+
|
|
1863
|
+
it('should handle API errors gracefully', async () => {
|
|
1864
|
+
(mockRequest as jest.Mock).mockRejectedValue(new Error('Not Found'));
|
|
1865
|
+
|
|
1866
|
+
const result = await bitbucketService.getUser('nonexistent', undefined);
|
|
1867
|
+
|
|
1868
|
+
expect(result.success).toBe(false);
|
|
1869
|
+
expect(result.error).toBe('Not Found');
|
|
1870
|
+
});
|
|
1871
|
+
});
|
|
1652
1872
|
});
|
package/src/bitbucket-service.ts
CHANGED
|
@@ -256,6 +256,9 @@ export class BitbucketService {
|
|
|
256
256
|
* @param filePath Optional file path for file-specific comments
|
|
257
257
|
* @param line Optional line number for line-specific comments
|
|
258
258
|
* @param lineType Optional line type ('ADDED', 'REMOVED', 'CONTEXT') for line comments
|
|
259
|
+
* @param pending Optional flag to create a pending (draft) comment, not visible to others until a review is submitted.
|
|
260
|
+
* Only works when filePath is provided (file-level or inline comments).
|
|
261
|
+
* Top-level PR comments (no filePath) are always posted live regardless of this flag.
|
|
259
262
|
* @returns Promise with created comment data
|
|
260
263
|
*/
|
|
261
264
|
async postPullRequestComment(
|
|
@@ -266,12 +269,19 @@ export class BitbucketService {
|
|
|
266
269
|
parentId?: number,
|
|
267
270
|
filePath?: string,
|
|
268
271
|
line?: number,
|
|
269
|
-
lineType?: 'ADDED' | 'REMOVED' | 'CONTEXT'
|
|
272
|
+
lineType?: 'ADDED' | 'REMOVED' | 'CONTEXT',
|
|
273
|
+
pending?: boolean
|
|
270
274
|
) {
|
|
271
275
|
const comment: any = {
|
|
272
276
|
text
|
|
273
277
|
};
|
|
274
278
|
|
|
279
|
+
// Mark comment as pending (draft) — not visible to others until review is submitted
|
|
280
|
+
// Note: Bitbucket DC uses state:'PENDING' not pending:true
|
|
281
|
+
if (pending) {
|
|
282
|
+
comment.state = 'PENDING';
|
|
283
|
+
}
|
|
284
|
+
|
|
275
285
|
// Add parent reference for replies
|
|
276
286
|
if (parentId) {
|
|
277
287
|
comment.parent = { id: parentId };
|
|
@@ -303,6 +313,69 @@ export class BitbucketService {
|
|
|
303
313
|
);
|
|
304
314
|
}
|
|
305
315
|
|
|
316
|
+
/**
|
|
317
|
+
* Get a user by slug, or search for users by name/email filter
|
|
318
|
+
* @param userSlug Optional exact slug to look up a specific user
|
|
319
|
+
* @param filter Optional search string to find users by name or email
|
|
320
|
+
* @returns Promise with user data
|
|
321
|
+
*/
|
|
322
|
+
async getUser(userSlug?: string, filter?: string) {
|
|
323
|
+
if (userSlug) {
|
|
324
|
+
return handleApiOperation(
|
|
325
|
+
() => __request(OpenAPI, {
|
|
326
|
+
method: 'GET',
|
|
327
|
+
url: '/api/latest/users/{userSlug}',
|
|
328
|
+
path: { userSlug },
|
|
329
|
+
}),
|
|
330
|
+
'Error fetching user'
|
|
331
|
+
);
|
|
332
|
+
}
|
|
333
|
+
return handleApiOperation(
|
|
334
|
+
() => __request(OpenAPI, {
|
|
335
|
+
method: 'GET',
|
|
336
|
+
url: '/api/latest/users',
|
|
337
|
+
query: { filter },
|
|
338
|
+
}),
|
|
339
|
+
'Error fetching users'
|
|
340
|
+
);
|
|
341
|
+
}
|
|
342
|
+
|
|
343
|
+
/**
|
|
344
|
+
* Submit a pull request review, publishing all pending (draft) comments and updating the reviewer's status.
|
|
345
|
+
* This is the equivalent of clicking "Submit Review" in the Bitbucket UI.
|
|
346
|
+
* @param projectKey The project key
|
|
347
|
+
* @param repositorySlug The repository slug
|
|
348
|
+
* @param pullRequestId The pull request ID
|
|
349
|
+
* @param userSlug The username/slug of the reviewer submitting the review (the PAT token owner).
|
|
350
|
+
* @param status The review verdict: 'APPROVED', 'NEEDS_WORK', or 'UNAPPROVED'
|
|
351
|
+
* @param lastReviewedCommit Optional last reviewed commit hash (for tracking review progress)
|
|
352
|
+
* @returns Promise with updated participant data
|
|
353
|
+
*/
|
|
354
|
+
async submitPullRequestReview(
|
|
355
|
+
projectKey: string,
|
|
356
|
+
repositorySlug: string,
|
|
357
|
+
pullRequestId: string,
|
|
358
|
+
userSlug: string,
|
|
359
|
+
status: 'APPROVED' | 'NEEDS_WORK' | 'UNAPPROVED',
|
|
360
|
+
lastReviewedCommit?: string
|
|
361
|
+
) {
|
|
362
|
+
const requestBody: any = {
|
|
363
|
+
status,
|
|
364
|
+
...(lastReviewedCommit ? { lastReviewedCommit } : {})
|
|
365
|
+
};
|
|
366
|
+
|
|
367
|
+
return handleApiOperation(
|
|
368
|
+
() => PullRequestsService.updateStatus(
|
|
369
|
+
projectKey,
|
|
370
|
+
userSlug,
|
|
371
|
+
pullRequestId,
|
|
372
|
+
repositorySlug,
|
|
373
|
+
requestBody
|
|
374
|
+
),
|
|
375
|
+
'Error submitting pull request review'
|
|
376
|
+
);
|
|
377
|
+
}
|
|
378
|
+
|
|
306
379
|
|
|
307
380
|
/**
|
|
308
381
|
* Get text diff for a specific file in a pull request
|
|
@@ -615,7 +688,20 @@ export const bitbucketToolSchemas = {
|
|
|
615
688
|
parentId: z.number().optional().describe("Parent comment ID for replies"),
|
|
616
689
|
filePath: z.string().optional().describe("File path for file-specific comments"),
|
|
617
690
|
line: z.number().optional().describe("Line number for line-specific comments"),
|
|
618
|
-
lineType: z.enum(['ADDED', 'REMOVED', 'CONTEXT']).optional().describe("Line type for line comments")
|
|
691
|
+
lineType: z.enum(['ADDED', 'REMOVED', 'CONTEXT']).optional().describe("Line type for line comments"),
|
|
692
|
+
pending: z.boolean().optional().describe("If true, creates a pending (draft) comment not visible to others until the review is submitted via bitbucket_submitPullRequestReview. Only works when filePath is provided — top-level PR comments (no filePath) are always posted live.")
|
|
693
|
+
},
|
|
694
|
+
getUser: {
|
|
695
|
+
userSlug: z.string().optional().describe("Exact slug of the user to look up (e.g. 'tdepole'). Use this to confirm a known slug or fetch a user's details."),
|
|
696
|
+
filter: z.string().optional().describe("Search string to find users by name or email. Use this to discover a user's slug when it is not known.")
|
|
697
|
+
},
|
|
698
|
+
submitPullRequestReview: {
|
|
699
|
+
projectKey: z.string().describe("The project key"),
|
|
700
|
+
repositorySlug: z.string().describe("The repository slug"),
|
|
701
|
+
pullRequestId: z.string().describe("The pull request ID"),
|
|
702
|
+
userSlug: z.string().describe("The username/slug of the PAT token owner — the same user whose credentials are in BITBUCKET_API_TOKEN. Resolution order: (1) author.slug from any comment posted this session, (2) reviewers/participants array from getPullRequest, (3) bitbucket_getUser with a name/email filter."),
|
|
703
|
+
status: z.enum(['APPROVED', 'NEEDS_WORK', 'UNAPPROVED']).describe("The review verdict: APPROVED, NEEDS_WORK, or UNAPPROVED"),
|
|
704
|
+
lastReviewedCommit: z.string().optional().describe("Optional hash of the last commit reviewed, used to track review progress")
|
|
619
705
|
},
|
|
620
706
|
getPullRequestDiff: {
|
|
621
707
|
projectKey: z.string().describe("The project key"),
|
package/src/index.ts
CHANGED
|
@@ -112,12 +112,32 @@ server.tool(
|
|
|
112
112
|
}
|
|
113
113
|
);
|
|
114
114
|
|
|
115
|
+
server.tool(
|
|
116
|
+
"bitbucket_getUser",
|
|
117
|
+
"Get a Bitbucket user by their slug, or search for users by name/email to discover their slug. Use this to resolve userSlug for bitbucket_submitPullRequestReview when it is not already known from a comment response or PR participant list.",
|
|
118
|
+
bitbucketToolSchemas.getUser,
|
|
119
|
+
async ({ userSlug, filter }) => {
|
|
120
|
+
const result = await bitbucketService.getUser(userSlug, filter);
|
|
121
|
+
return formatToolResponse(result);
|
|
122
|
+
}
|
|
123
|
+
);
|
|
124
|
+
|
|
115
125
|
server.tool(
|
|
116
126
|
"bitbucket_postPullRequestComment",
|
|
117
|
-
"Post a comment to a Bitbucket pull request",
|
|
127
|
+
"Post a comment to a Bitbucket pull request. Use pending: true to create a draft comment that is only visible to you until you call bitbucket_submitPullRequestReview. NOTE: pending only works when filePath is provided (file-level or inline comments). True top-level PR comments (no filePath) are always posted live and cannot be drafted.",
|
|
118
128
|
bitbucketToolSchemas.postPullRequestComment,
|
|
119
|
-
async ({ projectKey, repositorySlug, pullRequestId, text, parentId, filePath, line, lineType }) => {
|
|
120
|
-
const result = await bitbucketService.postPullRequestComment(projectKey, repositorySlug, pullRequestId, text, parentId, filePath, line, lineType);
|
|
129
|
+
async ({ projectKey, repositorySlug, pullRequestId, text, parentId, filePath, line, lineType, pending }) => {
|
|
130
|
+
const result = await bitbucketService.postPullRequestComment(projectKey, repositorySlug, pullRequestId, text, parentId, filePath, line, lineType, pending);
|
|
131
|
+
return formatToolResponse(result);
|
|
132
|
+
}
|
|
133
|
+
);
|
|
134
|
+
|
|
135
|
+
server.tool(
|
|
136
|
+
"bitbucket_submitPullRequestReview",
|
|
137
|
+
"Submit a pull request review, publishing all pending (draft) comments and setting the reviewer's verdict. This is equivalent to clicking 'Submit Review' in the Bitbucket UI. Use after posting comments with pending: true. To resolve userSlug: (1) check author.slug in any comment you posted this session, (2) check the reviewers/participants array from bitbucket_getPullRequest, or (3) call bitbucket_getUser with a name/email filter as a last resort.",
|
|
138
|
+
bitbucketToolSchemas.submitPullRequestReview,
|
|
139
|
+
async ({ projectKey, repositorySlug, pullRequestId, userSlug, status, lastReviewedCommit }) => {
|
|
140
|
+
const result = await bitbucketService.submitPullRequestReview(projectKey, repositorySlug, pullRequestId, userSlug, status, lastReviewedCommit);
|
|
121
141
|
return formatToolResponse(result);
|
|
122
142
|
}
|
|
123
143
|
);
|