npm-cli-gh-issue-preparator 1.9.0 → 1.10.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 (41) hide show
  1. package/CHANGELOG.md +7 -0
  2. package/bin/adapter/entry-points/cli/index.js +10 -4
  3. package/bin/adapter/entry-points/cli/index.js.map +1 -1
  4. package/bin/adapter/repositories/GraphqlIssueRepository.js +417 -0
  5. package/bin/adapter/repositories/GraphqlIssueRepository.js.map +1 -0
  6. package/bin/adapter/repositories/TowerDefenceIssueRepository.js +24 -335
  7. package/bin/adapter/repositories/TowerDefenceIssueRepository.js.map +1 -1
  8. package/bin/domain/entities/StoryObjectMap.js +3 -0
  9. package/bin/domain/entities/StoryObjectMap.js.map +1 -0
  10. package/bin/domain/usecases/NotifyFinishedIssuePreparationUseCase.js +25 -7
  11. package/bin/domain/usecases/NotifyFinishedIssuePreparationUseCase.js.map +1 -1
  12. package/bin/domain/usecases/StartPreparationUseCase.js +35 -3
  13. package/bin/domain/usecases/StartPreparationUseCase.js.map +1 -1
  14. package/package.json +1 -1
  15. package/src/adapter/entry-points/cli/index.test.ts +13 -1
  16. package/src/adapter/entry-points/cli/index.ts +14 -7
  17. package/src/adapter/repositories/GraphqlIssueRepository.integration.test.ts +162 -0
  18. package/src/adapter/repositories/GraphqlIssueRepository.test.ts +1333 -0
  19. package/src/adapter/repositories/GraphqlIssueRepository.ts +629 -0
  20. package/src/adapter/repositories/TowerDefenceIssueRepository.integration.test.ts +106 -0
  21. package/src/adapter/repositories/TowerDefenceIssueRepository.test.ts +0 -1000
  22. package/src/adapter/repositories/TowerDefenceIssueRepository.ts +32 -507
  23. package/src/domain/entities/StoryObjectMap.ts +13 -0
  24. package/src/domain/usecases/NotifyFinishedIssuePreparationUseCase.test.ts +256 -0
  25. package/src/domain/usecases/NotifyFinishedIssuePreparationUseCase.ts +40 -9
  26. package/src/domain/usecases/StartPreparationUseCase.test.ts +265 -32
  27. package/src/domain/usecases/StartPreparationUseCase.ts +62 -14
  28. package/src/domain/usecases/adapter-interfaces/IssueRepository.ts +2 -0
  29. package/types/adapter/entry-points/cli/index.d.ts.map +1 -1
  30. package/types/adapter/repositories/GraphqlIssueRepository.d.ts +14 -0
  31. package/types/adapter/repositories/GraphqlIssueRepository.d.ts.map +1 -0
  32. package/types/adapter/repositories/TowerDefenceIssueRepository.d.ts +6 -10
  33. package/types/adapter/repositories/TowerDefenceIssueRepository.d.ts.map +1 -1
  34. package/types/domain/entities/StoryObjectMap.d.ts +10 -0
  35. package/types/domain/entities/StoryObjectMap.d.ts.map +1 -0
  36. package/types/domain/usecases/NotifyFinishedIssuePreparationUseCase.d.ts +1 -1
  37. package/types/domain/usecases/NotifyFinishedIssuePreparationUseCase.d.ts.map +1 -1
  38. package/types/domain/usecases/StartPreparationUseCase.d.ts +6 -1
  39. package/types/domain/usecases/StartPreparationUseCase.d.ts.map +1 -1
  40. package/types/domain/usecases/adapter-interfaces/IssueRepository.d.ts +2 -0
  41. package/types/domain/usecases/adapter-interfaces/IssueRepository.d.ts.map +1 -1
