github-issue-tower-defence-management 1.156.4 → 1.157.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 (48) hide show
  1. package/CHANGELOG.md +7 -0
  2. package/README.md +3 -3
  3. package/bin/adapter/entry-points/cli/index.js +6 -1
  4. package/bin/adapter/entry-points/cli/index.js.map +1 -1
  5. package/bin/adapter/entry-points/cli/projectConfig.js +6 -0
  6. package/bin/adapter/entry-points/cli/projectConfig.js.map +1 -1
  7. package/bin/adapter/entry-points/console/consoleDataDelivery.js +3 -10
  8. package/bin/adapter/entry-points/console/consoleDataDelivery.js.map +1 -1
  9. package/bin/adapter/entry-points/console/consoleTabNames.js +32 -0
  10. package/bin/adapter/entry-points/console/consoleTabNames.js.map +1 -0
  11. package/bin/adapter/entry-points/console/webServer.js +1 -1
  12. package/bin/adapter/entry-points/console/webServer.js.map +1 -1
  13. package/bin/adapter/entry-points/handlers/FileSystemConsoleTabsRepository.js +82 -0
  14. package/bin/adapter/entry-points/handlers/FileSystemConsoleTabsRepository.js.map +1 -0
  15. package/bin/adapter/entry-points/handlers/consoleListsWriter.js +2 -10
  16. package/bin/adapter/entry-points/handlers/consoleListsWriter.js.map +1 -1
  17. package/bin/domain/usecases/NotifyFinishedIssuePreparationUseCase.js +49 -1
  18. package/bin/domain/usecases/NotifyFinishedIssuePreparationUseCase.js.map +1 -1
  19. package/bin/domain/usecases/adapter-interfaces/ConsoleTabsRepository.js +3 -0
  20. package/bin/domain/usecases/adapter-interfaces/ConsoleTabsRepository.js.map +1 -0
  21. package/package.json +1 -1
  22. package/src/adapter/entry-points/cli/index.ts +8 -0
  23. package/src/adapter/entry-points/cli/projectConfig.test.ts +56 -0
  24. package/src/adapter/entry-points/cli/projectConfig.ts +8 -0
  25. package/src/adapter/entry-points/console/consoleDataDelivery.ts +3 -10
  26. package/src/adapter/entry-points/console/consoleTabNames.test.ts +51 -0
  27. package/src/adapter/entry-points/console/consoleTabNames.ts +37 -0
  28. package/src/adapter/entry-points/console/webServer.ts +1 -1
  29. package/src/adapter/entry-points/handlers/FileSystemConsoleTabsRepository.test.ts +217 -0
  30. package/src/adapter/entry-points/handlers/FileSystemConsoleTabsRepository.ts +113 -0
  31. package/src/adapter/entry-points/handlers/consoleListsWriter.ts +2 -12
  32. package/src/domain/usecases/NotifyFinishedIssuePreparationUseCase.test.ts +159 -0
  33. package/src/domain/usecases/NotifyFinishedIssuePreparationUseCase.ts +59 -0
  34. package/src/domain/usecases/adapter-interfaces/ConsoleTabsRepository.ts +12 -0
  35. package/types/adapter/entry-points/cli/index.d.ts.map +1 -1
  36. package/types/adapter/entry-points/cli/projectConfig.d.ts +1 -0
  37. package/types/adapter/entry-points/cli/projectConfig.d.ts.map +1 -1
  38. package/types/adapter/entry-points/console/consoleDataDelivery.d.ts +2 -1
  39. package/types/adapter/entry-points/console/consoleDataDelivery.d.ts.map +1 -1
  40. package/types/adapter/entry-points/console/consoleTabNames.d.ts +4 -0
  41. package/types/adapter/entry-points/console/consoleTabNames.d.ts.map +1 -0
  42. package/types/adapter/entry-points/handlers/FileSystemConsoleTabsRepository.d.ts +13 -0
  43. package/types/adapter/entry-points/handlers/FileSystemConsoleTabsRepository.d.ts.map +1 -0
  44. package/types/adapter/entry-points/handlers/consoleListsWriter.d.ts.map +1 -1
  45. package/types/domain/usecases/NotifyFinishedIssuePreparationUseCase.d.ts +5 -1
  46. package/types/domain/usecases/NotifyFinishedIssuePreparationUseCase.d.ts.map +1 -1
  47. package/types/domain/usecases/adapter-interfaces/ConsoleTabsRepository.d.ts +9 -0
  48. package/types/domain/usecases/adapter-interfaces/ConsoleTabsRepository.d.ts.map +1 -0
