github-issue-tower-defence-management 1.129.0 → 1.131.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 (68) hide show
  1. package/CHANGELOG.md +14 -0
  2. package/README.md +7 -5
  3. package/bin/adapter/entry-points/cli/index.js +8 -0
  4. package/bin/adapter/entry-points/cli/index.js.map +1 -1
  5. package/bin/adapter/entry-points/cli/projectConfig.js +2 -0
  6. package/bin/adapter/entry-points/cli/projectConfig.js.map +1 -1
  7. package/bin/adapter/entry-points/console/consoleDataDelivery.js +1 -0
  8. package/bin/adapter/entry-points/console/consoleDataDelivery.js.map +1 -1
  9. package/bin/adapter/entry-points/console/consoleDoneStore.js +1 -0
  10. package/bin/adapter/entry-points/console/consoleDoneStore.js.map +1 -1
  11. package/bin/adapter/entry-points/console/ui-dist/assets/{index-Dr5qin37.js → index-Bz0KvgIG.js} +22 -22
  12. package/bin/adapter/entry-points/console/ui-dist/index.html +1 -1
  13. package/bin/adapter/entry-points/handlers/HandleScheduledEventUseCaseHandler.js +6 -6
  14. package/bin/adapter/entry-points/handlers/consoleListsWriter.js +1 -0
  15. package/bin/adapter/entry-points/handlers/consoleListsWriter.js.map +1 -1
  16. package/bin/domain/usecases/HandleScheduledEventUseCase.js +1 -0
  17. package/bin/domain/usecases/HandleScheduledEventUseCase.js.map +1 -1
  18. package/bin/domain/usecases/StartPreparationUseCase.js +6 -1
  19. package/bin/domain/usecases/StartPreparationUseCase.js.map +1 -1
  20. package/bin/domain/usecases/console/GenerateConsoleListsUseCase.js +1 -0
  21. package/bin/domain/usecases/console/GenerateConsoleListsUseCase.js.map +1 -1
  22. package/package.json +1 -1
  23. package/src/adapter/entry-points/cli/index.test.ts +36 -0
  24. package/src/adapter/entry-points/cli/index.ts +14 -0
  25. package/src/adapter/entry-points/cli/projectConfig.ts +3 -0
  26. package/src/adapter/entry-points/console/consoleDataDelivery.test.ts +6 -0
  27. package/src/adapter/entry-points/console/consoleDataDelivery.ts +1 -0
  28. package/src/adapter/entry-points/console/consoleDoneStore.test.ts +4 -0
  29. package/src/adapter/entry-points/console/consoleDoneStore.ts +1 -0
  30. package/src/adapter/entry-points/console/ui/e2e/consoleTestHarness.ts +10 -0
  31. package/src/adapter/entry-points/console/ui/src/features/console/components/layout/ConsoleTabList.stories.tsx +4 -0
  32. package/src/adapter/entry-points/console/ui/src/features/console/components/layout/ConsoleTabList.test.tsx +2 -0
  33. package/src/adapter/entry-points/console/ui/src/features/console/components/operations/ConsoleNextActionDateActions.stories.tsx +2 -2
  34. package/src/adapter/entry-points/console/ui/src/features/console/components/operations/ConsoleNextActionDateActions.test.tsx +5 -5
  35. package/src/adapter/entry-points/console/ui/src/features/console/components/operations/ConsoleNextActionDateActions.tsx +3 -3
  36. package/src/adapter/entry-points/console/ui/src/features/console/components/operations/ConsoleOperationMenu.stories.tsx +8 -0
  37. package/src/adapter/entry-points/console/ui/src/features/console/components/operations/ConsoleOperationMenu.test.tsx +15 -0
  38. package/src/adapter/entry-points/console/ui/src/features/console/components/operations/ConsoleOperationMenu.tsx +2 -2
  39. package/src/adapter/entry-points/console/ui/src/features/console/hooks/useConsoleNavigation.test.ts +1 -0
  40. package/src/adapter/entry-points/console/ui/src/features/console/hooks/useConsoleTabData.test.ts +2 -1
  41. package/src/adapter/entry-points/console/ui/src/features/console/logic/actionToast.test.ts +6 -2
  42. package/src/adapter/entry-points/console/ui/src/features/console/logic/actionToast.ts +7 -6
  43. package/src/adapter/entry-points/console/ui/src/features/console/logic/operations.test.ts +7 -5
  44. package/src/adapter/entry-points/console/ui/src/features/console/logic/operations.ts +3 -2
  45. package/src/adapter/entry-points/console/ui/src/features/console/logic/tabAdvance.test.ts +11 -1
  46. package/src/adapter/entry-points/console/ui/src/features/console/logic/types.ts +3 -1
  47. package/src/adapter/entry-points/console/ui/src/features/console/testing/fixtures.ts +1 -0
  48. package/src/adapter/entry-points/console/ui-dist/assets/{index-Dr5qin37.js → index-Bz0KvgIG.js} +22 -22
  49. package/src/adapter/entry-points/console/ui-dist/index.html +1 -1
  50. package/src/adapter/entry-points/console/webServer.test.ts +1 -0
  51. package/src/adapter/entry-points/handlers/consoleListsWriter.test.ts +21 -1
  52. package/src/adapter/entry-points/handlers/consoleListsWriter.ts +1 -0
  53. package/src/domain/usecases/HandleScheduledEventUseCase.ts +1 -0
  54. package/src/domain/usecases/StartPreparationUseCase.test.ts +315 -3
  55. package/src/domain/usecases/StartPreparationUseCase.ts +7 -1
  56. package/src/domain/usecases/console/GenerateConsoleListsUseCase.test.ts +26 -0
  57. package/src/domain/usecases/console/GenerateConsoleListsUseCase.ts +8 -1
  58. package/types/adapter/entry-points/cli/index.d.ts.map +1 -1
  59. package/types/adapter/entry-points/cli/projectConfig.d.ts +1 -0
  60. package/types/adapter/entry-points/cli/projectConfig.d.ts.map +1 -1
  61. package/types/adapter/entry-points/console/consoleDataDelivery.d.ts.map +1 -1
  62. package/types/adapter/entry-points/console/consoleDoneStore.d.ts.map +1 -1
  63. package/types/adapter/entry-points/handlers/consoleListsWriter.d.ts.map +1 -1
  64. package/types/domain/usecases/HandleScheduledEventUseCase.d.ts.map +1 -1
  65. package/types/domain/usecases/StartPreparationUseCase.d.ts +1 -0
  66. package/types/domain/usecases/StartPreparationUseCase.d.ts.map +1 -1
  67. package/types/domain/usecases/console/GenerateConsoleListsUseCase.d.ts +2 -1
  68. package/types/domain/usecases/console/GenerateConsoleListsUseCase.d.ts.map +1 -1
