npm-cli-gh-issue-preparator 1.13.0 → 1.14.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 +7 -0
- package/bin/domain/usecases/StartPreparationUseCase.js +7 -0
- package/bin/domain/usecases/StartPreparationUseCase.js.map +1 -1
- package/package.json +1 -1
- package/src/domain/usecases/StartPreparationUseCase.test.ts +147 -0
- package/src/domain/usecases/StartPreparationUseCase.ts +8 -0
- package/types/domain/usecases/StartPreparationUseCase.d.ts.map +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,3 +1,10 @@
|
|
|
1
|
+
# [1.14.0](https://github.com/HiromiShikata/npm-cli-gh-issue-preparator/compare/v1.13.0...v1.14.0) (2026-02-23)
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
### Features
|
|
5
|
+
|
|
6
|
+
* **core:** skip aw command for issues with dependency or future nextActionHour ([7d3adfb](https://github.com/HiromiShikata/npm-cli-gh-issue-preparator/commit/7d3adfbfec6695aa01e572652ad15eda361a6f70)), closes [#59](https://github.com/HiromiShikata/npm-cli-gh-issue-preparator/issues/59)
|
|
7
|
+
|
|
1
8
|
# [1.13.0](https://github.com/HiromiShikata/npm-cli-gh-issue-preparator/compare/v1.12.0...v1.13.0) (2026-02-18)
|
|
2
9
|
|
|
3
10
|
|
|
@@ -29,6 +29,7 @@ class StartPreparationUseCase {
|
|
|
29
29
|
.filter((issue) => issue.status === params.awaitingWorkspaceStatus);
|
|
30
30
|
const currentPreparationIssueCount = allIssues.filter((issue) => issue.status === params.preparationStatus).length;
|
|
31
31
|
let updatedCurrentPreparationIssueCount = currentPreparationIssueCount;
|
|
32
|
+
const currentHour = new Date().getHours();
|
|
32
33
|
for (let i = 0; i < awaitingWorkspaceIssues.length &&
|
|
33
34
|
updatedCurrentPreparationIssueCount < maximumPreparingIssuesCount; i++) {
|
|
34
35
|
const issue = awaitingWorkspaceIssues[i];
|
|
@@ -37,6 +38,12 @@ class StartPreparationUseCase {
|
|
|
37
38
|
!blockerIssueUrls.includes(issue.url)) {
|
|
38
39
|
continue;
|
|
39
40
|
}
|
|
41
|
+
if (issue.dependedIssueUrls.length > 0) {
|
|
42
|
+
continue;
|
|
43
|
+
}
|
|
44
|
+
if (issue.nextActionHour !== null && currentHour < issue.nextActionHour) {
|
|
45
|
+
continue;
|
|
46
|
+
}
|
|
40
47
|
const agent = issue.labels
|
|
41
48
|
.find((label) => label.startsWith('category:'))
|
|
42
49
|
?.replace('category:', '')
|
|
@@ -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
|
@@ -695,4 +695,151 @@ describe('StartPreparationUseCase', () => {
|
|
|
695
695
|
expect(mockIssueRepository.update.mock.calls).toHaveLength(1);
|
|
696
696
|
expect(mockLocalCommandRunner.runCommand.mock.calls).toHaveLength(1);
|
|
697
697
|
});
|
|
698
|
+
|
|
699
|
+
it('should skip issues that have dependedIssueUrls', async () => {
|
|
700
|
+
const issueWithDependency = createMockIssue({
|
|
701
|
+
url: 'https://github.com/user/repo/issues/1',
|
|
702
|
+
title: 'Issue with dependency',
|
|
703
|
+
labels: [],
|
|
704
|
+
status: 'Awaiting Workspace',
|
|
705
|
+
dependedIssueUrls: ['https://github.com/user/repo/issues/2'],
|
|
706
|
+
});
|
|
707
|
+
const issueWithoutDependency = createMockIssue({
|
|
708
|
+
url: 'https://github.com/user/repo/issues/3',
|
|
709
|
+
title: 'Issue without dependency',
|
|
710
|
+
labels: [],
|
|
711
|
+
status: 'Awaiting Workspace',
|
|
712
|
+
dependedIssueUrls: [],
|
|
713
|
+
});
|
|
714
|
+
|
|
715
|
+
mockProjectRepository.getByUrl.mockResolvedValue(mockProject);
|
|
716
|
+
mockIssueRepository.getStoryObjectMap.mockResolvedValue(
|
|
717
|
+
createMockStoryObjectMap([issueWithDependency, issueWithoutDependency]),
|
|
718
|
+
);
|
|
719
|
+
mockIssueRepository.getAllOpened.mockResolvedValueOnce([
|
|
720
|
+
issueWithDependency,
|
|
721
|
+
issueWithoutDependency,
|
|
722
|
+
]);
|
|
723
|
+
mockLocalCommandRunner.runCommand.mockResolvedValue({
|
|
724
|
+
stdout: '',
|
|
725
|
+
stderr: '',
|
|
726
|
+
exitCode: 0,
|
|
727
|
+
});
|
|
728
|
+
|
|
729
|
+
await useCase.run({
|
|
730
|
+
projectUrl: 'https://github.com/user/repo',
|
|
731
|
+
awaitingWorkspaceStatus: 'Awaiting Workspace',
|
|
732
|
+
preparationStatus: 'Preparation',
|
|
733
|
+
defaultAgentName: 'agent1',
|
|
734
|
+
maximumPreparingIssuesCount: null,
|
|
735
|
+
});
|
|
736
|
+
|
|
737
|
+
expect(mockIssueRepository.update.mock.calls).toHaveLength(1);
|
|
738
|
+
expect(mockIssueRepository.update.mock.calls[0][0]).toMatchObject({
|
|
739
|
+
url: 'https://github.com/user/repo/issues/3',
|
|
740
|
+
status: 'Preparation',
|
|
741
|
+
});
|
|
742
|
+
expect(mockLocalCommandRunner.runCommand.mock.calls).toHaveLength(1);
|
|
743
|
+
});
|
|
744
|
+
|
|
745
|
+
it('should skip issues where nextActionHour is in the future', async () => {
|
|
746
|
+
jest.useFakeTimers();
|
|
747
|
+
try {
|
|
748
|
+
jest.setSystemTime(new Date('2024-01-01T10:00:00'));
|
|
749
|
+
|
|
750
|
+
const issueWithFutureNextActionHour = createMockIssue({
|
|
751
|
+
url: 'https://github.com/user/repo/issues/1',
|
|
752
|
+
title: 'Issue with future next action hour',
|
|
753
|
+
labels: [],
|
|
754
|
+
status: 'Awaiting Workspace',
|
|
755
|
+
nextActionHour: 15,
|
|
756
|
+
});
|
|
757
|
+
const issueWithoutNextActionHour = createMockIssue({
|
|
758
|
+
url: 'https://github.com/user/repo/issues/2',
|
|
759
|
+
title: 'Issue without next action hour',
|
|
760
|
+
labels: [],
|
|
761
|
+
status: 'Awaiting Workspace',
|
|
762
|
+
nextActionHour: null,
|
|
763
|
+
});
|
|
764
|
+
|
|
765
|
+
mockProjectRepository.getByUrl.mockResolvedValue(mockProject);
|
|
766
|
+
mockIssueRepository.getStoryObjectMap.mockResolvedValue(
|
|
767
|
+
createMockStoryObjectMap([
|
|
768
|
+
issueWithFutureNextActionHour,
|
|
769
|
+
issueWithoutNextActionHour,
|
|
770
|
+
]),
|
|
771
|
+
);
|
|
772
|
+
mockIssueRepository.getAllOpened.mockResolvedValueOnce([
|
|
773
|
+
issueWithFutureNextActionHour,
|
|
774
|
+
issueWithoutNextActionHour,
|
|
775
|
+
]);
|
|
776
|
+
mockLocalCommandRunner.runCommand.mockResolvedValue({
|
|
777
|
+
stdout: '',
|
|
778
|
+
stderr: '',
|
|
779
|
+
exitCode: 0,
|
|
780
|
+
});
|
|
781
|
+
|
|
782
|
+
await useCase.run({
|
|
783
|
+
projectUrl: 'https://github.com/user/repo',
|
|
784
|
+
awaitingWorkspaceStatus: 'Awaiting Workspace',
|
|
785
|
+
preparationStatus: 'Preparation',
|
|
786
|
+
defaultAgentName: 'agent1',
|
|
787
|
+
maximumPreparingIssuesCount: null,
|
|
788
|
+
});
|
|
789
|
+
|
|
790
|
+
expect(mockIssueRepository.update.mock.calls).toHaveLength(1);
|
|
791
|
+
expect(mockIssueRepository.update.mock.calls[0][0]).toMatchObject({
|
|
792
|
+
url: 'https://github.com/user/repo/issues/2',
|
|
793
|
+
status: 'Preparation',
|
|
794
|
+
});
|
|
795
|
+
expect(mockLocalCommandRunner.runCommand.mock.calls).toHaveLength(1);
|
|
796
|
+
} finally {
|
|
797
|
+
jest.useRealTimers();
|
|
798
|
+
}
|
|
799
|
+
});
|
|
800
|
+
|
|
801
|
+
it('should not skip issues where nextActionHour is in the past or current hour', async () => {
|
|
802
|
+
jest.useFakeTimers();
|
|
803
|
+
try {
|
|
804
|
+
jest.setSystemTime(new Date('2024-01-01T15:00:00'));
|
|
805
|
+
|
|
806
|
+
const issueWithPastNextActionHour = createMockIssue({
|
|
807
|
+
url: 'https://github.com/user/repo/issues/1',
|
|
808
|
+
title: 'Issue with past next action hour',
|
|
809
|
+
labels: [],
|
|
810
|
+
status: 'Awaiting Workspace',
|
|
811
|
+
nextActionHour: 10,
|
|
812
|
+
});
|
|
813
|
+
|
|
814
|
+
mockProjectRepository.getByUrl.mockResolvedValue(mockProject);
|
|
815
|
+
mockIssueRepository.getStoryObjectMap.mockResolvedValue(
|
|
816
|
+
createMockStoryObjectMap([issueWithPastNextActionHour]),
|
|
817
|
+
);
|
|
818
|
+
mockIssueRepository.getAllOpened.mockResolvedValueOnce([
|
|
819
|
+
issueWithPastNextActionHour,
|
|
820
|
+
]);
|
|
821
|
+
mockLocalCommandRunner.runCommand.mockResolvedValue({
|
|
822
|
+
stdout: '',
|
|
823
|
+
stderr: '',
|
|
824
|
+
exitCode: 0,
|
|
825
|
+
});
|
|
826
|
+
|
|
827
|
+
await useCase.run({
|
|
828
|
+
projectUrl: 'https://github.com/user/repo',
|
|
829
|
+
awaitingWorkspaceStatus: 'Awaiting Workspace',
|
|
830
|
+
preparationStatus: 'Preparation',
|
|
831
|
+
defaultAgentName: 'agent1',
|
|
832
|
+
maximumPreparingIssuesCount: null,
|
|
833
|
+
});
|
|
834
|
+
|
|
835
|
+
expect(mockIssueRepository.update.mock.calls).toHaveLength(1);
|
|
836
|
+
expect(mockIssueRepository.update.mock.calls[0][0]).toMatchObject({
|
|
837
|
+
url: 'https://github.com/user/repo/issues/1',
|
|
838
|
+
status: 'Preparation',
|
|
839
|
+
});
|
|
840
|
+
expect(mockLocalCommandRunner.runCommand.mock.calls).toHaveLength(1);
|
|
841
|
+
} finally {
|
|
842
|
+
jest.useRealTimers();
|
|
843
|
+
}
|
|
844
|
+
});
|
|
698
845
|
});
|
|
@@ -54,6 +54,8 @@ export class StartPreparationUseCase {
|
|
|
54
54
|
).length;
|
|
55
55
|
let updatedCurrentPreparationIssueCount = currentPreparationIssueCount;
|
|
56
56
|
|
|
57
|
+
const currentHour = new Date().getHours();
|
|
58
|
+
|
|
57
59
|
for (
|
|
58
60
|
let i = 0;
|
|
59
61
|
i < awaitingWorkspaceIssues.length &&
|
|
@@ -71,6 +73,12 @@ export class StartPreparationUseCase {
|
|
|
71
73
|
) {
|
|
72
74
|
continue;
|
|
73
75
|
}
|
|
76
|
+
if (issue.dependedIssueUrls.length > 0) {
|
|
77
|
+
continue;
|
|
78
|
+
}
|
|
79
|
+
if (issue.nextActionHour !== null && currentHour < issue.nextActionHour) {
|
|
80
|
+
continue;
|
|
81
|
+
}
|
|
74
82
|
const agent =
|
|
75
83
|
issue.labels
|
|
76
84
|
.find((label) => label.startsWith('category:'))
|
|
@@ -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;IAClC,OAAO,CAAC,QAAQ,CAAC,eAAe;IAIhC,OAAO,CAAC,QAAQ,CAAC,gBAAgB;IACjC,OAAO,CAAC,QAAQ,CAAC,kBAAkB;gBANlB,iBAAiB,EAAE,IAAI,CAAC,iBAAiB,EAAE,UAAU,CAAC,EACtD,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;KAC5C,KAAG,OAAO,CAAC,IAAI,CAAC,
|
|
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;IAClC,OAAO,CAAC,QAAQ,CAAC,eAAe;IAIhC,OAAO,CAAC,QAAQ,CAAC,gBAAgB;IACjC,OAAO,CAAC,QAAQ,CAAC,kBAAkB;gBANlB,iBAAiB,EAAE,IAAI,CAAC,iBAAiB,EAAE,UAAU,CAAC,EACtD,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;KAC5C,KAAG,OAAO,CAAC,IAAI,CAAC,CAwEf;IACF,yBAAyB,GACvB,gBAAgB,cAAc,KAC7B;QACD,OAAO,EAAE,MAAM,CAAC;QAChB,gBAAgB,EAAE,MAAM,EAAE,CAAC;KAC5B,EAAE,CAyBD;CACH"}
|