github-issue-tower-defence-management 1.91.0 → 1.91.2

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 (116) hide show
  1. package/CHANGELOG.md +15 -0
  2. package/README.md +5 -4
  3. package/bin/adapter/entry-points/cli/index.js +1 -1
  4. package/bin/adapter/entry-points/cli/index.js.map +1 -1
  5. package/bin/adapter/entry-points/handlers/consoleListsWriter.js +1 -0
  6. package/bin/adapter/entry-points/handlers/consoleListsWriter.js.map +1 -1
  7. package/bin/domain/usecases/console/GenerateConsoleListsUseCase.js +3 -0
  8. package/bin/domain/usecases/console/GenerateConsoleListsUseCase.js.map +1 -1
  9. package/package.json +1 -1
  10. package/src/adapter/entry-points/cli/index.test.ts +6 -1
  11. package/src/adapter/entry-points/cli/index.ts +1 -1
  12. package/src/adapter/entry-points/console/ui/src/features/console/components/{ConsoleMarkdownView.stories.tsx → content/ConsoleMarkdownContent.stories.tsx} +6 -6
  13. package/src/adapter/entry-points/console/ui/src/features/console/components/{ConsoleMarkdownView.test.tsx → content/ConsoleMarkdownContent.test.tsx} +6 -6
  14. package/src/adapter/entry-points/console/ui/src/features/console/components/{ConsoleMarkdownView.tsx → content/ConsoleMarkdownContent.tsx} +2 -2
  15. package/src/adapter/entry-points/console/ui/src/features/console/components/{ConsoleMermaidDiagram.stories.tsx → content/ConsoleMermaidDiagram.stories.tsx} +1 -1
  16. package/src/adapter/entry-points/console/ui/src/features/console/components/{ConsoleMermaidDiagram.test.tsx → content/ConsoleMermaidDiagram.test.tsx} +2 -2
  17. package/src/adapter/entry-points/console/ui/src/features/console/components/{ConsoleMermaidDiagram.tsx → content/ConsoleMermaidDiagram.tsx} +1 -1
  18. package/src/adapter/entry-points/console/ui/src/features/console/components/{ConsoleChangedFileList.stories.tsx → detail/ConsoleChangedFileList.stories.tsx} +1 -1
  19. package/src/adapter/entry-points/console/ui/src/features/console/components/{ConsoleChangedFileList.test.tsx → detail/ConsoleChangedFileList.test.tsx} +1 -1
  20. package/src/adapter/entry-points/console/ui/src/features/console/components/{ConsoleChangedFileList.tsx → detail/ConsoleChangedFileList.tsx} +2 -2
  21. package/src/adapter/entry-points/console/ui/src/features/console/components/{ConsoleCommentList.stories.tsx → detail/ConsoleCommentList.stories.tsx} +1 -1
  22. package/src/adapter/entry-points/console/ui/src/features/console/components/{ConsoleCommentList.test.tsx → detail/ConsoleCommentList.test.tsx} +1 -1
  23. package/src/adapter/entry-points/console/ui/src/features/console/components/{ConsoleCommentList.tsx → detail/ConsoleCommentList.tsx} +4 -4
  24. package/src/adapter/entry-points/console/ui/src/features/console/components/{ConsoleCommitList.stories.tsx → detail/ConsoleCommitList.stories.tsx} +1 -1
  25. package/src/adapter/entry-points/console/ui/src/features/console/components/{ConsoleCommitList.test.tsx → detail/ConsoleCommitList.test.tsx} +1 -1
  26. package/src/adapter/entry-points/console/ui/src/features/console/components/{ConsoleCommitList.tsx → detail/ConsoleCommitList.tsx} +2 -2
  27. package/src/adapter/entry-points/console/ui/src/features/console/components/{ConsoleItemDetail.stories.tsx → detail/ConsoleItemDetail.stories.tsx} +1 -1
  28. package/src/adapter/entry-points/console/ui/src/features/console/components/{ConsoleItemDetail.test.tsx → detail/ConsoleItemDetail.test.tsx} +2 -2
  29. package/src/adapter/entry-points/console/ui/src/features/console/components/{ConsoleItemDetail.tsx → detail/ConsoleItemDetail.tsx} +11 -8
  30. package/src/adapter/entry-points/console/ui/src/features/console/components/{ConsoleItemIcon.test.tsx → detail/ConsoleItemIcon.test.tsx} +1 -1
  31. package/src/adapter/entry-points/console/ui/src/features/console/components/{ConsoleItemIcon.tsx → detail/ConsoleItemIcon.tsx} +1 -1
  32. package/src/adapter/entry-points/console/ui/src/features/console/components/{ConsolePullRequestSection.stories.tsx → detail/ConsolePullRequestDetail.stories.tsx} +6 -6
  33. package/src/adapter/entry-points/console/ui/src/features/console/components/{ConsolePullRequestSection.test.tsx → detail/ConsolePullRequestDetail.test.tsx} +5 -5
  34. package/src/adapter/entry-points/console/ui/src/features/console/components/{ConsolePullRequestSection.tsx → detail/ConsolePullRequestDetail.tsx} +5 -5
  35. package/src/adapter/entry-points/console/ui/src/features/console/components/{ConsoleProjectHeader.stories.tsx → layout/ConsoleProjectSummary.stories.tsx} +5 -5
  36. package/src/adapter/entry-points/console/ui/src/features/console/components/{ConsoleProjectHeader.test.tsx → layout/ConsoleProjectSummary.test.tsx} +4 -4
  37. package/src/adapter/entry-points/console/ui/src/features/console/components/{ConsoleProjectHeader.tsx → layout/ConsoleProjectSummary.tsx} +3 -1
  38. package/src/adapter/entry-points/console/ui/src/features/console/components/{ConsoleTabBar.stories.tsx → layout/ConsoleTabList.stories.tsx} +7 -7
  39. package/src/adapter/entry-points/console/ui/src/features/console/components/{ConsoleTabBar.test.tsx → layout/ConsoleTabList.test.tsx} +7 -7
  40. package/src/adapter/entry-points/console/ui/src/features/console/components/{ConsoleTabBar.tsx → layout/ConsoleTabList.tsx} +2 -2
  41. package/src/adapter/entry-points/console/ui/src/features/console/components/{ConsoleListView.stories.tsx → list/ConsoleItemList.stories.tsx} +7 -7
  42. package/src/adapter/entry-points/console/ui/src/features/console/components/{ConsoleListView.test.tsx → list/ConsoleItemList.test.tsx} +9 -9
  43. package/src/adapter/entry-points/console/ui/src/features/console/components/{ConsoleListView.tsx → list/ConsoleItemList.tsx} +13 -7
  44. package/src/adapter/entry-points/console/ui/src/features/console/components/{ConsoleListItemRow.stories.tsx → list/ConsoleItemSummary.stories.tsx} +6 -6
  45. package/src/adapter/entry-points/console/ui/src/features/console/components/{ConsoleListItemRow.test.tsx → list/ConsoleItemSummary.test.tsx} +7 -7
  46. package/src/adapter/entry-points/console/ui/src/features/console/components/{ConsoleListItemRow.tsx → list/ConsoleItemSummary.tsx} +3 -3
  47. package/src/adapter/entry-points/console/ui/src/features/console/components/{ConsoleStoryGroupHeader.stories.tsx → list/ConsoleStorySummary.stories.tsx} +5 -5
  48. package/src/adapter/entry-points/console/ui/src/features/console/components/{ConsoleStoryGroupHeader.test.tsx → list/ConsoleStorySummary.test.tsx} +4 -4
  49. package/src/adapter/entry-points/console/ui/src/features/console/components/{ConsoleStoryGroupHeader.tsx → list/ConsoleStorySummary.tsx} +3 -3
  50. package/src/adapter/entry-points/console/ui/src/features/console/components/operations/ConsoleCloseActions.stories.tsx +14 -0
  51. package/src/adapter/entry-points/console/ui/src/features/console/components/{ConsoleCloseButtonGroup.test.tsx → operations/ConsoleCloseActions.test.tsx} +4 -6
  52. package/src/adapter/entry-points/console/ui/src/features/console/components/{ConsoleCloseButtonGroup.tsx → operations/ConsoleCloseActions.tsx} +2 -2
  53. package/src/adapter/entry-points/console/ui/src/features/console/components/operations/ConsoleNextActionDateActions.stories.tsx +20 -0
  54. package/src/adapter/entry-points/console/ui/src/features/console/components/{ConsoleNextActionDateGroup.test.tsx → operations/ConsoleNextActionDateActions.test.tsx} +5 -5
  55. package/src/adapter/entry-points/console/ui/src/features/console/components/{ConsoleNextActionDateGroup.tsx → operations/ConsoleNextActionDateActions.tsx} +2 -2
  56. package/src/adapter/entry-points/console/ui/src/features/console/components/{ConsoleOperationBar.stories.tsx → operations/ConsoleOperationMenu.stories.tsx} +7 -7
  57. package/src/adapter/entry-points/console/ui/src/features/console/components/{ConsoleOperationBar.test.tsx → operations/ConsoleOperationMenu.test.tsx} +8 -8
  58. package/src/adapter/entry-points/console/ui/src/features/console/components/{ConsoleOperationBar.tsx → operations/ConsoleOperationMenu.tsx} +16 -13
  59. package/src/adapter/entry-points/console/ui/src/features/console/components/operations/ConsolePullRequestReviewActions.stories.tsx +14 -0
  60. package/src/adapter/entry-points/console/ui/src/features/console/components/{ConsolePullRequestReviewGroup.test.tsx → operations/ConsolePullRequestReviewActions.test.tsx} +4 -4
  61. package/src/adapter/entry-points/console/ui/src/features/console/components/{ConsolePullRequestReviewGroup.tsx → operations/ConsolePullRequestReviewActions.tsx} +2 -2
  62. package/src/adapter/entry-points/console/ui/src/features/console/components/operations/ConsoleStatusActions.stories.tsx +17 -0
  63. package/src/adapter/entry-points/console/ui/src/features/console/components/{ConsoleStatusButtonGroup.test.tsx → operations/ConsoleStatusActions.test.tsx} +6 -6
  64. package/src/adapter/entry-points/console/ui/src/features/console/components/{ConsoleStatusButtonGroup.tsx → operations/ConsoleStatusActions.tsx} +7 -4
  65. package/src/adapter/entry-points/console/ui/src/features/console/components/operations/ConsoleStoryActions.stories.tsx +17 -0
  66. package/src/adapter/entry-points/console/ui/src/features/console/components/{ConsoleStoryButtonGroup.test.tsx → operations/ConsoleStoryActions.test.tsx} +5 -11
  67. package/src/adapter/entry-points/console/ui/src/features/console/components/{ConsoleStoryButtonGroup.tsx → operations/ConsoleStoryActions.tsx} +3 -3
  68. package/src/adapter/entry-points/console/ui/src/features/console/hooks/useConsoleCaches.ts +1 -1
  69. package/src/adapter/entry-points/console/ui/src/features/console/hooks/useConsoleItemDetailData.test.ts +1 -1
  70. package/src/adapter/entry-points/console/ui/src/features/console/hooks/useConsoleItemDetailData.ts +2 -2
  71. package/src/adapter/entry-points/console/ui/src/features/console/hooks/useConsoleOperations.test.ts +2 -2
  72. package/src/adapter/entry-points/console/ui/src/features/console/hooks/useConsoleOperations.ts +3 -3
  73. package/src/adapter/entry-points/console/ui/src/features/console/hooks/useConsoleOverlay.test.ts +1 -1
  74. package/src/adapter/entry-points/console/ui/src/features/console/hooks/useConsoleOverlay.ts +2 -2
  75. package/src/adapter/entry-points/console/ui/src/features/console/hooks/useConsoleTabData.ts +2 -2
  76. package/src/adapter/entry-points/console/ui/src/features/console/lib/consoleApi.ts +1 -1
  77. package/src/adapter/entry-points/console/ui/src/features/console/{grouping.ts → logic/grouping.ts} +2 -2
  78. package/src/adapter/entry-points/console/ui/src/features/console/logic/overlay.test.ts +146 -0
  79. package/src/adapter/entry-points/console/ui/src/features/console/logic/overlay.ts +48 -0
  80. package/src/adapter/entry-points/console/ui/src/features/console/pages/ConsoleItemDetailContainer.test.tsx +4 -4
  81. package/src/adapter/entry-points/console/ui/src/features/console/pages/ConsoleItemDetailContainer.tsx +6 -6
  82. package/src/adapter/entry-points/console/ui/src/features/console/pages/ConsolePage.test.tsx +55 -1
  83. package/src/adapter/entry-points/console/ui/src/features/console/pages/ConsolePage.tsx +12 -20
  84. package/src/adapter/entry-points/console/ui/src/features/console/{fixtures.ts → testing/fixtures.ts} +1 -1
  85. package/src/adapter/entry-points/console/ui-dist/assets/{index-BvuSQN9s.js → index-Druih-WG.js} +20 -20
  86. package/src/adapter/entry-points/console/ui-dist/index.html +1 -1
  87. package/src/adapter/entry-points/handlers/consoleListsWriter.test.ts +27 -2
  88. package/src/adapter/entry-points/handlers/consoleListsWriter.ts +1 -0
  89. package/src/domain/usecases/console/GenerateConsoleListsUseCase.test.ts +26 -0
  90. package/src/domain/usecases/console/GenerateConsoleListsUseCase.ts +17 -1
  91. package/types/adapter/entry-points/handlers/consoleListsWriter.d.ts.map +1 -1
  92. package/types/domain/usecases/console/GenerateConsoleListsUseCase.d.ts +2 -1
  93. package/types/domain/usecases/console/GenerateConsoleListsUseCase.d.ts.map +1 -1
  94. package/src/adapter/entry-points/console/ui/src/features/console/components/ConsoleCloseButtonGroup.stories.tsx +0 -14
  95. package/src/adapter/entry-points/console/ui/src/features/console/components/ConsoleNextActionDateGroup.stories.tsx +0 -20
  96. package/src/adapter/entry-points/console/ui/src/features/console/components/ConsolePullRequestReviewGroup.stories.tsx +0 -14
  97. package/src/adapter/entry-points/console/ui/src/features/console/components/ConsoleStatusButtonGroup.stories.tsx +0 -17
  98. package/src/adapter/entry-points/console/ui/src/features/console/components/ConsoleStoryButtonGroup.stories.tsx +0 -17
  99. package/src/adapter/entry-points/console/ui/src/features/console/overlay.test.ts +0 -124
  100. package/src/adapter/entry-points/console/ui/src/features/console/overlay.ts +0 -101
  101. /package/src/adapter/entry-points/console/ui/src/features/console/components/{ConsoleItemIcon.stories.tsx → detail/ConsoleItemIcon.stories.tsx} +0 -0
  102. /package/src/adapter/entry-points/console/ui/src/features/console/components/{ConsolePanel.stories.tsx → layout/ConsolePanel.stories.tsx} +0 -0
  103. /package/src/adapter/entry-points/console/ui/src/features/console/components/{ConsolePanel.test.tsx → layout/ConsolePanel.test.tsx} +0 -0
  104. /package/src/adapter/entry-points/console/ui/src/features/console/components/{ConsolePanel.tsx → layout/ConsolePanel.tsx} +0 -0
  105. /package/src/adapter/entry-points/console/ui/src/features/console/{colors.test.ts → logic/colors.test.ts} +0 -0
  106. /package/src/adapter/entry-points/console/ui/src/features/console/{colors.ts → logic/colors.ts} +0 -0
  107. /package/src/adapter/entry-points/console/ui/src/features/console/{fileStatus.test.ts → logic/fileStatus.test.ts} +0 -0
  108. /package/src/adapter/entry-points/console/ui/src/features/console/{fileStatus.ts → logic/fileStatus.ts} +0 -0
  109. /package/src/adapter/entry-points/console/ui/src/features/console/{grouping.test.ts → logic/grouping.test.ts} +0 -0
  110. /package/src/adapter/entry-points/console/ui/src/features/console/{itemIcons.test.ts → logic/itemIcons.test.ts} +0 -0
  111. /package/src/adapter/entry-points/console/ui/src/features/console/{itemIcons.ts → logic/itemIcons.ts} +0 -0
  112. /package/src/adapter/entry-points/console/ui/src/features/console/{operations.test.ts → logic/operations.test.ts} +0 -0
  113. /package/src/adapter/entry-points/console/ui/src/features/console/{operations.ts → logic/operations.ts} +0 -0
  114. /package/src/adapter/entry-points/console/ui/src/features/console/{relativeTime.test.ts → logic/relativeTime.test.ts} +0 -0
  115. /package/src/adapter/entry-points/console/ui/src/features/console/{relativeTime.ts → logic/relativeTime.ts} +0 -0
  116. /package/src/adapter/entry-points/console/ui/src/features/console/{types.ts → logic/types.ts} +0 -0
