github-issue-tower-defence-management 1.143.6 → 1.144.1

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 (63) hide show
  1. package/CHANGELOG.md +14 -0
  2. package/bin/adapter/entry-points/cli/index.js +2 -0
  3. package/bin/adapter/entry-points/cli/index.js.map +1 -1
  4. package/bin/adapter/entry-points/console/consoleItemUrlLookup.js +88 -0
  5. package/bin/adapter/entry-points/console/consoleItemUrlLookup.js.map +1 -0
  6. package/bin/adapter/entry-points/console/consoleOperationApi.js +44 -1
  7. package/bin/adapter/entry-points/console/consoleOperationApi.js.map +1 -1
  8. package/bin/adapter/entry-points/console/ui-dist/assets/index-BYoG8oQb.js +82 -0
  9. package/bin/adapter/entry-points/console/ui-dist/index.html +1 -1
  10. package/bin/adapter/entry-points/console/webServer.js +3 -0
  11. package/bin/adapter/entry-points/console/webServer.js.map +1 -1
  12. package/bin/adapter/repositories/LocalCommandIssueAttachmentRepository.js +75 -0
  13. package/bin/adapter/repositories/LocalCommandIssueAttachmentRepository.js.map +1 -0
  14. package/bin/domain/usecases/adapter-interfaces/IssueAttachmentRepository.js +3 -0
  15. package/bin/domain/usecases/adapter-interfaces/IssueAttachmentRepository.js.map +1 -0
  16. package/bin/domain/usecases/console/GenerateConsoleListsUseCase.js +26 -3
  17. package/bin/domain/usecases/console/GenerateConsoleListsUseCase.js.map +1 -1
  18. package/package.json +1 -1
  19. package/src/adapter/entry-points/cli/index.ts +4 -0
  20. package/src/adapter/entry-points/console/consoleItemUrlLookup.test.ts +63 -0
  21. package/src/adapter/entry-points/console/consoleItemUrlLookup.ts +66 -0
  22. package/src/adapter/entry-points/console/consoleOperationApi.test.ts +155 -0
  23. package/src/adapter/entry-points/console/consoleOperationApi.ts +56 -0
  24. package/src/adapter/entry-points/console/ui/e2e/consoleTestHarness.ts +3 -0
  25. package/src/adapter/entry-points/console/ui/src/features/console/components/detail/ConsoleCommentComposer.stories.tsx +17 -0
  26. package/src/adapter/entry-points/console/ui/src/features/console/components/detail/ConsoleCommentComposer.test.tsx +149 -1
  27. package/src/adapter/entry-points/console/ui/src/features/console/components/detail/ConsoleCommentComposer.tsx +107 -1
  28. package/src/adapter/entry-points/console/ui/src/features/console/hooks/useConsoleDetailPrefetch.test.ts +1 -0
  29. package/src/adapter/entry-points/console/ui/src/features/console/hooks/useConsoleItemDetailData.test.ts +2 -0
  30. package/src/adapter/entry-points/console/ui/src/features/console/hooks/useConsoleOperations.ts +22 -0
  31. package/src/adapter/entry-points/console/ui/src/features/console/hooks/useConsoleTabData.test.ts +39 -0
  32. package/src/adapter/entry-points/console/ui/src/features/console/hooks/useConsoleTabData.ts +14 -1
  33. package/src/adapter/entry-points/console/ui/src/features/console/lib/consoleApi.ts +35 -0
  34. package/src/adapter/entry-points/console/ui/src/features/console/logic/grouping.test.ts +1 -0
  35. package/src/adapter/entry-points/console/ui/src/features/console/logic/overlay.test.ts +1 -0
  36. package/src/adapter/entry-points/console/ui/src/features/console/logic/types.ts +1 -0
  37. package/src/adapter/entry-points/console/ui/src/features/console/pages/ConsoleItemDetailContainer.test.tsx +43 -1
  38. package/src/adapter/entry-points/console/ui/src/features/console/pages/ConsoleItemDetailContainer.tsx +8 -2
  39. package/src/adapter/entry-points/console/ui/src/features/console/pages/ConsolePage.test.tsx +7 -0
  40. package/src/adapter/entry-points/console/ui/src/features/console/testing/fixtures.ts +5 -0
  41. package/src/adapter/entry-points/console/ui-dist/assets/index-BYoG8oQb.js +82 -0
  42. package/src/adapter/entry-points/console/ui-dist/index.html +1 -1
  43. package/src/adapter/entry-points/console/webServer.ts +6 -0
  44. package/src/adapter/repositories/LocalCommandIssueAttachmentRepository.test.ts +136 -0
  45. package/src/adapter/repositories/LocalCommandIssueAttachmentRepository.ts +96 -0
  46. package/src/domain/usecases/adapter-interfaces/IssueAttachmentRepository.ts +9 -0
  47. package/src/domain/usecases/console/GenerateConsoleListsUseCase.test.ts +62 -0
  48. package/src/domain/usecases/console/GenerateConsoleListsUseCase.ts +45 -3
  49. package/types/adapter/entry-points/cli/index.d.ts.map +1 -1
  50. package/types/adapter/entry-points/console/consoleItemUrlLookup.d.ts +2 -0
  51. package/types/adapter/entry-points/console/consoleItemUrlLookup.d.ts.map +1 -0
  52. package/types/adapter/entry-points/console/consoleOperationApi.d.ts +3 -0
  53. package/types/adapter/entry-points/console/consoleOperationApi.d.ts.map +1 -1
  54. package/types/adapter/entry-points/console/webServer.d.ts +2 -0
  55. package/types/adapter/entry-points/console/webServer.d.ts.map +1 -1
  56. package/types/adapter/repositories/LocalCommandIssueAttachmentRepository.d.ts +15 -0
  57. package/types/adapter/repositories/LocalCommandIssueAttachmentRepository.d.ts.map +1 -0
  58. package/types/domain/usecases/adapter-interfaces/IssueAttachmentRepository.d.ts +9 -0
  59. package/types/domain/usecases/adapter-interfaces/IssueAttachmentRepository.d.ts.map +1 -0
  60. package/types/domain/usecases/console/GenerateConsoleListsUseCase.d.ts +2 -0
  61. package/types/domain/usecases/console/GenerateConsoleListsUseCase.d.ts.map +1 -1
  62. package/bin/adapter/entry-points/console/ui-dist/assets/index-DDQKZmBM.js +0 -81
  63. package/src/adapter/entry-points/console/ui-dist/assets/index-DDQKZmBM.js +0 -81
