@atlassian-dc-mcp/bitbucket 0.34.0 → 0.36.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 (64) hide show
  1. package/CHANGELOG.md +20 -0
  2. package/README.md +55 -2
  3. package/build/__tests__/bitbucket-service.test.js +41 -2
  4. package/build/__tests__/bitbucket-service.test.js.map +1 -1
  5. package/build/__tests__/config.test.js +2 -1
  6. package/build/__tests__/config.test.js.map +1 -1
  7. package/build/__tests__/pr-builds.test.d.ts +2 -0
  8. package/build/__tests__/pr-builds.test.d.ts.map +1 -0
  9. package/build/__tests__/pr-builds.test.js +74 -0
  10. package/build/__tests__/pr-builds.test.js.map +1 -0
  11. package/build/__tests__/pr-merge.test.js +5 -4
  12. package/build/__tests__/pr-merge.test.js.map +1 -1
  13. package/build/__tests__/pr-state.test.d.ts +2 -0
  14. package/build/__tests__/pr-state.test.d.ts.map +1 -0
  15. package/build/__tests__/pr-state.test.js +118 -0
  16. package/build/__tests__/pr-state.test.js.map +1 -0
  17. package/build/__tests__/repo-gateway.test.d.ts +2 -0
  18. package/build/__tests__/repo-gateway.test.d.ts.map +1 -0
  19. package/build/__tests__/{merge-gateway.test.js → repo-gateway.test.js} +70 -10
  20. package/build/__tests__/repo-gateway.test.js.map +1 -0
  21. package/build/bitbucket-service.d.ts +44 -0
  22. package/build/bitbucket-service.d.ts.map +1 -1
  23. package/build/bitbucket-service.js +59 -0
  24. package/build/bitbucket-service.js.map +1 -1
  25. package/build/index.js +33 -1
  26. package/build/index.js.map +1 -1
  27. package/build/pr-builds.d.ts +36 -0
  28. package/build/pr-builds.d.ts.map +1 -0
  29. package/build/pr-builds.js +40 -0
  30. package/build/pr-builds.js.map +1 -0
  31. package/build/pr-merge.d.ts +2 -2
  32. package/build/pr-merge.d.ts.map +1 -1
  33. package/build/pr-merge.js +2 -2
  34. package/build/pr-merge.js.map +1 -1
  35. package/build/pr-state.d.ts +33 -0
  36. package/build/pr-state.d.ts.map +1 -0
  37. package/build/pr-state.js +37 -0
  38. package/build/pr-state.js.map +1 -0
  39. package/build/repo-gateway.d.ts +57 -0
  40. package/build/repo-gateway.d.ts.map +1 -0
  41. package/build/repo-gateway.js +122 -0
  42. package/build/repo-gateway.js.map +1 -0
  43. package/package.json +3 -3
  44. package/src/__tests__/bitbucket-service.test.ts +50 -2
  45. package/src/__tests__/config.test.ts +2 -1
  46. package/src/__tests__/pr-builds.test.ts +93 -0
  47. package/src/__tests__/pr-merge.test.ts +5 -5
  48. package/src/__tests__/pr-state.test.ts +150 -0
  49. package/src/__tests__/{merge-gateway.test.ts → repo-gateway.test.ts} +83 -11
  50. package/src/bitbucket-service.ts +67 -0
  51. package/src/index.ts +52 -1
  52. package/src/pr-builds.ts +74 -0
  53. package/src/pr-merge.ts +3 -3
  54. package/src/pr-state.ts +68 -0
  55. package/src/repo-gateway.ts +183 -0
  56. package/tsconfig.tsbuildinfo +1 -1
  57. package/build/__tests__/merge-gateway.test.d.ts +0 -2
  58. package/build/__tests__/merge-gateway.test.d.ts.map +0 -1
  59. package/build/__tests__/merge-gateway.test.js.map +0 -1
  60. package/build/merge-gateway.d.ts +0 -34
  61. package/build/merge-gateway.d.ts.map +0 -1
  62. package/build/merge-gateway.js +0 -86
  63. package/build/merge-gateway.js.map +0 -1
  64. package/src/merge-gateway.ts +0 -132
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=merge-gateway.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"merge-gateway.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/merge-gateway.test.ts"],"names":[],"mappings":""}
@@ -1 +0,0 @@
1
- {"version":3,"file":"merge-gateway.test.js","sourceRoot":"","sources":["../../src/__tests__/merge-gateway.test.ts"],"names":[],"mappings":"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"}
@@ -1,34 +0,0 @@
1
- /**
2
- * Operator-controlled gate for merging pull requests.
3
- *
4
- * A merge writes to a shared branch and cannot be undone through the API, so it is
5
- * disabled by default: `bitbucket_mergePullRequest` is not even registered unless the
6
- * operator enables it and names the repositories it may merge in. The allowed scope is
7
- * read from the environment once at startup, so the model can never select or widen it.
8
- * Read-only mergeability checks are not gated.
9
- */
10
- export interface MergeGateway {
11
- /** Whether merging is enabled and at least one valid repository pattern resolved. */
12
- enabled: boolean;
13
- /** Allowed `PROJECT/repository-slug` targets; a `PROJECT/*` entry allows the whole project. */
14
- repos: string[];
15
- /** Allowed target refs; a trailing `*` matches a prefix. Empty means any ref in an allowed repository. */
16
- targetRefs: string[];
17
- }
18
- type Env = Record<string, string | undefined>;
19
- type Warn = (message: string) => void;
20
- /**
21
- * Reads the merge gateway configuration from the environment. Merging only activates
22
- * when the flag is set and at least one repository entry is valid; otherwise a warning
23
- * is logged and the gateway stays disabled.
24
- */
25
- export declare function resolveMergeGateway(options?: {
26
- env?: Env;
27
- warn?: Warn;
28
- }): MergeGateway;
29
- /** Throws unless the gateway allows merging in this repository. No network call. */
30
- export declare function assertRepoMergeAllowed(gateway: MergeGateway, projectKey: string, repositorySlug: string): void;
31
- /** Throws unless the gateway allows merging into this target ref. A gateway with no ref restriction allows all. */
32
- export declare function assertTargetRefMergeAllowed(gateway: MergeGateway, targetRefId: string | undefined): void;
33
- export {};
34
- //# sourceMappingURL=merge-gateway.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"merge-gateway.d.ts","sourceRoot":"","sources":["../src/merge-gateway.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,MAAM,WAAW,YAAY;IAC3B,qFAAqF;IACrF,OAAO,EAAE,OAAO,CAAC;IACjB,+FAA+F;IAC/F,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,0GAA0G;IAC1G,UAAU,EAAE,MAAM,EAAE,CAAC;CACtB;AAED,KAAK,GAAG,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC;AAC9C,KAAK,IAAI,GAAG,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;AA6CtC;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,CAAC,EAAE;IAAE,GAAG,CAAC,EAAE,GAAG,CAAC;IAAC,IAAI,CAAC,EAAE,IAAI,CAAA;CAAE,GAAG,YAAY,CA2BtF;AAED,oFAAoF;AACpF,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,GAAG,IAAI,CAa9G;AAED,mHAAmH;AACnH,wBAAgB,2BAA2B,CAAC,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,CAgBxG"}
@@ -1,86 +0,0 @@
1
- const DISABLED = { enabled: false, repos: [], targetRefs: [] };
2
- const REPO_ENTRY_RE = /^[^\s/]+\/[^\s/]+$/;
3
- function readBool(env, name) {
4
- const value = env[name]?.trim().toLowerCase();
5
- return value === 'true' || value === '1' || value === 'yes';
6
- }
7
- function parseList(raw) {
8
- return (raw ?? '').split(/[,;\s]+/).map(entry => entry.trim()).filter(Boolean);
9
- }
10
- function dedupe(values) {
11
- return [...new Set(values)];
12
- }
13
- /**
14
- * Accepts `PROJECT/repository-slug` or `PROJECT/*`. The project key is upper-cased and
15
- * the slug lower-cased to match the casing the REST API uses, so comparisons are exact.
16
- */
17
- function normalizeRepoEntry(entry, warn) {
18
- if (!REPO_ENTRY_RE.test(entry)) {
19
- warn(`Ignoring merge repository entry that is not "PROJECT/repository-slug" or "PROJECT/*": "${entry}"`);
20
- return undefined;
21
- }
22
- const [projectKey, slug] = entry.split('/');
23
- if (projectKey === '*') {
24
- warn(`Ignoring merge repository entry that would allow every project: "${entry}"`);
25
- return undefined;
26
- }
27
- return `${projectKey.toUpperCase()}/${slug.toLowerCase()}`;
28
- }
29
- /** Bare branch names are expanded so operators can write `develop` instead of `refs/heads/develop`. */
30
- function normalizeRefEntry(entry) {
31
- return entry.startsWith('refs/') ? entry : `refs/heads/${entry}`;
32
- }
33
- function matchesPattern(value, pattern) {
34
- return pattern.endsWith('*') ? value.startsWith(pattern.slice(0, -1)) : value === pattern;
35
- }
36
- /**
37
- * Reads the merge gateway configuration from the environment. Merging only activates
38
- * when the flag is set and at least one repository entry is valid; otherwise a warning
39
- * is logged and the gateway stays disabled.
40
- */
41
- export function resolveMergeGateway(options) {
42
- const env = options?.env ?? process.env;
43
- const warn = options?.warn ?? ((message) => console.error(`[merge-gateway] ${message}`));
44
- if (!readBool(env, 'BITBUCKET_MERGE_ENABLED')) {
45
- return DISABLED;
46
- }
47
- const repos = dedupe(parseList(env.BITBUCKET_MERGE_ALLOWED_REPOS)
48
- .map(entry => normalizeRepoEntry(entry, warn))
49
- .filter((entry) => Boolean(entry)));
50
- if (repos.length === 0) {
51
- warn('Merging was enabled but no valid repository is configured (set BITBUCKET_MERGE_ALLOWED_REPOS ' +
52
- 'to a list of "PROJECT/repository-slug" or "PROJECT/*" entries); the merge tool will stay disabled.');
53
- return DISABLED;
54
- }
55
- return {
56
- enabled: true,
57
- repos,
58
- targetRefs: dedupe(parseList(env.BITBUCKET_MERGE_ALLOWED_TARGET_REFS).map(normalizeRefEntry)),
59
- };
60
- }
61
- /** Throws unless the gateway allows merging in this repository. No network call. */
62
- export function assertRepoMergeAllowed(gateway, projectKey, repositorySlug) {
63
- if (!gateway.enabled) {
64
- throw new Error('Merging pull requests is disabled on this server. Enable it with BITBUCKET_MERGE_ENABLED ' +
65
- 'and list the allowed repositories in BITBUCKET_MERGE_ALLOWED_REPOS.');
66
- }
67
- const target = `${projectKey.toUpperCase()}/${repositorySlug.toLowerCase()}`;
68
- if (!gateway.repos.some(pattern => matchesPattern(target, pattern))) {
69
- throw new Error(`Merging is not allowed in ${target} on this server. Allowed: ${gateway.repos.join(', ')}.`);
70
- }
71
- }
72
- /** Throws unless the gateway allows merging into this target ref. A gateway with no ref restriction allows all. */
73
- export function assertTargetRefMergeAllowed(gateway, targetRefId) {
74
- if (gateway.targetRefs.length === 0) {
75
- return;
76
- }
77
- if (!targetRefId) {
78
- throw new Error('Could not determine the target branch of the pull request, and this server restricts which ' +
79
- 'branches may be merged into (BITBUCKET_MERGE_ALLOWED_TARGET_REFS); refusing to merge.');
80
- }
81
- if (!gateway.targetRefs.some(pattern => matchesPattern(targetRefId, pattern))) {
82
- throw new Error(`Merging into ${targetRefId} is not allowed on this server. ` +
83
- `Allowed target refs: ${gateway.targetRefs.join(', ')}.`);
84
- }
85
- }
86
- //# sourceMappingURL=merge-gateway.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"merge-gateway.js","sourceRoot":"","sources":["../src/merge-gateway.ts"],"names":[],"mappings":"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"}
@@ -1,132 +0,0 @@
1
- /**
2
- * Operator-controlled gate for merging pull requests.
3
- *
4
- * A merge writes to a shared branch and cannot be undone through the API, so it is
5
- * disabled by default: `bitbucket_mergePullRequest` is not even registered unless the
6
- * operator enables it and names the repositories it may merge in. The allowed scope is
7
- * read from the environment once at startup, so the model can never select or widen it.
8
- * Read-only mergeability checks are not gated.
9
- */
10
- export interface MergeGateway {
11
- /** Whether merging is enabled and at least one valid repository pattern resolved. */
12
- enabled: boolean;
13
- /** Allowed `PROJECT/repository-slug` targets; a `PROJECT/*` entry allows the whole project. */
14
- repos: string[];
15
- /** Allowed target refs; a trailing `*` matches a prefix. Empty means any ref in an allowed repository. */
16
- targetRefs: string[];
17
- }
18
-
19
- type Env = Record<string, string | undefined>;
20
- type Warn = (message: string) => void;
21
-
22
- const DISABLED: MergeGateway = { enabled: false, repos: [], targetRefs: [] };
23
-
24
- const REPO_ENTRY_RE = /^[^\s/]+\/[^\s/]+$/;
25
-
26
- function readBool(env: Env, name: string): boolean {
27
- const value = env[name]?.trim().toLowerCase();
28
- return value === 'true' || value === '1' || value === 'yes';
29
- }
30
-
31
- function parseList(raw: string | undefined): string[] {
32
- return (raw ?? '').split(/[,;\s]+/).map(entry => entry.trim()).filter(Boolean);
33
- }
34
-
35
- function dedupe(values: string[]): string[] {
36
- return [...new Set(values)];
37
- }
38
-
39
- /**
40
- * Accepts `PROJECT/repository-slug` or `PROJECT/*`. The project key is upper-cased and
41
- * the slug lower-cased to match the casing the REST API uses, so comparisons are exact.
42
- */
43
- function normalizeRepoEntry(entry: string, warn: Warn): string | undefined {
44
- if (!REPO_ENTRY_RE.test(entry)) {
45
- warn(`Ignoring merge repository entry that is not "PROJECT/repository-slug" or "PROJECT/*": "${entry}"`);
46
- return undefined;
47
- }
48
- const [projectKey, slug] = entry.split('/');
49
- if (projectKey === '*') {
50
- warn(`Ignoring merge repository entry that would allow every project: "${entry}"`);
51
- return undefined;
52
- }
53
- return `${projectKey.toUpperCase()}/${slug.toLowerCase()}`;
54
- }
55
-
56
- /** Bare branch names are expanded so operators can write `develop` instead of `refs/heads/develop`. */
57
- function normalizeRefEntry(entry: string): string {
58
- return entry.startsWith('refs/') ? entry : `refs/heads/${entry}`;
59
- }
60
-
61
- function matchesPattern(value: string, pattern: string): boolean {
62
- return pattern.endsWith('*') ? value.startsWith(pattern.slice(0, -1)) : value === pattern;
63
- }
64
-
65
- /**
66
- * Reads the merge gateway configuration from the environment. Merging only activates
67
- * when the flag is set and at least one repository entry is valid; otherwise a warning
68
- * is logged and the gateway stays disabled.
69
- */
70
- export function resolveMergeGateway(options?: { env?: Env; warn?: Warn }): MergeGateway {
71
- const env = options?.env ?? process.env;
72
- const warn = options?.warn ?? ((message: string) => console.error(`[merge-gateway] ${message}`));
73
-
74
- if (!readBool(env, 'BITBUCKET_MERGE_ENABLED')) {
75
- return DISABLED;
76
- }
77
-
78
- const repos = dedupe(
79
- parseList(env.BITBUCKET_MERGE_ALLOWED_REPOS)
80
- .map(entry => normalizeRepoEntry(entry, warn))
81
- .filter((entry): entry is string => Boolean(entry)),
82
- );
83
-
84
- if (repos.length === 0) {
85
- warn(
86
- 'Merging was enabled but no valid repository is configured (set BITBUCKET_MERGE_ALLOWED_REPOS ' +
87
- 'to a list of "PROJECT/repository-slug" or "PROJECT/*" entries); the merge tool will stay disabled.',
88
- );
89
- return DISABLED;
90
- }
91
-
92
- return {
93
- enabled: true,
94
- repos,
95
- targetRefs: dedupe(parseList(env.BITBUCKET_MERGE_ALLOWED_TARGET_REFS).map(normalizeRefEntry)),
96
- };
97
- }
98
-
99
- /** Throws unless the gateway allows merging in this repository. No network call. */
100
- export function assertRepoMergeAllowed(gateway: MergeGateway, projectKey: string, repositorySlug: string): void {
101
- if (!gateway.enabled) {
102
- throw new Error(
103
- 'Merging pull requests is disabled on this server. Enable it with BITBUCKET_MERGE_ENABLED ' +
104
- 'and list the allowed repositories in BITBUCKET_MERGE_ALLOWED_REPOS.',
105
- );
106
- }
107
- const target = `${projectKey.toUpperCase()}/${repositorySlug.toLowerCase()}`;
108
- if (!gateway.repos.some(pattern => matchesPattern(target, pattern))) {
109
- throw new Error(
110
- `Merging is not allowed in ${target} on this server. Allowed: ${gateway.repos.join(', ')}.`,
111
- );
112
- }
113
- }
114
-
115
- /** Throws unless the gateway allows merging into this target ref. A gateway with no ref restriction allows all. */
116
- export function assertTargetRefMergeAllowed(gateway: MergeGateway, targetRefId: string | undefined): void {
117
- if (gateway.targetRefs.length === 0) {
118
- return;
119
- }
120
- if (!targetRefId) {
121
- throw new Error(
122
- 'Could not determine the target branch of the pull request, and this server restricts which ' +
123
- 'branches may be merged into (BITBUCKET_MERGE_ALLOWED_TARGET_REFS); refusing to merge.',
124
- );
125
- }
126
- if (!gateway.targetRefs.some(pattern => matchesPattern(targetRefId, pattern))) {
127
- throw new Error(
128
- `Merging into ${targetRefId} is not allowed on this server. ` +
129
- `Allowed target refs: ${gateway.targetRefs.join(', ')}.`,
130
- );
131
- }
132
- }