npm-cli-gh-issue-preparator 1.8.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 (76) hide show
  1. package/CHANGELOG.md +14 -0
  2. package/bin/adapter/entry-points/cli/index.js +33 -8
  3. package/bin/adapter/entry-points/cli/index.js.map +1 -1
  4. package/bin/adapter/repositories/GitHubIssueCommentRepository.js +183 -0
  5. package/bin/adapter/repositories/GitHubIssueCommentRepository.js.map +1 -0
  6. package/bin/adapter/repositories/GraphqlIssueRepository.js +417 -0
  7. package/bin/adapter/repositories/GraphqlIssueRepository.js.map +1 -0
  8. package/bin/adapter/repositories/TowerDefenceIssueRepository.js +47 -0
  9. package/bin/adapter/repositories/TowerDefenceIssueRepository.js.map +1 -0
  10. package/bin/adapter/repositories/TowerDefenceProjectRepository.js +45 -0
  11. package/bin/adapter/repositories/TowerDefenceProjectRepository.js.map +1 -0
  12. package/bin/domain/entities/Member.js +3 -0
  13. package/bin/domain/entities/Member.js.map +1 -0
  14. package/bin/domain/entities/StoryObjectMap.js +3 -0
  15. package/bin/domain/entities/StoryObjectMap.js.map +1 -0
  16. package/bin/domain/usecases/NotifyFinishedIssuePreparationUseCase.js +43 -2
  17. package/bin/domain/usecases/NotifyFinishedIssuePreparationUseCase.js.map +1 -1
  18. package/bin/domain/usecases/StartPreparationUseCase.js +35 -3
  19. package/bin/domain/usecases/StartPreparationUseCase.js.map +1 -1
  20. package/bin/domain/usecases/adapter-interfaces/IssueCommentRepository.js +3 -0
  21. package/bin/domain/usecases/adapter-interfaces/IssueCommentRepository.js.map +1 -0
  22. package/package.json +3 -2
  23. package/src/adapter/entry-points/cli/index.integration.test.ts +64 -117
  24. package/src/adapter/entry-points/cli/index.test.ts +124 -2
  25. package/src/adapter/entry-points/cli/index.ts +68 -8
  26. package/src/adapter/repositories/GitHubIssueCommentRepository.test.ts +418 -0
  27. package/src/adapter/repositories/GitHubIssueCommentRepository.ts +277 -0
  28. package/src/adapter/repositories/GraphqlIssueRepository.integration.test.ts +162 -0
  29. package/src/adapter/repositories/GraphqlIssueRepository.test.ts +1333 -0
  30. package/src/adapter/repositories/{GitHubIssueRepository.ts → GraphqlIssueRepository.ts} +203 -412
  31. package/src/adapter/repositories/TowerDefenceIssueRepository.integration.test.ts +106 -0
  32. package/src/adapter/repositories/TowerDefenceIssueRepository.test.ts +141 -0
  33. package/src/adapter/repositories/TowerDefenceIssueRepository.ts +66 -0
  34. package/src/adapter/repositories/TowerDefenceProjectRepository.test.ts +215 -0
  35. package/src/adapter/repositories/TowerDefenceProjectRepository.ts +58 -0
  36. package/src/domain/entities/Issue.ts +23 -7
  37. package/src/domain/entities/Member.ts +3 -0
  38. package/src/domain/entities/Project.ts +52 -3
  39. package/src/domain/entities/StoryObjectMap.ts +13 -0
  40. package/src/domain/usecases/NotifyFinishedIssuePreparationUseCase.test.ts +470 -26
  41. package/src/domain/usecases/NotifyFinishedIssuePreparationUseCase.ts +83 -4
  42. package/src/domain/usecases/StartPreparationUseCase.test.ts +358 -96
  43. package/src/domain/usecases/StartPreparationUseCase.ts +66 -15
  44. package/src/domain/usecases/adapter-interfaces/IssueCommentRepository.ts +7 -0
  45. package/src/domain/usecases/adapter-interfaces/IssueRepository.ts +2 -0
  46. package/types/adapter/entry-points/cli/index.d.ts.map +1 -1
  47. package/types/adapter/repositories/GitHubIssueCommentRepository.d.ts +12 -0
  48. package/types/adapter/repositories/GitHubIssueCommentRepository.d.ts.map +1 -0
  49. package/types/adapter/repositories/GitHubIssueRepository.d.ts +16 -13
  50. package/types/adapter/repositories/GitHubProjectRepository.d.ts +6 -6
  51. package/types/adapter/repositories/GraphqlIssueRepository.d.ts +14 -0
  52. package/types/adapter/repositories/GraphqlIssueRepository.d.ts.map +1 -0
  53. package/types/adapter/repositories/TowerDefenceIssueRepository.d.ts +16 -0
  54. package/types/adapter/repositories/TowerDefenceIssueRepository.d.ts.map +1 -0
  55. package/types/adapter/repositories/TowerDefenceProjectRepository.d.ts +14 -0
  56. package/types/adapter/repositories/TowerDefenceProjectRepository.d.ts.map +1 -0
  57. package/types/domain/entities/Issue.d.ts +23 -6
  58. package/types/domain/entities/Issue.d.ts.map +1 -1
  59. package/types/domain/entities/Member.d.ts +4 -0
  60. package/types/domain/entities/Member.d.ts.map +1 -0
  61. package/types/domain/entities/Project.d.ts +43 -3
  62. package/types/domain/entities/Project.d.ts.map +1 -1
  63. package/types/domain/entities/StoryObjectMap.d.ts +10 -0
  64. package/types/domain/entities/StoryObjectMap.d.ts.map +1 -0
  65. package/types/domain/usecases/NotifyFinishedIssuePreparationUseCase.d.ts +6 -2
  66. package/types/domain/usecases/NotifyFinishedIssuePreparationUseCase.d.ts.map +1 -1
  67. package/types/domain/usecases/StartPreparationUseCase.d.ts +6 -1
  68. package/types/domain/usecases/StartPreparationUseCase.d.ts.map +1 -1
  69. package/types/domain/usecases/adapter-interfaces/IssueCommentRepository.d.ts +7 -0
  70. package/types/domain/usecases/adapter-interfaces/IssueCommentRepository.d.ts.map +1 -0
  71. package/types/domain/usecases/adapter-interfaces/IssueRepository.d.ts +2 -0
  72. package/types/domain/usecases/adapter-interfaces/IssueRepository.d.ts.map +1 -1
  73. package/src/adapter/repositories/GitHubIssueRepository.integration.test.ts +0 -66
  74. package/src/adapter/repositories/GitHubIssueRepository.test.ts +0 -2395
  75. package/src/adapter/repositories/GitHubProjectRepository.test.ts +0 -403
  76. package/src/adapter/repositories/GitHubProjectRepository.ts +0 -249