package/CHANGELOG.md CHANGED
@@ -1,3 +1,10 @@
1
+ # [1.10.0](https://github.com/HiromiShikata/npm-cli-gh-issue-preparator/compare/v1.9.0...v1.10.0) (2026-02-13)
2
+
3
+
4
+ ### Features
5
+
6
+ * **core:** add PR status checking to notify finished issue preparation ([72e5562](https://github.com/HiromiShikata/npm-cli-gh-issue-preparator/commit/72e556229200a14669240e37da75da60a34530c0))
7
+
1
8
  # [1.9.0](https://github.com/HiromiShikata/npm-cli-gh-issue-preparator/compare/v1.8.0...v1.9.0) (2026-02-11)
2
9
 
3
10
 
@@ -11,6 +11,7 @@ const commander_1 = require("commander");
11
11
  const StartPreparationUseCase_1 = require("../../../domain/usecases/StartPreparationUseCase");
12
12
  const NotifyFinishedIssuePreparationUseCase_1 = require("../../../domain/usecases/NotifyFinishedIssuePreparationUseCase");
13
13
  const TowerDefenceIssueRepository_1 = require("../../repositories/TowerDefenceIssueRepository");
14
+ const GraphqlIssueRepository_1 = require("../../repositories/GraphqlIssueRepository");
14
15
  const TowerDefenceProjectRepository_1 = require("../../repositories/TowerDefenceProjectRepository");
15
16
  const GitHubIssueCommentRepository_1 = require("../../repositories/GitHubIssueCommentRepository");
16
17
  const NodeLocalCommandRunner_1 = require("../../repositories/NodeLocalCommandRunner");
@@ -36,9 +37,14 @@ program
36
37
  process.exit(1);
37
38
  }
38
39
  const projectRepository = new TowerDefenceProjectRepository_1.TowerDefenceProjectRepository(options.configFilePath, token);
39
- const issueRepository = new TowerDefenceIssueRepository_1.TowerDefenceIssueRepository(options.configFilePath, token);
40
+ const towerDefenceIssueRepository = new TowerDefenceIssueRepository_1.TowerDefenceIssueRepository(options.configFilePath, token);
41
+ const graphqlIssueRepository = new GraphqlIssueRepository_1.GraphqlIssueRepository(token);
40
42
  const localCommandRunner = new NodeLocalCommandRunner_1.NodeLocalCommandRunner();
41
- const useCase = new StartPreparationUseCase_1.StartPreparationUseCase(projectRepository, issueRepository, localCommandRunner);
43
+ const useCase = new StartPreparationUseCase_1.StartPreparationUseCase(projectRepository, {
44
+ getAllOpened: towerDefenceIssueRepository.getAllOpened.bind(towerDefenceIssueRepository),
45
+ getStoryObjectMap: towerDefenceIssueRepository.getStoryObjectMap.bind(towerDefenceIssueRepository),
46
+ update: graphqlIssueRepository.update.bind(graphqlIssueRepository),
47
+ }, localCommandRunner);
42
48
  let maximumPreparingIssuesCount = null;
43
49
  if (options.maximumPreparingIssuesCount !== undefined) {
44
50
  const parsedCount = Number(options.maximumPreparingIssuesCount);
@@ -76,9 +82,9 @@ program
76
82
  process.exit(1);
77
83
  }
78
84
  const projectRepository = new TowerDefenceProjectRepository_1.TowerDefenceProjectRepository(options.configFilePath, token);
79
- const issueRepository = new TowerDefenceIssueRepository_1.TowerDefenceIssueRepository(options.configFilePath, token);
85
+ const graphqlIssueRepository = new GraphqlIssueRepository_1.GraphqlIssueRepository(token);
80
86
  const issueCommentRepository = new GitHubIssueCommentRepository_1.GitHubIssueCommentRepository(token);
81
- const useCase = new NotifyFinishedIssuePreparationUseCase_1.NotifyFinishedIssuePreparationUseCase(projectRepository, issueRepository, issueCommentRepository);
87
+ const useCase = new NotifyFinishedIssuePreparationUseCase_1.NotifyFinishedIssuePreparationUseCase(projectRepository, graphqlIssueRepository, issueCommentRepository);
82
88
  let thresholdForAutoReject = 3;
83
89
  if (options.thresholdForAutoReject !== undefined) {
84
90
  const parsed = Number(options.thresholdForAutoReject);
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/adapter/entry-points/cli/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/adapter/entry-points/cli/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,417 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.GraphqlIssueRepository = void 0;
4
+ function isStatusFieldsResponse(value) {
5
+ if (typeof value !== 'object' || value === null)
6
+ return false;
7
+ return true;
8
+ }
9
+ function isUpdateItemResponse(value) {
10
+ if (typeof value !== 'object' || value === null)
11
+ return false;
12
+ return true;
13
+ }
14
+ function isIssueTimelineResponse(value) {
15
+ if (typeof value !== 'object' || value === null)
16
+ return false;
17
+ return true;
18
+ }
19
+ function isIssueResponse(value) {
20
+ if (typeof value !== 'object' || value === null)
21
+ return false;
22
+ return true;
23
+ }
24
+ class GraphqlIssueRepository {
25
+ constructor(token) {
26
+ this.token = token;
27
+ }
28
+ async get(issueUrl, project) {
29
+ const { owner, repo, issueNumber } = this.parseIssueUrl(issueUrl);
30
+ const { projectNumber } = this.parseProjectUrl(project.url);
31
+ const query = `
32
+ query($owner: String!, $repo: String!, $issueNumber: Int!) {
33
+ repository(owner: $owner, name: $repo) {
34
+ issue(number: $issueNumber) {
35
+ number
36
+ title
37
+ state
38
+ body
39
+ createdAt
40
+ url
41
+ assignees(first: 100) {
42
+ nodes {
43
+ login
44
+ }
45
+ }
46
+ labels(first: 100) {
47
+ nodes {
48
+ name
49
+ }
50
+ }
51
+ projectItems(first: 100) {
52
+ nodes {
53
+ id
54
+ project {
55
+ number
56
+ }
57
+ fieldValueByName(name: "Status") {
58
+ ... on ProjectV2ItemFieldSingleSelectValue {
59
+ name
60
+ }
61
+ }
62
+ }
63
+ }
64
+ }
65
+ }
66
+ }
67
+ `;
68
+ const response = await fetch('https://api.github.com/graphql', {
69
+ method: 'POST',
70
+ headers: {
71
+ Authorization: `Bearer ${this.token}`,
72
+ 'Content-Type': 'application/json',
73
+ },
74
+ body: JSON.stringify({
75
+ query,
76
+ variables: {
77
+ owner,
78
+ repo,
79
+ issueNumber,
80
+ },
81
+ }),
82
+ });
83
+ // projectNumber is used below to filter project items, not in GraphQL query
84
+ void projectNumber;
85
+ if (!response.ok) {
86
+ throw new Error('Failed to fetch issue from GitHub GraphQL API');
87
+ }
88
+ const responseData = await response.json();
89
+ if (!isIssueResponse(responseData)) {
90
+ throw new Error('Unexpected response shape when fetching issue');
91
+ }
92
+ const issueData = responseData.data?.repository?.issue;
93
+ if (!issueData) {
94
+ return null;
95
+ }
96
+ const projectItem = issueData.projectItems?.nodes.find((item) => item.project?.number === projectNumber);
97
+ const mapState = (state) => {
98
+ if (state === 'OPEN')
99
+ return 'OPEN';
100
+ if (state === 'CLOSED')
101
+ return 'CLOSED';
102
+ if (state === 'MERGED')
103
+ return 'MERGED';
104
+ return 'OPEN';
105
+ };
106
+ const issue = {
107
+ nameWithOwner: `${owner}/${repo}`,
108
+ number: issueData.number,
109
+ title: issueData.title,
110
+ state: mapState(issueData.state),
111
+ status: projectItem?.fieldValueByName?.name ?? null,
112
+ story: null,
113
+ nextActionDate: null,
114
+ nextActionHour: null,
115
+ estimationMinutes: null,
116
+ dependedIssueUrls: [],
117
+ completionDate50PercentConfidence: null,
118
+ url: issueData.url,
119
+ assignees: issueData.assignees.nodes.map((a) => a.login),
120
+ labels: issueData.labels.nodes.map((l) => l.name),
121
+ org: owner,
122
+ repo: repo,
123
+ body: issueData.body,
124
+ itemId: projectItem?.id ?? '',
125
+ isPr: false,
126
+ isInProgress: false,
127
+ isClosed: issueData.state === 'CLOSED',
128
+ createdAt: new Date(issueData.createdAt),
129
+ };
130
+ return issue;
131
+ }
132
+ parseProjectUrl(projectUrl) {
133
+ const urlMatch = projectUrl.match(/github\.com\/(?:orgs|users)\/([^/]+)\/projects\/(\d+)/);
134
+ if (!urlMatch) {
135
+ throw new Error(`Invalid GitHub project URL: ${projectUrl}`);
136
+ }
137
+ const owner = urlMatch[1];
138
+ const projectNumber = parseInt(urlMatch[2], 10);
139
+ return { owner, projectNumber };
140
+ }
141
+ async getStatusOptionId(projectUrl, statusName) {
142
+ if (statusName === null) {
143
+ return null;
144
+ }
145
+ const { owner, projectNumber } = this.parseProjectUrl(projectUrl);
146
+ const query = `
147
+ query($owner: String!, $number: Int!, $after: String) {
148
+ organization(login: $owner) {
149
+ projectV2(number: $number) {
150
+ id
151
+ fields(first: 100, after: $after) {
152
+ pageInfo {
153
+ endCursor
154
+ hasNextPage
155
+ }
156
+ nodes {
157
+ ... on ProjectV2SingleSelectField {
158
+ id
159
+ name
160
+ options {
161
+ id
162
+ name
163
+ }
164
+ }
165
+ }
166
+ }
167
+ }
168
+ }
169
+ user(login: $owner) {
170
+ projectV2(number: $number) {
171
+ id
172
+ fields(first: 100, after: $after) {
173
+ pageInfo {
174
+ endCursor
175
+ hasNextPage
176
+ }
177
+ nodes {
178
+ ... on ProjectV2SingleSelectField {
179
+ id
180
+ name
181
+ options {
182
+ id
183
+ name
184
+ }
185
+ }
186
+ }
187
+ }
188
+ }
189
+ }
190
+ }
191
+ `;
192
+ let after = null;
193
+ let hasNextPage = true;
194
+ while (hasNextPage) {
195
+ const response = await fetch('https://api.github.com/graphql', {
196
+ method: 'POST',
197
+ headers: {
198
+ Authorization: `Bearer ${this.token}`,
199
+ 'Content-Type': 'application/json',
200
+ },
201
+ body: JSON.stringify({
202
+ query,
203
+ variables: {
204
+ owner,
205
+ number: projectNumber,
206
+ after,
207
+ },
208
+ }),
209
+ });
210
+ if (!response.ok) {
211
+ return null;
212
+ }
213
+ const responseData = await response.json();
214
+ if (!isStatusFieldsResponse(responseData)) {
215
+ return null;
216
+ }
217
+ const result = responseData;
218
+ const projectData = result.data?.organization?.projectV2 || result.data?.user?.projectV2;
219
+ if (!projectData) {
220
+ return null;
221
+ }
222
+ const fields = projectData.fields.nodes;
223
+ const statusField = fields.find((f) => f.name === 'Status');
224
+ if (statusField) {
225
+ const option = statusField.options.find((o) => o.name === statusName);
226
+ if (option) {
227
+ return {
228
+ projectId: projectData.id,
229
+ fieldId: statusField.id,
230
+ optionId: option.id,
231
+ };
232
+ }
233
+ }
234
+ hasNextPage = projectData.fields.pageInfo.hasNextPage;
235
+ after = projectData.fields.pageInfo.endCursor;
236
+ }
237
+ return null;
238
+ }
239
+ async update(issue, project) {
240
+ const statusInfo = await this.getStatusOptionId(project.url, issue.status);
241
+ if (!statusInfo) {
242
+ throw new Error(`Status option not found for status: ${issue.status}`);
243
+ }
244
+ const mutation = `
245
+ mutation($projectId: ID!, $itemId: ID!, $fieldId: ID!, $value: ProjectV2FieldValue!) {
246
+ updateProjectV2ItemFieldValue(
247
+ input: {
248
+ projectId: $projectId
249
+ itemId: $itemId
250
+ fieldId: $fieldId
251
+ value: $value
252
+ }
253
+ ) {
254
+ projectV2Item {
255
+ id
256
+ }
257
+ }
258
+ }
259
+ `;
260
+ const response = await fetch('https://api.github.com/graphql', {
261
+ method: 'POST',
262
+ headers: {
263
+ Authorization: `Bearer ${this.token}`,
264
+ 'Content-Type': 'application/json',
265
+ },
266
+ body: JSON.stringify({
267
+ query: mutation,
268
+ variables: {
269
+ projectId: statusInfo.projectId,
270
+ itemId: issue.itemId,
271
+ fieldId: statusInfo.fieldId,
272
+ value: { singleSelectOptionId: statusInfo.optionId },
273
+ },
274
+ }),
275
+ });
276
+ if (!response.ok) {
277
+ throw new Error(`GitHub API error`);
278
+ }
279
+ const responseData = await response.json();
280
+ if (!isUpdateItemResponse(responseData)) {
281
+ throw new Error('Invalid API response format');
282
+ }
283
+ if (responseData.errors) {
284
+ throw new Error(`GraphQL errors: ${JSON.stringify(responseData.errors)}`);
285
+ }
286
+ }
287
+ parseIssueUrl(issueUrl) {
288
+ const urlMatch = issueUrl.match(/github\.com\/([^/]+)\/([^/]+)\/issues\/(\d+)/);
289
+ if (!urlMatch) {
290
+ throw new Error(`Invalid GitHub issue URL: ${issueUrl}`);
291
+ }
292
+ return {
293
+ owner: urlMatch[1],
294
+ repo: urlMatch[2],
295
+ issueNumber: parseInt(urlMatch[3], 10),
296
+ };
297
+ }
298
+ async findRelatedOpenPRs(issueUrl) {
299
+ const { owner, repo, issueNumber } = this.parseIssueUrl(issueUrl);
300
+ const query = `
301
+ query($owner: String!, $repo: String!, $issueNumber: Int!, $after: String) {
302
+ repository(owner: $owner, name: $repo) {
303
+ issue(number: $issueNumber) {
304
+ timelineItems(first: 100, after: $after, itemTypes: [CROSS_REFERENCED_EVENT]) {
305
+ pageInfo {
306
+ endCursor
307
+ hasNextPage
308
+ }
309
+ nodes {
310
+ __typename
311
+ ... on CrossReferencedEvent {
312
+ willCloseTarget
313
+ source {
314
+ __typename
315
+ ... on PullRequest {
316
+ url
317
+ number
318
+ state
319
+ mergeable
320
+ baseRefName
321
+ headRefName
322
+ commits(last: 1) {
323
+ nodes {
324
+ commit {
325
+ statusCheckRollup {
326
+ state
327
+ }
328
+ }
329
+ }
330
+ }
331
+ reviewThreads(first: 100) {
332
+ nodes {
333
+ isResolved
334
+ }
335
+ }
336
+ headRefName
337
+ baseRef {
338
+ name
339
+ }
340
+ }
341
+ }
342
+ }
343
+ }
344
+ }
345
+ }
346
+ }
347
+ }
348
+ `;
349
+ const relatedPRsMap = new Map();
350
+ let after = null;
351
+ let hasNextPage = true;
352
+ while (hasNextPage) {
353
+ const response = await fetch('https://api.github.com/graphql', {
354
+ method: 'POST',
355
+ headers: {
356
+ Authorization: `Bearer ${this.token}`,
357
+ 'Content-Type': 'application/json',
358
+ },
359
+ body: JSON.stringify({
360
+ query,
361
+ variables: {
362
+ owner,
363
+ repo,
364
+ issueNumber,
365
+ after,
366
+ },
367
+ }),
368
+ });
369
+ if (!response.ok) {
370
+ throw new Error(`Failed to fetch issue timeline from GitHub GraphQL API`);
371
+ }
372
+ const responseData = await response.json();
373
+ if (!isIssueTimelineResponse(responseData)) {
374
+ throw new Error('Unexpected response shape when fetching issue timeline from GitHub GraphQL API');
375
+ }
376
+ const result = responseData;
377
+ const issueData = result.data?.repository?.issue;
378
+ if (!issueData) {
379
+ throw new Error('Issue not found when fetching timeline from GitHub GraphQL API');
380
+ }
381
+ const timelineItems = issueData.timelineItems.nodes;
382
+ for (const item of timelineItems) {
383
+ if (item.__typename !== 'CrossReferencedEvent')
384
+ continue;
385
+ if (!item.source || item.source.__typename !== 'PullRequest')
386
+ continue;
387
+ if (item.source.state !== 'OPEN')
388
+ continue;
389
+ const pr = item.source;
390
+ const prUrl = pr.url || '';
391
+ const isConflicted = pr.mergeable === 'CONFLICTING';
392
+ const lastCommit = pr.commits?.nodes[0]?.commit;
393
+ const ciState = lastCommit?.statusCheckRollup?.state;
394
+ const isPassedAllCiJob = ciState === 'SUCCESS';
395
+ const reviewThreads = pr.reviewThreads?.nodes || [];
396
+ const isResolvedAllReviewComments = reviewThreads.length === 0 ||
397
+ reviewThreads.every((thread) => thread.isResolved);
398
+ // Note: compareWithBaseRef is not available in GraphQL timeline items.
399
+ // To get accurate behindBy, a separate API call per PR would be needed.
400
+ // For now, we set isBranchOutOfDate to false. Conflicts are still detected via mergeable.
401
+ const isBranchOutOfDate = false;
402
+ relatedPRsMap.set(prUrl, {
403
+ url: prUrl,
404
+ isConflicted,
405
+ isPassedAllCiJob,
406
+ isResolvedAllReviewComments,
407
+ isBranchOutOfDate,
408
+ });
409
+ }
410
+ hasNextPage = issueData.timelineItems.pageInfo.hasNextPage;
411
+ after = issueData.timelineItems.pageInfo.endCursor;
412
+ }
413
+ return Array.from(relatedPRsMap.values());
414
+ }
415
+ }
416
+ exports.GraphqlIssueRepository = GraphqlIssueRepository;
417
+ //# sourceMappingURL=GraphqlIssueRepository.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GraphqlIssueRepository.js","sourceRoot":"","sources":["../../../src/adapter/repositories/GraphqlIssueRepository.ts"],"names":[],"mappings":"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"}