npm-cli-gh-issue-preparator 1.19.2 → 1.19.3

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 CHANGED
@@ -1,3 +1,11 @@
1
+ ## [1.19.3](https://github.com/HiromiShikata/npm-cli-gh-issue-preparator/compare/v1.19.2...v1.19.3) (2026-03-02)
2
+
3
+
4
+ ### Bug Fixes
5
+
6
+ * **core:** aggregate blocker URLs per orgRepo in createWorkflowBockerIsues ([832523b](https://github.com/HiromiShikata/npm-cli-gh-issue-preparator/commit/832523b19e52717202734cb01a48ba8d297030c7))
7
+ * **core:** iterate all workflow blocker stories in createWorkflowBockerIsues ([2435494](https://github.com/HiromiShikata/npm-cli-gh-issue-preparator/commit/2435494af5a771416519ba19ac0d829ee8f2ee27))
8
+
1
9
  ## [1.19.2](https://github.com/HiromiShikata/npm-cli-gh-issue-preparator/compare/v1.19.1...v1.19.2) (2026-03-01)
2
10
 
3
11
 
@@ -71,17 +71,22 @@ class StartPreparationUseCase {
71
71
  if (workflowBlockerStory.length === 0) {
72
72
  return [];
73
73
  }
74
- const result = storyObjectMap
75
- .get(workflowBlockerStory[0])
76
- ?.issues.filter((issue) => issue.state === 'OPEN')
77
- .map((issue) => {
78
- const orgRepo = issue.url.split('/issues')[0].split('github.com/')[1];
79
- return {
80
- orgRepo,
81
- blockerIssueUrls: [issue.url],
82
- };
83
- }) || [];
84
- return result;
74
+ const aggregated = new Map();
75
+ workflowBlockerStory.forEach((storyName) => {
76
+ const issues = storyObjectMap
77
+ .get(storyName)
78
+ ?.issues.filter((issue) => issue.state === 'OPEN') || [];
79
+ issues.forEach((issue) => {
80
+ const orgRepo = issue.url.split('/issues')[0].split('github.com/')[1];
81
+ const existing = aggregated.get(orgRepo) || [];
82
+ existing.push(issue.url);
83
+ aggregated.set(orgRepo, existing);
84
+ });
85
+ });
86
+ return Array.from(aggregated.entries()).map(([orgRepo, blockerIssueUrls]) => ({
87
+ orgRepo,
88
+ blockerIssueUrls,
89
+ }));
85
90
  };
86
91
  }
87
92
  }
@@ -1 +1 @@
1
- {"version":3,"file":"StartPreparationUseCase.js","sourceRoot":"","sources":["../../../src/domain/usecases/StartPreparationUseCase.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"StartPreparationUseCase.js","sourceRoot":"","sources":["../../../src/domain/usecases/StartPreparationUseCase.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "npm-cli-gh-issue-preparator",
3
- "version": "1.19.2",
3
+ "version": "1.19.3",
4
4
  "description": "",
5
5
  "main": "bin/index.js",
6
6
  "scripts": {
@@ -552,6 +552,196 @@ describe('StartPreparationUseCase', () => {
552
552
  });
553
553
  });
554
554
 
555
+ it('should collect blocker issues from multiple workflow blocker stories', async () => {
556
+ const blockerIssueRepo1 = createMockIssue({
557
+ url: 'https://github.com/user/repo1/issues/100',
558
+ title: 'Blocker Issue Repo1',
559
+ labels: [],
560
+ status: 'Awaiting Workspace',
561
+ state: 'OPEN',
562
+ });
563
+
564
+ const blockerIssueRepo2 = createMockIssue({
565
+ url: 'https://github.com/user/repo2/issues/200',
566
+ title: 'Blocker Issue Repo2',
567
+ labels: [],
568
+ status: 'Awaiting Workspace',
569
+ state: 'OPEN',
570
+ });
571
+
572
+ const blockedIssueRepo1 = createMockIssue({
573
+ url: 'https://github.com/user/repo1/issues/101',
574
+ title: 'Blocked Issue in Repo1',
575
+ labels: [],
576
+ status: 'Awaiting Workspace',
577
+ state: 'OPEN',
578
+ });
579
+
580
+ const blockedIssueRepo2 = createMockIssue({
581
+ url: 'https://github.com/user/repo2/issues/201',
582
+ title: 'Blocked Issue in Repo2',
583
+ labels: [],
584
+ status: 'Awaiting Workspace',
585
+ state: 'OPEN',
586
+ });
587
+
588
+ const unblockedIssue = createMockIssue({
589
+ url: 'https://github.com/user/repo3/issues/300',
590
+ title: 'Unblocked Issue',
591
+ labels: [],
592
+ status: 'Awaiting Workspace',
593
+ state: 'OPEN',
594
+ });
595
+
596
+ const multiBlockerMap: StoryObjectMap = new Map();
597
+ multiBlockerMap.set('Workflow blocker A', {
598
+ story: {
599
+ id: 'story-blocker-a',
600
+ name: 'Workflow blocker A',
601
+ color: 'RED',
602
+ description: '',
603
+ },
604
+ storyIssue: null,
605
+ issues: [blockerIssueRepo1],
606
+ });
607
+ multiBlockerMap.set('Workflow blocker B', {
608
+ story: {
609
+ id: 'story-blocker-b',
610
+ name: 'Workflow blocker B',
611
+ color: 'RED',
612
+ description: '',
613
+ },
614
+ storyIssue: null,
615
+ issues: [blockerIssueRepo2],
616
+ });
617
+ multiBlockerMap.set('Default Story', {
618
+ story: {
619
+ id: 'story-1',
620
+ name: 'Default Story',
621
+ color: 'GRAY',
622
+ description: '',
623
+ },
624
+ storyIssue: null,
625
+ issues: [blockedIssueRepo1, blockedIssueRepo2, unblockedIssue],
626
+ });
627
+
628
+ mockProjectRepository.getByUrl.mockResolvedValue(mockProject);
629
+ mockIssueRepository.getStoryObjectMap.mockResolvedValue(multiBlockerMap);
630
+ mockIssueRepository.getAllOpened.mockResolvedValueOnce([
631
+ blockerIssueRepo1,
632
+ blockerIssueRepo2,
633
+ blockedIssueRepo1,
634
+ blockedIssueRepo2,
635
+ unblockedIssue,
636
+ ]);
637
+ mockLocalCommandRunner.runCommand.mockResolvedValue({
638
+ stdout: '',
639
+ stderr: '',
640
+ exitCode: 0,
641
+ });
642
+
643
+ await useCase.run({
644
+ projectUrl: 'https://github.com/user/repo',
645
+ awaitingWorkspaceStatus: 'Awaiting Workspace',
646
+ preparationStatus: 'Preparation',
647
+ defaultAgentName: 'agent1',
648
+ maximumPreparingIssuesCount: null,
649
+ utilizationPercentageThreshold: 90,
650
+ });
651
+
652
+ const updatedUrls = mockIssueRepository.update.mock.calls.map(
653
+ (call) => call[0].url,
654
+ );
655
+ expect(updatedUrls).toContain('https://github.com/user/repo1/issues/100');
656
+ expect(updatedUrls).toContain('https://github.com/user/repo2/issues/200');
657
+ expect(updatedUrls).toContain('https://github.com/user/repo3/issues/300');
658
+ expect(updatedUrls).not.toContain(
659
+ 'https://github.com/user/repo1/issues/101',
660
+ );
661
+ expect(updatedUrls).not.toContain(
662
+ 'https://github.com/user/repo2/issues/201',
663
+ );
664
+ });
665
+
666
+ it('should aggregate blocker URLs per orgRepo when multiple blocker issues exist in the same repo', async () => {
667
+ const blockerIssue1 = createMockIssue({
668
+ url: 'https://github.com/user/repo/issues/100',
669
+ title: 'Blocker Issue 1',
670
+ labels: [],
671
+ status: 'Awaiting Workspace',
672
+ state: 'OPEN',
673
+ });
674
+
675
+ const blockerIssue2 = createMockIssue({
676
+ url: 'https://github.com/user/repo/issues/101',
677
+ title: 'Blocker Issue 2',
678
+ labels: [],
679
+ status: 'Awaiting Workspace',
680
+ state: 'OPEN',
681
+ });
682
+
683
+ const nonBlockerIssue = createMockIssue({
684
+ url: 'https://github.com/user/repo/issues/102',
685
+ title: 'Non-Blocker Issue',
686
+ labels: [],
687
+ status: 'Awaiting Workspace',
688
+ state: 'OPEN',
689
+ });
690
+
691
+ const blockerMap: StoryObjectMap = new Map();
692
+ blockerMap.set('Workflow blocker', {
693
+ story: {
694
+ id: 'story-blocker',
695
+ name: 'Workflow blocker',
696
+ color: 'RED',
697
+ description: '',
698
+ },
699
+ storyIssue: null,
700
+ issues: [blockerIssue1, blockerIssue2],
701
+ });
702
+ blockerMap.set('Default Story', {
703
+ story: {
704
+ id: 'story-1',
705
+ name: 'Default Story',
706
+ color: 'GRAY',
707
+ description: '',
708
+ },
709
+ storyIssue: null,
710
+ issues: [nonBlockerIssue],
711
+ });
712
+
713
+ mockProjectRepository.getByUrl.mockResolvedValue(mockProject);
714
+ mockIssueRepository.getStoryObjectMap.mockResolvedValue(blockerMap);
715
+ mockIssueRepository.getAllOpened.mockResolvedValueOnce([
716
+ blockerIssue1,
717
+ blockerIssue2,
718
+ nonBlockerIssue,
719
+ ]);
720
+ mockLocalCommandRunner.runCommand.mockResolvedValue({
721
+ stdout: '',
722
+ stderr: '',
723
+ exitCode: 0,
724
+ });
725
+
726
+ await useCase.run({
727
+ projectUrl: 'https://github.com/user/repo',
728
+ awaitingWorkspaceStatus: 'Awaiting Workspace',
729
+ preparationStatus: 'Preparation',
730
+ defaultAgentName: 'agent1',
731
+ maximumPreparingIssuesCount: null,
732
+ utilizationPercentageThreshold: 90,
733
+ });
734
+
735
+ const updatedUrls = mockIssueRepository.update.mock.calls.map(
736
+ (call) => call[0].url,
737
+ );
738
+ expect(updatedUrls).toContain('https://github.com/user/repo/issues/100');
739
+ expect(updatedUrls).toContain('https://github.com/user/repo/issues/101');
740
+ expect(updatedUrls).not.toContain(
741
+ 'https://github.com/user/repo/issues/102',
742
+ );
743
+ });
744
+
555
745
  it('should handle workflow blocker story with undefined storyObject (|| [] fallback)', async () => {
556
746
  // Create an awaiting issue that should be processed
557
747
  const awaitingIssue = createMockIssue({
@@ -145,20 +145,24 @@ export class StartPreparationUseCase {
145
145
  return [];
146
146
  }
147
147
 
148
- const result: {
149
- orgRepo: string;
150
- blockerIssueUrls: string[];
151
- }[] =
152
- storyObjectMap
153
- .get(workflowBlockerStory[0])
154
- ?.issues.filter((issue) => issue.state === 'OPEN')
155
- .map((issue) => {
156
- const orgRepo = issue.url.split('/issues')[0].split('github.com/')[1];
157
- return {
158
- orgRepo,
159
- blockerIssueUrls: [issue.url],
160
- };
161
- }) || [];
162
- return result;
148
+ const aggregated = new Map<string, string[]>();
149
+ workflowBlockerStory.forEach((storyName) => {
150
+ const issues =
151
+ storyObjectMap
152
+ .get(storyName)
153
+ ?.issues.filter((issue) => issue.state === 'OPEN') || [];
154
+ issues.forEach((issue) => {
155
+ const orgRepo = issue.url.split('/issues')[0].split('github.com/')[1];
156
+ const existing = aggregated.get(orgRepo) || [];
157
+ existing.push(issue.url);
158
+ aggregated.set(orgRepo, existing);
159
+ });
160
+ });
161
+ return Array.from(aggregated.entries()).map(
162
+ ([orgRepo, blockerIssueUrls]) => ({
163
+ orgRepo,
164
+ blockerIssueUrls,
165
+ }),
166
+ );
163
167
  };
164
168
  }
@@ -1 +1 @@
1
- {"version":3,"file":"StartPreparationUseCase.d.ts","sourceRoot":"","sources":["../../../src/domain/usecases/StartPreparationUseCase.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,sCAAsC,CAAC;AACvE,OAAO,EAAE,iBAAiB,EAAE,MAAM,wCAAwC,CAAC;AAC3E,OAAO,EAAE,kBAAkB,EAAE,MAAM,yCAAyC,CAAC;AAE7E,OAAO,EAAe,cAAc,EAAE,MAAM,4BAA4B,CAAC;AACzE,OAAO,EAAE,gBAAgB,EAAE,MAAM,uCAAuC,CAAC;AAEzE,qBAAa,uBAAuB;IAEhC,OAAO,CAAC,QAAQ,CAAC,iBAAiB;IAIlC,OAAO,CAAC,QAAQ,CAAC,eAAe;IAIhC,OAAO,CAAC,QAAQ,CAAC,gBAAgB;IACjC,OAAO,CAAC,QAAQ,CAAC,kBAAkB;gBATlB,iBAAiB,EAAE,IAAI,CACtC,iBAAiB,EACjB,UAAU,GAAG,eAAe,CAC7B,EACgB,eAAe,EAAE,IAAI,CACpC,eAAe,EACf,cAAc,GAAG,mBAAmB,GAAG,QAAQ,CAChD,EACgB,gBAAgB,EAAE,IAAI,CAAC,gBAAgB,EAAE,UAAU,CAAC,EACpD,kBAAkB,EAAE,kBAAkB;IAGzD,GAAG,GAAU,QAAQ;QACnB,UAAU,EAAE,MAAM,CAAC;QACnB,uBAAuB,EAAE,MAAM,CAAC;QAChC,iBAAiB,EAAE,MAAM,CAAC;QAC1B,gBAAgB,EAAE,MAAM,CAAC;QACzB,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,2BAA2B,EAAE,MAAM,GAAG,IAAI,CAAC;QAC3C,8BAA8B,EAAE,MAAM,CAAC;KACxC,KAAG,OAAO,CAAC,IAAI,CAAC,CAsGf;IACF,yBAAyB,GACvB,gBAAgB,cAAc,KAC7B;QACD,OAAO,EAAE,MAAM,CAAC;QAChB,gBAAgB,EAAE,MAAM,EAAE,CAAC;KAC5B,EAAE,CAyBD;CACH"}
1
+ {"version":3,"file":"StartPreparationUseCase.d.ts","sourceRoot":"","sources":["../../../src/domain/usecases/StartPreparationUseCase.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,sCAAsC,CAAC;AACvE,OAAO,EAAE,iBAAiB,EAAE,MAAM,wCAAwC,CAAC;AAC3E,OAAO,EAAE,kBAAkB,EAAE,MAAM,yCAAyC,CAAC;AAE7E,OAAO,EAAe,cAAc,EAAE,MAAM,4BAA4B,CAAC;AACzE,OAAO,EAAE,gBAAgB,EAAE,MAAM,uCAAuC,CAAC;AAEzE,qBAAa,uBAAuB;IAEhC,OAAO,CAAC,QAAQ,CAAC,iBAAiB;IAIlC,OAAO,CAAC,QAAQ,CAAC,eAAe;IAIhC,OAAO,CAAC,QAAQ,CAAC,gBAAgB;IACjC,OAAO,CAAC,QAAQ,CAAC,kBAAkB;gBATlB,iBAAiB,EAAE,IAAI,CACtC,iBAAiB,EACjB,UAAU,GAAG,eAAe,CAC7B,EACgB,eAAe,EAAE,IAAI,CACpC,eAAe,EACf,cAAc,GAAG,mBAAmB,GAAG,QAAQ,CAChD,EACgB,gBAAgB,EAAE,IAAI,CAAC,gBAAgB,EAAE,UAAU,CAAC,EACpD,kBAAkB,EAAE,kBAAkB;IAGzD,GAAG,GAAU,QAAQ;QACnB,UAAU,EAAE,MAAM,CAAC;QACnB,uBAAuB,EAAE,MAAM,CAAC;QAChC,iBAAiB,EAAE,MAAM,CAAC;QAC1B,gBAAgB,EAAE,MAAM,CAAC;QACzB,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,2BAA2B,EAAE,MAAM,GAAG,IAAI,CAAC;QAC3C,8BAA8B,EAAE,MAAM,CAAC;KACxC,KAAG,OAAO,CAAC,IAAI,CAAC,CAsGf;IACF,yBAAyB,GACvB,gBAAgB,cAAc,KAC7B;QACD,OAAO,EAAE,MAAM,CAAC;QAChB,gBAAgB,EAAE,MAAM,EAAE,CAAC;KAC5B,EAAE,CA6BD;CACH"}