package/CHANGELOG.md CHANGED
@@ -1,3 +1,17 @@
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
+
8
+ # [1.9.0](https://github.com/HiromiShikata/npm-cli-gh-issue-preparator/compare/v1.8.0...v1.9.0) (2026-02-11)
9
+
10
+
11
+ ### Features
12
+
13
+ * **core:** use getStoryObjectMap from tower-defence library ([980aed8](https://github.com/HiromiShikata/npm-cli-gh-issue-preparator/commit/980aed86127965c68d38e1336ef007aad5d810ee)), closes [#82](https://github.com/HiromiShikata/npm-cli-gh-issue-preparator/issues/82)
14
+
1
15
  # [1.8.0](https://github.com/HiromiShikata/npm-cli-gh-issue-preparator/compare/v1.7.1...v1.8.0) (2026-02-09)
2
16
 
3
17
 
@@ -10,8 +10,10 @@ dotenv_1.default.config();
10
10
  const commander_1 = require("commander");
11
11
  const StartPreparationUseCase_1 = require("../../../domain/usecases/StartPreparationUseCase");
12
12
  const NotifyFinishedIssuePreparationUseCase_1 = require("../../../domain/usecases/NotifyFinishedIssuePreparationUseCase");
13
- const GitHubProjectRepository_1 = require("../../repositories/GitHubProjectRepository");
14
- const GitHubIssueRepository_1 = require("../../repositories/GitHubIssueRepository");
13
+ const TowerDefenceIssueRepository_1 = require("../../repositories/TowerDefenceIssueRepository");
14
+ const GraphqlIssueRepository_1 = require("../../repositories/GraphqlIssueRepository");
15
+ const TowerDefenceProjectRepository_1 = require("../../repositories/TowerDefenceProjectRepository");
16
+ const GitHubIssueCommentRepository_1 = require("../../repositories/GitHubIssueCommentRepository");
15
17
  const NodeLocalCommandRunner_1 = require("../../repositories/NodeLocalCommandRunner");
16
18
  const program = new commander_1.Command();
17
19
  exports.program = program;
@@ -25,6 +27,7 @@ program
25
27
  .requiredOption('--awaitingWorkspaceStatus <status>', 'Status for issues awaiting workspace')
26
28
  .requiredOption('--preparationStatus <status>', 'Status for issues in preparation')
27
29
  .requiredOption('--defaultAgentName <name>', 'Default agent name')
30
+ .requiredOption('--configFilePath <path>', 'Path to config file for tower defence management')
28
31
  .option('--logFilePath <path>', 'Path to log file')
29
32
  .option('--maximumPreparingIssuesCount <count>', 'Maximum number of issues in preparation status (default: 6)')
30
33
  .action(async (options) => {
@@ -33,10 +36,15 @@ program
33
36
  console.error('GH_TOKEN environment variable is required');
34
37
  process.exit(1);
35
38
  }
36
- const projectRepository = new GitHubProjectRepository_1.GitHubProjectRepository(token);
37
- const issueRepository = new GitHubIssueRepository_1.GitHubIssueRepository(token);
39
+ const projectRepository = new TowerDefenceProjectRepository_1.TowerDefenceProjectRepository(options.configFilePath, token);
40
+ const towerDefenceIssueRepository = new TowerDefenceIssueRepository_1.TowerDefenceIssueRepository(options.configFilePath, token);
41
+ const graphqlIssueRepository = new GraphqlIssueRepository_1.GraphqlIssueRepository(token);
38
42
  const localCommandRunner = new NodeLocalCommandRunner_1.NodeLocalCommandRunner();
39
- 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);
40
48
  let maximumPreparingIssuesCount = null;
41
49
  if (options.maximumPreparingIssuesCount !== undefined) {
42
50
  const parsedCount = Number(options.maximumPreparingIssuesCount);
@@ -63,21 +71,38 @@ program
63
71
  .requiredOption('--projectUrl <url>', 'GitHub project URL')
64
72
  .requiredOption('--issueUrl <url>', 'GitHub issue URL')
65
73
  .requiredOption('--preparationStatus <status>', 'Status for issues in preparation')
74
+ .requiredOption('--awaitingWorkspaceStatus <status>', 'Status for issues awaiting workspace')
66
75
  .requiredOption('--awaitingQualityCheckStatus <status>', 'Status for issues awaiting quality check')
76
+ .requiredOption('--configFilePath <path>', 'Path to config file for tower defence management')
77
+ .option('--thresholdForAutoReject <count>', 'Threshold for auto-escalation after consecutive rejections (default: 3)')
67
78
  .action(async (options) => {
68
79
  const token = process.env.GH_TOKEN;
69
80
  if (!token) {
70
81
  console.error('GH_TOKEN environment variable is required');
71
82
  process.exit(1);
72
83
  }
73
- const projectRepository = new GitHubProjectRepository_1.GitHubProjectRepository(token);
74
- const issueRepository = new GitHubIssueRepository_1.GitHubIssueRepository(token);
75
- const useCase = new NotifyFinishedIssuePreparationUseCase_1.NotifyFinishedIssuePreparationUseCase(projectRepository, issueRepository);
84
+ const projectRepository = new TowerDefenceProjectRepository_1.TowerDefenceProjectRepository(options.configFilePath, token);
85
+ const graphqlIssueRepository = new GraphqlIssueRepository_1.GraphqlIssueRepository(token);
86
+ const issueCommentRepository = new GitHubIssueCommentRepository_1.GitHubIssueCommentRepository(token);
87
+ const useCase = new NotifyFinishedIssuePreparationUseCase_1.NotifyFinishedIssuePreparationUseCase(projectRepository, graphqlIssueRepository, issueCommentRepository);
88
+ let thresholdForAutoReject = 3;
89
+ if (options.thresholdForAutoReject !== undefined) {
90
+ const parsed = Number(options.thresholdForAutoReject);
91
+ if (!Number.isFinite(parsed) ||
92
+ !Number.isInteger(parsed) ||
93
+ parsed <= 0) {
94
+ console.error('Invalid value for --thresholdForAutoReject. It must be a positive integer.');
95
+ process.exit(1);
96
+ }
97
+ thresholdForAutoReject = parsed;
98
+ }
76
99
  await useCase.run({
77
100
  projectUrl: options.projectUrl,
78
101
  issueUrl: options.issueUrl,
79
102
  preparationStatus: options.preparationStatus,
103
+ awaitingWorkspaceStatus: options.awaitingWorkspaceStatus,
80
104
  awaitingQualityCheckStatus: options.awaitingQualityCheckStatus,
105
+ thresholdForAutoReject,
81
106
  });
82
107
  });
83
108
  /* istanbul ignore next */
@@ -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,183 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.GitHubIssueCommentRepository = void 0;
4
+ function isIssueCommentsResponse(value) {
5
+ if (typeof value !== 'object' || value === null)
6
+ return false;
7
+ return true;
8
+ }
9
+ function isCreateCommentResponse(value) {
10
+ if (typeof value !== 'object' || value === null)
11
+ return false;
12
+ return true;
13
+ }
14
+ function isIssueIdResponse(value) {
15
+ if (typeof value !== 'object' || value === null)
16
+ return false;
17
+ return true;
18
+ }
19
+ class GitHubIssueCommentRepository {
20
+ constructor(token) {
21
+ this.token = token;
22
+ }
23
+ parseIssueUrl(issue) {
24
+ const urlMatch = issue.url.match(/github\.com\/([^/]+)\/([^/]+)\/issues\/(\d+)/);
25
+ if (!urlMatch) {
26
+ throw new Error(`Invalid GitHub issue URL: ${issue.url}`);
27
+ }
28
+ return {
29
+ owner: urlMatch[1],
30
+ repo: urlMatch[2],
31
+ issueNumber: parseInt(urlMatch[3], 10),
32
+ };
33
+ }
34
+ async getCommentsFromIssue(issue) {
35
+ const { owner, repo, issueNumber } = this.parseIssueUrl(issue);
36
+ const query = `
37
+ query($owner: String!, $repo: String!, $issueNumber: Int!, $after: String) {
38
+ repository(owner: $owner, name: $repo) {
39
+ issue(number: $issueNumber) {
40
+ comments(first: 100, after: $after) {
41
+ pageInfo {
42
+ endCursor
43
+ hasNextPage
44
+ }
45
+ nodes {
46
+ author {
47
+ login
48
+ }
49
+ body
50
+ createdAt
51
+ }
52
+ }
53
+ }
54
+ }
55
+ }
56
+ `;
57
+ const comments = [];
58
+ let after = null;
59
+ let hasNextPage = true;
60
+ while (hasNextPage) {
61
+ const response = await fetch('https://api.github.com/graphql', {
62
+ method: 'POST',
63
+ headers: {
64
+ Authorization: `Bearer ${this.token}`,
65
+ 'Content-Type': 'application/json',
66
+ },
67
+ body: JSON.stringify({
68
+ query,
69
+ variables: {
70
+ owner,
71
+ repo,
72
+ issueNumber,
73
+ after,
74
+ },
75
+ }),
76
+ });
77
+ if (!response.ok) {
78
+ throw new Error(`Failed to fetch comments from GitHub GraphQL API: ${response.status} ${response.statusText}`);
79
+ }
80
+ const responseData = await response.json();
81
+ if (!isIssueCommentsResponse(responseData)) {
82
+ throw new Error('Unexpected response shape when fetching comments from GitHub GraphQL API');
83
+ }
84
+ const issueData = responseData.data?.repository?.issue;
85
+ if (!issueData) {
86
+ throw new Error('Issue not found when fetching comments from GitHub GraphQL API');
87
+ }
88
+ const commentNodes = issueData.comments.nodes;
89
+ for (const node of commentNodes) {
90
+ comments.push({
91
+ author: node.author?.login || '',
92
+ content: node.body,
93
+ createdAt: new Date(node.createdAt),
94
+ });
95
+ }
96
+ hasNextPage = issueData.comments.pageInfo.hasNextPage;
97
+ after = issueData.comments.pageInfo.endCursor;
98
+ }
99
+ return comments;
100
+ }
101
+ async getIssueNodeId(issue) {
102
+ const { owner, repo, issueNumber } = this.parseIssueUrl(issue);
103
+ const query = `
104
+ query($owner: String!, $repo: String!, $issueNumber: Int!) {
105
+ repository(owner: $owner, name: $repo) {
106
+ issue(number: $issueNumber) {
107
+ id
108
+ }
109
+ }
110
+ }
111
+ `;
112
+ const response = await fetch('https://api.github.com/graphql', {
113
+ method: 'POST',
114
+ headers: {
115
+ Authorization: `Bearer ${this.token}`,
116
+ 'Content-Type': 'application/json',
117
+ },
118
+ body: JSON.stringify({
119
+ query,
120
+ variables: {
121
+ owner,
122
+ repo,
123
+ issueNumber,
124
+ },
125
+ }),
126
+ });
127
+ if (!response.ok) {
128
+ throw new Error(`Failed to fetch issue ID from GitHub GraphQL API: ${response.status} ${response.statusText}`);
129
+ }
130
+ const responseData = await response.json();
131
+ if (!isIssueIdResponse(responseData)) {
132
+ throw new Error('Unexpected response shape when fetching issue ID from GitHub GraphQL API');
133
+ }
134
+ const issueId = responseData.data?.repository?.issue?.id;
135
+ if (!issueId) {
136
+ throw new Error('Issue not found when fetching issue ID from GitHub GraphQL API');
137
+ }
138
+ return issueId;
139
+ }
140
+ async createComment(issue, commentContent) {
141
+ const issueId = await this.getIssueNodeId(issue);
142
+ const mutation = `
143
+ mutation($issueId: ID!, $body: String!) {
144
+ addComment(input: {
145
+ subjectId: $issueId
146
+ body: $body
147
+ }) {
148
+ commentEdge {
149
+ node {
150
+ id
151
+ }
152
+ }
153
+ }
154
+ }
155
+ `;
156
+ const response = await fetch('https://api.github.com/graphql', {
157
+ method: 'POST',
158
+ headers: {
159
+ Authorization: `Bearer ${this.token}`,
160
+ 'Content-Type': 'application/json',
161
+ },
162
+ body: JSON.stringify({
163
+ query: mutation,
164
+ variables: {
165
+ issueId,
166
+ body: commentContent,
167
+ },
168
+ }),
169
+ });
170
+ if (!response.ok) {
171
+ throw new Error(`Failed to create comment via GitHub GraphQL API: ${response.status} ${response.statusText}`);
172
+ }
173
+ const responseData = await response.json();
174
+ if (!isCreateCommentResponse(responseData)) {
175
+ throw new Error('Invalid API response format when creating comment');
176
+ }
177
+ if (responseData.errors) {
178
+ throw new Error(`GraphQL errors when creating comment: ${JSON.stringify(responseData.errors)}`);
179
+ }
180
+ }
181
+ }
182
+ exports.GitHubIssueCommentRepository = GitHubIssueCommentRepository;
183
+ //# sourceMappingURL=GitHubIssueCommentRepository.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GitHubIssueCommentRepository.js","sourceRoot":"","sources":["../../../src/adapter/repositories/GitHubIssueCommentRepository.ts"],"names":[],"mappings":"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"}