@@ -26,6 +26,7 @@ const issueItem = consoleListItemsFixture[2];
26
26
  type CachesOverrides = {
27
27
  relatedPrs?: ConsoleRelatedPullRequest[];
28
28
  prFiles?: ConsoleChangedFile[];
29
+ relatedPrsNeverResolve?: boolean;
29
30
  };
30
31
 
31
32
  const buildCaches = (overrides: CachesOverrides = {}): ConsoleCaches => {
@@ -34,7 +35,10 @@ const buildCaches = (overrides: CachesOverrides = {}): ConsoleCaches => {
34
35
  fetchComments: async () => [],
35
36
  fetchPrFiles: async () => overrides.prFiles ?? [],
36
37
  fetchPrCommits: async () => [],
37
- fetchRelatedPrs: async () => overrides.relatedPrs ?? [],
38
+ fetchRelatedPrs: async () =>
39
+ overrides.relatedPrsNeverResolve === true
40
+ ? new Promise<ConsoleRelatedPullRequest[]>(() => {})
41
+ : (overrides.relatedPrs ?? []),
38
42
  fetchIssueState: async () => ({
39
43
  state: 'open',
40
44
  merged: false,
@@ -75,6 +79,7 @@ const buildOperations = (): ConsoleOperationsApi => ({
75
79
  body: 'comment body',
76
80
  createdAt: '2026-06-19T11:58:00.000Z',
77
81
  })),
82
+ uploadAttachment: jest.fn(async () => ''),
78
83
  addInlineReviewComment: jest.fn(async () => {}),
79
84
  });
80
85
 
@@ -115,6 +120,43 @@ describe('ConsoleItemDetailContainer', () => {
115
120
  );
116
121
  });
117
122
 
