@generacy-ai/generacy-plugin-github-issues 0.0.0-preview-20260304013206

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 (94) hide show
  1. package/LICENSE +191 -0
  2. package/dist/auth/auth-factory.d.ts +44 -0
  3. package/dist/auth/auth-factory.d.ts.map +1 -0
  4. package/dist/auth/auth-factory.js +85 -0
  5. package/dist/auth/auth-factory.js.map +1 -0
  6. package/dist/auth/env.d.ts +32 -0
  7. package/dist/auth/env.d.ts.map +1 -0
  8. package/dist/auth/env.js +88 -0
  9. package/dist/auth/env.js.map +1 -0
  10. package/dist/auth/github-app.d.ts +69 -0
  11. package/dist/auth/github-app.d.ts.map +1 -0
  12. package/dist/auth/github-app.js +191 -0
  13. package/dist/auth/github-app.js.map +1 -0
  14. package/dist/auth/index.d.ts +10 -0
  15. package/dist/auth/index.d.ts.map +1 -0
  16. package/dist/auth/index.js +10 -0
  17. package/dist/auth/index.js.map +1 -0
  18. package/dist/auth/token-cache.d.ts +70 -0
  19. package/dist/auth/token-cache.d.ts.map +1 -0
  20. package/dist/auth/token-cache.js +112 -0
  21. package/dist/auth/token-cache.js.map +1 -0
  22. package/dist/auth/types.d.ts +119 -0
  23. package/dist/auth/types.d.ts.map +1 -0
  24. package/dist/auth/types.js +27 -0
  25. package/dist/auth/types.js.map +1 -0
  26. package/dist/client.d.ts +101 -0
  27. package/dist/client.d.ts.map +1 -0
  28. package/dist/client.js +197 -0
  29. package/dist/client.js.map +1 -0
  30. package/dist/index.d.ts +15 -0
  31. package/dist/index.d.ts.map +1 -0
  32. package/dist/index.js +20 -0
  33. package/dist/index.js.map +1 -0
  34. package/dist/operations/comments.d.ts +46 -0
  35. package/dist/operations/comments.d.ts.map +1 -0
  36. package/dist/operations/comments.js +127 -0
  37. package/dist/operations/comments.js.map +1 -0
  38. package/dist/operations/issues.d.ts +46 -0
  39. package/dist/operations/issues.d.ts.map +1 -0
  40. package/dist/operations/issues.js +188 -0
  41. package/dist/operations/issues.js.map +1 -0
  42. package/dist/operations/labels.d.ts +46 -0
  43. package/dist/operations/labels.d.ts.map +1 -0
  44. package/dist/operations/labels.js +132 -0
  45. package/dist/operations/labels.js.map +1 -0
  46. package/dist/operations/pull-requests.d.ts +41 -0
  47. package/dist/operations/pull-requests.d.ts.map +1 -0
  48. package/dist/operations/pull-requests.js +162 -0
  49. package/dist/operations/pull-requests.js.map +1 -0
  50. package/dist/plugin.d.ts +181 -0
  51. package/dist/plugin.d.ts.map +1 -0
  52. package/dist/plugin.js +324 -0
  53. package/dist/plugin.js.map +1 -0
  54. package/dist/types/config.d.ts +126 -0
  55. package/dist/types/config.d.ts.map +1 -0
  56. package/dist/types/config.js +22 -0
  57. package/dist/types/config.js.map +1 -0
  58. package/dist/types/events.d.ts +72 -0
  59. package/dist/types/events.d.ts.map +1 -0
  60. package/dist/types/events.js +2 -0
  61. package/dist/types/events.js.map +1 -0
  62. package/dist/types/index.d.ts +7 -0
  63. package/dist/types/index.d.ts.map +1 -0
  64. package/dist/types/index.js +3 -0
  65. package/dist/types/index.js.map +1 -0
  66. package/dist/types/issues.d.ts +178 -0
  67. package/dist/types/issues.d.ts.map +1 -0
  68. package/dist/types/issues.js +29 -0
  69. package/dist/types/issues.js.map +1 -0
  70. package/dist/types/responses.d.ts +61 -0
  71. package/dist/types/responses.d.ts.map +1 -0
  72. package/dist/types/responses.js +5 -0
  73. package/dist/types/responses.js.map +1 -0
  74. package/dist/utils/errors.d.ts +69 -0
  75. package/dist/utils/errors.d.ts.map +1 -0
  76. package/dist/utils/errors.js +123 -0
  77. package/dist/utils/errors.js.map +1 -0
  78. package/dist/utils/validation.d.ts +33 -0
  79. package/dist/utils/validation.d.ts.map +1 -0
  80. package/dist/utils/validation.js +69 -0
  81. package/dist/utils/validation.js.map +1 -0
  82. package/dist/webhooks/handler.d.ts +66 -0
  83. package/dist/webhooks/handler.d.ts.map +1 -0
  84. package/dist/webhooks/handler.js +176 -0
  85. package/dist/webhooks/handler.js.map +1 -0
  86. package/dist/webhooks/parser.d.ts +36 -0
  87. package/dist/webhooks/parser.d.ts.map +1 -0
  88. package/dist/webhooks/parser.js +220 -0
  89. package/dist/webhooks/parser.js.map +1 -0
  90. package/dist/webhooks/triggers.d.ts +25 -0
  91. package/dist/webhooks/triggers.d.ts.map +1 -0
  92. package/dist/webhooks/triggers.js +119 -0
  93. package/dist/webhooks/triggers.js.map +1 -0
  94. package/package.json +62 -0
