github-issue-tower-defence-management 1.176.0 → 1.177.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 (34) hide show
  1. package/.github/workflows/umino-project.yml +4 -107
  2. package/CHANGELOG.md +13 -0
  3. package/bin/adapter/entry-points/console/ui-dist/assets/{index-BhDothvr.js → index-D6aAQrf7.js} +2 -2
  4. package/bin/adapter/entry-points/console/ui-dist/index.html +1 -1
  5. package/bin/adapter/repositories/issue/ApiV3CheerioRestIssueRepository.js +1 -0
  6. package/bin/adapter/repositories/issue/ApiV3CheerioRestIssueRepository.js.map +1 -1
  7. package/bin/adapter/repositories/issue/GraphqlProjectItemRepository.js +6 -0
  8. package/bin/adapter/repositories/issue/GraphqlProjectItemRepository.js.map +1 -1
  9. package/bin/domain/usecases/AssignNoAssigneeIssueToManagerUseCase.js +3 -0
  10. package/bin/domain/usecases/AssignNoAssigneeIssueToManagerUseCase.js.map +1 -1
  11. package/bin/domain/usecases/SetupTowerDefenceProjectUseCase.js +23 -10
  12. package/bin/domain/usecases/SetupTowerDefenceProjectUseCase.js.map +1 -1
  13. package/package.json +1 -1
  14. package/src/adapter/entry-points/console/ui/src/features/console/components/list/ConsoleItemList.stories.tsx +36 -0
  15. package/src/adapter/entry-points/console/ui/src/features/console/logic/grouping.test.ts +88 -0
  16. package/src/adapter/entry-points/console/ui/src/features/console/logic/grouping.ts +16 -4
  17. package/src/adapter/entry-points/console/ui/src/features/console/pages/ConsolePage.tsx +13 -3
  18. package/src/adapter/entry-points/console/ui-dist/assets/{index-BhDothvr.js → index-D6aAQrf7.js} +2 -2
  19. package/src/adapter/entry-points/console/ui-dist/index.html +1 -1
  20. package/src/adapter/repositories/issue/ApiV3CheerioRestIssueRepository.test.ts +5 -0
  21. package/src/adapter/repositories/issue/ApiV3CheerioRestIssueRepository.ts +1 -0
  22. package/src/adapter/repositories/issue/GraphqlProjectItemRepository.ts +12 -5
  23. package/src/domain/entities/Issue.ts +1 -0
  24. package/src/domain/usecases/AssignNoAssigneeIssueToManagerUseCase.test.ts +49 -0
  25. package/src/domain/usecases/AssignNoAssigneeIssueToManagerUseCase.ts +4 -0
  26. package/src/domain/usecases/SetupTowerDefenceProjectUseCase.test.ts +138 -0
  27. package/src/domain/usecases/SetupTowerDefenceProjectUseCase.ts +41 -17
  28. package/types/adapter/repositories/issue/ApiV3CheerioRestIssueRepository.d.ts.map +1 -1
  29. package/types/adapter/repositories/issue/GraphqlProjectItemRepository.d.ts +1 -0
  30. package/types/adapter/repositories/issue/GraphqlProjectItemRepository.d.ts.map +1 -1
  31. package/types/domain/entities/Issue.d.ts +1 -0
  32. package/types/domain/entities/Issue.d.ts.map +1 -1
  33. package/types/domain/usecases/AssignNoAssigneeIssueToManagerUseCase.d.ts.map +1 -1
  34. package/types/domain/usecases/SetupTowerDefenceProjectUseCase.d.ts.map +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"SetupTowerDefenceProjectUseCase.js","sourceRoot":"","sources":["../../../src/domain/usecases/SetupTowerDefenceProjectUseCase.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"SetupTowerDefenceProjectUseCase.js","sourceRoot":"","sources":["../../../src/domain/usecases/SetupTowerDefenceProjectUseCase.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "github-issue-tower-defence-management",
3
- "version": "1.176.0",
3
+ "version": "1.177.0",
4
4
  "description": "",
5
5
  "main": "bin/index.js",
6
6
  "scripts": {
@@ -1,5 +1,6 @@
1
1
  import type { Meta, StoryObj } from '@storybook/react-vite';
2
2
  import { buildConsoleListRows } from '../../logic/grouping';
3
+ import type { ConsoleOverlay } from '../../logic/types';
3
4
  import {
4
5
  consoleListItemsFixture,
5
6
  consoleStoryColorsFixture,
@@ -59,3 +60,38 @@ export const ErrorState: Story = {
59
60
  onSelectItem: () => {},
60
61
  },
61
62
  };
63
+
64
+ const staleOverlay: ConsoleOverlay = {
65
+ PVTI_lADOABCD1234zgABCD01: {
66
+ ts: 100,
67
+ mode: 'prs',
68
+ story: { name: 'OldStory', color: 'GRAY' },
69
+ },
70
+ };
71
+
72
+ export const StaleOverlayBefore: Story = {
73
+ args: {
74
+ rows: buildConsoleListRows([consoleListItemsFixture[0]], staleOverlay, []),
75
+ storyColors: consoleStoryColorsFixture,
76
+ activeItemId: null,
77
+ isLoading: false,
78
+ error: null,
79
+ onSelectItem: () => {},
80
+ },
81
+ };
82
+
83
+ export const StaleOverlayAfter: Story = {
84
+ args: {
85
+ rows: buildConsoleListRows(
86
+ [consoleListItemsFixture[0]],
87
+ staleOverlay,
88
+ [],
89
+ '2026-08-24T00:00:00Z',
90
+ ),
91
+ storyColors: consoleStoryColorsFixture,
92
+ activeItemId: null,
93
+ isLoading: false,
94
+ error: null,
95
+ onSelectItem: () => {},
96
+ },
97
+ };
@@ -67,6 +67,73 @@ describe('resolveItemStory', () => {
67
67
  CONSOLE_NO_STORY_LABEL,
68
68
  );
69
69
  });
70
+
71
+ it('returns overlay story when overlay entry is fresh (ts >= snapshot)', () => {
72
+ const snapshotTs = 1000;
73
+ const overlay: ConsoleOverlay = {
74
+ PVTI_4: {
75
+ ts: snapshotTs,
76
+ mode: 'triage',
77
+ story: { name: 'FreshOverlay', color: 'GREEN' },
78
+ },
79
+ };
80
+ expect(
81
+ resolveItemStory(
82
+ item({ number: 4, story: 'ItemStory' }),
83
+ overlay,
84
+ new Date(snapshotTs).toISOString(),
85
+ ),
86
+ ).toBe('FreshOverlay');
87
+ });
88
+
89
+ it('falls back to item story when overlay entry is stale (ts < snapshot)', () => {
90
+ const overlayTs = 999;
91
+ const snapshotTs = 1000;
92
+ const overlay: ConsoleOverlay = {
93
+ PVTI_5: {
94
+ ts: overlayTs,
95
+ mode: 'triage',
96
+ story: { name: 'StaleOverlay', color: 'RED' },
97
+ },
98
+ };
99
+ expect(
100
+ resolveItemStory(
101
+ item({ number: 5, story: 'ItemStory' }),
102
+ overlay,
103
+ new Date(snapshotTs).toISOString(),
104
+ ),
105
+ ).toBe('ItemStory');
106
+ });
107
+
108
+ it('returns overlay story when snapshotGeneratedAt is null (backward compat)', () => {
109
+ const overlay: ConsoleOverlay = {
110
+ PVTI_6: {
111
+ ts: 1,
112
+ mode: 'triage',
113
+ story: { name: 'OverlayStory', color: 'BLUE' },
114
+ },
115
+ };
116
+ expect(
117
+ resolveItemStory(item({ number: 6, story: 'ItemStory' }), overlay, null),
118
+ ).toBe('OverlayStory');
119
+ });
120
+
121
+ it('returns overlay story when snapshotGeneratedAt is an invalid date string (NaN guard)', () => {
122
+ const overlay: ConsoleOverlay = {
123
+ PVTI_7: {
124
+ ts: 1,
125
+ mode: 'triage',
126
+ story: { name: 'OverlayStory', color: 'BLUE' },
127
+ },
128
+ };
129
+ expect(
130
+ resolveItemStory(
131
+ item({ number: 7, story: 'ItemStory' }),
132
+ overlay,
133
+ 'not-a-date',
134
+ ),
135
+ ).toBe('OverlayStory');
136
+ });
70
137
  });