@@ -22,11 +22,12 @@ class IllegalIssueStatusError extends Error {
22
22
  }
23
23
  exports.IllegalIssueStatusError = IllegalIssueStatusError;
24
24
  class NotifyFinishedIssuePreparationUseCase {
25
- constructor(projectRepository, issueRepository, issueCommentRepository, webhookRepository) {
25
+ constructor(projectRepository, issueRepository, issueCommentRepository, webhookRepository, consoleTabsRepository) {
26
26
  this.projectRepository = projectRepository;
27
27
  this.issueRepository = issueRepository;
28
28
  this.issueCommentRepository = issueCommentRepository;
29
29
  this.webhookRepository = webhookRepository;
30
+ this.consoleTabsRepository = consoleTabsRepository;
30
31
  this.run = async (params) => {
31
32
  const project = await this.projectRepository.getByUrl(params.projectUrl);
32
33
  const awaitingWorkspaceStatusOption = project.status.statuses.find((s) => s.name === WorkflowStatus_1.AWAITING_WORKSPACE_STATUS_NAME);
@@ -70,6 +71,7 @@ class NotifyFinishedIssuePreparationUseCase {
70
71
  issue.status = WorkflowStatus_1.AWAITING_WORKSPACE_STATUS_NAME;
71
72
  await this.issueRepository.update(issue, project);
72
73
  await this.issueRepository.updateStatus(project, issue, awaitingWorkspaceStatusOption.id);
74
+ await this.patchConsoleTab(issue);
73
75
  await this.issueCommentRepository.createComment(issue, `Issue has dependent issue URLs:\n${issue.dependedIssueUrls.map((url) => `- ${url}`).join('\n')}`);
74
76
  return;
75
77
  }
@@ -77,6 +79,7 @@ class NotifyFinishedIssuePreparationUseCase {
77
79
  issue.status = WorkflowStatus_1.AWAITING_WORKSPACE_STATUS_NAME;
78
80
  await this.issueRepository.update(issue, project);
79
81
  await this.issueRepository.updateStatus(project, issue, awaitingWorkspaceStatusOption.id);
82
+ await this.patchConsoleTab(issue);
80
83
  await this.issueCommentRepository.createComment(issue, `Issue has next action date or hour set: nextActionDate=${issue.nextActionDate?.toISOString() ?? 'null'}, nextActionHour=${issue.nextActionHour ?? 'null'}`);
81
84
  return;
82
85
  }
@@ -97,6 +100,7 @@ class NotifyFinishedIssuePreparationUseCase {
97
100
  issue.status = WorkflowStatus_1.FAILED_PREPARATION_STATUS_NAME;
98
101
  await this.issueRepository.update(issue, project);
99
102
  await this.issueRepository.updateStatus(project, issue, failedPreparationStatusOption.id);
103
+ await this.patchConsoleTab(issue);
100
104
  await this.setDependedIssueUrlForAllOpenPRs(issue, params.issueUrl, project);
101
105
  await this.issueCommentRepository.createComment(issue, `${rejectionStatusMessage}\n\nFailed to pass the check automatically for ${params.thresholdForAutoReject} times`);
102
106
  await this.sendWorkflowBlockerNotification(params.issueUrl, params.workflowBlockerResolvedWebhookUrl, project);
@@ -109,6 +113,7 @@ class NotifyFinishedIssuePreparationUseCase {
109
113
  issue.status = WorkflowStatus_1.AWAITING_WORKSPACE_STATUS_NAME;
110
114
  await this.issueRepository.update(issue, project);
111
115
  await this.issueRepository.updateStatus(project, issue, awaitingWorkspaceStatusOption.id);
116
+ await this.patchConsoleTab(issue);
112
117
  await this.issueCommentRepository.createComment(issue, returnedToAwaitingWorkspaceMessage_1.RETURNED_TO_AWAITING_WORKSPACE_MESSAGE);
113
118
  return;
114
119
  }
@@ -117,6 +122,7 @@ class NotifyFinishedIssuePreparationUseCase {
117
122
  issue.status = WorkflowStatus_1.AWAITING_QUALITY_CHECK_STATUS_NAME;
118
123
  await this.issueRepository.update(issue, project);
119
124
  await this.issueRepository.updateStatus(project, issue, awaitingQualityCheckStatusOption.id);
125
+ await this.patchConsoleTab(issue);
120
126
  await this.setDependedIssueUrlForAllOpenPRs(issue, params.issueUrl, project);
121
127
  await this.sendWorkflowBlockerNotification(params.issueUrl, params.workflowBlockerResolvedWebhookUrl, project);
122
128
  return;
@@ -124,6 +130,7 @@ class NotifyFinishedIssuePreparationUseCase {
124
130
  issue.status = WorkflowStatus_1.AWAITING_WORKSPACE_STATUS_NAME;
125
131
  await this.issueRepository.update(issue, project);
126
132
  await this.issueRepository.updateStatus(project, issue, awaitingWorkspaceStatusOption.id);
133
+ await this.patchConsoleTab(issue);
127
134
  await this.setDependedIssueUrlForAllOpenPRs(issue, params.issueUrl, project);
128
135
  await this.issueCommentRepository.createComment(issue, rejectionStatusMessage);
129
136
  };
@@ -219,6 +226,47 @@ class NotifyFinishedIssuePreparationUseCase {
219
226
  console.warn('Failed to send workflow blocker notification:', error);
220
227
  }
221
228
  };
229
+ this.resolveConsoleTargetTab = (status) => {
230
+ const lower = status.toLowerCase();
231
+ if (lower === WorkflowStatus_1.AWAITING_QUALITY_CHECK_STATUS_NAME.toLowerCase())
232
+ return 'prs';
233
+ if (lower === WorkflowStatus_1.FAILED_PREPARATION_STATUS_NAME.toLowerCase())
234
+ return 'failed-preparation';
235
+ return null;
236
+ };
237
+ this.patchConsoleTab = async (issue) => {
238
+ if (!this.consoleTabsRepository)
239
+ return;
240
+ const targetTabName = this.resolveConsoleTargetTab(issue.status ?? '');
241
+ const relatedOpenPullRequestUrls = !issue.isPr && targetTabName !== null
242
+ ? (await this.issueRepository.findRelatedOpenPRs(issue.url)).map((pr) => pr.url)
243
+ : [];
244
+ const item = {
245
+ number: issue.number,
246
+ title: issue.title,
247
+ url: issue.url,
248
+ repo: issue.nameWithOwner,
249
+ nameWithOwner: issue.nameWithOwner,
250
+ projectItemId: issue.itemId,
251
+ itemId: issue.itemId,
252
+ isPr: issue.isPr,
253
+ story: issue.story ?? '',
254
+ status: issue.status,
255
+ nextActionDate: issue.nextActionDate === null
256
+ ? null
257
+ : issue.nextActionDate.toISOString(),
258
+ nextActionHour: issue.nextActionHour,
259
+ dependedIssueUrls: issue.dependedIssueUrls,
260
+ labels: issue.labels,
261
+ createdAt: issue.createdAt.toISOString(),
262
+ relatedOpenPullRequestUrls,
263
+ };
264
+ this.consoleTabsRepository.patchIssueTabTransition({
265
+ projectItemId: issue.itemId,
266
+ item,
267
+ targetTabName,
268
+ });
269
+ };
222
270
  this.issueRejectionEvaluator = new IssueRejectionEvaluator_1.IssueRejectionEvaluator(issueRepository);
223
271
  this.changeTargetPullRequestApprover = new ChangeTargetPullRequestApprover_1.ChangeTargetPullRequestApprover(issueRepository);
224
272
  }
@@ -1 +1 @@
1
- {"version":3,"file":"NotifyFinishedIssuePreparationUseCase.js","sourceRoot":"","sources":["../../../src/domain/usecases/NotifyFinishedIssuePreparationUseCase.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"NotifyFinishedIssuePreparationUseCase.js","sourceRoot":"","sources":["../../../src/domain/usecases/NotifyFinishedIssuePreparationUseCase.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=ConsoleTabsRepository.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ConsoleTabsRepository.js","sourceRoot":"","sources":["../../../../src/domain/usecases/adapter-interfaces/ConsoleTabsRepository.ts"],"names":[],"mappings":""}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "github-issue-tower-defence-management",
3
- "version": "1.156.4",
3
+ "version": "1.157.0",
4
4
  "description": "",
5
5
  "main": "bin/index.js",
6
6
  "scripts": {
@@ -36,6 +36,7 @@ import { NodeTmuxSessionRepository } from '../../repositories/NodeTmuxSessionRep
36
36
  import { ProcTakeOwnershipSpawnRepository } from '../../repositories/ProcTakeOwnershipSpawnRepository';
37
37
  import { GitHubIssueCommentRepository } from '../../repositories/GitHubIssueCommentRepository';
38
38
  import { FetchWebhookRepository } from '../../repositories/FetchWebhookRepository';
39
+ import { FileSystemConsoleTabsRepository } from '../handlers/FileSystemConsoleTabsRepository';
39
40
  import { RevertOrphanedPreparationUseCase } from '../../../domain/usecases/RevertOrphanedPreparationUseCase';
40
41
  import * as path from 'path';
41
42
  import { DEFAULT_WEB_PORT, startWebServer } from '../console/webServer';
@@ -594,11 +595,18 @@ program
594
595
  const issueCommentRepository = new GitHubIssueCommentRepository(token);
595
596
  const webhookRepository = new FetchWebhookRepository();
596
597
 
598
+ const consoleDataOutputDir = config.consoleDataOutputDir ?? null;
599
+ const consoleTabsRepository =
600
+ consoleDataOutputDir !== null
601
+ ? new FileSystemConsoleTabsRepository(consoleDataOutputDir, projectName)
602
+ : null;
603
+
597
604
  const useCase = new NotifyFinishedIssuePreparationUseCase(
598
605
  projectRepository,
599
606
  issueRepository,
600
607
  issueCommentRepository,
601
608
  webhookRepository,
609
+ consoleTabsRepository,
602
610
  );
603
611
 
604
612
  const rawAllowedIssueAuthors = config.allowedIssueAuthors;
@@ -140,3 +140,59 @@ describe('parseProjectReadmeConfig labelsAsLlmAgentName', () => {
140
140
  ).toBeUndefined();
141
141
  });
142
142
  });
143
+
144
+ describe('loadConfigFile consoleDataOutputDir', () => {
145
+ let dir: string;
146
+
147
+ beforeEach(() => {
148
+ dir = fs.mkdtempSync(
149
+ path.join(os.tmpdir(), 'project-config-console-data-output-dir-'),
150
+ );
151
+ });
152
+
153
+ afterEach(() => {
154
+ fs.rmSync(dir, { recursive: true, force: true });
155
+ });
156
+
157
+ const writeConfig = (content: string): string => {
158
+ const filePath = path.join(dir, 'config.yml');
159
+ fs.writeFileSync(filePath, content);
160
+ return filePath;
161
+ };
162
+
163
+ it('parses consoleDataOutputDir from the config file', () => {
164
+ const filePath = writeConfig(
165
+ "projectName: 'demo'\nconsoleDataOutputDir: '/tmp/console-data'\n",
166
+ );
167
+ expect(loadConfigFile(filePath).consoleDataOutputDir).toBe(
168
+ '/tmp/console-data',
169
+ );
170
+ });
171
+
172
+ it('yields undefined consoleDataOutputDir when the key is absent', () => {
173
+ const filePath = writeConfig("projectName: 'demo'\n");
174
+ expect(loadConfigFile(filePath).consoleDataOutputDir).toBeUndefined();
175
+ });
176
+ });
177
+
178
+ describe('parseProjectReadmeConfig consoleDataOutputDir', () => {
179
+ const makeReadme = (yaml: string) =>
180
+ `<details>\n<summary>config</summary>\n${yaml}\n</details>`;
181
+
182
+ it('does not emit a warning for consoleDataOutputDir', () => {
183
+ const warnSpy = jest.spyOn(console, 'warn').mockImplementation(() => {});
184
+ const readme = makeReadme("consoleDataOutputDir: '/tmp/console-data'\n");
185
+ parseProjectReadmeConfig(readme, 'https://example.com/project');
186
+ expect(warnSpy).not.toHaveBeenCalledWith(
187
+ expect.stringContaining('consoleDataOutputDir'),
188
+ );
189
+ warnSpy.mockRestore();
190
+ });
191
+
192
+ it('yields undefined consoleDataOutputDir when the key is absent', () => {
193
+ const readme = makeReadme('defaultAgentName: impl\n');
194
+ expect(
195
+ parseProjectReadmeConfig(readme).consoleDataOutputDir,
196
+ ).toBeUndefined();
197
+ });
198
+ });
@@ -24,6 +24,7 @@ export type ConfigFile = {
24
24
  labelsAsLlmAgentName?: string[];
25
25
  labelsNotRequiringPullRequest?: string[];
26
26
  changeTargetPathAliases?: Record<string, string>;
27
+ consoleDataOutputDir?: string;
27
28
  consoleAccessToken?: string;
28
29
  consoleProjects?: Record<string, string>;
29
30
  consoleGithubTokenFilesByRepositoryOwner?: Record<string, string>;
@@ -132,6 +133,7 @@ const knownProjectReadmeConfigKeys = [
132
133
  'labelsAsLlmAgentName',
133
134
  'labelsNotRequiringPullRequest',
134
135
  'changeTargetPathAliases',
136
+ 'consoleDataOutputDir',
135
137
  ] as const;
136
138
 
137
139
  export const loadConfigFile = (configFilePath: string): ConfigFile => {
@@ -190,6 +192,7 @@ export const loadConfigFile = (configFilePath: string): ConfigFile => {
190
192
  parsed,
191
193
  'changeTargetPathAliases',
192
194
  ),
195
+ consoleDataOutputDir: getStringValue(parsed, 'consoleDataOutputDir'),
193
196
  consoleAccessToken: getStringValue(parsed, 'consoleAccessToken'),
194
197
  consoleProjects: getStringRecordValue(parsed, 'consoleProjects'),
195
198
  consoleGithubTokenFilesByRepositoryOwner: getStringRecordValue(
@@ -281,6 +284,7 @@ export const parseProjectReadmeConfig = (
281
284
  parsed,
282
285
  'changeTargetPathAliases',
283
286
  ),
287
+ consoleDataOutputDir: getStringValue(parsed, 'consoleDataOutputDir'),
284
288
  };
285
289
  } catch {
286
290
  console.warn('Failed to parse YAML from project README config section');
@@ -368,6 +372,10 @@ export const mergeConfigs = (
368
372
  readmeOverrides.changeTargetPathAliases ??
369
373
  cliOverrides.changeTargetPathAliases ??
370
374
  configFile.changeTargetPathAliases,
375
+ consoleDataOutputDir:
376
+ readmeOverrides.consoleDataOutputDir ??
377
+ cliOverrides.consoleDataOutputDir ??
378
+ configFile.consoleDataOutputDir,
371
379
  consoleAccessToken:
372
380
  cliOverrides.consoleAccessToken ?? configFile.consoleAccessToken,
373
381
  consoleProjects: cliOverrides.consoleProjects ?? configFile.consoleProjects,
@@ -1,16 +1,9 @@
1
1
  import * as fs from 'fs';
2
2
  import * as path from 'path';
3
3
  import { readDoneProjectItemIds } from './consoleDoneStore';
4
+ import { CONSOLE_LIST_TAB_NAMES } from './consoleTabNames';
4
5
 
5
- export const CONSOLE_LIST_TAB_NAMES: string[] = [
6
- 'workflow-blocker',
7
- 'prs',
8
- 'triage',
9
- 'unread',
10
- 'failed-preparation',
11
- 'todo-by-human',
12
- 'todo-by-agent',
13
- ];
6
+ export { CONSOLE_LIST_TAB_NAMES };
14
7
 
15
8
  export type ConsoleDataRoute =
16
9
  | { kind: 'list'; pjcode: string; tab: string }
@@ -46,7 +39,7 @@ export const parseConsoleDataRoute = (
46
39
  }
47
40
  return { kind: 'in-tmux', pjcode, relativePath: rest.join('/') };
48
41
  }
49
- if (!CONSOLE_LIST_TAB_NAMES.includes(tab)) {
42
+ if (!CONSOLE_LIST_TAB_NAMES.some((name) => name === tab)) {
50
43
  return null;
51
44
  }
52
45
  if (segments.length === 4 && segments[3] === 'list.json') {
@@ -0,0 +1,51 @@
1
+ import * as fs from 'fs';
2
+ import * as os from 'os';
3
+ import * as path from 'path';
4
+ import type { Project } from '../../../domain/entities/Project';
5
+ import { writeConsoleLists } from '../handlers/consoleListsWriter';
6
+ import { parseConsoleDataRoute } from './consoleDataDelivery';
7
+ import { CONSOLE_LIST_TAB_NAMES } from './consoleTabNames';
8
+
9
+ const createMinimalProject = (): Project => ({
10
+ id: 'p1',
11
+ url: 'https://github.com/users/user/projects/1',
12
+ databaseId: 1,
13
+ name: 'Test',
14
+ status: { name: 'Status', fieldId: 'f1', statuses: [] },
15
+ nextActionDate: null,
16
+ nextActionHour: null,
17
+ story: null,
18
+ remainingEstimationMinutes: null,
19
+ dependedIssueUrlSeparatedByComma: null,
20
+ completionDate50PercentConfidence: null,
21
+ });
22
+
23
+ describe('consoleTabNames cross-component contract', () => {
24
+ it('every CONSOLE_LIST_TAB_NAMES tab is recognised as a valid list route by the data delivery parser', () => {
25
+ for (const tab of CONSOLE_LIST_TAB_NAMES) {
26
+ const route = parseConsoleDataRoute(`/projects/testpj/${tab}/list.json`);
27
+ expect(route).toMatchObject({ kind: 'list', pjcode: 'testpj', tab });
28
+ }
29
+ });
30
+
31
+ it('writeConsoleLists creates a list.json file for every CONSOLE_LIST_TAB_NAMES tab', () => {
32
+ const dir = fs.mkdtempSync(
33
+ path.join(os.tmpdir(), 'console-tab-names-contract-test-'),
34
+ );
35
+ try {
36
+ writeConsoleLists({
37
+ consoleDataOutputDir: dir,
38
+ pjcode: 'testpj',
39
+ assigneeLogin: 'user',
40
+ project: createMinimalProject(),
41
+ issues: [],
42
+ });
43
+ for (const tab of CONSOLE_LIST_TAB_NAMES) {
44
+ const filePath = path.join(dir, 'testpj', tab, 'list.json');
45
+ expect(fs.existsSync(filePath)).toBe(true);
46
+ }
47
+ } finally {
48
+ fs.rmSync(dir, { recursive: true, force: true });
49
+ }
50
+ });
51
+ });
@@ -0,0 +1,37 @@
1
+ import type { ConsoleTabName } from '../../../domain/usecases/console/GenerateConsoleListsUseCase';
2
+
3
+ export const CONSOLE_LIST_TAB_NAMES: ConsoleTabName[] = [
4
+ 'workflow-blocker',
5
+ 'prs',
6
+ 'triage',
7
+ 'unread',
8
+ 'failed-preparation',
9
+ 'todo-by-human',
10
+ 'todo-by-agent',
11
+ ];
12
+
13
+ const UNKNOWN_STORY_SORT_INDEX = 999999;
14
+
15
+ const isRecord = (value: unknown): value is Record<string, unknown> =>
16
+ value !== null && typeof value === 'object' && !Array.isArray(value);
17
+
18
+ export const sortByStoryOrder = (
19
+ items: unknown[],
20
+ storyOrder: string[],
21
+ ): unknown[] => {
22
+ const indexByStory = new Map(storyOrder.map((name, index) => [name, index]));
23
+ return items
24
+ .map((item, position) => {
25
+ const storyValue = isRecord(item) ? item.story : undefined;
26
+ const story = typeof storyValue === 'string' ? storyValue : undefined;
27
+ return {
28
+ item,
29
+ position,
30
+ sortKey:
31
+ (story !== undefined ? indexByStory.get(story) : undefined) ??
32
+ UNKNOWN_STORY_SORT_INDEX,
33
+ };
34
+ })
35
+ .sort((a, b) => a.sortKey - b.sortKey || a.position - b.position)
36
+ .map((entry) => entry.item);
37
+ };
@@ -112,7 +112,7 @@ export const isConsoleAppRoute = (requestPath: string): boolean => {
112
112
  return false;
113
113
  }
114
114
  const tab = segments[2];
115
- return CONSOLE_LIST_TAB_NAMES.includes(tab);
115
+ return CONSOLE_LIST_TAB_NAMES.some((name) => name === tab);
116
116
  };
117
117
 
118
118
  export const isTokenValid = (
@@ -0,0 +1,217 @@
1
+ import * as fs from 'fs';
2
+ import * as os from 'os';
3
+ import * as path from 'path';
4
+ import { FileSystemConsoleTabsRepository } from './FileSystemConsoleTabsRepository';
5
+ import { readDoneProjectItemIds } from '../console/consoleDoneStore';
6
+ import type { ConsoleListItem } from '../../../domain/usecases/console/GenerateConsoleListsUseCase';
7
+
8
+ const makeItem = (
9
+ overrides: Partial<ConsoleListItem> = {},
10
+ ): ConsoleListItem => ({
11
+ number: 1,
12
+ title: 'Test Issue',
13
+ url: 'https://github.com/user/repo/issues/1',
14
+ repo: 'user/repo',
15
+ nameWithOwner: 'user/repo',
16
+ projectItemId: 'item-1',
17
+ itemId: 'item-1',
18
+ isPr: false,
19
+ story: 'Story A',
20
+ status: 'Awaiting Quality Check',
21
+ nextActionDate: null,
22
+ nextActionHour: null,
23
+ dependedIssueUrls: [],
24
+ labels: [],
25
+ createdAt: new Date('2024-01-01T00:00:00Z').toISOString(),
26
+ relatedOpenPullRequestUrls: [],
27
+ ...overrides,
28
+ });
29
+
30
+ const makeStatusTab = (
31
+ pjcode: string,
32
+ items: ConsoleListItem[],
33
+ storyOrder: string[] = ['Story A', 'Story B'],
34
+ ) => ({
35
+ pjcode,
36
+ generatedAt: '2026-08-16T04:19:32Z',
37
+ statusOptions: [],
38
+ storyOrder,
39
+ storyColors: {},
40
+ items,
41
+ });
42
+
43
+ describe('FileSystemConsoleTabsRepository', () => {
44
+ let dir: string;
45
+ const PJCODE = 'test-project';
46
+
47
+ beforeEach(() => {
48
+ dir = fs.mkdtempSync(
49
+ path.join(os.tmpdir(), 'console-tabs-repository-test-'),
50
+ );
51
+ });
52
+
53
+ afterEach(() => {
54
+ fs.rmSync(dir, { recursive: true, force: true });
55
+ });
56
+
57
+ const writeTabFile = (tab: string, data: unknown): void => {
58
+ const tabDir = path.join(dir, PJCODE, tab);
59
+ fs.mkdirSync(tabDir, { recursive: true });
60
+ fs.writeFileSync(path.join(tabDir, 'list.json'), JSON.stringify(data));
61
+ };
62
+
63
+ const readTabFile = (tab: string): unknown => {
64
+ const filePath = path.join(dir, PJCODE, tab, 'list.json');
65
+ const data: unknown = JSON.parse(fs.readFileSync(filePath, 'utf-8'));
66
+ return data;
67
+ };
68
+
69
+ it('inserts the item into the prs tab when transitioning to Awaiting Quality Check', () => {
70
+ writeTabFile('prs', makeStatusTab(PJCODE, []));
71
+ const repo = new FileSystemConsoleTabsRepository(dir, PJCODE);
72
+ const item = makeItem({ status: 'Awaiting Quality Check' });
73
+
74
+ repo.patchIssueTabTransition({
75
+ projectItemId: item.projectItemId,
76
+ item,
77
+ targetTabName: 'prs',
78
+ });
79
+
80
+ expect(readTabFile('prs')).toMatchObject({
81
+ items: [{ projectItemId: 'item-1' }],
82
+ });
83
+ });
84
+
85
+ it('preserves generatedAt in the patched tab file', () => {
86
+ writeTabFile('prs', makeStatusTab(PJCODE, []));
87
+ const repo = new FileSystemConsoleTabsRepository(dir, PJCODE);
88
+ const item = makeItem();
89
+
90
+ repo.patchIssueTabTransition({
91
+ projectItemId: item.projectItemId,
92
+ item,
93
+ targetTabName: 'prs',
94
+ });
95
+
96
+ expect(readTabFile('prs')).toHaveProperty(
97
+ 'generatedAt',
98
+ '2026-08-16T04:19:32Z',
99
+ );
100
+ });
101
+
102
+ it('removes the item from any tab it previously appeared in', () => {
103
+ const existingItem = makeItem({ projectItemId: 'item-1' });
104
+ writeTabFile('todo-by-human', makeStatusTab(PJCODE, [existingItem]));
105
+ writeTabFile('prs', makeStatusTab(PJCODE, []));
106
+ const repo = new FileSystemConsoleTabsRepository(dir, PJCODE);
107
+ const item = makeItem({ status: 'Awaiting Quality Check' });
108
+
109
+ repo.patchIssueTabTransition({
110
+ projectItemId: 'item-1',
111
+ item,
112
+ targetTabName: 'prs',
113
+ });
114
+
115
+ expect(readTabFile('todo-by-human')).toMatchObject({ items: [] });
116
+ expect(readTabFile('prs')).toMatchObject({
117
+ items: [{ projectItemId: 'item-1' }],
118
+ });
119
+ });
120
+
121
+ it('removes the projectItemId from the target tab .done.json', () => {
122
+ writeTabFile('prs', makeStatusTab(PJCODE, []));
123
+ const doneFilePath = path.join(dir, PJCODE, 'prs', '.done.json');
124
+ fs.writeFileSync(
125
+ doneFilePath,
126
+ JSON.stringify({ projectItemIds: ['item-1', 'item-2'] }),
127
+ );
128
+ const repo = new FileSystemConsoleTabsRepository(dir, PJCODE);
129
+ const item = makeItem();
130
+
131
+ repo.patchIssueTabTransition({
132
+ projectItemId: 'item-1',
133
+ item,
134
+ targetTabName: 'prs',
135
+ });
136
+
137
+ const ids = readDoneProjectItemIds(dir, PJCODE, 'prs');
138
+ expect(ids).not.toContain('item-1');
139
+ expect(ids).toContain('item-2');
140
+ });
141
+
142
+ it('is a no-op when the target tab file does not exist', () => {
143
+ const repo = new FileSystemConsoleTabsRepository(dir, PJCODE);
144
+ const item = makeItem();
145
+
146
+ expect(() =>
147
+ repo.patchIssueTabTransition({
148
+ projectItemId: item.projectItemId,
149
+ item,
150
+ targetTabName: 'prs',
151
+ }),
152
+ ).not.toThrow();
153
+ expect(fs.existsSync(path.join(dir, PJCODE, 'prs', 'list.json'))).toBe(
154
+ false,
155
+ );
156
+ });
157
+
158
+ it('removes the item from any tab and writes nothing when targetTabName is null', () => {
159
+ const existingItem = makeItem({ projectItemId: 'item-1' });
160
+ writeTabFile('prs', makeStatusTab(PJCODE, [existingItem]));
161
+ const repo = new FileSystemConsoleTabsRepository(dir, PJCODE);
162
+ const item = makeItem({ status: 'Awaiting Workspace' });
163
+
164
+ repo.patchIssueTabTransition({
165
+ projectItemId: 'item-1',
166
+ item,
167
+ targetTabName: null,
168
+ });
169
+
170
+ expect(readTabFile('prs')).toMatchObject({ items: [] });
171
+ });
172
+
173
+ it('maintains story order after inserting the new item', () => {
174
+ const itemInStoryB = makeItem({
175
+ projectItemId: 'item-2',
176
+ story: 'Story B',
177
+ });
178
+ writeTabFile('prs', makeStatusTab(PJCODE, [itemInStoryB]));
179
+ const repo = new FileSystemConsoleTabsRepository(dir, PJCODE);
180
+ const item = makeItem({
181
+ projectItemId: 'item-1',
182
+ story: 'Story A',
183
+ status: 'Awaiting Quality Check',
184
+ });
185
+
186
+ repo.patchIssueTabTransition({
187
+ projectItemId: 'item-1',
188
+ item,
189
+ targetTabName: 'prs',
190
+ });
191
+
192
+ expect(readTabFile('prs')).toMatchObject({
193
+ items: [{ story: 'Story A' }, { story: 'Story B' }],
194
+ });
195
+ });
196
+
197
+ it('does not write to tab files that do not contain the item when targetTabName is null', () => {
198
+ const otherItem = makeItem({ projectItemId: 'item-99' });
199
+ writeTabFile('prs', makeStatusTab(PJCODE, [otherItem]));
200
+ const mtimeBefore = fs.statSync(
201
+ path.join(dir, PJCODE, 'prs', 'list.json'),
202
+ ).mtimeMs;
203
+ const repo = new FileSystemConsoleTabsRepository(dir, PJCODE);
204
+ const item = makeItem({ projectItemId: 'item-1' });
205
+
206
+ repo.patchIssueTabTransition({
207
+ projectItemId: 'item-1',
208
+ item,
209
+ targetTabName: null,
210
+ });
211
+
212
+ const mtimeAfter = fs.statSync(
213
+ path.join(dir, PJCODE, 'prs', 'list.json'),
214
+ ).mtimeMs;
215
+ expect(mtimeAfter).toBe(mtimeBefore);
216
+ });
217
+ });