@@ -0,0 +1,188 @@
1
+ import { validateCreateIssueParams, validateUpdateIssueParams, validateIssueFilter, } from '../utils/validation.js';
2
+ import { GitHubNotFoundError } from '../utils/errors.js';
3
+ /**
4
+ * Transform GitHub API issue response to our Issue type
5
+ */
6
+ function transformIssue(apiIssue) {
7
+ return {
8
+ number: apiIssue.number,
9
+ title: apiIssue.title,
10
+ body: apiIssue.body ?? null,
11
+ state: apiIssue.state,
12
+ labels: apiIssue.labels
13
+ .filter((l) => typeof l === 'object')
14
+ .map((l) => ({
15
+ id: l.id ?? 0,
16
+ name: l.name ?? '',
17
+ color: l.color ?? '',
18
+ description: l.description ?? null,
19
+ })),
20
+ assignees: (apiIssue.assignees ?? []).map((a) => ({
21
+ id: a.id,
22
+ login: a.login,
23
+ avatarUrl: a.avatar_url,
24
+ type: (a.type ?? 'User'),
25
+ })),
26
+ milestone: apiIssue.milestone
27
+ ? {
28
+ id: apiIssue.milestone.id,
29
+ number: apiIssue.milestone.number,
30
+ title: apiIssue.milestone.title,
31
+ description: apiIssue.milestone.description,
32
+ state: (apiIssue.milestone.state ?? 'open'),
33
+ dueOn: apiIssue.milestone.due_on ?? null,
34
+ }
35
+ : null,
36
+ createdAt: apiIssue.created_at,
37
+ updatedAt: apiIssue.updated_at,
38
+ closedAt: apiIssue.closed_at ?? null,
39
+ author: apiIssue.user
40
+ ? {
41
+ id: apiIssue.user.id,
42
+ login: apiIssue.user.login,
43
+ avatarUrl: apiIssue.user.avatar_url,
44
+ type: (apiIssue.user.type ?? 'User'),
45
+ }
46
+ : { id: 0, login: 'unknown', avatarUrl: '', type: 'User' },
47
+ url: apiIssue.url,
48
+ htmlUrl: apiIssue.html_url,
49
+ };
50
+ }
51
+ /**
52
+ * Issue operations using the GitHub client
53
+ */
54
+ export class IssueOperations {
55
+ client;
56
+ constructor(client) {
57
+ this.client = client;
58
+ }
59
+ /**
60
+ * Create a new issue
61
+ */
62
+ async create(params) {
63
+ const validated = validateCreateIssueParams(params);
64
+ const { data } = await this.client.request(() => this.client.rest.issues.create({
65
+ owner: this.client.owner,
66
+ repo: this.client.repo,
67
+ title: validated.title,
68
+ body: validated.body,
69
+ labels: validated.labels,
70
+ assignees: validated.assignees,
71
+ milestone: validated.milestone,
72
+ }), 'create issue');
73
+ return transformIssue(data);
74
+ }
75
+ /**
76
+ * Get an issue by number
77
+ */
78
+ async get(issueNumber) {
79
+ const { data } = await this.client.request(() => this.client.rest.issues.get({
80
+ owner: this.client.owner,
81
+ repo: this.client.repo,
82
+ issue_number: issueNumber,
83
+ }), `get issue #${issueNumber}`);
84
+ return transformIssue(data);
85
+ }
86
+ /**
87
+ * Update an issue
88
+ */
89
+ async update(issueNumber, params) {
90
+ const validated = validateUpdateIssueParams(params);
91
+ const { data } = await this.client.request(() => this.client.rest.issues.update({
92
+ owner: this.client.owner,
93
+ repo: this.client.repo,
94
+ issue_number: issueNumber,
95
+ title: validated.title,
96
+ body: validated.body,
97
+ state: validated.state,
98
+ labels: validated.labels,
99
+ assignees: validated.assignees,
100
+ milestone: validated.milestone,
101
+ }), `update issue #${issueNumber}`);
102
+ return transformIssue(data);
103
+ }
104
+ /**
105
+ * Close an issue
106
+ */
107
+ async close(issueNumber) {
108
+ await this.client.request(() => this.client.rest.issues.update({
109
+ owner: this.client.owner,
110
+ repo: this.client.repo,
111
+ issue_number: issueNumber,
112
+ state: 'closed',
113
+ }), `close issue #${issueNumber}`);
114
+ }
115
+ /**
116
+ * Reopen an issue
117
+ */
118
+ async reopen(issueNumber) {
119
+ await this.client.request(() => this.client.rest.issues.update({
120
+ owner: this.client.owner,
121
+ repo: this.client.repo,
122
+ issue_number: issueNumber,
123
+ state: 'open',
124
+ }), `reopen issue #${issueNumber}`);
125
+ }
126
+ /**
127
+ * Search issues using GitHub search syntax
128
+ */
129
+ async search(query) {
130
+ const fullQuery = `repo:${this.client.owner}/${this.client.repo} ${query}`;
131
+ const { data } = await this.client.request(() => this.client.rest.search.issuesAndPullRequests({
132
+ q: fullQuery,
133
+ per_page: 100,
134
+ }), 'search issues');
135
+ // Filter out pull requests (they're included in the search results)
136
+ return data.items
137
+ .filter((item) => !('pull_request' in item))
138
+ .map((item) => transformIssue(item));
139
+ }
140
+ /**
141
+ * List issues with optional filtering
142
+ */
143
+ async list(filter) {
144
+ const validated = filter ? validateIssueFilter(filter) : {};
145
+ const results = await this.client.paginate((params) => this.client.rest.issues.listForRepo({
146
+ owner: this.client.owner,
147
+ repo: this.client.repo,
148
+ state: validated.state,
149
+ labels: validated.labels?.join(','),
150
+ assignee: validated.assignee,
151
+ creator: validated.creator,
152
+ mentioned: validated.mentioned,
153
+ milestone: validated.milestone === 'none' || validated.milestone === '*'
154
+ ? validated.milestone
155
+ : validated.milestone?.toString(),
156
+ since: validated.since,
157
+ sort: validated.sort,
158
+ direction: validated.direction,
159
+ ...params,
160
+ }), 10);
161
+ // Filter out pull requests
162
+ return results
163
+ .filter((item) => !('pull_request' in item))
164
+ .map((item) => transformIssue(item));
165
+ }
166
+ /**
167
+ * Check if an issue exists
168
+ */
169
+ async exists(issueNumber) {
170
+ try {
171
+ await this.get(issueNumber);
172
+ return true;
173
+ }
174
+ catch (error) {
175
+ if (error instanceof GitHubNotFoundError) {
176
+ return false;
177
+ }
178
+ throw error;
179
+ }
180
+ }
181
+ }
182
+ /**
183
+ * Create issue operations instance
184
+ */
185
+ export function createIssueOperations(client) {
186
+ return new IssueOperations(client);
187
+ }
188
+ //# sourceMappingURL=issues.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"issues.js","sourceRoot":"","sources":["../../src/operations/issues.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,46 @@
1
+ import type { GitHubClient } from '../client.js';
2
+ import type { Label } from '../types/index.js';
3
+ /**
4
+ * Label operations using the GitHub client
5
+ */
6
+ export declare class LabelOperations {
7
+ private readonly client;
8
+ constructor(client: GitHubClient);
9
+ /**
10
+ * Add labels to an issue
11
+ */
12
+ add(issueNumber: number, labels: string[]): Promise<Label[]>;
13
+ /**
14
+ * Remove a label from an issue
15
+ */
16
+ remove(issueNumber: number, label: string): Promise<void>;
17
+ /**
18
+ * Remove multiple labels from an issue
19
+ */
20
+ removeMany(issueNumber: number, labels: string[]): Promise<void>;
21
+ /**
22
+ * Set labels on an issue (replaces all existing labels)
23
+ */
24
+ set(issueNumber: number, labels: string[]): Promise<Label[]>;
25
+ /**
26
+ * List all labels on an issue
27
+ */
28
+ list(issueNumber: number): Promise<Label[]>;
29
+ /**
30
+ * List all labels in the repository
31
+ */
32
+ listForRepo(): Promise<Label[]>;
33
+ /**
34
+ * Create a label in the repository
35
+ */
36
+ create(name: string, color: string, description?: string): Promise<Label>;
37
+ /**
38
+ * Delete a label from the repository
39
+ */
40
+ delete(name: string): Promise<void>;
41
+ }
42
+ /**
43
+ * Create label operations instance
44
+ */
45
+ export declare function createLabelOperations(client: GitHubClient): LabelOperations;
46
+ //# sourceMappingURL=labels.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"labels.d.ts","sourceRoot":"","sources":["../../src/operations/labels.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AACjD,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAoB/C;;GAEG;AACH,qBAAa,eAAe;IACd,OAAO,CAAC,QAAQ,CAAC,MAAM;gBAAN,MAAM,EAAE,YAAY;IAEjD;;OAEG;IACG,GAAG,CAAC,WAAW,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,KAAK,EAAE,CAAC;IAmBlE;;OAEG;IACG,MAAM,CAAC,WAAW,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAa/D;;OAEG;IACG,UAAU,CAAC,WAAW,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IA2BtE;;OAEG;IACG,GAAG,CAAC,WAAW,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,KAAK,EAAE,CAAC;IAelE;;OAEG;IACG,IAAI,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,EAAE,CAAC;IAejD;;OAEG;IACG,WAAW,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;IAcrC;;OAEG;IACG,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC;IAgB/E;;OAEG;IACG,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAW1C;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,YAAY,GAAG,eAAe,CAE3E"}
@@ -0,0 +1,132 @@
1
+ import { GitHubValidationError } from '../utils/errors.js';
2
+ /**
3
+ * Transform GitHub API label response to our Label type
4
+ */
5
+ function transformLabel(apiLabel) {
6
+ return {
7
+ id: apiLabel.id,
8
+ name: apiLabel.name,
9
+ color: apiLabel.color,
10
+ description: apiLabel.description,
11
+ };
12
+ }
13
+ /**
14
+ * Label operations using the GitHub client
15
+ */
16
+ export class LabelOperations {
17
+ client;
18
+ constructor(client) {
19
+ this.client = client;
20
+ }
21
+ /**
22
+ * Add labels to an issue
23
+ */
24
+ async add(issueNumber, labels) {
25
+ if (labels.length === 0) {
26
+ throw new GitHubValidationError('At least one label is required');
27
+ }
28
+ const { data } = await this.client.request(() => this.client.rest.issues.addLabels({
29
+ owner: this.client.owner,
30
+ repo: this.client.repo,
31
+ issue_number: issueNumber,
32
+ labels,
33
+ }), `add labels to issue #${issueNumber}`);
34
+ return data.map(transformLabel);
35
+ }
36
+ /**
37
+ * Remove a label from an issue
38
+ */
39
+ async remove(issueNumber, label) {
40
+ await this.client.request(() => this.client.rest.issues.removeLabel({
41
+ owner: this.client.owner,
42
+ repo: this.client.repo,
43
+ issue_number: issueNumber,
44
+ name: label,
45
+ }), `remove label '${label}' from issue #${issueNumber}`);
46
+ }
47
+ /**
48
+ * Remove multiple labels from an issue
49
+ */
50
+ async removeMany(issueNumber, labels) {
51
+ if (labels.length === 0) {
52
+ return;
53
+ }
54
+ // GitHub API doesn't support bulk removal, so we remove one by one
55
+ await Promise.all(labels.map((label) => this.client.request(() => this.client.rest.issues.removeLabel({
56
+ owner: this.client.owner,
57
+ repo: this.client.repo,
58
+ issue_number: issueNumber,
59
+ name: label,
60
+ }), `remove label '${label}' from issue #${issueNumber}`).catch((error) => {
61
+ // Ignore 404 errors (label might not exist on the issue)
62
+ if (error.code !== 'NOT_FOUND_ERROR') {
63
+ throw error;
64
+ }
65
+ })));
66
+ }
67
+ /**
68
+ * Set labels on an issue (replaces all existing labels)
69
+ */
70
+ async set(issueNumber, labels) {
71
+ const { data } = await this.client.request(() => this.client.rest.issues.setLabels({
72
+ owner: this.client.owner,
73
+ repo: this.client.repo,
74
+ issue_number: issueNumber,
75
+ labels,
76
+ }), `set labels on issue #${issueNumber}`);
77
+ return data.map(transformLabel);
78
+ }
79
+ /**
80
+ * List all labels on an issue
81
+ */
82
+ async list(issueNumber) {
83
+ const results = await this.client.paginate((params) => this.client.rest.issues.listLabelsOnIssue({
84
+ owner: this.client.owner,
85
+ repo: this.client.repo,
86
+ issue_number: issueNumber,
87
+ ...params,
88
+ }), 5);
89
+ return results.map(transformLabel);
90
+ }
91
+ /**
92
+ * List all labels in the repository
93
+ */
94
+ async listForRepo() {
95
+ const results = await this.client.paginate((params) => this.client.rest.issues.listLabelsForRepo({
96
+ owner: this.client.owner,
97
+ repo: this.client.repo,
98
+ ...params,
99
+ }), 10);
100
+ return results.map(transformLabel);
101
+ }
102
+ /**
103
+ * Create a label in the repository
104
+ */
105
+ async create(name, color, description) {
106
+ const { data } = await this.client.request(() => this.client.rest.issues.createLabel({
107
+ owner: this.client.owner,
108
+ repo: this.client.repo,
109
+ name,
110
+ color: color.replace(/^#/, ''), // Remove # prefix if present
111
+ description,
112
+ }), `create label '${name}'`);
113
+ return transformLabel(data);
114
+ }
115
+ /**
116
+ * Delete a label from the repository
117
+ */
118
+ async delete(name) {
119
+ await this.client.request(() => this.client.rest.issues.deleteLabel({
120
+ owner: this.client.owner,
121
+ repo: this.client.repo,
122
+ name,
123
+ }), `delete label '${name}'`);
124
+ }
125
+ }
126
+ /**
127
+ * Create label operations instance
128
+ */
129
+ export function createLabelOperations(client) {
130
+ return new LabelOperations(client);
131
+ }
132
+ //# sourceMappingURL=labels.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"labels.js","sourceRoot":"","sources":["../../src/operations/labels.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,41 @@
1
+ import type { GitHubClient } from '../client.js';
2
+ import type { PullRequest } from '../types/index.js';
3
+ /**
4
+ * Pull request operations using the GitHub client
5
+ */
6
+ export declare class PullRequestOperations {
7
+ private readonly client;
8
+ constructor(client: GitHubClient);
9
+ /**
10
+ * Get a pull request by number
11
+ */
12
+ get(prNumber: number): Promise<PullRequest>;
13
+ /**
14
+ * Link a pull request to an issue by adding a comment
15
+ * Note: GitHub automatically links PRs that reference issues in their description
16
+ * This method adds an explicit link comment
17
+ */
18
+ linkToIssue(prNumber: number, issueNumber: number): Promise<void>;
19
+ /**
20
+ * Get all PRs linked to an issue
21
+ * Uses GitHub's timeline events to find linked PRs
22
+ */
23
+ getLinkedToIssue(issueNumber: number): Promise<PullRequest[]>;
24
+ /**
25
+ * List all open PRs in the repository
26
+ */
27
+ listOpen(): Promise<PullRequest[]>;
28
+ /**
29
+ * List PRs by author
30
+ */
31
+ listByAuthor(authorLogin: string): Promise<PullRequest[]>;
32
+ /**
33
+ * Check if an issue has any linked PRs
34
+ */
35
+ hasLinkedPRs(issueNumber: number): Promise<boolean>;
36
+ }
37
+ /**
38
+ * Create pull request operations instance
39
+ */
40
+ export declare function createPullRequestOperations(client: GitHubClient): PullRequestOperations;
41
+ //# sourceMappingURL=pull-requests.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pull-requests.d.ts","sourceRoot":"","sources":["../../src/operations/pull-requests.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AACjD,OAAO,KAAK,EAAE,WAAW,EAAQ,MAAM,mBAAmB,CAAC;AAyD3D;;GAEG;AACH,qBAAa,qBAAqB;IACpB,OAAO,CAAC,QAAQ,CAAC,MAAM;gBAAN,MAAM,EAAE,YAAY;IAEjD;;OAEG;IACG,GAAG,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;IAcjD;;;;OAIG;IACG,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAcvE;;;OAGG;IACG,gBAAgB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;IA2DnE;;OAEG;IACG,QAAQ,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC;IAexC;;OAEG;IACG,YAAY,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;IAiB/D;;OAEG;IACG,YAAY,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;CAI1D;AAED;;GAEG;AACH,wBAAgB,2BAA2B,CAAC,MAAM,EAAE,YAAY,GAAG,qBAAqB,CAEvF"}
@@ -0,0 +1,162 @@
1
+ /**
2
+ * Transform GitHub API PR response to our PullRequest type
3
+ */
4
+ function transformPullRequest(apiPR) {
5
+ // Determine the effective state
6
+ let state = apiPR.state;
7
+ if (apiPR.state === 'closed' && apiPR.merged) {
8
+ state = 'merged';
9
+ }
10
+ // Extract linked issue numbers from PR body
11
+ const linkedIssues = [];
12
+ if (apiPR.body) {
13
+ // Match common patterns: Fixes #123, Closes #456, etc.
14
+ const patterns = [
15
+ /(?:close[sd]?|fix(?:e[sd])?|resolve[sd]?)\s+#(\d+)/gi,
16
+ /(?:close[sd]?|fix(?:e[sd])?|resolve[sd]?)\s+(?:https?:\/\/github\.com\/[^/]+\/[^/]+\/issues\/)(\d+)/gi,
17
+ ];
18
+ for (const pattern of patterns) {
19
+ let match;
20
+ while ((match = pattern.exec(apiPR.body)) !== null) {
21
+ const issueNum = parseInt(match[1] ?? '', 10);
22
+ if (!isNaN(issueNum) && !linkedIssues.includes(issueNum)) {
23
+ linkedIssues.push(issueNum);
24
+ }
25
+ }
26
+ }
27
+ }
28
+ return {
29
+ number: apiPR.number,
30
+ title: apiPR.title,
31
+ state,
32
+ author: apiPR.user
33
+ ? {
34
+ id: apiPR.user.id,
35
+ login: apiPR.user.login,
36
+ avatarUrl: apiPR.user.avatar_url,
37
+ type: (apiPR.user.type ?? 'User'),
38
+ }
39
+ : { id: 0, login: 'unknown', avatarUrl: '', type: 'User' },
40
+ htmlUrl: apiPR.html_url,
41
+ linkedIssues,
42
+ };
43
+ }
44
+ /**
45
+ * Pull request operations using the GitHub client
46
+ */
47
+ export class PullRequestOperations {
48
+ client;
49
+ constructor(client) {
50
+ this.client = client;
51
+ }
52
+ /**
53
+ * Get a pull request by number
54
+ */
55
+ async get(prNumber) {
56
+ const { data } = await this.client.request(() => this.client.rest.pulls.get({
57
+ owner: this.client.owner,
58
+ repo: this.client.repo,
59
+ pull_number: prNumber,
60
+ }), `get PR #${prNumber}`);
61
+ return transformPullRequest(data);
62
+ }
63
+ /**
64
+ * Link a pull request to an issue by adding a comment
65
+ * Note: GitHub automatically links PRs that reference issues in their description
66
+ * This method adds an explicit link comment
67
+ */
68
+ async linkToIssue(prNumber, issueNumber) {
69
+ // Add a comment to the PR referencing the issue
70
+ await this.client.request(() => this.client.rest.issues.createComment({
71
+ owner: this.client.owner,
72
+ repo: this.client.repo,
73
+ issue_number: prNumber, // PRs are also issues in GitHub API
74
+ body: `Linked to #${issueNumber}`,
75
+ }), `link PR #${prNumber} to issue #${issueNumber}`);
76
+ }
77
+ /**
78
+ * Get all PRs linked to an issue
79
+ * Uses GitHub's timeline events to find linked PRs
80
+ */
81
+ async getLinkedToIssue(issueNumber) {
82
+ // First approach: Search for PRs that mention the issue
83
+ const { data: searchResults } = await this.client.request(() => this.client.rest.search.issuesAndPullRequests({
84
+ q: `repo:${this.client.owner}/${this.client.repo} is:pr #${issueNumber}`,
85
+ per_page: 100,
86
+ }), `search PRs linked to issue #${issueNumber}`);
87
+ const pullRequests = [];
88
+ for (const item of searchResults.items) {
89
+ // Verify it's a PR and links to this issue
90
+ if ('pull_request' in item) {
91
+ const pr = await this.get(item.number);
92
+ if (pr.linkedIssues.includes(issueNumber)) {
93
+ pullRequests.push(pr);
94
+ }
95
+ }
96
+ }
97
+ // Second approach: Check timeline events for cross-references
98
+ const { data: timeline } = await this.client.request(() => this.client.rest.issues.listEventsForTimeline({
99
+ owner: this.client.owner,
100
+ repo: this.client.repo,
101
+ issue_number: issueNumber,
102
+ per_page: 100,
103
+ }), `get timeline for issue #${issueNumber}`);
104
+ // Find cross-referenced PRs
105
+ for (const event of timeline) {
106
+ if (event.event === 'cross-referenced' &&
107
+ 'source' in event &&
108
+ event.source &&
109
+ typeof event.source === 'object' &&
110
+ 'issue' in event.source) {
111
+ const source = event.source;
112
+ if (source.issue?.pull_request) {
113
+ const prNumber = source.issue.number;
114
+ // Avoid duplicates
115
+ if (!pullRequests.some((pr) => pr.number === prNumber)) {
116
+ const pr = await this.get(prNumber);
117
+ pullRequests.push(pr);
118
+ }
119
+ }
120
+ }
121
+ }
122
+ return pullRequests;
123
+ }
124
+ /**
125
+ * List all open PRs in the repository
126
+ */
127
+ async listOpen() {
128
+ const results = await this.client.paginate((params) => this.client.rest.pulls.list({
129
+ owner: this.client.owner,
130
+ repo: this.client.repo,
131
+ state: 'open',
132
+ ...params,
133
+ }), 10);
134
+ return results.map(transformPullRequest);
135
+ }
136
+ /**
137
+ * List PRs by author
138
+ */
139
+ async listByAuthor(authorLogin) {
140
+ const { data } = await this.client.request(() => this.client.rest.search.issuesAndPullRequests({
141
+ q: `repo:${this.client.owner}/${this.client.repo} is:pr author:${authorLogin}`,
142
+ per_page: 100,
143
+ }), `search PRs by author ${authorLogin}`);
144
+ return Promise.all(data.items
145
+ .filter((item) => 'pull_request' in item)
146
+ .map((item) => this.get(item.number)));
147
+ }
148
+ /**
149
+ * Check if an issue has any linked PRs
150
+ */
151
+ async hasLinkedPRs(issueNumber) {
152
+ const linkedPRs = await this.getLinkedToIssue(issueNumber);
153
+ return linkedPRs.length > 0;
154
+ }
155
+ }
156
+ /**
157
+ * Create pull request operations instance
158
+ */
159
+ export function createPullRequestOperations(client) {
160
+ return new PullRequestOperations(client);
161
+ }
162
+ //# sourceMappingURL=pull-requests.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pull-requests.js","sourceRoot":"","sources":["../../src/operations/pull-requests.ts"],"names":[],"mappings":"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"}