71
138
 
72
139
  describe('buildConsoleListRows', () => {
@@ -138,4 +205,25 @@ describe('buildConsoleListRows', () => {
138
205
  it('returns no rows for an empty list', () => {
139
206
  expect(buildConsoleListRows([], {}, [])).toEqual([]);
140
207
  });
208
+
209
+ it('uses item story for group header when overlay entry is stale', () => {
210
+ const overlayTs = 999;
211
+ const snapshotTs = 1000;
212
+ const overlay: ConsoleOverlay = {
213
+ PVTI_1: {
214
+ ts: overlayTs,
215
+ mode: 'triage',
216
+ story: { name: 'StaleStory', color: 'RED' },
217
+ },
218
+ };
219
+ const items = [item({ number: 1, story: 'ItemStory' })];
220
+ const rows = buildConsoleListRows(
221
+ items,
222
+ overlay,
223
+ [],
224
+ new Date(snapshotTs).toISOString(),
225
+ );
226
+ const header = rows[0];
227
+ expect(header.kind === 'group-header' && header.story).toBe('ItemStory');
228
+ });
141
229
  });
@@ -24,6 +24,7 @@ export const resolveStoryColorEnum = (
24
24
  export const resolveItemStory = (
25
25
  item: ConsoleListItem,
26
26
  overlay: ConsoleOverlay,
27
+ snapshotGeneratedAt: string | null = null,
27
28
  ): string => {
28
29
  const overlayKey =
29
30
  item.projectItemId !== '' ? item.projectItemId : item.itemId;
@@ -32,6 +33,16 @@ export const resolveItemStory = (
32
33
  overlayEntry?.story?.name !== undefined &&
33
34
  overlayEntry.story.name !== ''
34
35
  ) {
36
+ if (snapshotGeneratedAt !== null) {
37
+ const snapshotGeneratedAtMs = Date.parse(snapshotGeneratedAt);
38
+ if (
39
+ !Number.isNaN(snapshotGeneratedAtMs) &&
40
+ overlayEntry.ts < snapshotGeneratedAtMs
41
+ ) {
42
+ const trimmed = item.story.trim();
43
+ return trimmed !== '' ? item.story : CONSOLE_NO_STORY_LABEL;
44
+ }
45
+ }
35
46
  return overlayEntry.story.name;
36
47
  }
37
48
  const trimmed = item.story.trim();
@@ -57,14 +68,15 @@ export const buildConsoleListRows = (
57
68
  items: ConsoleListItem[],
58
69
  overlay: ConsoleOverlay,
59
70
  storyOrder: string[],
71
+ snapshotGeneratedAt: string | null = null,
60
72
  ): ConsoleListRow[] => {
61
73
  const indexByStory = new Map(storyOrder.map((name, index) => [name, index]));
62
74
  const sorted =
63
75
  storyOrder.length === 0
64
76
  ? items
65
77
  : [...items].sort((a, b) => {
66
- const storyA = resolveItemStory(a, overlay);
67
- const storyB = resolveItemStory(b, overlay);
78
+ const storyA = resolveItemStory(a, overlay, snapshotGeneratedAt);
79
+ const storyB = resolveItemStory(b, overlay, snapshotGeneratedAt);
68
80
  const indexA = indexByStory.get(storyA) ?? UNKNOWN_STORY_SORT_INDEX;
69
81
  const indexB = indexByStory.get(storyB) ?? UNKNOWN_STORY_SORT_INDEX;
70
82
  return indexA - indexB;
@@ -72,14 +84,14 @@ export const buildConsoleListRows = (
72
84
 
73
85
  const storyCounts = new Map<string, number>();
74
86
  for (const item of sorted) {
75
- const story = resolveItemStory(item, overlay);
87
+ const story = resolveItemStory(item, overlay, snapshotGeneratedAt);
76
88
  storyCounts.set(story, (storyCounts.get(story) ?? 0) + 1);
77
89
  }
78
90
 
79
91
  const rows: ConsoleListRow[] = [];
80
92
  let previousStory: string | null = null;
81
93
  for (const item of sorted) {
82
- const story = resolveItemStory(item, overlay);
94
+ const story = resolveItemStory(item, overlay, snapshotGeneratedAt);
83
95
  if (story !== previousStory) {
84
96
  rows.push({
85
97
  kind: 'group-header',
@@ -120,8 +120,14 @@ export const ConsolePage = () => {
120
120
  const storyOrder = activeSnapshot?.storyOrder ?? [];
121
121
 
122
122
  const rows = useMemo(
123
- () => buildConsoleListRows(pendingItems, overlayState.overlay, storyOrder),
124
- [pendingItems, overlayState.overlay, storyOrder],
123
+ () =>
124
+ buildConsoleListRows(
125
+ pendingItems,
126
+ overlayState.overlay,
127
+ storyOrder,
128
+ activeSnapshot?.generatedAt ?? null,
129
+ ),
130
+ [pendingItems, overlayState.overlay, storyOrder, activeSnapshot],
125
131
  );
126
132
 
127
133
  const storyColors = activeSnapshot?.storyColors ?? {};
@@ -183,7 +189,11 @@ export const ConsolePage = () => {
183
189
 
184
190
  const storyNameForSelected =
185
191
  selectedItem !== null
186
- ? resolveItemStory(selectedItem, overlayState.overlay)
192
+ ? resolveItemStory(
193
+ selectedItem,
194
+ overlayState.overlay,
195
+ snapshots[activeTab]?.generatedAt ?? null,
196
+ )
187
197
  : null;
188
198
 
189
199
  const advanceToNext = useCallback(