123
+ it('shows Approve for an issue item from the generated related open pull request urls before the related pull requests are fetched', () => {
124
+ const operations = buildOperations();
125
+ const onQueueAction = jest.fn();
126
+ const bakedPullRequestUrl =
127
+ 'https://github.com/HiromiShikata/npm-cli-github-issue-tower-defence-management/pull/1372';
128
+ const itemWithBakedPullRequest = {
129
+ ...issueItem,
130
+ relatedOpenPullRequestUrls: [bakedPullRequestUrl],
131
+ };
132
+ const { getByText } = render(
133
+ <ConsoleItemDetailContainer
134
+ tab="prs"
135
+ item={itemWithBakedPullRequest}
136
+ caches={buildCaches({ relatedPrsNeverResolve: true })}
137
+ operations={operations}
138
+ statusOptions={consoleStatusOptionsFixture}
139
+ storyOptions={consoleStoryOptionsFixture}
140
+ storyColors={consoleStoryColorsFixture}
141
+ storyName="TDPM Console port"
142
+ overlayStatus={null}
143
+ now={Date.parse('2026-06-19T12:00:00.000Z')}
144
+ onQueueAction={onQueueAction}
145
+ />,
146
+ );
147
+
148
+ expect(getByText('Approve')).toBeInTheDocument();
149
+ fireEvent.click(getByText('Approve'));
150
+ const input = onQueueAction.mock.calls[0][0];
151
+ input.commit();
152
+ expect(operations.reviewPullRequest).toHaveBeenCalledWith(
153
+ itemWithBakedPullRequest,
154
+ bakedPullRequestUrl,
155
+ 'approve',
156
+ [],
157
+ );
158
+ });
159
+
118
160
  it('disables Reject until an inline comment is entered and then commits it as the request-changes review', async () => {
119
161
  const operations = buildOperations();
120
162
  const onQueueAction = jest.fn();
@@ -71,7 +71,10 @@ export const ConsoleItemDetailContainer = ({
71
71
  ),
72
72
  [caches.state],
73
73
  );
74
- const hasPullRequest = item.isPr || detail.relatedPullRequests.length > 0;
74
+ const hasPullRequest =
75
+ item.isPr ||
76
+ item.relatedOpenPullRequestUrls.length > 0 ||
77
+ detail.relatedPullRequests.length > 0;
75
78
  const [pendingReviewComments, setPendingReviewComments] = useState<
76
79
  ConsolePendingReviewComment[]
77
80
  >([]);
@@ -89,7 +92,9 @@ export const ConsoleItemDetailContainer = ({
89
92
  onReview: (action) => {
90
93
  const prUrl = item.isPr
91
94
  ? item.url
92
- : (detail.relatedPullRequests[0]?.pullRequest.url ?? item.url);
95
+ : (detail.relatedPullRequests[0]?.pullRequest.url ??
96
+ item.relatedOpenPullRequestUrls[0] ??
97
+ item.url);
93
98
  const reviewComments =
94
99
  action === 'request_changes' ? pendingReviewComments : [];
95
100
  onQueueAction({
@@ -173,6 +178,7 @@ export const ConsoleItemDetailContainer = ({
173
178
  isPr={item.isPr}
174
179
  now={now}
175
180
  onSubmit={(body) => operations.addComment(item, body)}
181
+ onUploadFile={(file) => operations.uploadAttachment(item, file)}
176
182
  />
177
183
  }
178
184
  operationBar={
@@ -37,6 +37,7 @@ const listPayload = (tab: string) => ({
37
37
  projectItemId: 'PVTI_1',
38
38
  itemId: 'PVTI_1',
39
39
  isPr: true,
40
+ relatedOpenPullRequestUrls: [],
40
41
  story: 'TDPM Console port',
41
42
  status: 'Awaiting Quality Check',
42
43
  nextActionDate: null,
@@ -57,6 +58,7 @@ const listPayload = (tab: string) => ({
57
58
  projectItemId: 'PVTI_2',
58
59
  itemId: 'PVTI_2',
59
60
  isPr: false,
61
+ relatedOpenPullRequestUrls: [],
60
62
  story: 'TDPM Console port',
61
63
  status: 'Unread',
62
64
  nextActionDate: null,
@@ -266,6 +268,7 @@ describe('ConsolePage', () => {
266
268
  projectItemId: 'PVTI_B1',
267
269
  itemId: 'PVTI_B1',
268
270
  isPr: false,
271
+ relatedOpenPullRequestUrls: [],
269
272
  story: 'TDPM Console port',
270
273
  status: 'In Progress',
271
274
  nextActionDate: null,
@@ -283,6 +286,7 @@ describe('ConsolePage', () => {
283
286
  projectItemId: 'PVTI_B2',
284
287
  itemId: 'PVTI_B2',
285
288
  isPr: false,
289
+ relatedOpenPullRequestUrls: [],
286
290
  story: 'TDPM Console port',
287
291
  status: 'In Progress',
288
292
  nextActionDate: null,
@@ -348,6 +352,7 @@ describe('ConsolePage', () => {
348
352
  projectItemId: 'PVTI_B1',
349
353
  itemId: 'PVTI_B1',
350
354
  isPr: false,
355
+ relatedOpenPullRequestUrls: [],
351
356
  story: 'TDPM Console port',
352
357
  status: 'In Progress',
353
358
  nextActionDate: null,
@@ -472,6 +477,7 @@ const twoItemPrPayload = () => ({
472
477
  projectItemId: 'PVTI_1',
473
478
  itemId: 'PVTI_1',
474
479
  isPr: true,
480
+ relatedOpenPullRequestUrls: [],
475
481
  story: 'TDPM Console port',
476
482
  status: 'Awaiting Quality Check',
477
483
  nextActionDate: null,
@@ -489,6 +495,7 @@ const twoItemPrPayload = () => ({
489
495
  projectItemId: 'PVTI_2',
490
496
  itemId: 'PVTI_2',
491
497
  isPr: true,
498
+ relatedOpenPullRequestUrls: [],
492
499
  story: 'TDPM Console port',
493
500
  status: 'Awaiting Quality Check',
494
501
  nextActionDate: null,
@@ -56,6 +56,7 @@ export const consoleListItemsFixture: ConsoleListItem[] = [
56
56
  projectItemId: 'PVTI_lADOABCD1234zgABCD01',
57
57
  itemId: 'PVTI_lADOABCD1234zgABCD01',
58
58
  isPr: true,
59
+ relatedOpenPullRequestUrls: [],
59
60
  story: 'TDPM Console port',
60
61
  status: 'Awaiting Quality Check',
61
62
  nextActionDate: null,
@@ -77,6 +78,7 @@ export const consoleListItemsFixture: ConsoleListItem[] = [
77
78
  projectItemId: 'PVTI_lADOABCD1234zgABCD02',
78
79
  itemId: 'PVTI_lADOABCD1234zgABCD02',
79
80
  isPr: true,
81
+ relatedOpenPullRequestUrls: [],
80
82
  story: 'TDPM Console port',
81
83
  status: 'Preparation',
82
84
  nextActionDate: null,
@@ -95,6 +97,7 @@ export const consoleListItemsFixture: ConsoleListItem[] = [
95
97
  projectItemId: 'PVTI_lADOABCD1234zgABCD03',
96
98
  itemId: 'PVTI_lADOABCD1234zgABCD03',
97
99
  isPr: false,
100
+ relatedOpenPullRequestUrls: [],
98
101
  story: 'TDPM Console port',
99
102
  status: 'Todo by human',
100
103
  nextActionDate: '2026-06-20T07:00:00.000Z',
@@ -113,6 +116,7 @@ export const consoleListItemsFixture: ConsoleListItem[] = [
113
116
  projectItemId: 'PVTI_lADOABCD1234zgABCD04',
114
117
  itemId: 'PVTI_lADOABCD1234zgABCD04',
115
118
  isPr: false,
119
+ relatedOpenPullRequestUrls: [],
116
120
  story: 'regular / workflow improvement',
117
121
  status: null,
118
122
  nextActionDate: null,
@@ -131,6 +135,7 @@ export const consoleListItemsFixture: ConsoleListItem[] = [
131
135
  projectItemId: 'PVTI_lADOABCD1234zgABCD05',
132
136
  itemId: 'PVTI_lADOABCD1234zgABCD05',
133
137
  isPr: false,
138
+ relatedOpenPullRequestUrls: [],
134
139
  story: 'Publish product documentation site',
135
140
  status: 'Icebox',
136
141
  nextActionDate: null,