github-issue-tower-defence-management 1.128.1 → 1.130.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.
- package/.github/workflows/console-ui.yml +1 -1
- package/.github/workflows/empty-format-test-job.yml +1 -1
- package/.github/workflows/format.yml +1 -1
- package/.github/workflows/publish.yml +1 -1
- package/.github/workflows/test.yml +1 -1
- package/CHANGELOG.md +14 -0
- package/README.md +9 -8
- package/bin/adapter/entry-points/console/consoleDataDelivery.js +1 -0
- package/bin/adapter/entry-points/console/consoleDataDelivery.js.map +1 -1
- package/bin/adapter/entry-points/console/consoleDoneStore.js +1 -0
- package/bin/adapter/entry-points/console/consoleDoneStore.js.map +1 -1
- package/bin/adapter/entry-points/console/ui-dist/assets/index-Bz0KvgIG.js +103 -0
- package/bin/adapter/entry-points/console/ui-dist/index.html +1 -1
- package/bin/adapter/entry-points/handlers/consoleListsWriter.js +1 -0
- package/bin/adapter/entry-points/handlers/consoleListsWriter.js.map +1 -1
- package/bin/domain/entities/WorkflowStatus.js +6 -1
- package/bin/domain/entities/WorkflowStatus.js.map +1 -1
- package/bin/domain/usecases/console/GenerateConsoleListsUseCase.js +2 -0
- package/bin/domain/usecases/console/GenerateConsoleListsUseCase.js.map +1 -1
- package/package.json +3 -3
- package/src/adapter/entry-points/console/consoleDataDelivery.test.ts +6 -0
- package/src/adapter/entry-points/console/consoleDataDelivery.ts +1 -0
- package/src/adapter/entry-points/console/consoleDoneStore.test.ts +4 -0
- package/src/adapter/entry-points/console/consoleDoneStore.ts +1 -0
- package/src/adapter/entry-points/console/ui/e2e/consoleTestHarness.ts +10 -0
- package/src/adapter/entry-points/console/ui/src/features/console/components/layout/ConsoleTabList.stories.tsx +4 -0
- package/src/adapter/entry-points/console/ui/src/features/console/components/layout/ConsoleTabList.test.tsx +2 -0
- package/src/adapter/entry-points/console/ui/src/features/console/components/operations/ConsoleNextActionDateActions.stories.tsx +2 -2
- package/src/adapter/entry-points/console/ui/src/features/console/components/operations/ConsoleNextActionDateActions.test.tsx +5 -5
- package/src/adapter/entry-points/console/ui/src/features/console/components/operations/ConsoleNextActionDateActions.tsx +3 -3
- package/src/adapter/entry-points/console/ui/src/features/console/components/operations/ConsoleOperationMenu.stories.tsx +8 -0
- package/src/adapter/entry-points/console/ui/src/features/console/components/operations/ConsoleOperationMenu.test.tsx +15 -0
- package/src/adapter/entry-points/console/ui/src/features/console/components/operations/ConsoleOperationMenu.tsx +2 -2
- package/src/adapter/entry-points/console/ui/src/features/console/hooks/useConsoleNavigation.test.ts +1 -0
- package/src/adapter/entry-points/console/ui/src/features/console/hooks/useConsoleTabData.test.ts +2 -1
- package/src/adapter/entry-points/console/ui/src/features/console/logic/actionToast.test.ts +6 -2
- package/src/adapter/entry-points/console/ui/src/features/console/logic/actionToast.ts +7 -6
- package/src/adapter/entry-points/console/ui/src/features/console/logic/operations.test.ts +7 -5
- package/src/adapter/entry-points/console/ui/src/features/console/logic/operations.ts +3 -2
- package/src/adapter/entry-points/console/ui/src/features/console/logic/tabAdvance.test.ts +11 -1
- package/src/adapter/entry-points/console/ui/src/features/console/logic/types.ts +3 -1
- package/src/adapter/entry-points/console/ui/src/features/console/testing/fixtures.ts +1 -0
- package/src/adapter/entry-points/console/ui-dist/assets/index-Bz0KvgIG.js +103 -0
- package/src/adapter/entry-points/console/ui-dist/index.html +1 -1
- package/src/adapter/entry-points/console/webServer.test.ts +1 -0
- package/src/adapter/entry-points/handlers/consoleListsWriter.test.ts +21 -1
- package/src/adapter/entry-points/handlers/consoleListsWriter.ts +1 -0
- package/src/domain/entities/WorkflowStatus.ts +5 -0
- package/src/domain/usecases/SetupTowerDefenceProjectUseCase.test.ts +92 -2
- package/src/domain/usecases/console/GenerateConsoleListsUseCase.test.ts +28 -0
- package/src/domain/usecases/console/GenerateConsoleListsUseCase.ts +9 -1
- package/types/adapter/entry-points/console/consoleDataDelivery.d.ts.map +1 -1
- package/types/adapter/entry-points/console/consoleDoneStore.d.ts.map +1 -1
- package/types/adapter/entry-points/handlers/consoleListsWriter.d.ts.map +1 -1
- package/types/domain/entities/WorkflowStatus.d.ts +1 -0
- package/types/domain/entities/WorkflowStatus.d.ts.map +1 -1
- package/types/domain/usecases/console/GenerateConsoleListsUseCase.d.ts +2 -1
- package/types/domain/usecases/console/GenerateConsoleListsUseCase.d.ts.map +1 -1
- package/bin/adapter/entry-points/console/ui-dist/assets/index-CufymFM1.js +0 -103
- package/src/adapter/entry-points/console/ui-dist/assets/index-CufymFM1.js +0 -103
|
@@ -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-
|
|
7
|
+
<script type="module" crossorigin src="/assets/index-Bz0KvgIG.js"></script>
|
|
8
8
|
<link rel="stylesheet" crossorigin href="/assets/index-N9M1qhkw.css">
|
|
9
9
|
</head>
|
|
10
10
|
<body>
|
|
@@ -82,6 +82,7 @@ describe('webServer pure helpers', () => {
|
|
|
82
82
|
true,
|
|
83
83
|
);
|
|
84
84
|
expect(isConsoleAppRoute('/projects/utage3/todo-by-human')).toBe(true);
|
|
85
|
+
expect(isConsoleAppRoute('/projects/utage3/todo-by-agent')).toBe(true);
|
|
85
86
|
});
|
|
86
87
|
|
|
87
88
|
it('does not match data, api, or unknown tab routes', () => {
|
|
@@ -87,7 +87,7 @@ describe('writeConsoleLists', () => {
|
|
|
87
87
|
const tabFile = (tab: string): string =>
|
|
88
88
|
path.join(outDir, 'demo', tab, 'list.json');
|
|
89
89
|
|
|
90
|
-
it('writes
|
|
90
|
+
it('writes every console tab list.json file', () => {
|
|
91
91
|
writeConsoleLists({
|
|
92
92
|
consoleDataOutputDir: outDir,
|
|
93
93
|
pjcode: 'demo',
|
|
@@ -104,6 +104,7 @@ describe('writeConsoleLists', () => {
|
|
|
104
104
|
'unread',
|
|
105
105
|
'failed-preparation',
|
|
106
106
|
'todo-by-human',
|
|
107
|
+
'todo-by-agent',
|
|
107
108
|
]) {
|
|
108
109
|
expect(fs.existsSync(tabFile(tab))).toBe(true);
|
|
109
110
|
}
|
|
@@ -172,6 +173,25 @@ describe('writeConsoleLists', () => {
|
|
|
172
173
|
expect(isUnknownArray(items) ? items.length : 0).toBe(1);
|
|
173
174
|
});
|
|
174
175
|
|
|
176
|
+
it('writes todo-by-agent items selected by the Todo by agent status', () => {
|
|
177
|
+
writeConsoleLists({
|
|
178
|
+
consoleDataOutputDir: outDir,
|
|
179
|
+
pjcode: 'demo',
|
|
180
|
+
assigneeLogin: ASSIGNEE,
|
|
181
|
+
project,
|
|
182
|
+
issues: [makeIssue({ status: 'Todo by agent' })],
|
|
183
|
+
generatedAt: '2026-06-14T07:22:33Z',
|
|
184
|
+
});
|
|
185
|
+
|
|
186
|
+
const raw: unknown = JSON.parse(
|
|
187
|
+
fs.readFileSync(tabFile('todo-by-agent'), 'utf8'),
|
|
188
|
+
);
|
|
189
|
+
expect(isRecord(raw)).toBe(true);
|
|
190
|
+
const items: unknown = isRecord(raw) ? raw.items : undefined;
|
|
191
|
+
expect(isUnknownArray(items)).toBe(true);
|
|
192
|
+
expect(isUnknownArray(items) ? items.length : 0).toBe(1);
|
|
193
|
+
});
|
|
194
|
+
|
|
175
195
|
it('writes items with no body field', () => {
|
|
176
196
|
writeConsoleLists({
|
|
177
197
|
consoleDataOutputDir: outDir,
|
|
@@ -6,6 +6,7 @@ export const PREPARATION_STATUS_NAME = 'Preparation';
|
|
|
6
6
|
export const FAILED_PREPARATION_STATUS_NAME = 'Failed Preparation';
|
|
7
7
|
export const AWAITING_QUALITY_CHECK_STATUS_NAME = 'Awaiting Quality Check';
|
|
8
8
|
export const TODO_STATUS_NAME = 'Todo by human';
|
|
9
|
+
export const TODO_BY_AGENT_STATUS_NAME = 'Todo by agent';
|
|
9
10
|
export const PC_TODO_STATUS_NAME = 'PC Todo';
|
|
10
11
|
export const IN_TMUX_STATUS_NAME = 'In Tmux by human';
|
|
11
12
|
export const IN_TMUX_BY_AGENT_STATUS_NAME = 'In Tmux by agent';
|
|
@@ -47,6 +48,10 @@ export const REQUIRED_WORKFLOW_STATUSES: WorkflowStatusDefinition[] = [
|
|
|
47
48
|
name: TODO_STATUS_NAME,
|
|
48
49
|
color: 'PINK',
|
|
49
50
|
},
|
|
51
|
+
{
|
|
52
|
+
name: TODO_BY_AGENT_STATUS_NAME,
|
|
53
|
+
color: 'BLUE',
|
|
54
|
+
},
|
|
50
55
|
{
|
|
51
56
|
name: IN_TMUX_STATUS_NAME,
|
|
52
57
|
color: 'RED',
|
|
@@ -19,6 +19,7 @@ import {
|
|
|
19
19
|
PC_TODO_STATUS_NAME,
|
|
20
20
|
PREPARATION_STATUS_NAME,
|
|
21
21
|
REQUIRED_WORKFLOW_STATUSES,
|
|
22
|
+
TODO_BY_AGENT_STATUS_NAME,
|
|
22
23
|
TODO_STATUS_NAME,
|
|
23
24
|
} from '../entities/WorkflowStatus';
|
|
24
25
|
|
|
@@ -77,7 +78,7 @@ const buildIssue = (overrides: Partial<Issue>): Issue => ({
|
|
|
77
78
|
});
|
|
78
79
|
|
|
79
80
|
describe('SetupTowerDefenceProjectUseCase', () => {
|
|
80
|
-
it('should define exactly the
|
|
81
|
+
it('should define exactly the 11 required statuses in the documented order with the documented colors and no descriptions', () => {
|
|
81
82
|
expect(REQUIRED_WORKFLOW_STATUSES).toEqual([
|
|
82
83
|
{ name: DEFAULT_STATUS_NAME, color: 'ORANGE' },
|
|
83
84
|
{ name: AWAITING_WORKSPACE_STATUS_NAME, color: 'BLUE' },
|
|
@@ -85,6 +86,7 @@ describe('SetupTowerDefenceProjectUseCase', () => {
|
|
|
85
86
|
{ name: FAILED_PREPARATION_STATUS_NAME, color: 'RED' },
|
|
86
87
|
{ name: AWAITING_QUALITY_CHECK_STATUS_NAME, color: 'GREEN' },
|
|
87
88
|
{ name: TODO_STATUS_NAME, color: 'PINK' },
|
|
89
|
+
{ name: TODO_BY_AGENT_STATUS_NAME, color: 'BLUE' },
|
|
88
90
|
{ name: IN_TMUX_STATUS_NAME, color: 'RED' },
|
|
89
91
|
{ name: IN_TMUX_BY_AGENT_STATUS_NAME, color: 'YELLOW' },
|
|
90
92
|
{ name: DONE_STATUS_NAME, color: 'PURPLE' },
|
|
@@ -253,6 +255,12 @@ describe('SetupTowerDefenceProjectUseCase', () => {
|
|
|
253
255
|
color: 'PINK',
|
|
254
256
|
description: '',
|
|
255
257
|
},
|
|
258
|
+
{
|
|
259
|
+
id: null,
|
|
260
|
+
name: TODO_BY_AGENT_STATUS_NAME,
|
|
261
|
+
color: 'BLUE',
|
|
262
|
+
description: '',
|
|
263
|
+
},
|
|
256
264
|
{
|
|
257
265
|
id: null,
|
|
258
266
|
name: IN_TMUX_STATUS_NAME,
|
|
@@ -324,6 +332,7 @@ describe('SetupTowerDefenceProjectUseCase', () => {
|
|
|
324
332
|
FAILED_PREPARATION_STATUS_NAME,
|
|
325
333
|
AWAITING_QUALITY_CHECK_STATUS_NAME,
|
|
326
334
|
TODO_STATUS_NAME,
|
|
335
|
+
TODO_BY_AGENT_STATUS_NAME,
|
|
327
336
|
IN_TMUX_STATUS_NAME,
|
|
328
337
|
IN_TMUX_BY_AGENT_STATUS_NAME,
|
|
329
338
|
DONE_STATUS_NAME,
|
|
@@ -432,12 +441,90 @@ describe('SetupTowerDefenceProjectUseCase', () => {
|
|
|
432
441
|
const [, payload] = mockProjectRepository.updateStatusList.mock.calls[0];
|
|
433
442
|
const inTmuxEntry = payload.find((s) => s.name === IN_TMUX_STATUS_NAME);
|
|
434
443
|
expect(inTmuxEntry).toBeDefined();
|
|
435
|
-
expect(inTmuxEntry?.id).toBe('id-
|
|
444
|
+
expect(inTmuxEntry?.id).toBe('id-7');
|
|
436
445
|
expect(payload.some((s) => s.name === LEGACY_IN_TMUX_STATUS_NAME)).toBe(
|
|
437
446
|
false,
|
|
438
447
|
);
|
|
439
448
|
});
|
|
440
449
|
|
|
450
|
+
it('should create the "Todo by agent" status with blue color when it is missing', async () => {
|
|
451
|
+
const mockProjectRepository =
|
|
452
|
+
mock<Pick<ProjectRepository, 'getByUrl' | 'updateStatusList'>>();
|
|
453
|
+
const mockIssueRepository =
|
|
454
|
+
mock<Pick<IssueRepository, 'getAllIssues' | 'updateStatus'>>();
|
|
455
|
+
const statuses = buildCanonicalStatuses().filter(
|
|
456
|
+
(s) => s.name !== TODO_BY_AGENT_STATUS_NAME,
|
|
457
|
+
);
|
|
458
|
+
const project = buildProject(statuses);
|
|
459
|
+
mockProjectRepository.getByUrl.mockResolvedValue(project);
|
|
460
|
+
mockProjectRepository.updateStatusList.mockResolvedValue([]);
|
|
461
|
+
mockIssueRepository.getAllIssues.mockResolvedValue({
|
|
462
|
+
project: mock<Project>(),
|
|
463
|
+
issues: [],
|
|
464
|
+
cacheUsed: false,
|
|
465
|
+
});
|
|
466
|
+
|
|
467
|
+
const useCase = new SetupTowerDefenceProjectUseCase(
|
|
468
|
+
mockProjectRepository,
|
|
469
|
+
mockIssueRepository,
|
|
470
|
+
);
|
|
471
|
+
await useCase.run({ projectUrl: project.url });
|
|
472
|
+
|
|
473
|
+
expect(mockProjectRepository.updateStatusList).toHaveBeenCalledTimes(1);
|
|
474
|
+
const [, payload] = mockProjectRepository.updateStatusList.mock.calls[0];
|
|
475
|
+
const todoByAgentEntry = payload.find(
|
|
476
|
+
(s) => s.name === TODO_BY_AGENT_STATUS_NAME,
|
|
477
|
+
);
|
|
478
|
+
expect(todoByAgentEntry).toBeDefined();
|
|
479
|
+
expect(todoByAgentEntry?.id).toBeNull();
|
|
480
|
+
expect(todoByAgentEntry?.color).toBe('BLUE');
|
|
481
|
+
const names = payload.map((s) => s.name);
|
|
482
|
+
expect(names.indexOf(TODO_BY_AGENT_STATUS_NAME)).toBe(
|
|
483
|
+
names.indexOf(TODO_STATUS_NAME) + 1,
|
|
484
|
+
);
|
|
485
|
+
});
|
|
486
|
+
|
|
487
|
+
it('should leave an already-present "Todo by agent" option unchanged by reusing its existing option ID', async () => {
|
|
488
|
+
const mockProjectRepository =
|
|
489
|
+
mock<Pick<ProjectRepository, 'getByUrl' | 'updateStatusList'>>();
|
|
490
|
+
const mockIssueRepository =
|
|
491
|
+
mock<Pick<IssueRepository, 'getAllIssues' | 'updateStatus'>>();
|
|
492
|
+
const statuses = buildCanonicalStatuses().map((s) => {
|
|
493
|
+
if (s.name === TODO_BY_AGENT_STATUS_NAME) {
|
|
494
|
+
return { ...s, id: 'preexisting-todo-agent-id' };
|
|
495
|
+
}
|
|
496
|
+
if (s.name === DEFAULT_STATUS_NAME) {
|
|
497
|
+
return { ...s, description: 'stale description' };
|
|
498
|
+
}
|
|
499
|
+
return s;
|
|
500
|
+
});
|
|
501
|
+
const project = buildProject(statuses);
|
|
502
|
+
mockProjectRepository.getByUrl.mockResolvedValue(project);
|
|
503
|
+
mockProjectRepository.updateStatusList.mockResolvedValue([]);
|
|
504
|
+
mockIssueRepository.getAllIssues.mockResolvedValue({
|
|
505
|
+
project: mock<Project>(),
|
|
506
|
+
issues: [],
|
|
507
|
+
cacheUsed: false,
|
|
508
|
+
});
|
|
509
|
+
|
|
510
|
+
const useCase = new SetupTowerDefenceProjectUseCase(
|
|
511
|
+
mockProjectRepository,
|
|
512
|
+
mockIssueRepository,
|
|
513
|
+
);
|
|
514
|
+
await useCase.run({ projectUrl: project.url });
|
|
515
|
+
|
|
516
|
+
expect(mockProjectRepository.updateStatusList).toHaveBeenCalledTimes(1);
|
|
517
|
+
const [, payload] = mockProjectRepository.updateStatusList.mock.calls[0];
|
|
518
|
+
const todoByAgentEntry = payload.find(
|
|
519
|
+
(s) => s.name === TODO_BY_AGENT_STATUS_NAME,
|
|
520
|
+
);
|
|
521
|
+
expect(todoByAgentEntry?.id).toBe('preexisting-todo-agent-id');
|
|
522
|
+
expect(todoByAgentEntry?.color).toBe('BLUE');
|
|
523
|
+
expect(
|
|
524
|
+
payload.filter((s) => s.name === TODO_BY_AGENT_STATUS_NAME),
|
|
525
|
+
).toHaveLength(1);
|
|
526
|
+
});
|
|
527
|
+
|
|
441
528
|
it('should create the "In Tmux by agent" status with yellow color when it is missing', async () => {
|
|
442
529
|
const mockProjectRepository =
|
|
443
530
|
mock<Pick<ProjectRepository, 'getByUrl' | 'updateStatusList'>>();
|
|
@@ -627,6 +714,7 @@ describe('SetupTowerDefenceProjectUseCase', () => {
|
|
|
627
714
|
FAILED_PREPARATION_STATUS_NAME,
|
|
628
715
|
AWAITING_QUALITY_CHECK_STATUS_NAME,
|
|
629
716
|
TODO_STATUS_NAME,
|
|
717
|
+
TODO_BY_AGENT_STATUS_NAME,
|
|
630
718
|
IN_TMUX_STATUS_NAME,
|
|
631
719
|
IN_TMUX_BY_AGENT_STATUS_NAME,
|
|
632
720
|
DONE_STATUS_NAME,
|
|
@@ -764,6 +852,7 @@ describe('SetupTowerDefenceProjectUseCase', () => {
|
|
|
764
852
|
FAILED_PREPARATION_STATUS_NAME,
|
|
765
853
|
AWAITING_QUALITY_CHECK_STATUS_NAME,
|
|
766
854
|
TODO_STATUS_NAME,
|
|
855
|
+
TODO_BY_AGENT_STATUS_NAME,
|
|
767
856
|
IN_TMUX_STATUS_NAME,
|
|
768
857
|
IN_TMUX_BY_AGENT_STATUS_NAME,
|
|
769
858
|
DONE_STATUS_NAME,
|
|
@@ -917,6 +1006,7 @@ describe('SetupTowerDefenceProjectUseCase', () => {
|
|
|
917
1006
|
FAILED_PREPARATION_STATUS_NAME,
|
|
918
1007
|
AWAITING_QUALITY_CHECK_STATUS_NAME,
|
|
919
1008
|
TODO_STATUS_NAME,
|
|
1009
|
+
TODO_BY_AGENT_STATUS_NAME,
|
|
920
1010
|
IN_TMUX_STATUS_NAME,
|
|
921
1011
|
IN_TMUX_BY_AGENT_STATUS_NAME,
|
|
922
1012
|
DONE_STATUS_NAME,
|
|
@@ -23,6 +23,7 @@ const STATUS_OPTIONS: FieldOption[] = [
|
|
|
23
23
|
storyOption('st-failed', 'Failed Preparation', 'RED'),
|
|
24
24
|
storyOption('st-aqc', 'Awaiting Quality Check', 'GREEN'),
|
|
25
25
|
storyOption('st-todo', 'Todo by human', 'PINK'),
|
|
26
|
+
storyOption('st-todo-agent', 'Todo by agent', 'BLUE'),
|
|
26
27
|
storyOption('st-tmux', 'In Tmux by human', 'RED'),
|
|
27
28
|
storyOption('st-tmux-agent', 'In Tmux by agent', 'YELLOW'),
|
|
28
29
|
storyOption('st-done', 'Done', 'PURPLE'),
|
|
@@ -200,6 +201,25 @@ describe('GenerateConsoleListsUseCase', () => {
|
|
|
200
201
|
expect(result['todo-by-human'].items).toHaveLength(0);
|
|
201
202
|
});
|
|
202
203
|
|
|
204
|
+
it('selects todo-by-agent items for the exact status only', () => {
|
|
205
|
+
const result = run([
|
|
206
|
+
makeIssue({ status: 'Todo by agent' }),
|
|
207
|
+
makeIssue({ status: 'todo by agent' }),
|
|
208
|
+
makeIssue({ status: 'Todo by human' }),
|
|
209
|
+
makeIssue({ status: 'Unread' }),
|
|
210
|
+
]);
|
|
211
|
+
expect(result['todo-by-agent'].items.map((item) => item.number)).toEqual([
|
|
212
|
+
1,
|
|
213
|
+
]);
|
|
214
|
+
});
|
|
215
|
+
|
|
216
|
+
it('rejects a non-actionable todo-by-agent issue', () => {
|
|
217
|
+
const result = run([
|
|
218
|
+
makeIssue({ status: 'Todo by agent', nextActionHour: 9 }),
|
|
219
|
+
]);
|
|
220
|
+
expect(result['todo-by-agent'].items).toHaveLength(0);
|
|
221
|
+
});
|
|
222
|
+
|
|
203
223
|
it('selects no-story items case-insensitively for triage', () => {
|
|
204
224
|
const result = run([
|
|
205
225
|
makeIssue({ story: 'regular / NO STORY; SET STORY FIELD' }),
|
|
@@ -430,6 +450,7 @@ describe('GenerateConsoleListsUseCase', () => {
|
|
|
430
450
|
'Unread',
|
|
431
451
|
'In Tmux by human',
|
|
432
452
|
'In Tmux by agent',
|
|
453
|
+
'Todo by agent',
|
|
433
454
|
]) {
|
|
434
455
|
expect(names).not.toContain(excluded);
|
|
435
456
|
}
|
|
@@ -443,6 +464,13 @@ describe('GenerateConsoleListsUseCase', () => {
|
|
|
443
464
|
expect(names).toContain('Awaiting Workspace');
|
|
444
465
|
});
|
|
445
466
|
|
|
467
|
+
it('excludes todo by agent and done from todo-by-agent status options', () => {
|
|
468
|
+
const names = run([])['todo-by-agent'].statusOptions.map((o) => o.name);
|
|
469
|
+
expect(names).not.toContain('Todo by agent');
|
|
470
|
+
expect(names).not.toContain('Done');
|
|
471
|
+
expect(names).toContain('Awaiting Workspace');
|
|
472
|
+
});
|
|
473
|
+
|
|
446
474
|
it('emits all story options for triage and no statusOptions key', () => {
|
|
447
475
|
const triage = run([]).triage;
|
|
448
476
|
expect(triage.storyOptions.map((o) => o.name)).toEqual([
|
|
@@ -3,6 +3,7 @@ import { FieldOption, Project } from '../../entities/Project';
|
|
|
3
3
|
import {
|
|
4
4
|
IN_TMUX_BY_AGENT_STATUS_NAME,
|
|
5
5
|
LEGACY_TODO_STATUS_NAME,
|
|
6
|
+
TODO_BY_AGENT_STATUS_NAME,
|
|
6
7
|
TODO_STATUS_NAME,
|
|
7
8
|
} from '../../entities/WorkflowStatus';
|
|
8
9
|
|
|
@@ -56,7 +57,8 @@ export type ConsoleTabName =
|
|
|
56
57
|
| 'triage'
|
|
57
58
|
| 'unread'
|
|
58
59
|
| 'failed-preparation'
|
|
59
|
-
| 'todo-by-human'
|
|
60
|
+
| 'todo-by-human'
|
|
61
|
+
| 'todo-by-agent';
|
|
60
62
|
|
|
61
63
|
export type ConsoleLists = {
|
|
62
64
|
'workflow-blocker': ConsoleStatusTab;
|
|
@@ -65,6 +67,7 @@ export type ConsoleLists = {
|
|
|
65
67
|
unread: ConsoleStatusTab;
|
|
66
68
|
'failed-preparation': ConsoleStatusTab;
|
|
67
69
|
'todo-by-human': ConsoleStatusTab;
|
|
70
|
+
'todo-by-agent': ConsoleStatusTab;
|
|
68
71
|
};
|
|
69
72
|
|
|
70
73
|
export type GenerateConsoleListsInput = {
|
|
@@ -146,6 +149,7 @@ export class GenerateConsoleListsUseCase {
|
|
|
146
149
|
'unread',
|
|
147
150
|
'in tmux by human',
|
|
148
151
|
'in tmux by agent',
|
|
152
|
+
'todo by agent',
|
|
149
153
|
],
|
|
150
154
|
),
|
|
151
155
|
'todo-by-human': buildStatusTab(
|
|
@@ -154,6 +158,10 @@ export class GenerateConsoleListsUseCase {
|
|
|
154
158
|
issue.status === LEGACY_TODO_STATUS_NAME,
|
|
155
159
|
[TODO_STATUS_NAME.toLowerCase(), 'done'],
|
|
156
160
|
),
|
|
161
|
+
'todo-by-agent': buildStatusTab(
|
|
162
|
+
(issue) => issue.status === TODO_BY_AGENT_STATUS_NAME,
|
|
163
|
+
[TODO_BY_AGENT_STATUS_NAME.toLowerCase(), 'done'],
|
|
164
|
+
),
|
|
157
165
|
triage: {
|
|
158
166
|
pjcode,
|
|
159
167
|
generatedAt,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"consoleDataDelivery.d.ts","sourceRoot":"","sources":["../../../../src/adapter/entry-points/console/consoleDataDelivery.ts"],"names":[],"mappings":"AAIA,eAAO,MAAM,sBAAsB,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"consoleDataDelivery.d.ts","sourceRoot":"","sources":["../../../../src/adapter/entry-points/console/consoleDataDelivery.ts"],"names":[],"mappings":"AAIA,eAAO,MAAM,sBAAsB,EAAE,MAAM,EAQ1C,CAAC;AAEF,MAAM,MAAM,gBAAgB,GACxB;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,GAC7C;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,GAC5D;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,CAAA;CAAE,CAAC;AAO9D,eAAO,MAAM,qBAAqB,GAChC,aAAa,MAAM,KAClB,gBAAgB,GAAG,IAoCrB,CAAC;AA0CF,MAAM,MAAM,mBAAmB,GAAG;IAChC,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;CACd,CAAC;AAEF,eAAO,MAAM,wBAAwB,GACnC,sBAAsB,MAAM,EAC5B,OAAO,gBAAgB,KACtB,mBA6CF,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"consoleDoneStore.d.ts","sourceRoot":"","sources":["../../../../src/adapter/entry-points/console/consoleDoneStore.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,sBAAsB,eAAe,CAAC;AAEnD,MAAM,MAAM,iBAAiB,GAAG;IAC9B,cAAc,EAAE,MAAM,EAAE,CAAC;CAC1B,CAAC;AAqBF,eAAO,MAAM,kBAAkB,GAC7B,sBAAsB,MAAM,EAC5B,QAAQ,MAAM,EACd,KAAK,MAAM,KACV,MACmE,CAAC;AAYvE,eAAO,MAAM,sBAAsB,GACjC,sBAAsB,MAAM,EAC5B,QAAQ,MAAM,EACd,KAAK,MAAM,KACV,MAAM,EASR,CAAC;AAEF,eAAO,MAAM,uBAAuB,GAClC,sBAAsB,MAAM,EAC5B,QAAQ,MAAM,EACd,KAAK,MAAM,EACX,eAAe,MAAM,KACpB,IAaF,CAAC;AAEF,eAAO,MAAM,sBAAsB,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"consoleDoneStore.d.ts","sourceRoot":"","sources":["../../../../src/adapter/entry-points/console/consoleDoneStore.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,sBAAsB,eAAe,CAAC;AAEnD,MAAM,MAAM,iBAAiB,GAAG;IAC9B,cAAc,EAAE,MAAM,EAAE,CAAC;CAC1B,CAAC;AAqBF,eAAO,MAAM,kBAAkB,GAC7B,sBAAsB,MAAM,EAC5B,QAAQ,MAAM,EACd,KAAK,MAAM,KACV,MACmE,CAAC;AAYvE,eAAO,MAAM,sBAAsB,GACjC,sBAAsB,MAAM,EAC5B,QAAQ,MAAM,EACd,KAAK,MAAM,KACV,MAAM,EASR,CAAC;AAEF,eAAO,MAAM,uBAAuB,GAClC,sBAAsB,MAAM,EAC5B,QAAQ,MAAM,EACd,KAAK,MAAM,EACX,eAAe,MAAM,KACpB,IAaF,CAAC;AAEF,eAAO,MAAM,sBAAsB,EAAE,MAAM,EAS1C,CAAC;AAEF,eAAO,MAAM,iCAAiC,GAC5C,sBAAsB,MAAM,EAC5B,QAAQ,MAAM,EACd,eAAe,MAAM,KACpB,IAIF,CAAC;AAEF,eAAO,MAAM,uBAAuB,GAClC,sBAAsB,MAAM,EAC5B,QAAQ,MAAM,EACd,KAAK,MAAM,KACV,IAGF,CAAC;AAEF,eAAO,MAAM,iCAAiC,GAC5C,sBAAsB,MAAM,EAC5B,QAAQ,MAAM,KACb,IAIF,CAAC"}
|
|
@@ -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;AAQhE,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,wBAAwB,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;IACrD,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB,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;AAQhE,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,wBAAwB,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;IACrD,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB,CAAC;AAYF,eAAO,MAAM,wBAAwB,GAAI,MAAM,IAAI,KAAG,MACR,CAAC;AAU/C,eAAO,MAAM,iBAAiB,GAAI,QAAQ,wBAAwB,KAAG,IAyBpE,CAAC"}
|
|
@@ -5,6 +5,7 @@ export declare const PREPARATION_STATUS_NAME = "Preparation";
|
|
|
5
5
|
export declare const FAILED_PREPARATION_STATUS_NAME = "Failed Preparation";
|
|
6
6
|
export declare const AWAITING_QUALITY_CHECK_STATUS_NAME = "Awaiting Quality Check";
|
|
7
7
|
export declare const TODO_STATUS_NAME = "Todo by human";
|
|
8
|
+
export declare const TODO_BY_AGENT_STATUS_NAME = "Todo by agent";
|
|
8
9
|
export declare const PC_TODO_STATUS_NAME = "PC Todo";
|
|
9
10
|
export declare const IN_TMUX_STATUS_NAME = "In Tmux by human";
|
|
10
11
|
export declare const IN_TMUX_BY_AGENT_STATUS_NAME = "In Tmux by agent";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"WorkflowStatus.d.ts","sourceRoot":"","sources":["../../../src/domain/entities/WorkflowStatus.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAExC,eAAO,MAAM,mBAAmB,WAAW,CAAC;AAC5C,eAAO,MAAM,8BAA8B,uBAAuB,CAAC;AACnE,eAAO,MAAM,uBAAuB,gBAAgB,CAAC;AACrD,eAAO,MAAM,8BAA8B,uBAAuB,CAAC;AACnE,eAAO,MAAM,kCAAkC,2BAA2B,CAAC;AAC3E,eAAO,MAAM,gBAAgB,kBAAkB,CAAC;AAChD,eAAO,MAAM,mBAAmB,YAAY,CAAC;AAC7C,eAAO,MAAM,mBAAmB,qBAAqB,CAAC;AACtD,eAAO,MAAM,4BAA4B,qBAAqB,CAAC;AAC/D,eAAO,MAAM,gBAAgB,SAAS,CAAC;AACvC,eAAO,MAAM,kBAAkB,WAAW,CAAC;AAE3C,eAAO,MAAM,uBAAuB,SAAS,CAAC;AAC9C,eAAO,MAAM,0BAA0B,YAAY,CAAC;AACpD,eAAO,MAAM,0CAA0C,4BAC5B,CAAC;AAE5B,MAAM,MAAM,wBAAwB,GAAG;IACrC,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,WAAW,CAAC,OAAO,CAAC,CAAC;CAC7B,CAAC;AAEF,eAAO,MAAM,0BAA0B,EAAE,wBAAwB,
|
|
1
|
+
{"version":3,"file":"WorkflowStatus.d.ts","sourceRoot":"","sources":["../../../src/domain/entities/WorkflowStatus.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAExC,eAAO,MAAM,mBAAmB,WAAW,CAAC;AAC5C,eAAO,MAAM,8BAA8B,uBAAuB,CAAC;AACnE,eAAO,MAAM,uBAAuB,gBAAgB,CAAC;AACrD,eAAO,MAAM,8BAA8B,uBAAuB,CAAC;AACnE,eAAO,MAAM,kCAAkC,2BAA2B,CAAC;AAC3E,eAAO,MAAM,gBAAgB,kBAAkB,CAAC;AAChD,eAAO,MAAM,yBAAyB,kBAAkB,CAAC;AACzD,eAAO,MAAM,mBAAmB,YAAY,CAAC;AAC7C,eAAO,MAAM,mBAAmB,qBAAqB,CAAC;AACtD,eAAO,MAAM,4BAA4B,qBAAqB,CAAC;AAC/D,eAAO,MAAM,gBAAgB,SAAS,CAAC;AACvC,eAAO,MAAM,kBAAkB,WAAW,CAAC;AAE3C,eAAO,MAAM,uBAAuB,SAAS,CAAC;AAC9C,eAAO,MAAM,0BAA0B,YAAY,CAAC;AACpD,eAAO,MAAM,0CAA0C,4BAC5B,CAAC;AAE5B,MAAM,MAAM,wBAAwB,GAAG;IACrC,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,WAAW,CAAC,OAAO,CAAC,CAAC;CAC7B,CAAC;AAEF,eAAO,MAAM,0BAA0B,EAAE,wBAAwB,EA6ChE,CAAC"}
|
|
@@ -41,7 +41,7 @@ export type ConsoleTriageTab = {
|
|
|
41
41
|
storyColors: Record<string, ConsoleColor>;
|
|
42
42
|
items: ConsoleListItem[];
|
|
43
43
|
};
|
|
44
|
-
export type ConsoleTabName = 'workflow-blocker' | 'prs' | 'triage' | 'unread' | 'failed-preparation' | 'todo-by-human';
|
|
44
|
+
export type ConsoleTabName = 'workflow-blocker' | 'prs' | 'triage' | 'unread' | 'failed-preparation' | 'todo-by-human' | 'todo-by-agent';
|
|
45
45
|
export type ConsoleLists = {
|
|
46
46
|
'workflow-blocker': ConsoleStatusTab;
|
|
47
47
|
prs: ConsoleStatusTab;
|
|
@@ -49,6 +49,7 @@ export type ConsoleLists = {
|
|
|
49
49
|
unread: ConsoleStatusTab;
|
|
50
50
|
'failed-preparation': ConsoleStatusTab;
|
|
51
51
|
'todo-by-human': ConsoleStatusTab;
|
|
52
|
+
'todo-by-agent': ConsoleStatusTab;
|
|
52
53
|
};
|
|
53
54
|
export type GenerateConsoleListsInput = {
|
|
54
55
|
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;
|
|
1
|
+
{"version":3,"file":"GenerateConsoleListsUseCase.d.ts","sourceRoot":"","sources":["../../../../src/domain/usecases/console/GenerateConsoleListsUseCase.ts"],"names":[],"mappings":"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"}
|