@@ -40,7 +40,7 @@ const createMockIssue = (overrides: Partial<Issue> = {}): Issue => ({
40
40
  dependedIssueUrls: [],
41
41
  completionDate50PercentConfidence: null,
42
42
  url: 'https://github.com/user/repo/issues/1',
43
- assignees: [],
43
+ assignees: ['manager-user'],
44
44
  labels: [],
45
45
  org: 'user',
46
46
  repo: 'repo',
@@ -156,6 +156,7 @@ describe('StartPreparationUseCase', () => {
156
156
  maximumPreparingIssuesCount: null,
157
157
  utilizationPercentageThreshold: 90,
158
158
  allowedIssueAuthors: ['testuser'],
159
+ manager: 'manager-user',
159
160
  codexHomeCandidates: null,
160
161
  labelsAsLlmAgentName: null,
161
162
  });
@@ -222,6 +223,7 @@ describe('StartPreparationUseCase', () => {
222
223
  maximumPreparingIssuesCount: null,
223
224
  utilizationPercentageThreshold: 90,
224
225
  allowedIssueAuthors: ['testuser'],
226
+ manager: 'manager-user',
225
227
  codexHomeCandidates: null,
226
228
  labelsAsLlmAgentName: null,
227
229
  });
@@ -280,6 +282,7 @@ describe('StartPreparationUseCase', () => {
280
282
  maximumPreparingIssuesCount: null,
281
283
  utilizationPercentageThreshold: 90,
282
284
  allowedIssueAuthors: ['testuser'],
285
+ manager: 'manager-user',
283
286
  codexHomeCandidates: null,
284
287
  labelsAsLlmAgentName: null,
285
288
  });
@@ -328,6 +331,7 @@ describe('StartPreparationUseCase', () => {
328
331
  maximumPreparingIssuesCount: null,
329
332
  utilizationPercentageThreshold: 90,
330
333
  allowedIssueAuthors: ['testuser'],
334
+ manager: 'manager-user',
331
335
  codexHomeCandidates: null,
332
336
  labelsAsLlmAgentName: null,
333
337
  });
@@ -378,6 +382,7 @@ describe('StartPreparationUseCase', () => {
378
382
  maximumPreparingIssuesCount: null,
379
383
  utilizationPercentageThreshold: 90,
380
384
  allowedIssueAuthors: ['testuser'],
385
+ manager: 'manager-user',
381
386
  codexHomeCandidates: null,
382
387
  labelsAsLlmAgentName: null,
383
388
  });
@@ -427,6 +432,7 @@ describe('StartPreparationUseCase', () => {
427
432
  maximumPreparingIssuesCount: null,
428
433
  utilizationPercentageThreshold: 90,
429
434
  allowedIssueAuthors: ['testuser'],
435
+ manager: 'manager-user',
430
436
  codexHomeCandidates: null,
431
437
  labelsAsLlmAgentName: null,
432
438
  });
@@ -495,6 +501,7 @@ describe('StartPreparationUseCase', () => {
495
501
  maximumPreparingIssuesCount: null,
496
502
  utilizationPercentageThreshold: 90,
497
503
  allowedIssueAuthors: ['testuser'],
504
+ manager: 'manager-user',
498
505
  codexHomeCandidates: null,
499
506
  labelsAsLlmAgentName: null,
500
507
  });
@@ -586,6 +593,7 @@ describe('StartPreparationUseCase', () => {
586
593
  maximumPreparingIssuesCount: null,
587
594
  utilizationPercentageThreshold: 90,
588
595
  allowedIssueAuthors: ['testuser'],
596
+ manager: 'manager-user',
589
597
  codexHomeCandidates: null,
590
598
  labelsAsLlmAgentName: null,
591
599
  });
@@ -650,6 +658,7 @@ describe('StartPreparationUseCase', () => {
650
658
  maximumPreparingIssuesCount: null,
651
659
  utilizationPercentageThreshold: 90,
652
660
  allowedIssueAuthors: ['testuser'],
661
+ manager: 'manager-user',
653
662
  codexHomeCandidates: null,
654
663
  labelsAsLlmAgentName: null,
655
664
  });
@@ -694,6 +703,7 @@ describe('StartPreparationUseCase', () => {
694
703
  maximumPreparingIssuesCount: null,
695
704
  utilizationPercentageThreshold: 90,
696
705
  allowedIssueAuthors: ['testuser'],
706
+ manager: 'manager-user',
697
707
  codexHomeCandidates: null,
698
708
  labelsAsLlmAgentName: null,
699
709
  });
@@ -751,6 +761,7 @@ describe('StartPreparationUseCase', () => {
751
761
  maximumPreparingIssuesCount: null,
752
762
  utilizationPercentageThreshold: 90,
753
763
  allowedIssueAuthors: ['testuser'],
764
+ manager: 'manager-user',
754
765
  codexHomeCandidates: null,
755
766
  labelsAsLlmAgentName: null,
756
767
  });
@@ -786,6 +797,7 @@ describe('StartPreparationUseCase', () => {
786
797
  maximumPreparingIssuesCount: null,
787
798
  utilizationPercentageThreshold: 90,
788
799
  allowedIssueAuthors: ['testuser'],
800
+ manager: 'manager-user',
789
801
  codexHomeCandidates: null,
790
802
  labelsAsLlmAgentName: null,
791
803
  });
@@ -831,6 +843,7 @@ describe('StartPreparationUseCase', () => {
831
843
  maximumPreparingIssuesCount: null,
832
844
  utilizationPercentageThreshold: 90,
833
845
  allowedIssueAuthors: ['testuser'],
846
+ manager: 'manager-user',
834
847
  codexHomeCandidates: null,
835
848
  labelsAsLlmAgentName: null,
836
849
  });
@@ -876,6 +889,7 @@ describe('StartPreparationUseCase', () => {
876
889
  maximumPreparingIssuesCount: null,
877
890
  utilizationPercentageThreshold: 90,
878
891
  allowedIssueAuthors: ['testuser'],
892
+ manager: 'manager-user',
879
893
  codexHomeCandidates: null,
880
894
  labelsAsLlmAgentName: null,
881
895
  });
@@ -921,6 +935,7 @@ describe('StartPreparationUseCase', () => {
921
935
  maximumPreparingIssuesCount: null,
922
936
  utilizationPercentageThreshold: 90,
923
937
  allowedIssueAuthors: ['testuser'],
938
+ manager: 'manager-user',
924
939
  codexHomeCandidates: null,
925
940
  labelsAsLlmAgentName: null,
926
941
  });
@@ -966,6 +981,7 @@ describe('StartPreparationUseCase', () => {
966
981
  maximumPreparingIssuesCount: null,
967
982
  utilizationPercentageThreshold: 90,
968
983
  allowedIssueAuthors: ['testuser'],
984
+ manager: 'manager-user',
969
985
  codexHomeCandidates: null,
970
986
  labelsAsLlmAgentName: null,
971
987
  });
@@ -1011,6 +1027,7 @@ describe('StartPreparationUseCase', () => {
1011
1027
  maximumPreparingIssuesCount: null,
1012
1028
  utilizationPercentageThreshold: 90,
1013
1029
  allowedIssueAuthors: ['testuser'],
1030
+ manager: 'manager-user',
1014
1031
  codexHomeCandidates: null,
1015
1032
  labelsAsLlmAgentName: null,
1016
1033
  });
@@ -1059,6 +1076,7 @@ describe('StartPreparationUseCase', () => {
1059
1076
  maximumPreparingIssuesCount: null,
1060
1077
  utilizationPercentageThreshold: 90,
1061
1078
  allowedIssueAuthors: ['testuser'],
1079
+ manager: 'manager-user',
1062
1080
  codexHomeCandidates: null,
1063
1081
  labelsAsLlmAgentName: null,
1064
1082
  });
@@ -1107,6 +1125,7 @@ describe('StartPreparationUseCase', () => {
1107
1125
  maximumPreparingIssuesCount: null,
1108
1126
  utilizationPercentageThreshold: 90,
1109
1127
  allowedIssueAuthors: ['testuser'],
1128
+ manager: 'manager-user',
1110
1129
  codexHomeCandidates: null,
1111
1130
  labelsAsLlmAgentName: null,
1112
1131
  });
@@ -1157,6 +1176,7 @@ describe('StartPreparationUseCase', () => {
1157
1176
  maximumPreparingIssuesCount: null,
1158
1177
  utilizationPercentageThreshold: 90,
1159
1178
  allowedIssueAuthors: ['testuser'],
1179
+ manager: 'manager-user',
1160
1180
  codexHomeCandidates: null,
1161
1181
  labelsAsLlmAgentName: null,
1162
1182
  });
@@ -1192,6 +1212,7 @@ describe('StartPreparationUseCase', () => {
1192
1212
  maximumPreparingIssuesCount: 3,
1193
1213
  utilizationPercentageThreshold: 90,
1194
1214
  allowedIssueAuthors: ['testuser'],
1215
+ manager: 'manager-user',
1195
1216
  codexHomeCandidates: null,
1196
1217
  labelsAsLlmAgentName: null,
1197
1218
  });
@@ -1226,6 +1247,7 @@ describe('StartPreparationUseCase', () => {
1226
1247
  maximumPreparingIssuesCount: null,
1227
1248
  utilizationPercentageThreshold: 90,
1228
1249
  allowedIssueAuthors: ['testuser'],
1250
+ manager: 'manager-user',
1229
1251
  codexHomeCandidates: null,
1230
1252
  labelsAsLlmAgentName: null,
1231
1253
  });
@@ -1287,6 +1309,7 @@ describe('StartPreparationUseCase', () => {
1287
1309
  maximumPreparingIssuesCount: 12,
1288
1310
  utilizationPercentageThreshold: 90,
1289
1311
  allowedIssueAuthors: ['testuser'],
1312
+ manager: 'manager-user',
1290
1313
  codexHomeCandidates: null,
1291
1314
  labelsAsLlmAgentName: null,
1292
1315
  });
@@ -1357,6 +1380,7 @@ describe('StartPreparationUseCase', () => {
1357
1380
  maximumPreparingIssuesCount: 20,
1358
1381
  utilizationPercentageThreshold: 90,
1359
1382
  allowedIssueAuthors: ['testuser'],
1383
+ manager: 'manager-user',
1360
1384
  codexHomeCandidates: null,
1361
1385
  labelsAsLlmAgentName: null,
1362
1386
  });
@@ -1421,6 +1445,7 @@ describe('StartPreparationUseCase', () => {
1421
1445
  maximumPreparingIssuesCount: null,
1422
1446
  utilizationPercentageThreshold: 90,
1423
1447
  allowedIssueAuthors: ['testuser'],
1448
+ manager: 'manager-user',
1424
1449
  codexHomeCandidates: null,
1425
1450
  labelsAsLlmAgentName: null,
1426
1451
  });
@@ -1469,6 +1494,7 @@ describe('StartPreparationUseCase', () => {
1469
1494
  maximumPreparingIssuesCount: null,
1470
1495
  utilizationPercentageThreshold: 90,
1471
1496
  allowedIssueAuthors: ['testuser'],
1497
+ manager: 'manager-user',
1472
1498
  codexHomeCandidates: null,
1473
1499
  labelsAsLlmAgentName: null,
1474
1500
  });
@@ -1524,6 +1550,7 @@ describe('StartPreparationUseCase', () => {
1524
1550
  maximumPreparingIssuesCount: null,
1525
1551
  utilizationPercentageThreshold: 90,
1526
1552
  allowedIssueAuthors: ['testuser'],
1553
+ manager: 'manager-user',
1527
1554
  codexHomeCandidates: null,
1528
1555
  labelsAsLlmAgentName: null,
1529
1556
  });
@@ -1582,6 +1609,7 @@ describe('StartPreparationUseCase', () => {
1582
1609
  maximumPreparingIssuesCount: null,
1583
1610
  utilizationPercentageThreshold: 90,
1584
1611
  allowedIssueAuthors: ['testuser'],
1612
+ manager: 'manager-user',
1585
1613
  codexHomeCandidates: null,
1586
1614
  labelsAsLlmAgentName: null,
1587
1615
  });
@@ -1630,6 +1658,7 @@ describe('StartPreparationUseCase', () => {
1630
1658
  maximumPreparingIssuesCount: null,
1631
1659
  utilizationPercentageThreshold: 90,
1632
1660
  allowedIssueAuthors: ['testuser'],
1661
+ manager: 'manager-user',
1633
1662
  codexHomeCandidates: null,
1634
1663
  labelsAsLlmAgentName: null,
1635
1664
  });
@@ -1678,6 +1707,7 @@ describe('StartPreparationUseCase', () => {
1678
1707
  maximumPreparingIssuesCount: null,
1679
1708
  utilizationPercentageThreshold: 90,
1680
1709
  allowedIssueAuthors: ['testuser'],
1710
+ manager: 'manager-user',
1681
1711
  codexHomeCandidates: null,
1682
1712
  labelsAsLlmAgentName: null,
1683
1713
  });
@@ -1726,6 +1756,7 @@ describe('StartPreparationUseCase', () => {
1726
1756
  maximumPreparingIssuesCount: null,
1727
1757
  utilizationPercentageThreshold: 90,
1728
1758
  allowedIssueAuthors: ['testuser'],
1759
+ manager: 'manager-user',
1729
1760
  codexHomeCandidates: null,
1730
1761
  labelsAsLlmAgentName: null,
1731
1762
  });
@@ -1780,6 +1811,7 @@ describe('StartPreparationUseCase', () => {
1780
1811
  maximumPreparingIssuesCount: null,
1781
1812
  utilizationPercentageThreshold: 90,
1782
1813
  allowedIssueAuthors: ['user1', 'user2'],
1814
+ manager: 'manager-user',
1783
1815
  codexHomeCandidates: null,
1784
1816
  labelsAsLlmAgentName: null,
1785
1817
  });
@@ -1828,6 +1860,7 @@ describe('StartPreparationUseCase', () => {
1828
1860
  maximumPreparingIssuesCount: null,
1829
1861
  utilizationPercentageThreshold: 90,
1830
1862
  allowedIssueAuthors: null,
1863
+ manager: 'manager-user',
1831
1864
  codexHomeCandidates: null,
1832
1865
  labelsAsLlmAgentName: null,
1833
1866
  });
@@ -1865,6 +1898,7 @@ describe('StartPreparationUseCase', () => {
1865
1898
  maximumPreparingIssuesCount: null,
1866
1899
  utilizationPercentageThreshold: 90,
1867
1900
  allowedIssueAuthors: [],
1901
+ manager: 'manager-user',
1868
1902
  codexHomeCandidates: null,
1869
1903
  labelsAsLlmAgentName: null,
1870
1904
  });
@@ -1902,6 +1936,7 @@ describe('StartPreparationUseCase', () => {
1902
1936
  maximumPreparingIssuesCount: null,
1903
1937
  utilizationPercentageThreshold: 90,
1904
1938
  allowedIssueAuthors: ['dependabot[bot]'],
1939
+ manager: 'manager-user',
1905
1940
  codexHomeCandidates: null,
1906
1941
  labelsAsLlmAgentName: null,
1907
1942
  });
@@ -1939,6 +1974,7 @@ describe('StartPreparationUseCase', () => {
1939
1974
  maximumPreparingIssuesCount: null,
1940
1975
  utilizationPercentageThreshold: 90,
1941
1976
  allowedIssueAuthors: ['owner'],
1977
+ manager: 'manager-user',
1942
1978
  codexHomeCandidates: null,
1943
1979
  labelsAsLlmAgentName: null,
1944
1980
  });
@@ -1985,6 +2021,7 @@ describe('StartPreparationUseCase', () => {
1985
2021
  maximumPreparingIssuesCount: null,
1986
2022
  utilizationPercentageThreshold: 90,
1987
2023
  allowedIssueAuthors: ['user1', 'user2'],
2024
+ manager: 'manager-user',
1988
2025
  codexHomeCandidates: null,
1989
2026
  labelsAsLlmAgentName: null,
1990
2027
  });
@@ -2025,6 +2062,7 @@ describe('StartPreparationUseCase', () => {
2025
2062
  maximumPreparingIssuesCount: null,
2026
2063
  utilizationPercentageThreshold: 90,
2027
2064
  allowedIssueAuthors: ['user1'],
2065
+ manager: 'manager-user',
2028
2066
  codexHomeCandidates: null,
2029
2067
  labelsAsLlmAgentName: null,
2030
2068
  });
@@ -2033,6 +2071,215 @@ describe('StartPreparationUseCase', () => {
2033
2071
  expect(mockLocalCommandRunner.runCommand.mock.calls).toHaveLength(0);
2034
2072
  });
2035
2073
 
2074
+ it('should pick up an awaiting workspace issue assigned to the manager', async () => {
2075
+ const awaitingIssues: Issue[] = [
2076
+ createMockIssue({
2077
+ url: 'https://github.com/user/repo/issues/1',
2078
+ title: 'Issue assigned to manager',
2079
+ labels: ['category:impl'],
2080
+ status: 'Awaiting Workspace',
2081
+ author: 'testuser',
2082
+ assignees: ['manager-user'],
2083
+ }),
2084
+ ];
2085
+ mockProjectRepository.getByUrl.mockResolvedValue(mockProject);
2086
+ mockIssueRepository.getStoryObjectMap.mockResolvedValue(
2087
+ createMockStoryObjectMap(awaitingIssues),
2088
+ );
2089
+ mockLocalCommandRunner.runCommand.mockResolvedValue({
2090
+ stdout: '',
2091
+ stderr: '',
2092
+ exitCode: 0,
2093
+ });
2094
+ await useCase.run({
2095
+ projectUrl: 'https://github.com/user/repo',
2096
+ defaultAgentName: 'agent1',
2097
+ defaultLlmModelName: 'claude-opus',
2098
+ fallbackLlmModelName: null,
2099
+ defaultLlmAgentName: null,
2100
+ configFilePath: '/path/to/config.yml',
2101
+ maximumPreparingIssuesCount: null,
2102
+ utilizationPercentageThreshold: 90,
2103
+ allowedIssueAuthors: ['testuser'],
2104
+ manager: 'manager-user',
2105
+ codexHomeCandidates: null,
2106
+ labelsAsLlmAgentName: null,
2107
+ });
2108
+ expect(mockIssueRepository.updateStatus.mock.calls).toHaveLength(1);
2109
+ expect(mockIssueRepository.updateStatus.mock.calls[0][1]).toMatchObject({
2110
+ url: 'https://github.com/user/repo/issues/1',
2111
+ status: 'Preparation',
2112
+ });
2113
+ expect(mockLocalCommandRunner.runCommand.mock.calls).toHaveLength(1);
2114
+ });
2115
+
2116
+ it('should skip an awaiting workspace issue with no assignees', async () => {
2117
+ const awaitingIssues: Issue[] = [
2118
+ createMockIssue({
2119
+ url: 'https://github.com/user/repo/issues/1',
2120
+ title: 'Issue with no assignees',
2121
+ labels: ['category:impl'],
2122
+ status: 'Awaiting Workspace',
2123
+ author: 'testuser',
2124
+ assignees: [],
2125
+ }),
2126
+ ];
2127
+ mockProjectRepository.getByUrl.mockResolvedValue(mockProject);
2128
+ mockIssueRepository.getStoryObjectMap.mockResolvedValue(
2129
+ createMockStoryObjectMap(awaitingIssues),
2130
+ );
2131
+ mockLocalCommandRunner.runCommand.mockResolvedValue({
2132
+ stdout: '',
2133
+ stderr: '',
2134
+ exitCode: 0,
2135
+ });
2136
+ await useCase.run({
2137
+ projectUrl: 'https://github.com/user/repo',
2138
+ defaultAgentName: 'agent1',
2139
+ defaultLlmModelName: 'claude-opus',
2140
+ fallbackLlmModelName: null,
2141
+ defaultLlmAgentName: null,
2142
+ configFilePath: '/path/to/config.yml',
2143
+ maximumPreparingIssuesCount: null,
2144
+ utilizationPercentageThreshold: 90,
2145
+ allowedIssueAuthors: ['testuser'],
2146
+ manager: 'manager-user',
2147
+ codexHomeCandidates: null,
2148
+ labelsAsLlmAgentName: null,
2149
+ });
2150
+ expect(mockIssueRepository.updateStatus.mock.calls).toHaveLength(0);
2151
+ expect(mockLocalCommandRunner.runCommand.mock.calls).toHaveLength(0);
2152
+ });
2153
+
2154
+ it('should skip an awaiting workspace issue assigned only to a non-manager', async () => {
2155
+ const awaitingIssues: Issue[] = [
2156
+ createMockIssue({
2157
+ url: 'https://github.com/user/repo/issues/1',
2158
+ title: 'Issue assigned to non-manager only',
2159
+ labels: ['category:impl'],
2160
+ status: 'Awaiting Workspace',
2161
+ author: 'testuser',
2162
+ assignees: ['someone-else'],
2163
+ }),
2164
+ ];
2165
+ mockProjectRepository.getByUrl.mockResolvedValue(mockProject);
2166
+ mockIssueRepository.getStoryObjectMap.mockResolvedValue(
2167
+ createMockStoryObjectMap(awaitingIssues),
2168
+ );
2169
+ mockLocalCommandRunner.runCommand.mockResolvedValue({
2170
+ stdout: '',
2171
+ stderr: '',
2172
+ exitCode: 0,
2173
+ });
2174
+ await useCase.run({
2175
+ projectUrl: 'https://github.com/user/repo',
2176
+ defaultAgentName: 'agent1',
2177
+ defaultLlmModelName: 'claude-opus',
2178
+ fallbackLlmModelName: null,
2179
+ defaultLlmAgentName: null,
2180
+ configFilePath: '/path/to/config.yml',
2181
+ maximumPreparingIssuesCount: null,
2182
+ utilizationPercentageThreshold: 90,
2183
+ allowedIssueAuthors: ['testuser'],
2184
+ manager: 'manager-user',
2185
+ codexHomeCandidates: null,
2186
+ labelsAsLlmAgentName: null,
2187
+ });
2188
+ expect(mockIssueRepository.updateStatus.mock.calls).toHaveLength(0);
2189
+ expect(mockLocalCommandRunner.runCommand.mock.calls).toHaveLength(0);
2190
+ });
2191
+
2192
+ it('should pick up an awaiting workspace issue whose assignees include the manager alongside other assignees', async () => {
2193
+ const awaitingIssues: Issue[] = [
2194
+ createMockIssue({
2195
+ url: 'https://github.com/user/repo/issues/1',
2196
+ title: 'Renovate PR auto-assigned to manager',
2197
+ labels: ['category:impl'],
2198
+ status: 'Awaiting Workspace',
2199
+ author: 'testuser',
2200
+ assignees: ['renovate[bot]', 'manager-user'],
2201
+ }),
2202
+ ];
2203
+ mockProjectRepository.getByUrl.mockResolvedValue(mockProject);
2204
+ mockIssueRepository.getStoryObjectMap.mockResolvedValue(
2205
+ createMockStoryObjectMap(awaitingIssues),
2206
+ );
2207
+ mockLocalCommandRunner.runCommand.mockResolvedValue({
2208
+ stdout: '',
2209
+ stderr: '',
2210
+ exitCode: 0,
2211
+ });
2212
+ await useCase.run({
2213
+ projectUrl: 'https://github.com/user/repo',
2214
+ defaultAgentName: 'agent1',
2215
+ defaultLlmModelName: 'claude-opus',
2216
+ fallbackLlmModelName: null,
2217
+ defaultLlmAgentName: null,
2218
+ configFilePath: '/path/to/config.yml',
2219
+ maximumPreparingIssuesCount: null,
2220
+ utilizationPercentageThreshold: 90,
2221
+ allowedIssueAuthors: ['testuser'],
2222
+ manager: 'manager-user',
2223
+ codexHomeCandidates: null,
2224
+ labelsAsLlmAgentName: null,
2225
+ });
2226
+ expect(mockIssueRepository.updateStatus.mock.calls).toHaveLength(1);
2227
+ expect(mockLocalCommandRunner.runCommand.mock.calls).toHaveLength(1);
2228
+ });
2229
+
2230
+ it('should pick up only the manager-assigned issue among mixed assignee issues', async () => {
2231
+ const awaitingIssues: Issue[] = [
2232
+ createMockIssue({
2233
+ url: 'https://github.com/user/repo/issues/1',
2234
+ title: 'Assigned to manager',
2235
+ labels: ['category:impl'],
2236
+ status: 'Awaiting Workspace',
2237
+ author: 'testuser',
2238
+ assignees: ['manager-user'],
2239
+ number: 1,
2240
+ itemId: 'item-1',
2241
+ }),
2242
+ createMockIssue({
2243
+ url: 'https://github.com/user/repo/issues/2',
2244
+ title: 'Assigned to client only',
2245
+ labels: ['category:impl'],
2246
+ status: 'Awaiting Workspace',
2247
+ author: 'testuser',
2248
+ assignees: ['client-user'],
2249
+ number: 2,
2250
+ itemId: 'item-2',
2251
+ }),
2252
+ ];
2253
+ mockProjectRepository.getByUrl.mockResolvedValue(mockProject);
2254
+ mockIssueRepository.getStoryObjectMap.mockResolvedValue(
2255
+ createMockStoryObjectMap(awaitingIssues),
2256
+ );
2257
+ mockLocalCommandRunner.runCommand.mockResolvedValue({
2258
+ stdout: '',
2259
+ stderr: '',
2260
+ exitCode: 0,
2261
+ });
2262
+ await useCase.run({
2263
+ projectUrl: 'https://github.com/user/repo',
2264
+ defaultAgentName: 'agent1',
2265
+ defaultLlmModelName: 'claude-opus',
2266
+ fallbackLlmModelName: null,
2267
+ defaultLlmAgentName: null,
2268
+ configFilePath: '/path/to/config.yml',
2269
+ maximumPreparingIssuesCount: null,
2270
+ utilizationPercentageThreshold: 90,
2271
+ allowedIssueAuthors: ['testuser'],
2272
+ manager: 'manager-user',
2273
+ codexHomeCandidates: null,
2274
+ labelsAsLlmAgentName: null,
2275
+ });
2276
+ expect(mockIssueRepository.updateStatus.mock.calls).toHaveLength(1);
2277
+ expect(mockIssueRepository.updateStatus.mock.calls[0][1]).toMatchObject({
2278
+ url: 'https://github.com/user/repo/issues/1',
2279
+ });
2280
+ expect(mockLocalCommandRunner.runCommand.mock.calls).toHaveLength(1);
2281
+ });
2282
+
2036
2283
  it('should not pass --codexHome when codexHomeCandidates is null', async () => {
2037
2284
  const awaitingIssues: Issue[] = [
2038
2285
  createMockIssue({
@@ -2062,6 +2309,7 @@ describe('StartPreparationUseCase', () => {
2062
2309
  maximumPreparingIssuesCount: null,
2063
2310
  utilizationPercentageThreshold: 90,
2064
2311
  allowedIssueAuthors: ['testuser'],
2312
+ manager: 'manager-user',
2065
2313
  codexHomeCandidates: null,
2066
2314
  labelsAsLlmAgentName: null,
2067
2315
  });
@@ -2110,6 +2358,7 @@ describe('StartPreparationUseCase', () => {
2110
2358
  maximumPreparingIssuesCount: null,
2111
2359
  utilizationPercentageThreshold: 90,
2112
2360
  allowedIssueAuthors: ['testuser'],
2361
+ manager: 'manager-user',
2113
2362
  codexHomeCandidates: [],
2114
2363
  labelsAsLlmAgentName: null,
2115
2364
  });
@@ -2158,6 +2407,7 @@ describe('StartPreparationUseCase', () => {
2158
2407
  maximumPreparingIssuesCount: null,
2159
2408
  utilizationPercentageThreshold: 90,
2160
2409
  allowedIssueAuthors: ['testuser'],
2410
+ manager: 'manager-user',
2161
2411
  codexHomeCandidates: ['.codex-dev1'],
2162
2412
  labelsAsLlmAgentName: null,
2163
2413
  });
@@ -2226,6 +2476,7 @@ describe('StartPreparationUseCase', () => {
2226
2476
  maximumPreparingIssuesCount: null,
2227
2477
  utilizationPercentageThreshold: 90,
2228
2478
  allowedIssueAuthors: ['testuser'],
2479
+ manager: 'manager-user',
2229
2480
  codexHomeCandidates: ['.codex-dev1', '.codex-dev2'],
2230
2481
  labelsAsLlmAgentName: null,
2231
2482
  });
@@ -2291,6 +2542,7 @@ describe('StartPreparationUseCase', () => {
2291
2542
  maximumPreparingIssuesCount: null,
2292
2543
  utilizationPercentageThreshold: 90,
2293
2544
  allowedIssueAuthors: ['testuser'],
2545
+ manager: 'manager-user',
2294
2546
  codexHomeCandidates: null,
2295
2547
  labelsAsLlmAgentName: null,
2296
2548
  });
@@ -2350,6 +2602,7 @@ describe('StartPreparationUseCase', () => {
2350
2602
  maximumPreparingIssuesCount: null,
2351
2603
  utilizationPercentageThreshold: 90,
2352
2604
  allowedIssueAuthors: ['testuser'],
2605
+ manager: 'manager-user',
2353
2606
  codexHomeCandidates: null,
2354
2607
  labelsAsLlmAgentName: null,
2355
2608
  });
@@ -2378,6 +2631,7 @@ describe('StartPreparationUseCase', () => {
2378
2631
  maximumPreparingIssuesCount: null,
2379
2632
  utilizationPercentageThreshold: 90,
2380
2633
  allowedIssueAuthors: ['testuser'],
2634
+ manager: 'manager-user',
2381
2635
  codexHomeCandidates: null,
2382
2636
  labelsAsLlmAgentName: null,
2383
2637
  });
@@ -2424,6 +2678,7 @@ describe('StartPreparationUseCase', () => {
2424
2678
  maximumPreparingIssuesCount: null,
2425
2679
  utilizationPercentageThreshold: 90,
2426
2680
  allowedIssueAuthors: ['testuser'],
2681
+ manager: 'manager-user',
2427
2682
  codexHomeCandidates: null,
2428
2683
  labelsAsLlmAgentName: null,
2429
2684
  });
@@ -2476,6 +2731,7 @@ describe('StartPreparationUseCase', () => {
2476
2731
  maximumPreparingIssuesCount: null,
2477
2732
  utilizationPercentageThreshold: 90,
2478
2733
  allowedIssueAuthors: ['testuser'],
2734
+ manager: 'manager-user',
2479
2735
  codexHomeCandidates: null,
2480
2736
  labelsAsLlmAgentName: null,
2481
2737
  });
@@ -2566,6 +2822,7 @@ describe('StartPreparationUseCase', () => {
2566
2822
  maximumPreparingIssuesCount: null,
2567
2823
  utilizationPercentageThreshold: 90,
2568
2824
  allowedIssueAuthors: ['testuser'],
2825
+ manager: 'manager-user',
2569
2826
  codexHomeCandidates: null,
2570
2827
  labelsAsLlmAgentName: null,
2571
2828
  });
@@ -2623,6 +2880,7 @@ describe('StartPreparationUseCase', () => {
2623
2880
  maximumPreparingIssuesCount: null,
2624
2881
  utilizationPercentageThreshold: 90,
2625
2882
  allowedIssueAuthors: ['testuser'],
2883
+ manager: 'manager-user',
2626
2884
  codexHomeCandidates: null,
2627
2885
  labelsAsLlmAgentName: null,
2628
2886
  });
@@ -2698,6 +2956,7 @@ describe('StartPreparationUseCase', () => {
2698
2956
  maximumPreparingIssuesCount: null,
2699
2957
  utilizationPercentageThreshold: 90,
2700
2958
  allowedIssueAuthors: ['testuser'],
2959
+ manager: 'manager-user',
2701
2960
  codexHomeCandidates: null,
2702
2961
  labelsAsLlmAgentName: null,
2703
2962
  });
@@ -2776,6 +3035,7 @@ describe('StartPreparationUseCase', () => {
2776
3035
  maximumPreparingIssuesCount: null,
2777
3036
  utilizationPercentageThreshold: 90,
2778
3037
  allowedIssueAuthors: ['testuser'],
3038
+ manager: 'manager-user',
2779
3039
  codexHomeCandidates: null,
2780
3040
  labelsAsLlmAgentName: null,
2781
3041
  });
@@ -2853,6 +3113,7 @@ describe('StartPreparationUseCase', () => {
2853
3113
  maximumPreparingIssuesCount: null,
2854
3114
  utilizationPercentageThreshold: 90,
2855
3115
  allowedIssueAuthors: ['testuser'],
3116
+ manager: 'manager-user',
2856
3117
  codexHomeCandidates: null,
2857
3118
  labelsAsLlmAgentName: null,
2858
3119
  });
@@ -2927,6 +3188,7 @@ describe('StartPreparationUseCase', () => {
2927
3188
  maximumPreparingIssuesCount: null,
2928
3189
  utilizationPercentageThreshold: 90,
2929
3190
  allowedIssueAuthors: ['testuser'],
3191
+ manager: 'manager-user',
2930
3192
  codexHomeCandidates: null,
2931
3193
  labelsAsLlmAgentName: null,
2932
3194
  });
@@ -3014,6 +3276,7 @@ describe('StartPreparationUseCase', () => {
3014
3276
  maximumPreparingIssuesCount: null,
3015
3277
  utilizationPercentageThreshold: 90,
3016
3278
  allowedIssueAuthors: ['testuser'],
3279
+ manager: 'manager-user',
3017
3280
  codexHomeCandidates: null,
3018
3281
  labelsAsLlmAgentName: null,
3019
3282
  });
@@ -3080,6 +3343,7 @@ describe('StartPreparationUseCase', () => {
3080
3343
  maximumPreparingIssuesCount: null,
3081
3344
  utilizationPercentageThreshold: 90,
3082
3345
  allowedIssueAuthors: ['testuser'],
3346
+ manager: 'manager-user',
3083
3347
  codexHomeCandidates: null,
3084
3348
  labelsAsLlmAgentName: null,
3085
3349
  });
@@ -3147,6 +3411,7 @@ describe('StartPreparationUseCase', () => {
3147
3411
  maximumPreparingIssuesCount: null,
3148
3412
  utilizationPercentageThreshold: 90,
3149
3413
  allowedIssueAuthors: ['testuser'],
3414
+ manager: 'manager-user',
3150
3415
  codexHomeCandidates: null,
3151
3416
  labelsAsLlmAgentName: null,
3152
3417
  });
@@ -3216,6 +3481,7 @@ describe('StartPreparationUseCase', () => {
3216
3481
  maximumPreparingIssuesCount: null,
3217
3482
  utilizationPercentageThreshold: 90,
3218
3483
  allowedIssueAuthors: ['testuser'],
3484
+ manager: 'manager-user',
3219
3485
  codexHomeCandidates: null,
3220
3486
  labelsAsLlmAgentName: null,
3221
3487
  });
@@ -3288,6 +3554,7 @@ describe('StartPreparationUseCase', () => {
3288
3554
  maximumPreparingIssuesCount: null,
3289
3555
  utilizationPercentageThreshold: 90,
3290
3556
  allowedIssueAuthors: ['testuser'],
3557
+ manager: 'manager-user',
3291
3558
  codexHomeCandidates: null,
3292
3559
  labelsAsLlmAgentName: null,
3293
3560
  });
@@ -3402,6 +3669,7 @@ describe('StartPreparationUseCase', () => {
3402
3669
  maximumPreparingIssuesCount: null,
3403
3670
  utilizationPercentageThreshold: 90,
3404
3671
  allowedIssueAuthors: ['testuser'],
3672
+ manager: 'manager-user',
3405
3673
  codexHomeCandidates: null,
3406
3674
  labelsAsLlmAgentName: null,
3407
3675
  });
@@ -3487,6 +3755,7 @@ describe('StartPreparationUseCase', () => {
3487
3755
  maximumPreparingIssuesCount: null,
3488
3756
  utilizationPercentageThreshold: 90,
3489
3757
  allowedIssueAuthors: ['testuser'],
3758
+ manager: 'manager-user',
3490
3759
  codexHomeCandidates: null,
3491
3760
  labelsAsLlmAgentName: null,
3492
3761
  });
@@ -3547,6 +3816,7 @@ describe('StartPreparationUseCase', () => {
3547
3816
  maximumPreparingIssuesCount: null,
3548
3817
  utilizationPercentageThreshold: 90,
3549
3818
  allowedIssueAuthors: ['testuser'],
3819
+ manager: 'manager-user',
3550
3820
  codexHomeCandidates: null,
3551
3821
  labelsAsLlmAgentName: null,
3552
3822
  });
@@ -3613,6 +3883,7 @@ describe('StartPreparationUseCase', () => {
3613
3883
  maximumPreparingIssuesCount: null,
3614
3884
  utilizationPercentageThreshold: 90,
3615
3885
  allowedIssueAuthors: ['testuser'],
3886
+ manager: 'manager-user',
3616
3887
  codexHomeCandidates: null,
3617
3888
  labelsAsLlmAgentName: null,
3618
3889
  });
@@ -3679,6 +3950,7 @@ describe('StartPreparationUseCase', () => {
3679
3950
  maximumPreparingIssuesCount: null,
3680
3951
  utilizationPercentageThreshold: 90,
3681
3952
  allowedIssueAuthors: ['testuser'],
3953
+ manager: 'manager-user',
3682
3954
  codexHomeCandidates: null,
3683
3955
  labelsAsLlmAgentName: null,
3684
3956
  });
@@ -3745,6 +4017,7 @@ describe('StartPreparationUseCase', () => {
3745
4017
  maximumPreparingIssuesCount: null,
3746
4018
  utilizationPercentageThreshold: 90,
3747
4019
  allowedIssueAuthors: ['testuser'],
4020
+ manager: 'manager-user',
3748
4021
  codexHomeCandidates: null,
3749
4022
  labelsAsLlmAgentName: null,
3750
4023
  });
@@ -3814,6 +4087,7 @@ describe('StartPreparationUseCase', () => {
3814
4087
  maximumPreparingIssuesCount: null,
3815
4088
  utilizationPercentageThreshold: 90,
3816
4089
  allowedIssueAuthors: ['testuser'],
4090
+ manager: 'manager-user',
3817
4091
  codexHomeCandidates: null,
3818
4092
  labelsAsLlmAgentName: null,
3819
4093
  });
@@ -3861,6 +4135,7 @@ describe('StartPreparationUseCase', () => {
3861
4135
  maximumPreparingIssuesCount: null,
3862
4136
  utilizationPercentageThreshold: 90,
3863
4137
  allowedIssueAuthors: ['testuser'],
4138
+ manager: 'manager-user',
3864
4139
  codexHomeCandidates: null,
3865
4140
  labelsAsLlmAgentName: null,
3866
4141
  });
@@ -3930,6 +4205,7 @@ describe('StartPreparationUseCase', () => {
3930
4205
  maximumPreparingIssuesCount: null,
3931
4206
  utilizationPercentageThreshold: 90,
3932
4207
  allowedIssueAuthors: ['testuser'],
4208
+ manager: 'manager-user',
3933
4209
  codexHomeCandidates: null,
3934
4210
  labelsAsLlmAgentName: null,
3935
4211
  });
@@ -3999,6 +4275,7 @@ describe('StartPreparationUseCase', () => {
3999
4275
  maximumPreparingIssuesCount: null,
4000
4276
  utilizationPercentageThreshold: 90,
4001
4277
  allowedIssueAuthors: ['testuser'],
4278
+ manager: 'manager-user',
4002
4279
  codexHomeCandidates: null,
4003
4280
  labelsAsLlmAgentName: null,
4004
4281
  });
@@ -4068,6 +4345,7 @@ describe('StartPreparationUseCase', () => {
4068
4345
  maximumPreparingIssuesCount: null,
4069
4346
  utilizationPercentageThreshold: 90,
4070
4347
  allowedIssueAuthors: ['testuser'],
4348
+ manager: 'manager-user',
4071
4349
  codexHomeCandidates: null,
4072
4350
  labelsAsLlmAgentName: null,
4073
4351
  });
@@ -4145,6 +4423,7 @@ describe('StartPreparationUseCase', () => {
4145
4423
  maximumPreparingIssuesCount: null,
4146
4424
  utilizationPercentageThreshold: 90,
4147
4425
  allowedIssueAuthors: ['testuser'],
4426
+ manager: 'manager-user',
4148
4427
  codexHomeCandidates: null,
4149
4428
  labelsAsLlmAgentName: null,
4150
4429
  });
@@ -4222,6 +4501,7 @@ describe('StartPreparationUseCase', () => {
4222
4501
  maximumPreparingIssuesCount: null,
4223
4502
  utilizationPercentageThreshold: 90,
4224
4503
  allowedIssueAuthors: ['testuser'],
4504
+ manager: 'manager-user',
4225
4505
  codexHomeCandidates: null,
4226
4506
  labelsAsLlmAgentName: null,
4227
4507
  });
@@ -4304,6 +4584,7 @@ describe('StartPreparationUseCase', () => {
4304
4584
  maximumPreparingIssuesCount: null,
4305
4585
  utilizationPercentageThreshold: 90,
4306
4586
  allowedIssueAuthors: ['testuser'],
4587
+ manager: 'manager-user',
4307
4588
  codexHomeCandidates: null,
4308
4589
  labelsAsLlmAgentName: null,
4309
4590
  });
@@ -4415,6 +4696,7 @@ describe('StartPreparationUseCase', () => {
4415
4696
  maximumPreparingIssuesCount: null,
4416
4697
  utilizationPercentageThreshold: 90,
4417
4698
  allowedIssueAuthors: ['testuser'],
4699
+ manager: 'manager-user',
4418
4700
  codexHomeCandidates: null,
4419
4701
  labelsAsLlmAgentName: null,
4420
4702
  });
@@ -4490,6 +4772,7 @@ describe('StartPreparationUseCase', () => {
4490
4772
  maximumPreparingIssuesCount: null,
4491
4773
  utilizationPercentageThreshold: 90,
4492
4774
  allowedIssueAuthors: ['testuser'],
4775
+ manager: 'manager-user',
4493
4776
  codexHomeCandidates: null,
4494
4777
  labelsAsLlmAgentName: null,
4495
4778
  });
@@ -4562,6 +4845,7 @@ describe('StartPreparationUseCase', () => {
4562
4845
  maximumPreparingIssuesCount: null,
4563
4846
  utilizationPercentageThreshold: 90,
4564
4847
  allowedIssueAuthors: ['testuser'],
4848
+ manager: 'manager-user',
4565
4849
  codexHomeCandidates: null,
4566
4850
  labelsAsLlmAgentName: null,
4567
4851
  });
@@ -4609,6 +4893,7 @@ describe('StartPreparationUseCase', () => {
4609
4893
  maximumPreparingIssuesCount: null,
4610
4894
  utilizationPercentageThreshold: 90,
4611
4895
  allowedIssueAuthors: ['testuser'],
4896
+ manager: 'manager-user',
4612
4897
  codexHomeCandidates: null,
4613
4898
  labelsAsLlmAgentName: params.labelsAsLlmAgentName,
4614
4899
  });
@@ -4755,6 +5040,7 @@ describe('StartPreparationUseCase', () => {
4755
5040
  maximumPreparingIssuesCount: null,
4756
5041
  utilizationPercentageThreshold: 90,
4757
5042
  allowedIssueAuthors: ['testuser'],
5043
+ manager: 'manager-user',
4758
5044
  codexHomeCandidates: null,
4759
5045
  labelsAsLlmAgentName: null,
4760
5046
  });
@@ -4821,6 +5107,7 @@ describe('StartPreparationUseCase', () => {
4821
5107
  maximumPreparingIssuesCount: null,
4822
5108
  utilizationPercentageThreshold: 90,
4823
5109
  allowedIssueAuthors: ['testuser'],
5110
+ manager: 'manager-user',
4824
5111
  codexHomeCandidates: null,
4825
5112
  labelsAsLlmAgentName: null,
4826
5113
  });
@@ -4879,6 +5166,7 @@ describe('StartPreparationUseCase', () => {
4879
5166
  maximumPreparingIssuesCount: null,
4880
5167
  utilizationPercentageThreshold: 90,
4881
5168
  allowedIssueAuthors: ['testuser'],
5169
+ manager: 'manager-user',
4882
5170
  codexHomeCandidates: null,
4883
5171
  labelsAsLlmAgentName: null,
4884
5172
  });
@@ -4933,6 +5221,7 @@ describe('StartPreparationUseCase', () => {
4933
5221
  maximumPreparingIssuesCount: null,
4934
5222
  utilizationPercentageThreshold: 90,
4935
5223
  allowedIssueAuthors: ['testuser'],
5224
+ manager: 'manager-user',
4936
5225
  codexHomeCandidates: null,
4937
5226
  labelsAsLlmAgentName: null,
4938
5227
  });
@@ -4987,6 +5276,7 @@ describe('StartPreparationUseCase', () => {
4987
5276
  maximumPreparingIssuesCount: null,
4988
5277
  utilizationPercentageThreshold: 90,
4989
5278
  allowedIssueAuthors: ['testuser'],
5279
+ manager: 'manager-user',
4990
5280
  codexHomeCandidates: null,
4991
5281
  labelsAsLlmAgentName: null,
4992
5282
  });
@@ -5042,6 +5332,7 @@ describe('StartPreparationUseCase', () => {
5042
5332
  maximumPreparingIssuesCount: null,
5043
5333
  utilizationPercentageThreshold: 90,
5044
5334
  allowedIssueAuthors: ['testuser'],
5335
+ manager: 'manager-user',
5045
5336
  codexHomeCandidates: null,
5046
5337
  labelsAsLlmAgentName: null,
5047
5338
  });
@@ -5122,6 +5413,7 @@ describe('StartPreparationUseCase', () => {
5122
5413
  maximumPreparingIssuesCount: null,
5123
5414
  utilizationPercentageThreshold: 90,
5124
5415
  allowedIssueAuthors: ['testuser'],
5416
+ manager: 'manager-user',
5125
5417
  codexHomeCandidates: null,
5126
5418
  labelsAsLlmAgentName: null,
5127
5419
  });
@@ -5189,6 +5481,7 @@ describe('StartPreparationUseCase', () => {
5189
5481
  maximumPreparingIssuesCount: null,
5190
5482
  utilizationPercentageThreshold: 90,
5191
5483
  allowedIssueAuthors: ['testuser'],
5484
+ manager: 'manager-user',
5192
5485
  codexHomeCandidates: null,
5193
5486
  labelsAsLlmAgentName: null,
5194
5487
  });
@@ -5248,6 +5541,7 @@ describe('StartPreparationUseCase', () => {
5248
5541
  maximumPreparingIssuesCount: null,
5249
5542
  utilizationPercentageThreshold: 90,
5250
5543
  allowedIssueAuthors: ['testuser'],
5544
+ manager: 'manager-user',
5251
5545
  codexHomeCandidates: null,
5252
5546
  labelsAsLlmAgentName: null,
5253
5547
  });
@@ -5303,6 +5597,7 @@ describe('StartPreparationUseCase', () => {
5303
5597
  maximumPreparingIssuesCount: null,
5304
5598
  utilizationPercentageThreshold: 90,
5305
5599
  allowedIssueAuthors: ['testuser'],
5600
+ manager: 'manager-user',
5306
5601
  codexHomeCandidates: null,
5307
5602
  labelsAsLlmAgentName: null,
5308
5603
  });
@@ -5364,6 +5659,7 @@ describe('StartPreparationUseCase', () => {
5364
5659
  maximumPreparingIssuesCount: null,
5365
5660
  utilizationPercentageThreshold: 90,
5366
5661
  allowedIssueAuthors: ['testuser'],
5662
+ manager: 'manager-user',
5367
5663
  codexHomeCandidates: null,
5368
5664
  labelsAsLlmAgentName: null,
5369
5665
  });
@@ -5425,6 +5721,7 @@ describe('StartPreparationUseCase', () => {
5425
5721
  maximumPreparingIssuesCount: null,
5426
5722
  utilizationPercentageThreshold: 90,
5427
5723
  allowedIssueAuthors: ['testuser'],
5724
+ manager: 'manager-user',
5428
5725
  codexHomeCandidates: null,
5429
5726
  labelsAsLlmAgentName: null,
5430
5727
  });
@@ -5485,6 +5782,7 @@ describe('StartPreparationUseCase', () => {
5485
5782
  maximumPreparingIssuesCount: null,
5486
5783
  utilizationPercentageThreshold: 90,
5487
5784
  allowedIssueAuthors: ['testuser'],
5785
+ manager: 'manager-user',
5488
5786
  codexHomeCandidates: null,
5489
5787
  labelsAsLlmAgentName: null,
5490
5788
  });
@@ -5545,6 +5843,7 @@ describe('StartPreparationUseCase', () => {
5545
5843
  maximumPreparingIssuesCount: null,
5546
5844
  utilizationPercentageThreshold: 90,
5547
5845
  allowedIssueAuthors: ['testuser'],
5846
+ manager: 'manager-user',
5548
5847
  codexHomeCandidates: null,
5549
5848
  labelsAsLlmAgentName: null,
5550
5849
  });
@@ -5599,6 +5898,7 @@ describe('StartPreparationUseCase', () => {
5599
5898
  maximumPreparingIssuesCount: null,
5600
5899
  utilizationPercentageThreshold: 90,
5601
5900
  allowedIssueAuthors: ['testuser'],
5901
+ manager: 'manager-user',
5602
5902
  codexHomeCandidates: null,
5603
5903
  labelsAsLlmAgentName: null,
5604
5904
  });
@@ -5665,6 +5965,7 @@ describe('StartPreparationUseCase', () => {
5665
5965
  maximumPreparingIssuesCount: null,
5666
5966
  utilizationPercentageThreshold: 90,
5667
5967
  allowedIssueAuthors: ['testuser'],
5968
+ manager: 'manager-user',
5668
5969
  codexHomeCandidates: null,
5669
5970
  labelsAsLlmAgentName: null,
5670
5971
  });
@@ -5712,6 +6013,13 @@ describe('StartPreparationUseCase', () => {
5712
6013
  number: 14,
5713
6014
  author: 'not-allowed-user',
5714
6015
  }),
6016
+ createMockIssue({
6017
+ url: 'https://github.com/user/repo/issues/14b',
6018
+ title: 'Not Assigned To Manager Issue',
6019
+ status: 'Awaiting Workspace',
6020
+ number: 145,
6021
+ assignees: ['someone-else'],
6022
+ }),
5715
6023
  createMockIssue({
5716
6024
  url: 'https://github.com/user/repo/issues/15',
5717
6025
  title: 'Spawnable Issue',
@@ -5742,6 +6050,7 @@ describe('StartPreparationUseCase', () => {
5742
6050
  maximumPreparingIssuesCount: null,
5743
6051
  utilizationPercentageThreshold: 90,
5744
6052
  allowedIssueAuthors: ['testuser'],
6053
+ manager: 'manager-user',
5745
6054
  codexHomeCandidates: null,
5746
6055
  labelsAsLlmAgentName: null,
5747
6056
  });
@@ -5750,7 +6059,7 @@ describe('StartPreparationUseCase', () => {
5750
6059
  );
5751
6060
  expect(summaryCalls).toHaveLength(1);
5752
6061
  expect(summaryCalls[0][0]).toBe(
5753
- 'Spawn candidate exclusion summary for https://github.com/user/repo: dependedIssueUrls=1, futureNextActionDate=1, nextActionHourNotReached=1, authorNotAllowed=1',
6062
+ 'Spawn candidate exclusion summary for https://github.com/user/repo: dependedIssueUrls=1, futureNextActionDate=1, nextActionHourNotReached=1, authorNotAllowed=1, notAssignedToManager=1',
5754
6063
  );
5755
6064
  expect(mockLocalCommandRunner.runCommand.mock.calls).toHaveLength(1);
5756
6065
  expect(mockLocalCommandRunner.runCommand.mock.calls[0][1][0]).toBe(
@@ -5791,6 +6100,7 @@ describe('StartPreparationUseCase', () => {
5791
6100
  maximumPreparingIssuesCount: null,
5792
6101
  utilizationPercentageThreshold: 90,
5793
6102
  allowedIssueAuthors: ['testuser'],
6103
+ manager: 'manager-user',
5794
6104
  codexHomeCandidates: null,
5795
6105
  labelsAsLlmAgentName: null,
5796
6106
  });
@@ -5799,7 +6109,7 @@ describe('StartPreparationUseCase', () => {
5799
6109
  );
5800
6110
  expect(summaryCalls).toHaveLength(1);
5801
6111
  expect(summaryCalls[0][0]).toBe(
5802
- 'Spawn candidate exclusion summary for https://github.com/user/repo: dependedIssueUrls=0, futureNextActionDate=0, nextActionHourNotReached=0, authorNotAllowed=0',
6112
+ 'Spawn candidate exclusion summary for https://github.com/user/repo: dependedIssueUrls=0, futureNextActionDate=0, nextActionHourNotReached=0, authorNotAllowed=0, notAssignedToManager=0',
5803
6113
  );
5804
6114
  consoleLogSpy.mockRestore();
5805
6115
  });
@@ -5862,6 +6172,7 @@ describe('StartPreparationUseCase', () => {
5862
6172
  maximumPreparingIssuesCount: null,
5863
6173
  utilizationPercentageThreshold: 90,
5864
6174
  allowedIssueAuthors: ['testuser'],
6175
+ manager: 'manager-user',
5865
6176
  codexHomeCandidates: null,
5866
6177
  labelsAsLlmAgentName: null,
5867
6178
  });
@@ -5908,6 +6219,7 @@ describe('StartPreparationUseCase', () => {
5908
6219
  maximumPreparingIssuesCount: null,
5909
6220
  utilizationPercentageThreshold: 90,
5910
6221
  allowedIssueAuthors: ['testuser'],
6222
+ manager: 'manager-user',
5911
6223
  codexHomeCandidates: null,
5912
6224
  labelsAsLlmAgentName: null,
5913
6225
  });