@@ -4,7 +4,7 @@
4
4
  <meta charset="UTF-8" />
5
5
  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
6
6
  <title>TDPM Console</title>
7
- <script type="module" crossorigin src="/assets/index-BvuSQN9s.js"></script>
7
+ <script type="module" crossorigin src="/assets/index-Druih-WG.js"></script>
8
8
  <link rel="stylesheet" crossorigin href="/assets/index-BU6p3cGU.css">
9
9
  </head>
10
10
  <body>
@@ -78,7 +78,7 @@ describe('writeConsoleLists', () => {
78
78
  const tabFile = (tab: string): string =>
79
79
  path.join(outDir, 'demo', tab, 'list.json');
80
80
 
81
- it('writes all four tab list.json files', () => {
81
+ it('writes all five tab list.json files', () => {
82
82
  writeConsoleLists({
83
83
  consoleDataOutputDir: outDir,
84
84
  pjcode: 'demo',
@@ -88,11 +88,36 @@ describe('writeConsoleLists', () => {
88
88
  generatedAt: '2026-06-14T07:22:33Z',
89
89
  });
90
90
 
91
- for (const tab of ['prs', 'triage', 'unread', 'failed-preparation']) {
91
+ for (const tab of [
92
+ 'prs',
93
+ 'triage',
94
+ 'unread',
95
+ 'failed-preparation',
96
+ 'todo-by-human',
97
+ ]) {
92
98
  expect(fs.existsSync(tabFile(tab))).toBe(true);
93
99
  }
94
100
  });
95
101
 
102
+ it('writes todo-by-human items selected by the Todo by human status', () => {
103
+ writeConsoleLists({
104
+ consoleDataOutputDir: outDir,
105
+ pjcode: 'demo',
106
+ assigneeLogin: ASSIGNEE,
107
+ project,
108
+ issues: [makeIssue({ status: 'Todo by human' })],
109
+ generatedAt: '2026-06-14T07:22:33Z',
110
+ });
111
+
112
+ const raw: unknown = JSON.parse(
113
+ fs.readFileSync(tabFile('todo-by-human'), 'utf8'),
114
+ );
115
+ expect(isRecord(raw)).toBe(true);
116
+ const items: unknown = isRecord(raw) ? raw.items : undefined;
117
+ expect(isUnknownArray(items)).toBe(true);
118
+ expect(isUnknownArray(items) ? items.length : 0).toBe(1);
119
+ });
120
+
96
121
  it('writes items with no body field', () => {
97
122
  writeConsoleLists({
98
123
  consoleDataOutputDir: outDir,
@@ -22,6 +22,7 @@ const CONSOLE_TAB_NAMES: ConsoleTabName[] = [
22
22
  'triage',
23
23
  'unread',
24
24
  'failed-preparation',
25
+ 'todo-by-human',
25
26
  ];
26
27
 
27
28
  export const formatConsoleGeneratedAt = (date: Date): string =>
@@ -175,6 +175,25 @@ describe('GenerateConsoleListsUseCase', () => {
175
175
  expect(result['failed-preparation'].items[0].number).toBe(1);
176
176
  });
177
177
 
178
+ it('selects todo-by-human items for the current and legacy status with exact case', () => {
179
+ const result = run([
180
+ makeIssue({ status: 'Todo by human' }),
181
+ makeIssue({ status: 'Todo' }),
182
+ makeIssue({ status: 'todo by human' }),
183
+ makeIssue({ status: 'Unread' }),
184
+ ]);
185
+ expect(result['todo-by-human'].items.map((item) => item.number)).toEqual([
186
+ 1, 2,
187
+ ]);
188
+ });
189
+
190
+ it('rejects a non-actionable todo-by-human issue', () => {
191
+ const result = run([
192
+ makeIssue({ status: 'Todo by human', nextActionHour: 9 }),
193
+ ]);
194
+ expect(result['todo-by-human'].items).toHaveLength(0);
195
+ });
196
+
178
197
  it('selects no-story items case-insensitively for triage', () => {
179
198
  const result = run([
180
199
  makeIssue({ story: 'regular / NO STORY; SET STORY FIELD' }),
@@ -298,6 +317,13 @@ describe('GenerateConsoleListsUseCase', () => {
298
317
  expect(names).toContain('Awaiting Workspace');
299
318
  });
300
319
 
320
+ it('excludes todo by human and done from todo-by-human status options', () => {
321
+ const names = run([])['todo-by-human'].statusOptions.map((o) => o.name);
322
+ expect(names).not.toContain('Todo by human');
323
+ expect(names).not.toContain('Done');
324
+ expect(names).toContain('Awaiting Workspace');
325
+ });
326
+
301
327
  it('emits all story options for triage and no statusOptions key', () => {
302
328
  const triage = run([]).triage;
303
329
  expect(triage.storyOptions.map((o) => o.name)).toEqual([
@@ -1,5 +1,9 @@
1
1
  import { Issue } from '../../entities/Issue';
2
2
  import { FieldOption, Project } from '../../entities/Project';
3
+ import {
4
+ LEGACY_TODO_STATUS_NAME,
5
+ TODO_STATUS_NAME,
6
+ } from '../../entities/WorkflowStatus';
3
7
 
4
8
  export type ConsoleColor = FieldOption['color'];
5
9
 
@@ -41,13 +45,19 @@ export type ConsoleTriageTab = {
41
45
  items: ConsoleListItem[];
42
46
  };
43
47
 
44
- export type ConsoleTabName = 'prs' | 'triage' | 'unread' | 'failed-preparation';
48
+ export type ConsoleTabName =
49
+ | 'prs'
50
+ | 'triage'
51
+ | 'unread'
52
+ | 'failed-preparation'
53
+ | 'todo-by-human';
45
54
 
46
55
  export type ConsoleLists = {
47
56
  prs: ConsoleStatusTab;
48
57
  triage: ConsoleTriageTab;
49
58
  unread: ConsoleStatusTab;
50
59
  'failed-preparation': ConsoleStatusTab;
60
+ 'todo-by-human': ConsoleStatusTab;
51
61
  };
52
62
 
53
63
  export type GenerateConsoleListsInput = {
@@ -113,6 +123,12 @@ export class GenerateConsoleListsUseCase {
113
123
  'in tmux by agent',
114
124
  ],
115
125
  ),
126
+ 'todo-by-human': buildStatusTab(
127
+ (issue) =>
128
+ issue.status === TODO_STATUS_NAME ||
129
+ issue.status === LEGACY_TODO_STATUS_NAME,
130
+ [TODO_STATUS_NAME.toLowerCase(), 'done'],
131
+ ),
116
132
  triage: {
117
133
  pjcode,
118
134
  generatedAt,
@@ -1 +1 @@
1
- {"version":3,"file":"consoleListsWriter.d.ts","sourceRoot":"","sources":["../../../../src/adapter/entry-points/handlers/consoleListsWriter.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,gCAAgC,CAAC;AAC5D,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,kCAAkC,CAAC;AAOhE,MAAM,MAAM,wBAAwB,GAAG;IACrC,oBAAoB,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;IAChD,MAAM,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;IAClC,aAAa,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;IACzC,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,KAAK,EAAE,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB,CAAC;AASF,eAAO,MAAM,wBAAwB,GAAI,MAAM,IAAI,KAAG,MACR,CAAC;AAU/C,eAAO,MAAM,iBAAiB,GAAI,QAAQ,wBAAwB,KAAG,IAsBpE,CAAC"}
1
+ {"version":3,"file":"consoleListsWriter.d.ts","sourceRoot":"","sources":["../../../../src/adapter/entry-points/handlers/consoleListsWriter.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,gCAAgC,CAAC;AAC5D,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,kCAAkC,CAAC;AAOhE,MAAM,MAAM,wBAAwB,GAAG;IACrC,oBAAoB,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;IAChD,MAAM,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;IAClC,aAAa,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;IACzC,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,KAAK,EAAE,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB,CAAC;AAUF,eAAO,MAAM,wBAAwB,GAAI,MAAM,IAAI,KAAG,MACR,CAAC;AAU/C,eAAO,MAAM,iBAAiB,GAAI,QAAQ,wBAAwB,KAAG,IAsBpE,CAAC"}
@@ -37,12 +37,13 @@ export type ConsoleTriageTab = {
37
37
  storyColors: Record<string, ConsoleColor>;
38
38
  items: ConsoleListItem[];
39
39
  };
40
- export type ConsoleTabName = 'prs' | 'triage' | 'unread' | 'failed-preparation';
40
+ export type ConsoleTabName = 'prs' | 'triage' | 'unread' | 'failed-preparation' | 'todo-by-human';
41
41
  export type ConsoleLists = {
42
42
  prs: ConsoleStatusTab;
43
43
  triage: ConsoleTriageTab;
44
44
  unread: ConsoleStatusTab;
45
45
  'failed-preparation': ConsoleStatusTab;
46
+ 'todo-by-human': ConsoleStatusTab;
46
47
  };
47
48
  export type GenerateConsoleListsInput = {
48
49
  project: Project;
@@ -1 +1 @@
1
- {"version":3,"file":"GenerateConsoleListsUseCase.d.ts","sourceRoot":"","sources":["../../../../src/domain/usecases/console/GenerateConsoleListsUseCase.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,sBAAsB,CAAC;AAC7C,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC;AAE9D,MAAM,MAAM,YAAY,GAAG,WAAW,CAAC,OAAO,CAAC,CAAC;AAEhD,MAAM,MAAM,eAAe,GAAG;IAC5B,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,aAAa,EAAE,MAAM,CAAC;IACtB,aAAa,EAAE,MAAM,CAAC;IACtB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,OAAO,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;CACnB,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAAG;IAC/B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,YAAY,CAAC;CACrB,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG;IAC7B,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,kBAAkB,EAAE,CAAC;IACpC,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE;QAAE,KAAK,EAAE,YAAY,CAAA;KAAE,CAAC,CAAC;IACrD,KAAK,EAAE,eAAe,EAAE,CAAC;CAC1B,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG;IAC7B,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,kBAAkB,EAAE,CAAC;IACnC,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;IAC1C,KAAK,EAAE,eAAe,EAAE,CAAC;CAC1B,CAAC;AAEF,MAAM,MAAM,cAAc,GAAG,KAAK,GAAG,QAAQ,GAAG,QAAQ,GAAG,oBAAoB,CAAC;AAEhF,MAAM,MAAM,YAAY,GAAG;IACzB,GAAG,EAAE,gBAAgB,CAAC;IACtB,MAAM,EAAE,gBAAgB,CAAC;IACzB,MAAM,EAAE,gBAAgB,CAAC;IACzB,oBAAoB,EAAE,gBAAgB,CAAC;CACxC,CAAC;AAEF,MAAM,MAAM,yBAAyB,GAAG;IACtC,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,KAAK,EAAE,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,aAAa,EAAE,MAAM,CAAC;IACtB,WAAW,EAAE,MAAM,CAAC;CACrB,CAAC;AAIF,qBAAa,2BAA2B;IACtC,GAAG,GAAI,OAAO,yBAAyB,KAAG,YAAY,CAsEpD;IAEF,OAAO,CAAC,YAAY,CAKY;IAEhC,OAAO,CAAC,WAAW,CAYhB;IAEH,OAAO,CAAC,iBAAiB,CAYjB;IAER,OAAO,CAAC,sBAAsB,CAQ5B;IAEF,OAAO,CAAC,sBAAsB,CAQ5B;IAEF,OAAO,CAAC,gBAAgB,CAetB;CACH"}
1
+ {"version":3,"file":"GenerateConsoleListsUseCase.d.ts","sourceRoot":"","sources":["../../../../src/domain/usecases/console/GenerateConsoleListsUseCase.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,sBAAsB,CAAC;AAC7C,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC;AAM9D,MAAM,MAAM,YAAY,GAAG,WAAW,CAAC,OAAO,CAAC,CAAC;AAEhD,MAAM,MAAM,eAAe,GAAG;IAC5B,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,aAAa,EAAE,MAAM,CAAC;IACtB,aAAa,EAAE,MAAM,CAAC;IACtB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,OAAO,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;CACnB,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAAG;IAC/B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,YAAY,CAAC;CACrB,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG;IAC7B,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,kBAAkB,EAAE,CAAC;IACpC,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE;QAAE,KAAK,EAAE,YAAY,CAAA;KAAE,CAAC,CAAC;IACrD,KAAK,EAAE,eAAe,EAAE,CAAC;CAC1B,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG;IAC7B,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,kBAAkB,EAAE,CAAC;IACnC,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;IAC1C,KAAK,EAAE,eAAe,EAAE,CAAC;CAC1B,CAAC;AAEF,MAAM,MAAM,cAAc,GACtB,KAAK,GACL,QAAQ,GACR,QAAQ,GACR,oBAAoB,GACpB,eAAe,CAAC;AAEpB,MAAM,MAAM,YAAY,GAAG;IACzB,GAAG,EAAE,gBAAgB,CAAC;IACtB,MAAM,EAAE,gBAAgB,CAAC;IACzB,MAAM,EAAE,gBAAgB,CAAC;IACzB,oBAAoB,EAAE,gBAAgB,CAAC;IACvC,eAAe,EAAE,gBAAgB,CAAC;CACnC,CAAC;AAEF,MAAM,MAAM,yBAAyB,GAAG;IACtC,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,KAAK,EAAE,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,aAAa,EAAE,MAAM,CAAC;IACtB,WAAW,EAAE,MAAM,CAAC;CACrB,CAAC;AAIF,qBAAa,2BAA2B;IACtC,GAAG,GAAI,OAAO,yBAAyB,KAAG,YAAY,CA4EpD;IAEF,OAAO,CAAC,YAAY,CAKY;IAEhC,OAAO,CAAC,WAAW,CAYhB;IAEH,OAAO,CAAC,iBAAiB,CAYjB;IAER,OAAO,CAAC,sBAAsB,CAQ5B;IAEF,OAAO,CAAC,sBAAsB,CAQ5B;IAEF,OAAO,CAAC,gBAAgB,CAetB;CACH"}
@@ -1,14 +0,0 @@
1
- import type { Meta, StoryObj } from '@storybook/react-vite';
2
- import { ConsoleCloseButtonGroup } from './ConsoleCloseButtonGroup';
3
-
4
- const meta: Meta<typeof ConsoleCloseButtonGroup> = {
5
- title: 'Console/ConsoleCloseButtonGroup',
6
- component: ConsoleCloseButtonGroup,
7
- args: { onClose: () => {} },
8
- };
9
-
10
- export default meta;
11
-
12
- type Story = StoryObj<typeof ConsoleCloseButtonGroup>;
13
-
14
- export const Default: Story = {};
@@ -1,20 +0,0 @@
1
- import type { Meta, StoryObj } from '@storybook/react-vite';
2
- import { ConsoleNextActionDateGroup } from './ConsoleNextActionDateGroup';
3
-
4
- const meta: Meta<typeof ConsoleNextActionDateGroup> = {
5
- title: 'Console/ConsoleNextActionDateGroup',
6
- component: ConsoleNextActionDateGroup,
7
- args: { onSetNextActionDate: () => {} },
8
- };
9
-
10
- export default meta;
11
-
12
- type Story = StoryObj<typeof ConsoleNextActionDateGroup>;
13
-
14
- export const StandardTab: Story = {
15
- args: { isTodoByHuman: false },
16
- };
17
-
18
- export const TodoByHumanTab: Story = {
19
- args: { isTodoByHuman: true },
20
- };
@@ -1,14 +0,0 @@
1
- import type { Meta, StoryObj } from '@storybook/react-vite';
2
- import { ConsolePullRequestReviewGroup } from './ConsolePullRequestReviewGroup';
3
-
4
- const meta: Meta<typeof ConsolePullRequestReviewGroup> = {
5
- title: 'Console/ConsolePullRequestReviewGroup',
6
- component: ConsolePullRequestReviewGroup,
7
- args: { onReview: () => {} },
8
- };
9
-
10
- export default meta;
11
-
12
- type Story = StoryObj<typeof ConsolePullRequestReviewGroup>;
13
-
14
- export const Default: Story = {};
@@ -1,17 +0,0 @@
1
- import type { Meta, StoryObj } from '@storybook/react-vite';
2
- import { consoleStatusOptionsFixture } from '../fixtures';
3
- import { ConsoleStatusButtonGroup } from './ConsoleStatusButtonGroup';
4
-
5
- const meta: Meta<typeof ConsoleStatusButtonGroup> = {
6
- title: 'Console/ConsoleStatusButtonGroup',
7
- component: ConsoleStatusButtonGroup,
8
- args: { onSetStatus: () => {}, onSetInTmuxByHuman: () => {} },
9
- };
10
-
11
- export default meta;
12
-
13
- type Story = StoryObj<typeof ConsoleStatusButtonGroup>;
14
-
15
- export const AllStatusOptions: Story = {
16
- args: { statusOptions: consoleStatusOptionsFixture },
17
- };
@@ -1,17 +0,0 @@
1
- import type { Meta, StoryObj } from '@storybook/react-vite';
2
- import { consoleStoryOptionsFixture } from '../fixtures';
3
- import { ConsoleStoryButtonGroup } from './ConsoleStoryButtonGroup';
4
-
5
- const meta: Meta<typeof ConsoleStoryButtonGroup> = {
6
- title: 'Console/ConsoleStoryButtonGroup',
7
- component: ConsoleStoryButtonGroup,
8
- args: { onSetStory: () => {} },
9
- };
10
-
11
- export default meta;
12
-
13
- type Story = StoryObj<typeof ConsoleStoryButtonGroup>;
14
-
15
- export const AssignableStories: Story = {
16
- args: { storyOptions: consoleStoryOptionsFixture },
17
- };
@@ -1,124 +0,0 @@
1
- import {
2
- countPendingItems,
3
- filterPendingItems,
4
- getOverlayEntry,
5
- isOverlayEntryActedForMode,
6
- isOverlayEntryExpiredForMode,
7
- overlayKeyForItem,
8
- overlayStorageKey,
9
- parseGeneratedAtMs,
10
- writeOverlayEntry,
11
- } from './overlay';
12
- import type { ConsoleListItem, ConsoleOverlay } from './types';
13
-
14
- const item = (number: number): ConsoleListItem => ({
15
- number,
16
- title: `Item ${number}`,
17
- url: `https://github.com/o/r/issues/${number}`,
18
- repo: 'o/r',
19
- nameWithOwner: 'o/r',
20
- projectItemId: `PVTI_${number}`,
21
- itemId: `PVTI_${number}`,
22
- isPr: false,
23
- story: 'Story',
24
- labels: [],
25
- createdAt: '2026-06-10T00:00:00.000Z',
26
- });
27
-
28
- describe('overlay helpers', () => {
29
- it('builds the per-project storage key', () => {
30
- expect(overlayStorageKey('umino')).toBe('pv_overlay_umino');
31
- });
32
-
33
- it('uses the projectItemId as the overlay key when present', () => {
34
- expect(overlayKeyForItem(item(5))).toBe('PVTI_5');
35
- });
36
-
37
- it('parses a generatedAt timestamp', () => {
38
- expect(parseGeneratedAtMs('2026-06-10T00:00:00.000Z')).toBe(
39
- Date.parse('2026-06-10T00:00:00.000Z'),
40
- );
41
- expect(parseGeneratedAtMs('not-a-date')).toBe(0);
42
- });
43
- });
44
-
45
- describe('mode-aware expiry', () => {
46
- it('expires a same-mode entry written before the snapshot', () => {
47
- expect(
48
- isOverlayEntryExpiredForMode(
49
- { ts: 100, mode: 'prs', done: true },
50
- 200,
51
- 'prs',
52
- ),
53
- ).toBe(true);
54
- });
55
-
56
- it('does not expire an entry written in a different mode', () => {
57
- expect(
58
- isOverlayEntryExpiredForMode(
59
- { ts: 100, mode: 'triage', done: true },
60
- 200,
61
- 'prs',
62
- ),
63
- ).toBe(false);
64
- });
65
-
66
- it('does not expire an entry written after the snapshot', () => {
67
- expect(
68
- isOverlayEntryExpiredForMode(
69
- { ts: 300, mode: 'prs', done: true },
70
- 200,
71
- 'prs',
72
- ),
73
- ).toBe(false);
74
- });
75
- });
76
-
77
- describe('counts driven to zero do not revive on tab switch', () => {
78
- it('keeps a done item subtracted in its own mode', () => {
79
- const overlay: ConsoleOverlay = {
80
- PVTI_1: { ts: 500, mode: 'prs', done: true },
81
- };
82
- const generatedAtMs = 400;
83
- expect(countPendingItems([item(1)], overlay, generatedAtMs, 'prs')).toBe(0);
84
- });
85
-
86
- it('treats a done entry from another mode as still acted', () => {
87
- const overlay: ConsoleOverlay = {
88
- PVTI_1: { ts: 100, mode: 'triage', done: true },
89
- };
90
- expect(isOverlayEntryActedForMode(overlay.PVTI_1, 999, 'prs')).toBe(true);
91
- expect(countPendingItems([item(1)], overlay, 999, 'prs')).toBe(0);
92
- });
93
-
94
- it('revives the count only when a newer same-mode snapshot supersedes the entry', () => {
95
- const overlay: ConsoleOverlay = {
96
- PVTI_1: { ts: 100, mode: 'prs', done: true },
97
- };
98
- expect(countPendingItems([item(1)], overlay, 200, 'prs')).toBe(1);
99
- });
100
- });
101
-
102
- describe('filterPendingItems', () => {
103
- it('drops acted items and keeps the rest', () => {
104
- const overlay: ConsoleOverlay = {
105
- PVTI_1: { ts: 500, mode: 'prs', done: true },
106
- };
107
- const result = filterPendingItems([item(1), item(2)], overlay, 400, 'prs');
108
- expect(result.map((entry) => entry.number)).toEqual([2]);
109
- });
110
- });
111
-
112
- describe('getOverlayEntry and writeOverlayEntry', () => {
113
- it('returns null for an expired entry', () => {
114
- const overlay: ConsoleOverlay = {
115
- PVTI_1: { ts: 100, mode: 'prs', done: true },
116
- };
117
- expect(getOverlayEntry(overlay, item(1), 200, 'prs')).toBeNull();
118
- });
119
-
120
- it('stamps the timestamp and mode on write', () => {
121
- const next = writeOverlayEntry({}, 'PVTI_1', { done: true }, 'prs', 1234);
122
- expect(next.PVTI_1).toEqual({ done: true, ts: 1234, mode: 'prs' });
123
- });
124
- });
@@ -1,101 +0,0 @@
1
- import type {
2
- ConsoleListItem,
3
- ConsoleOverlay,
4
- ConsoleOverlayEntry,
5
- ConsoleTabName,
6
- } from './types';
7
-
8
- export const overlayStorageKey = (pjcode: string): string =>
9
- `pv_overlay_${pjcode}`;
10
-
11
- export const overlayKeyForItem = (item: ConsoleListItem): string =>
12
- item.projectItemId !== '' ? item.projectItemId : item.itemId;
13
-
14
- export const parseGeneratedAtMs = (generatedAt: string): number => {
15
- const parsed = Date.parse(generatedAt);
16
- return Number.isNaN(parsed) ? 0 : parsed;
17
- };
18
-
19
- export const isOverlayEntryExpiredForMode = (
20
- entry: ConsoleOverlayEntry,
21
- generatedAtMs: number,
22
- mode: ConsoleTabName,
23
- ): boolean =>
24
- entry.ts > 0 &&
25
- generatedAtMs > 0 &&
26
- entry.mode === mode &&
27
- entry.ts < generatedAtMs;
28
-
29
- export const getOverlayEntry = (
30
- overlay: ConsoleOverlay,
31
- item: ConsoleListItem,
32
- generatedAtMs: number,
33
- mode: ConsoleTabName,
34
- ): ConsoleOverlayEntry | null => {
35
- const entry = overlay[overlayKeyForItem(item)];
36
- if (entry === undefined) {
37
- return null;
38
- }
39
- if (isOverlayEntryExpiredForMode(entry, generatedAtMs, mode)) {
40
- return null;
41
- }
42
- return entry;
43
- };
44
-
45
- export const isOverlayEntryActedForMode = (
46
- entry: ConsoleOverlayEntry | undefined,
47
- generatedAtMs: number,
48
- mode: ConsoleTabName,
49
- ): boolean => {
50
- if (entry === undefined || entry.done !== true) {
51
- return false;
52
- }
53
- return !isOverlayEntryExpiredForMode(entry, generatedAtMs, mode);
54
- };
55
-
56
- export const countPendingItems = (
57
- items: ConsoleListItem[],
58
- overlay: ConsoleOverlay,
59
- generatedAtMs: number,
60
- mode: ConsoleTabName,
61
- ): number =>
62
- items.filter(
63
- (item) =>
64
- !isOverlayEntryActedForMode(
65
- overlay[overlayKeyForItem(item)],
66
- generatedAtMs,
67
- mode,
68
- ),
69
- ).length;
70
-
71
- export const filterPendingItems = (
72
- items: ConsoleListItem[],
73
- overlay: ConsoleOverlay,
74
- generatedAtMs: number,
75
- mode: ConsoleTabName,
76
- ): ConsoleListItem[] =>
77
- items.filter(
78
- (item) =>
79
- !isOverlayEntryActedForMode(
80
- overlay[overlayKeyForItem(item)],
81
- generatedAtMs,
82
- mode,
83
- ),
84
- );
85
-
86
- export const writeOverlayEntry = (
87
- overlay: ConsoleOverlay,
88
- key: string,
89
- patch: Partial<Omit<ConsoleOverlayEntry, 'ts' | 'mode'>>,
90
- mode: ConsoleTabName,
91
- now: number,
92
- ): ConsoleOverlay => {
93
- const existing = overlay[key];
94
- const next: ConsoleOverlayEntry = {
95
- ...(existing ?? {}),
96
- ...patch,
97
- ts: now,
98
- mode,
99
- };
100
- return { ...overlay, [key]: next };
101
- };