github-issue-tower-defence-management 2.2.0 → 2.4.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/CHANGELOG.md +14 -0
- package/bin/adapter/entry-points/cli/fleetConfig.js +19 -1
- package/bin/adapter/entry-points/cli/fleetConfig.js.map +1 -1
- package/bin/adapter/entry-points/console/consoleDoneStore.js +0 -2
- package/bin/adapter/entry-points/console/consoleDoneStore.js.map +1 -1
- package/bin/adapter/entry-points/console/consoleTabNames.js +0 -1
- package/bin/adapter/entry-points/console/consoleTabNames.js.map +1 -1
- package/bin/adapter/entry-points/console/ui-dist/assets/index-C5cOzhyn.js +86 -0
- package/bin/adapter/entry-points/console/ui-dist/index.html +1 -1
- package/bin/adapter/entry-points/handlers/HandleScheduledEventUseCaseHandler.js +4 -1
- package/bin/adapter/entry-points/handlers/HandleScheduledEventUseCaseHandler.js.map +1 -1
- package/bin/domain/usecases/console/GenerateConsoleListsUseCase.js +0 -15
- package/bin/domain/usecases/console/GenerateConsoleListsUseCase.js.map +1 -1
- package/package.json +1 -1
- package/src/adapter/entry-points/cli/fleetConfig.test.ts +86 -0
- package/src/adapter/entry-points/cli/fleetConfig.ts +38 -0
- package/src/adapter/entry-points/console/consoleDataDelivery.test.ts +15 -9
- package/src/adapter/entry-points/console/consoleDoneStore.ts +0 -2
- package/src/adapter/entry-points/console/consoleItemUrlLookup.test.ts +1 -1
- package/src/adapter/entry-points/console/consoleTabNames.ts +0 -1
- package/src/adapter/entry-points/console/ui/e2e/consoleScenario.spec.ts +7 -115
- package/src/adapter/entry-points/console/ui/e2e/consoleTestHarness.ts +0 -16
- package/src/adapter/entry-points/console/ui/src/features/console/components/detail/ConsoleItemDetail.stories.tsx +1 -3
- package/src/adapter/entry-points/console/ui/src/features/console/components/layout/ConsoleTabList.stories.tsx +0 -4
- package/src/adapter/entry-points/console/ui/src/features/console/components/layout/ConsoleTabList.test.tsx +0 -1
- package/src/adapter/entry-points/console/ui/src/features/console/components/operations/ConsoleOperationMenu.stories.tsx +0 -10
- package/src/adapter/entry-points/console/ui/src/features/console/components/operations/ConsoleOperationMenu.test.tsx +2 -28
- package/src/adapter/entry-points/console/ui/src/features/console/components/operations/ConsoleOperationMenu.tsx +0 -10
- package/src/adapter/entry-points/console/ui/src/features/console/hooks/useConsoleNavigation.test.ts +18 -14
- package/src/adapter/entry-points/console/ui/src/features/console/hooks/useConsoleOverlay.test.ts +2 -2
- package/src/adapter/entry-points/console/ui/src/features/console/logic/actionToast.test.ts +1 -1
- package/src/adapter/entry-points/console/ui/src/features/console/logic/grouping.test.ts +7 -7
- package/src/adapter/entry-points/console/ui/src/features/console/logic/overlay.test.ts +10 -8
- package/src/adapter/entry-points/console/ui/src/features/console/logic/tabAdvance.test.ts +9 -11
- package/src/adapter/entry-points/console/ui/src/features/console/logic/types.ts +1 -12
- package/src/adapter/entry-points/console/ui/src/features/console/pages/ConsoleItemDetailContainer.test.tsx +0 -12
- package/src/adapter/entry-points/console/ui/src/features/console/pages/ConsoleItemDetailContainer.tsx +0 -3
- package/src/adapter/entry-points/console/ui/src/features/console/pages/ConsolePage.tsx +10 -57
- package/src/adapter/entry-points/console/ui-dist/assets/index-C5cOzhyn.js +86 -0
- package/src/adapter/entry-points/console/ui-dist/index.html +1 -1
- package/src/adapter/entry-points/console/webServer.test.ts +2 -2
- package/src/adapter/entry-points/handlers/HandleScheduledEventUseCaseHandler.test.ts +24 -0
- package/src/adapter/entry-points/handlers/HandleScheduledEventUseCaseHandler.ts +10 -1
- package/src/adapter/entry-points/handlers/consoleListsWriter.test.ts +0 -1
- package/src/domain/usecases/console/GenerateConsoleListsUseCase.test.ts +2 -160
- package/src/domain/usecases/console/GenerateConsoleListsUseCase.ts +0 -37
- package/types/adapter/entry-points/cli/fleetConfig.d.ts +7 -0
- package/types/adapter/entry-points/cli/fleetConfig.d.ts.map +1 -1
- package/types/adapter/entry-points/console/consoleDoneStore.d.ts.map +1 -1
- package/types/adapter/entry-points/console/consoleTabNames.d.ts.map +1 -1
- package/types/adapter/entry-points/handlers/HandleScheduledEventUseCaseHandler.d.ts.map +1 -1
- package/types/domain/usecases/console/GenerateConsoleListsUseCase.d.ts +1 -11
- package/types/domain/usecases/console/GenerateConsoleListsUseCase.d.ts.map +1 -1
- package/bin/adapter/entry-points/console/ui-dist/assets/index-BVyeR7xJ.js +0 -86
- package/src/adapter/entry-points/console/ui/src/features/console/components/operations/ConsoleStoryActions.stories.tsx +0 -80
- package/src/adapter/entry-points/console/ui/src/features/console/components/operations/ConsoleStoryActions.test.tsx +0 -39
- package/src/adapter/entry-points/console/ui/src/features/console/components/operations/ConsoleStoryActions.tsx +0 -42
- package/src/adapter/entry-points/console/ui-dist/assets/index-BVyeR7xJ.js +0 -86
|
@@ -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-C5cOzhyn.js"></script>
|
|
8
8
|
<link rel="stylesheet" crossorigin href="/assets/index-CLHvrafO.css">
|
|
9
9
|
</head>
|
|
10
10
|
<body>
|
|
@@ -82,7 +82,7 @@ describe('webServer pure helpers', () => {
|
|
|
82
82
|
it('matches a per-project tab route for every list tab', () => {
|
|
83
83
|
expect(isConsoleAppRoute('/projects/acme/workflow-blocker')).toBe(true);
|
|
84
84
|
expect(isConsoleAppRoute('/projects/acme/prs')).toBe(true);
|
|
85
|
-
expect(isConsoleAppRoute('/projects/globex/
|
|
85
|
+
expect(isConsoleAppRoute('/projects/globex/todo-by-agent')).toBe(true);
|
|
86
86
|
expect(isConsoleAppRoute('/projects/initech/todo-by-human')).toBe(true);
|
|
87
87
|
expect(isConsoleAppRoute('/projects/umbrella/failed-preparation')).toBe(
|
|
88
88
|
true,
|
|
@@ -379,7 +379,7 @@ describe('webServer integration', () => {
|
|
|
379
379
|
port: 0,
|
|
380
380
|
});
|
|
381
381
|
try {
|
|
382
|
-
const projectRoot = await requestServer(server, '/projects/acme/
|
|
382
|
+
const projectRoot = await requestServer(server, '/projects/acme/prs');
|
|
383
383
|
expect(projectRoot.statusCode).toBe(200);
|
|
384
384
|
expect(projectRoot.body).toContain('TDPM Console');
|
|
385
385
|
} finally {
|
|
@@ -419,6 +419,30 @@ allowedIssueAuthors: 'user1, user2, user3'
|
|
|
419
419
|
});
|
|
420
420
|
});
|
|
421
421
|
|
|
422
|
+
it('applies the fleet default maximumPreparingIssuesCount when neither README nor YAML provides it', async () => {
|
|
423
|
+
const configWithPreparationNoMax = {
|
|
424
|
+
...validConfig,
|
|
425
|
+
startPreparation: {
|
|
426
|
+
defaultAgentName: 'yaml-agent',
|
|
427
|
+
configFilePath: '/path/to/config.yml',
|
|
428
|
+
utilizationPercentageThreshold: 90,
|
|
429
|
+
},
|
|
430
|
+
};
|
|
431
|
+
mockFetchReturningReadme(null);
|
|
432
|
+
jest
|
|
433
|
+
.mocked(fs.readFileSync)
|
|
434
|
+
.mockReturnValue(YAML.stringify(configWithPreparationNoMax));
|
|
435
|
+
|
|
436
|
+
const handler = new HandleScheduledEventUseCaseHandler();
|
|
437
|
+
await handler.handle('config.yml', false);
|
|
438
|
+
|
|
439
|
+
expect(capturedRunInputs[0][0]).toMatchObject({
|
|
440
|
+
startPreparation: {
|
|
441
|
+
maximumPreparingIssuesCount: 80,
|
|
442
|
+
},
|
|
443
|
+
});
|
|
444
|
+
});
|
|
445
|
+
|
|
422
446
|
it('should use README token from manager credentials to fetch README', async () => {
|
|
423
447
|
mockFetchReturningReadme(null);
|
|
424
448
|
jest.mocked(fs.readFileSync).mockReturnValue(YAML.stringify(validConfig));
|
|
@@ -32,6 +32,10 @@ import {
|
|
|
32
32
|
fetchProjectReadme,
|
|
33
33
|
parseProjectReadmeConfig,
|
|
34
34
|
} from '../cli/projectConfig';
|
|
35
|
+
import {
|
|
36
|
+
loadStartPreparationFleetSettings,
|
|
37
|
+
resolveFleetConfigFilePath,
|
|
38
|
+
} from '../cli/fleetConfig';
|
|
35
39
|
import { SystemDateRepository } from '../../repositories/SystemDateRepository';
|
|
36
40
|
import { LocalStorageRepository } from '../../repositories/LocalStorageRepository';
|
|
37
41
|
import { GoogleSpreadsheetRepository } from '../../repositories/GoogleSpreadsheetRepository';
|
|
@@ -272,6 +276,10 @@ export class HandleScheduledEventUseCaseHandler {
|
|
|
272
276
|
? parseProjectReadmeConfig(readme, input.projectUrl)
|
|
273
277
|
: {};
|
|
274
278
|
|
|
279
|
+
const startPreparationFleetSettings = loadStartPreparationFleetSettings(
|
|
280
|
+
resolveFleetConfigFilePath(null),
|
|
281
|
+
);
|
|
282
|
+
|
|
275
283
|
const normalizeAllowedIssueAuthors = (
|
|
276
284
|
value: string | string[] | null | undefined,
|
|
277
285
|
): string[] | null => {
|
|
@@ -323,7 +331,8 @@ export class HandleScheduledEventUseCaseHandler {
|
|
|
323
331
|
input.startPreparation.defaultLlmAgentName,
|
|
324
332
|
maximumPreparingIssuesCount:
|
|
325
333
|
readmeConfig.maximumPreparingIssuesCount ??
|
|
326
|
-
input.startPreparation.maximumPreparingIssuesCount
|
|
334
|
+
input.startPreparation.maximumPreparingIssuesCount ??
|
|
335
|
+
startPreparationFleetSettings.maximumPreparingIssuesCount,
|
|
327
336
|
utilizationPercentageThreshold:
|
|
328
337
|
readmeConfig.utilizationPercentageThreshold ??
|
|
329
338
|
input.startPreparation.utilizationPercentageThreshold,
|
|
@@ -219,139 +219,6 @@ describe('GenerateConsoleListsUseCase', () => {
|
|
|
219
219
|
]);
|
|
220
220
|
expect(result['todo-by-agent'].items).toHaveLength(0);
|
|
221
221
|
});
|
|
222
|
-
|
|
223
|
-
it('selects all actionable items for triage regardless of story', () => {
|
|
224
|
-
const result = run([
|
|
225
|
-
makeIssue({ story: 'regular / NO STORY; SET STORY FIELD' }),
|
|
226
|
-
makeIssue({ story: 'no story please' }),
|
|
227
|
-
makeIssue({ story: 'Story Alpha' }),
|
|
228
|
-
makeIssue({ story: null }),
|
|
229
|
-
]);
|
|
230
|
-
expect(result.triage.items).toHaveLength(4);
|
|
231
|
-
});
|
|
232
|
-
|
|
233
|
-
it('excludes In Tmux by agent items from triage regardless of story', () => {
|
|
234
|
-
const result = run([
|
|
235
|
-
makeIssue({ story: 'no story', status: 'In Tmux by agent' }),
|
|
236
|
-
makeIssue({ story: 'no story', status: 'in tmux by agent' }),
|
|
237
|
-
makeIssue({ story: 'no story', status: 'Unread' }),
|
|
238
|
-
]);
|
|
239
|
-
const statuses = result.triage.items.map((item) => item.status);
|
|
240
|
-
expect(statuses).toEqual(['Unread']);
|
|
241
|
-
});
|
|
242
|
-
|
|
243
|
-
it('excludes items with reactivation triggers from triage', () => {
|
|
244
|
-
const result = run([
|
|
245
|
-
makeIssue({
|
|
246
|
-
story: 'no story',
|
|
247
|
-
dependedIssueUrls: ['https://github.com/demo/repo/issues/99'],
|
|
248
|
-
}),
|
|
249
|
-
makeIssue({
|
|
250
|
-
story: 'no story',
|
|
251
|
-
nextActionDate: new Date('2026-08-20T00:00:00.000Z'),
|
|
252
|
-
}),
|
|
253
|
-
makeIssue({ story: 'no story', nextActionHour: 9 }),
|
|
254
|
-
]);
|
|
255
|
-
expect(result.triage.items).toHaveLength(0);
|
|
256
|
-
});
|
|
257
|
-
|
|
258
|
-
it('includes pull requests in triage when assigned, excludes unassigned and closed', () => {
|
|
259
|
-
const result = run([
|
|
260
|
-
makeIssue({ story: 'no story', isPr: true }),
|
|
261
|
-
makeIssue({ story: 'no story', assignees: ['someone-else'] }),
|
|
262
|
-
makeIssue({ story: 'no story', isClosed: true }),
|
|
263
|
-
]);
|
|
264
|
-
expect(result.triage.items).toHaveLength(1);
|
|
265
|
-
});
|
|
266
|
-
|
|
267
|
-
it('includes all actionable items in triage including those with a real story or null story', () => {
|
|
268
|
-
const result = run([
|
|
269
|
-
makeIssue({ story: null, status: 'Awaiting Workspace' }),
|
|
270
|
-
makeIssue({ story: null, status: null }),
|
|
271
|
-
makeIssue({ story: 'regular / NO STORY' }),
|
|
272
|
-
makeIssue({ story: 'Story Alpha' }),
|
|
273
|
-
]);
|
|
274
|
-
expect(result.triage.items).toHaveLength(4);
|
|
275
|
-
});
|
|
276
|
-
|
|
277
|
-
it('includes pull requests in triage, excludes unassigned and closed items with null story', () => {
|
|
278
|
-
const result = run([
|
|
279
|
-
makeIssue({ story: null, isPr: true }),
|
|
280
|
-
makeIssue({ story: null, assignees: ['someone-else'] }),
|
|
281
|
-
makeIssue({ story: null, isClosed: true }),
|
|
282
|
-
]);
|
|
283
|
-
expect(result.triage.items).toHaveLength(1);
|
|
284
|
-
});
|
|
285
|
-
|
|
286
|
-
it('shows all actionable items in triage whatever status they carry, excluding In Tmux by agent', () => {
|
|
287
|
-
const result = run([
|
|
288
|
-
makeIssue({ story: 'no story', status: 'Unread' }),
|
|
289
|
-
makeIssue({ story: 'no story', status: 'Awaiting Workspace' }),
|
|
290
|
-
makeIssue({ story: 'no story', status: 'In Tmux by agent' }),
|
|
291
|
-
makeIssue({ story: 'no story', status: 'Preparation' }),
|
|
292
|
-
makeIssue({ story: 'no story', status: 'Failed Preparation' }),
|
|
293
|
-
makeIssue({ story: 'no story', status: 'Awaiting Quality Check' }),
|
|
294
|
-
makeIssue({ story: 'no story', status: 'Todo by human' }),
|
|
295
|
-
makeIssue({ story: 'no story', status: 'Todo by agent' }),
|
|
296
|
-
makeIssue({ story: 'no story', status: 'In Tmux by human' }),
|
|
297
|
-
makeIssue({ story: 'no story', status: 'Done' }),
|
|
298
|
-
makeIssue({ story: 'no story', status: 'Icebox' }),
|
|
299
|
-
]);
|
|
300
|
-
expect(result.triage.items.map((item) => item.status)).toEqual([
|
|
301
|
-
'Unread',
|
|
302
|
-
'Awaiting Workspace',
|
|
303
|
-
'Preparation',
|
|
304
|
-
'Failed Preparation',
|
|
305
|
-
'Awaiting Quality Check',
|
|
306
|
-
'Todo by human',
|
|
307
|
-
'Todo by agent',
|
|
308
|
-
'In Tmux by human',
|
|
309
|
-
'Done',
|
|
310
|
-
'Icebox',
|
|
311
|
-
]);
|
|
312
|
-
});
|
|
313
|
-
|
|
314
|
-
it('shows items with any story in triage at every status except In Tmux by agent', () => {
|
|
315
|
-
const result = run([
|
|
316
|
-
makeIssue({ story: 'Story Alpha', status: 'Unread' }),
|
|
317
|
-
makeIssue({ story: 'Story Alpha', status: 'Awaiting Workspace' }),
|
|
318
|
-
makeIssue({ story: 'Story Alpha', status: 'In Tmux by agent' }),
|
|
319
|
-
makeIssue({ story: 'Story Alpha', status: 'Preparation' }),
|
|
320
|
-
makeIssue({ story: 'Story Alpha', status: 'Failed Preparation' }),
|
|
321
|
-
makeIssue({ story: 'Story Alpha', status: 'Awaiting Quality Check' }),
|
|
322
|
-
makeIssue({ story: 'Story Alpha', status: 'Todo by human' }),
|
|
323
|
-
makeIssue({ story: 'Story Alpha', status: 'Todo by agent' }),
|
|
324
|
-
makeIssue({ story: 'Story Alpha', status: 'In Tmux by human' }),
|
|
325
|
-
makeIssue({ story: 'Story Alpha', status: 'Done' }),
|
|
326
|
-
makeIssue({ story: 'Story Alpha', status: 'Icebox' }),
|
|
327
|
-
]);
|
|
328
|
-
expect(result.triage.items).toHaveLength(10);
|
|
329
|
-
});
|
|
330
|
-
|
|
331
|
-
it('keeps a no-story item whose status is written in a different case', () => {
|
|
332
|
-
const result = run([
|
|
333
|
-
makeIssue({ story: 'no story', status: 'unread' }),
|
|
334
|
-
makeIssue({ story: 'no story', status: 'awaiting workspace' }),
|
|
335
|
-
makeIssue({ story: 'no story', status: 'failed preparation' }),
|
|
336
|
-
]);
|
|
337
|
-
expect(result.triage.items.map((item) => item.status)).toEqual([
|
|
338
|
-
'unread',
|
|
339
|
-
'awaiting workspace',
|
|
340
|
-
'failed preparation',
|
|
341
|
-
]);
|
|
342
|
-
});
|
|
343
|
-
|
|
344
|
-
it('keeps an item carrying the story option this tool assigns automatically once its status has advanced', () => {
|
|
345
|
-
const result = run([
|
|
346
|
-
makeIssue({
|
|
347
|
-
story: 'regular / NO STORY; SET STORY FIELD',
|
|
348
|
-
status: 'Awaiting Quality Check',
|
|
349
|
-
}),
|
|
350
|
-
]);
|
|
351
|
-
expect(result.triage.items.map((item) => item.status)).toEqual([
|
|
352
|
-
'Awaiting Quality Check',
|
|
353
|
-
]);
|
|
354
|
-
});
|
|
355
222
|
});
|
|
356
223
|
|
|
357
224
|
describe('workflow-blocker tab', () => {
|
|
@@ -420,7 +287,6 @@ describe('GenerateConsoleListsUseCase', () => {
|
|
|
420
287
|
) => [
|
|
421
288
|
...result['workflow-blocker'].items,
|
|
422
289
|
...result.prs.items,
|
|
423
|
-
...result.triage.items,
|
|
424
290
|
...result['failed-preparation'].items,
|
|
425
291
|
...result['todo-by-human'].items,
|
|
426
292
|
];
|
|
@@ -438,14 +304,13 @@ describe('GenerateConsoleListsUseCase', () => {
|
|
|
438
304
|
expect(allTabItems(result)).toHaveLength(1);
|
|
439
305
|
});
|
|
440
306
|
|
|
441
|
-
it('hides a no-story In Tmux by agent issue from
|
|
307
|
+
it('hides a no-story In Tmux by agent issue from all tabs', () => {
|
|
442
308
|
const result = run([
|
|
443
309
|
makeIssue({
|
|
444
310
|
story: 'no story',
|
|
445
311
|
status: 'In Tmux by agent',
|
|
446
312
|
}),
|
|
447
313
|
]);
|
|
448
|
-
expect(result.triage.items).toHaveLength(0);
|
|
449
314
|
expect(allTabItems(result)).toHaveLength(0);
|
|
450
315
|
});
|
|
451
316
|
|
|
@@ -475,10 +340,8 @@ describe('GenerateConsoleListsUseCase', () => {
|
|
|
475
340
|
expect(
|
|
476
341
|
result['workflow-blocker'].items.map((item) => item.status).sort(),
|
|
477
342
|
).toEqual(['In Tmux by agent', 'In Tmux by human']);
|
|
478
|
-
expect(result.triage.items.map((item) => item.number)).toEqual([3, 2]);
|
|
479
343
|
expect(
|
|
480
344
|
result.prs.items
|
|
481
|
-
.concat(result.triage.items)
|
|
482
345
|
.concat(result['failed-preparation'].items)
|
|
483
346
|
.concat(result['todo-by-human'].items)
|
|
484
347
|
.some((item) => item.status === 'In Tmux by agent'),
|
|
@@ -673,16 +536,6 @@ describe('GenerateConsoleListsUseCase', () => {
|
|
|
673
536
|
expect(names).toContain('Awaiting Workspace');
|
|
674
537
|
});
|
|
675
538
|
|
|
676
|
-
it('emits all story options for triage and no statusOptions key', () => {
|
|
677
|
-
const triage = run([]).triage;
|
|
678
|
-
expect(triage.storyOptions.map((o) => o.name)).toEqual([
|
|
679
|
-
'regular / NO STORY; SET STORY FIELD',
|
|
680
|
-
'Story Alpha',
|
|
681
|
-
'Story Beta',
|
|
682
|
-
]);
|
|
683
|
-
expect(triage).not.toHaveProperty('statusOptions');
|
|
684
|
-
});
|
|
685
|
-
|
|
686
539
|
it('builds storyOrder from story field option order', () => {
|
|
687
540
|
expect(run([]).prs.storyOrder).toEqual([
|
|
688
541
|
'regular / NO STORY; SET STORY FIELD',
|
|
@@ -700,19 +553,12 @@ describe('GenerateConsoleListsUseCase', () => {
|
|
|
700
553
|
color: 'BLUE',
|
|
701
554
|
});
|
|
702
555
|
});
|
|
703
|
-
|
|
704
|
-
it('uses plain string color values for triage', () => {
|
|
705
|
-
const result = run([]);
|
|
706
|
-
expect(result.triage.storyColors['Story Alpha']).toBe('BLUE');
|
|
707
|
-
expect(result.triage.storyColors['Story Beta']).toBe('GREEN');
|
|
708
|
-
});
|
|
709
556
|
});
|
|
710
557
|
|
|
711
558
|
describe('generatedAt and pjcode passthrough', () => {
|
|
712
559
|
it('writes the provided generatedAt without milliseconds on every tab', () => {
|
|
713
560
|
const result = run([]);
|
|
714
561
|
expect(result.prs.generatedAt).toBe(generatedAt);
|
|
715
|
-
expect(result.triage.generatedAt).toBe(generatedAt);
|
|
716
562
|
expect(result['failed-preparation'].generatedAt).toBe(generatedAt);
|
|
717
563
|
expect(generatedAt).not.toMatch(/\.\d{3}Z$/);
|
|
718
564
|
});
|
|
@@ -720,7 +566,6 @@ describe('GenerateConsoleListsUseCase', () => {
|
|
|
720
566
|
it('writes the configured pjcode on every tab', () => {
|
|
721
567
|
const result = run([]);
|
|
722
568
|
expect(result.prs.pjcode).toBe('demo');
|
|
723
|
-
expect(result.triage.pjcode).toBe('demo');
|
|
724
569
|
expect(result['failed-preparation'].pjcode).toBe('demo');
|
|
725
570
|
});
|
|
726
571
|
});
|
|
@@ -789,13 +634,10 @@ describe('GenerateConsoleListsUseCase', () => {
|
|
|
789
634
|
describe('project without a story field', () => {
|
|
790
635
|
const projectNoStory = baseProject(null);
|
|
791
636
|
|
|
792
|
-
it('degrades story order
|
|
637
|
+
it('degrades story order and colors gracefully', () => {
|
|
793
638
|
const result = run([makeIssue({ story: 'no story' })], projectNoStory);
|
|
794
639
|
expect(result.prs.storyOrder).toEqual([]);
|
|
795
640
|
expect(result.prs.storyColors).toEqual({});
|
|
796
|
-
expect(result.triage.storyOptions).toEqual([]);
|
|
797
|
-
expect(result.triage.storyColors).toEqual({});
|
|
798
|
-
expect(result.triage.items).toHaveLength(1);
|
|
799
641
|
});
|
|
800
642
|
});
|
|
801
643
|
|
|
@@ -45,19 +45,9 @@ export type ConsoleStatusTab = {
|
|
|
45
45
|
items: ConsoleListItem[];
|
|
46
46
|
};
|
|
47
47
|
|
|
48
|
-
export type ConsoleTriageTab = {
|
|
49
|
-
pjcode: string;
|
|
50
|
-
generatedAt: string;
|
|
51
|
-
storyOptions: ConsoleFieldOption[];
|
|
52
|
-
storyOrder: string[];
|
|
53
|
-
storyColors: Record<string, ConsoleColor>;
|
|
54
|
-
items: ConsoleListItem[];
|
|
55
|
-
};
|
|
56
|
-
|
|
57
48
|
export type ConsoleTabName =
|
|
58
49
|
| 'workflow-blocker'
|
|
59
50
|
| 'prs'
|
|
60
|
-
| 'triage'
|
|
61
51
|
| 'failed-preparation'
|
|
62
52
|
| 'todo-by-human'
|
|
63
53
|
| 'todo-by-agent'
|
|
@@ -83,7 +73,6 @@ export type ConsoleStoriesTab = {
|
|
|
83
73
|
export type ConsoleLists = {
|
|
84
74
|
'workflow-blocker': ConsoleStatusTab;
|
|
85
75
|
prs: ConsoleStatusTab;
|
|
86
|
-
triage: ConsoleTriageTab;
|
|
87
76
|
'failed-preparation': ConsoleStatusTab;
|
|
88
77
|
'todo-by-human': ConsoleStatusTab;
|
|
89
78
|
'todo-by-agent': ConsoleStatusTab;
|
|
@@ -217,22 +206,6 @@ export class GenerateConsoleListsUseCase {
|
|
|
217
206
|
(issue) => issue.status === TODO_BY_AGENT_STATUS_NAME,
|
|
218
207
|
[TODO_BY_AGENT_STATUS_NAME.toLowerCase(), 'done'],
|
|
219
208
|
),
|
|
220
|
-
triage: {
|
|
221
|
-
pjcode,
|
|
222
|
-
generatedAt,
|
|
223
|
-
storyOptions: this.buildFieldOptions(storyOptions, []),
|
|
224
|
-
storyOrder,
|
|
225
|
-
storyColors: this.buildStoryColorsString(storyOptions),
|
|
226
|
-
items: this.sortByStoryOrder(
|
|
227
|
-
actionableIssues.map((issue) =>
|
|
228
|
-
this.projectItem(
|
|
229
|
-
issue,
|
|
230
|
-
relatedOpenPullRequestUrlsByIssueUrl.get(issue.url) ?? [],
|
|
231
|
-
),
|
|
232
|
-
),
|
|
233
|
-
storyOrder,
|
|
234
|
-
),
|
|
235
|
-
},
|
|
236
209
|
stories: {
|
|
237
210
|
pjcode,
|
|
238
211
|
generatedAt,
|
|
@@ -332,16 +305,6 @@ export class GenerateConsoleListsUseCase {
|
|
|
332
305
|
return result;
|
|
333
306
|
};
|
|
334
307
|
|
|
335
|
-
private buildStoryColorsString = (
|
|
336
|
-
options: FieldOption[],
|
|
337
|
-
): Record<string, ConsoleColor> => {
|
|
338
|
-
const result: Record<string, ConsoleColor> = {};
|
|
339
|
-
for (const option of options) {
|
|
340
|
-
result[option.name] = option.color;
|
|
341
|
-
}
|
|
342
|
-
return result;
|
|
343
|
-
};
|
|
344
|
-
|
|
345
308
|
private sortByStoryOrder = (
|
|
346
309
|
items: ConsoleListItem[],
|
|
347
310
|
storyOrder: string[],
|
|
@@ -2,11 +2,18 @@ import { LiveSessionOauthTokenSelectionSettings } from '../../../domain/usecases
|
|
|
2
2
|
export declare const FLEET_CONFIG_FILE_PATH_ENVIRONMENT_VARIABLE = "TDPM_FLEET_CONFIG";
|
|
3
3
|
export declare const LIVE_SESSION_OAUTH_TOKEN_SELECTION_SECTION_KEY = "liveSessionOauthTokenSelection";
|
|
4
4
|
export declare const PREPARATION_WORKER_SECTION_KEY = "preparationWorker";
|
|
5
|
+
export declare const START_PREPARATION_SECTION_KEY = "startPreparation";
|
|
6
|
+
export declare const DEFAULT_FLEET_MAXIMUM_PREPARING_ISSUES_COUNT = 80;
|
|
5
7
|
export type PreparationWorkerSettings = {
|
|
6
8
|
normalConcurrentLimit: number;
|
|
7
9
|
};
|
|
8
10
|
export declare const DEFAULT_PREPARATION_WORKER_SETTINGS: PreparationWorkerSettings;
|
|
11
|
+
export type StartPreparationFleetSettings = {
|
|
12
|
+
maximumPreparingIssuesCount: number;
|
|
13
|
+
};
|
|
14
|
+
export declare const DEFAULT_START_PREPARATION_FLEET_SETTINGS: StartPreparationFleetSettings;
|
|
9
15
|
export declare const resolveFleetConfigFilePath: (cliValue: string | null) => string | null;
|
|
10
16
|
export declare const loadLiveSessionOauthTokenSelectionSettings: (fleetConfigFilePath: string | null) => LiveSessionOauthTokenSelectionSettings;
|
|
11
17
|
export declare const loadPreparationWorkerSettings: (fleetConfigFilePath: string | null) => PreparationWorkerSettings;
|
|
18
|
+
export declare const loadStartPreparationFleetSettings: (fleetConfigFilePath: string | null) => StartPreparationFleetSettings;
|
|
12
19
|
//# sourceMappingURL=fleetConfig.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fleetConfig.d.ts","sourceRoot":"","sources":["../../../../src/adapter/entry-points/cli/fleetConfig.ts"],"names":[],"mappings":"AAEA,OAAO,EAEL,sCAAsC,EACvC,MAAM,6DAA6D,CAAC;AAGrE,eAAO,MAAM,2CAA2C,sBAAsB,CAAC;AAE/E,eAAO,MAAM,8CAA8C,mCACzB,CAAC;AACnC,eAAO,MAAM,8BAA8B,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"fleetConfig.d.ts","sourceRoot":"","sources":["../../../../src/adapter/entry-points/cli/fleetConfig.ts"],"names":[],"mappings":"AAEA,OAAO,EAEL,sCAAsC,EACvC,MAAM,6DAA6D,CAAC;AAGrE,eAAO,MAAM,2CAA2C,sBAAsB,CAAC;AAE/E,eAAO,MAAM,8CAA8C,mCACzB,CAAC;AACnC,eAAO,MAAM,8BAA8B,sBAAsB,CAAC;AAClE,eAAO,MAAM,6BAA6B,qBAAqB,CAAC;AAEhE,eAAO,MAAM,4CAA4C,KAAK,CAAC;AAE/D,MAAM,MAAM,yBAAyB,GAAG;IACtC,qBAAqB,EAAE,MAAM,CAAC;CAC/B,CAAC;AAEF,eAAO,MAAM,mCAAmC,EAAE,yBAEjD,CAAC;AAEF,MAAM,MAAM,6BAA6B,GAAG;IAC1C,2BAA2B,EAAE,MAAM,CAAC;CACrC,CAAC;AAEF,eAAO,MAAM,wCAAwC,EAAE,6BAGpD,CAAC;AAEJ,eAAO,MAAM,0BAA0B,GACrC,UAAU,MAAM,GAAG,IAAI,KACtB,MAAM,GAAG,IAUX,CAAC;AA0DF,eAAO,MAAM,0CAA0C,GACrD,qBAAqB,MAAM,GAAG,IAAI,KACjC,sCAiDF,CAAC;AAEF,eAAO,MAAM,6BAA6B,GACxC,qBAAqB,MAAM,GAAG,IAAI,KACjC,yBAsBF,CAAC;AAEF,eAAO,MAAM,iCAAiC,GAC5C,qBAAqB,MAAM,GAAG,IAAI,KACjC,6BAsBF,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,EAO1C,CAAC;AAEF,eAAO,MAAM,sCAAsC,EAAE,MAAM,EAM1D,CAAC;AAEF,eAAO,MAAM,qCAAqC,EAAE,MAAM,EAEzD,CAAC;AAEF,eAAO,MAAM,8BAA8B,GACzC,sBAAsB,MAAM,EAC5B,QAAQ,MAAM,EACd,eAAe,MAAM,EACrB,UAAU,MAAM,EAAE,KACjB,IAIF,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":"consoleTabNames.d.ts","sourceRoot":"","sources":["../../../../src/adapter/entry-points/console/consoleTabNames.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,8DAA8D,CAAC;AAEnG,eAAO,MAAM,sBAAsB,EAAE,cAAc,
|
|
1
|
+
{"version":3,"file":"consoleTabNames.d.ts","sourceRoot":"","sources":["../../../../src/adapter/entry-points/console/consoleTabNames.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,8DAA8D,CAAC;AAEnG,eAAO,MAAM,sBAAsB,EAAE,cAAc,EAOlD,CAAC;AAOF,eAAO,MAAM,gBAAgB,GAC3B,OAAO,OAAO,EAAE,EAChB,YAAY,MAAM,EAAE,KACnB,OAAO,EAgBT,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"HandleScheduledEventUseCaseHandler.d.ts","sourceRoot":"","sources":["../../../../src/adapter/entry-points/handlers/HandleScheduledEventUseCaseHandler.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"HandleScheduledEventUseCaseHandler.d.ts","sourceRoot":"","sources":["../../../../src/adapter/entry-points/handlers/HandleScheduledEventUseCaseHandler.ts"],"names":[],"mappings":"AAqDA,OAAO,EAAE,KAAK,EAAE,MAAM,gCAAgC,CAAC;AACvD,OAAO,EAAE,OAAO,EAAE,MAAM,kCAAkC,CAAC;AA2D3D,qBAAa,kCAAkC;IAC7C,MAAM,GACJ,gBAAgB,MAAM,EACtB,UAAU,OAAO,EACjB,6BAA4B,MAAM,EAAE,GAAG,IAAW,KACjD,OAAO,CAAC;QACT,OAAO,EAAE,OAAO,CAAC;QACjB,MAAM,EAAE,KAAK,EAAE,CAAC;QAChB,SAAS,EAAE,OAAO,CAAC;QACnB,eAAe,EAAE,IAAI,EAAE,CAAC;KACzB,GAAG,IAAI,CAAC,CA40BP;CACH"}
|
|
@@ -35,15 +35,7 @@ export type ConsoleStatusTab = {
|
|
|
35
35
|
}>;
|
|
36
36
|
items: ConsoleListItem[];
|
|
37
37
|
};
|
|
38
|
-
export type
|
|
39
|
-
pjcode: string;
|
|
40
|
-
generatedAt: string;
|
|
41
|
-
storyOptions: ConsoleFieldOption[];
|
|
42
|
-
storyOrder: string[];
|
|
43
|
-
storyColors: Record<string, ConsoleColor>;
|
|
44
|
-
items: ConsoleListItem[];
|
|
45
|
-
};
|
|
46
|
-
export type ConsoleTabName = 'workflow-blocker' | 'prs' | 'triage' | 'failed-preparation' | 'todo-by-human' | 'todo-by-agent' | 'stories';
|
|
38
|
+
export type ConsoleTabName = 'workflow-blocker' | 'prs' | 'failed-preparation' | 'todo-by-human' | 'todo-by-agent' | 'stories';
|
|
47
39
|
export type ConsoleStoryEntry = {
|
|
48
40
|
storyName: string;
|
|
49
41
|
storyOptionId: string;
|
|
@@ -64,7 +56,6 @@ export type ConsoleStoriesTab = {
|
|
|
64
56
|
export type ConsoleLists = {
|
|
65
57
|
'workflow-blocker': ConsoleStatusTab;
|
|
66
58
|
prs: ConsoleStatusTab;
|
|
67
|
-
triage: ConsoleTriageTab;
|
|
68
59
|
'failed-preparation': ConsoleStatusTab;
|
|
69
60
|
'todo-by-human': ConsoleStatusTab;
|
|
70
61
|
'todo-by-agent': ConsoleStatusTab;
|
|
@@ -87,7 +78,6 @@ export declare class GenerateConsoleListsUseCase {
|
|
|
87
78
|
private projectItem;
|
|
88
79
|
private buildFieldOptions;
|
|
89
80
|
private buildStoryColorsObject;
|
|
90
|
-
private buildStoryColorsString;
|
|
91
81
|
private sortByStoryOrder;
|
|
92
82
|
}
|
|
93
83
|
//# sourceMappingURL=GenerateConsoleListsUseCase.d.ts.map
|
|
@@ -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;AAS9D,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,GAAG,IAAI,CAAC;IACtB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,iBAAiB,EAAE,MAAM,EAAE,CAAC;IAC5B,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,0BAA0B,EAAE,MAAM,EAAE,CAAC;CACtC,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,
|
|
1
|
+
{"version":3,"file":"GenerateConsoleListsUseCase.d.ts","sourceRoot":"","sources":["../../../../src/domain/usecases/console/GenerateConsoleListsUseCase.ts"],"names":[],"mappings":"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"}
|