github-issue-tower-defence-management 1.135.1 → 1.135.2

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,10 @@
1
+ ## [1.135.2](https://github.com/HiromiShikata/npm-cli-github-issue-tower-defence-management/compare/v1.135.1...v1.135.2) (2026-07-25)
2
+
3
+
4
+ ### Bug Fixes
5
+
6
+ * **use-case:** clear past nextActionHour on every sweep without minute-45 dependency ([#1234](https://github.com/HiromiShikata/npm-cli-github-issue-tower-defence-management/issues/1234)) ([54d6b8f](https://github.com/HiromiShikata/npm-cli-github-issue-tower-defence-management/commit/54d6b8fecbd94c6068ae5c85f6d347ad38378725)), closes [HiromiShikata/secretary#2794](https://github.com/HiromiShikata/secretary/issues/2794)
7
+
1
8
  ## [1.135.1](https://github.com/HiromiShikata/npm-cli-github-issue-tower-defence-management/compare/v1.135.0...v1.135.1) (2026-07-25)
2
9
 
3
10
 
@@ -9,32 +9,25 @@ class ClearPastNextActionDateHourUseCase {
9
9
  return;
10
10
  }
11
11
  const now = input.targetDates[input.targetDates.length - 1];
12
- const nextActionHour = input.project.nextActionHour;
13
- if (nextActionHour) {
14
- const nextActionDate = input.project.nextActionDate;
15
- const targetDatesAtHour45 = input.targetDates
16
- .filter((targetDate) => targetDate.getMinutes() === 45)
17
- .reverse();
18
- if (targetDatesAtHour45.length > 0) {
19
- const targetDate = new Date(targetDatesAtHour45[targetDatesAtHour45.length - 1].getTime() +
20
- 5 * 60 * 1000);
21
- const targetHour = targetDate.getHours() + 1;
22
- for (const issue of input.issues) {
23
- if (issue.nextActionHour === null ||
24
- issue.nextActionHour > targetHour ||
25
- (issue.nextActionDate !== null &&
26
- issue.nextActionDate.getTime() > targetDate.getTime()) ||
27
- issue.state !== 'OPEN') {
28
- continue;
29
- }
30
- await this.issueRepository.clearProjectField(input.project, nextActionHour.fieldId, issue);
31
- await new Promise((resolve) => setTimeout(resolve, 5000));
32
- if (!nextActionDate) {
33
- continue;
34
- }
35
- await this.issueRepository.clearProjectField(input.project, nextActionDate.fieldId, issue);
36
- await new Promise((resolve) => setTimeout(resolve, 5000));
12
+ const nextActionHourField = input.project.nextActionHour;
13
+ if (nextActionHourField) {
14
+ const nextActionDateField = input.project.nextActionDate;
15
+ for (const issue of input.issues) {
16
+ if (issue.nextActionHour === null || issue.state !== 'OPEN') {
17
+ continue;
37
18
  }
19
+ const scheduledDate = issue.nextActionDate ?? now;
20
+ const scheduledTime = new Date(scheduledDate.getFullYear(), scheduledDate.getMonth(), scheduledDate.getDate(), issue.nextActionHour);
21
+ if (scheduledTime.getTime() > now.getTime()) {
22
+ continue;
23
+ }
24
+ await this.issueRepository.clearProjectField(input.project, nextActionHourField.fieldId, issue);
25
+ await new Promise((resolve) => setTimeout(resolve, 5000));
26
+ if (!nextActionDateField) {
27
+ continue;
28
+ }
29
+ await this.issueRepository.clearProjectField(input.project, nextActionDateField.fieldId, issue);
30
+ await new Promise((resolve) => setTimeout(resolve, 5000));
38
31
  }
39
32
  }
40
33
  const nextActionDate = input.project.nextActionDate;
@@ -1 +1 @@
1
- {"version":3,"file":"ClearPastNextActionDateHourUseCase.js","sourceRoot":"","sources":["../../../src/domain/usecases/ClearPastNextActionDateHourUseCase.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ClearPastNextActionDateHourUseCase.js","sourceRoot":"","sources":["../../../src/domain/usecases/ClearPastNextActionDateHourUseCase.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "github-issue-tower-defence-management",
3
- "version": "1.135.1",
3
+ "version": "1.135.2",
4
4
  "description": "",
5
5
  "main": "bin/index.js",
6
6
  "scripts": {
@@ -201,7 +201,7 @@ describe('ClearPastNextActionDateHourUseCase', () => {
201
201
  expectedClearProjectFieldCalls: [],
202
202
  },
203
203
  {
204
- name: 'should clear nextActionHour and nextActionDate for issue with past nextActionHour at HH:45 target',
204
+ name: 'should not clear nextActionHour at 09:45 when scheduled hour 10 has not yet arrived',
205
205
  input: {
206
206
  targetDates: [
207
207
  new Date('2026-04-02T09:45:00'),
@@ -217,6 +217,25 @@ describe('ClearPastNextActionDateHourUseCase', () => {
217
217
  ],
218
218
  cacheUsed: false,
219
219
  },
220
+ expectedClearProjectFieldCalls: [],
221
+ },
222
+ {
223
+ name: 'should clear nextActionHour when sweep has no minute-45 tick but scheduled hour has already passed',
224
+ input: {
225
+ targetDates: [
226
+ new Date('2026-04-02T10:05:00'),
227
+ new Date('2026-04-02T10:15:00'),
228
+ ],
229
+ project: basicProject,
230
+ issues: [
231
+ {
232
+ ...openIssueWithHour,
233
+ nextActionHour: 10,
234
+ nextActionDate: null,
235
+ },
236
+ ],
237
+ cacheUsed: false,
238
+ },
220
239
  expectedClearProjectFieldCalls: [
221
240
  [
222
241
  basicProject,
@@ -239,7 +258,7 @@ describe('ClearPastNextActionDateHourUseCase', () => {
239
258
  ],
240
259
  },
241
260
  {
242
- name: 'should not clear nextActionHour when no HH:45 in targetDates',
261
+ name: 'should not clear nextActionHour when scheduled hour has not yet arrived',
243
262
  input: {
244
263
  targetDates: [
245
264
  new Date('2026-04-02T09:00:00'),
@@ -268,7 +287,7 @@ describe('ClearPastNextActionDateHourUseCase', () => {
268
287
  issues: [
269
288
  {
270
289
  ...openIssueWithHour,
271
- nextActionHour: 10,
290
+ nextActionHour: 9,
272
291
  nextActionDate: null,
273
292
  },
274
293
  {
@@ -284,7 +303,7 @@ describe('ClearPastNextActionDateHourUseCase', () => {
284
303
  'hourFieldId',
285
304
  {
286
305
  ...openIssueWithHour,
287
- nextActionHour: 10,
306
+ nextActionHour: 9,
288
307
  nextActionDate: null,
289
308
  },
290
309
  ],
@@ -293,7 +312,7 @@ describe('ClearPastNextActionDateHourUseCase', () => {
293
312
  'dateFieldId',
294
313
  {
295
314
  ...openIssueWithHour,
296
- nextActionHour: 10,
315
+ nextActionHour: 9,
297
316
  nextActionDate: null,
298
317
  },
299
318
  ],
@@ -18,44 +18,38 @@ export class ClearPastNextActionDateHourUseCase {
18
18
  }
19
19
  const now = input.targetDates[input.targetDates.length - 1];
20
20
 
21
- const nextActionHour = input.project.nextActionHour;
22
- if (nextActionHour) {
23
- const nextActionDate = input.project.nextActionDate;
24
- const targetDatesAtHour45 = input.targetDates
25
- .filter((targetDate) => targetDate.getMinutes() === 45)
26
- .reverse();
27
- if (targetDatesAtHour45.length > 0) {
28
- const targetDate = new Date(
29
- targetDatesAtHour45[targetDatesAtHour45.length - 1].getTime() +
30
- 5 * 60 * 1000,
21
+ const nextActionHourField = input.project.nextActionHour;
22
+ if (nextActionHourField) {
23
+ const nextActionDateField = input.project.nextActionDate;
24
+ for (const issue of input.issues) {
25
+ if (issue.nextActionHour === null || issue.state !== 'OPEN') {
26
+ continue;
27
+ }
28
+ const scheduledDate = issue.nextActionDate ?? now;
29
+ const scheduledTime = new Date(
30
+ scheduledDate.getFullYear(),
31
+ scheduledDate.getMonth(),
32
+ scheduledDate.getDate(),
33
+ issue.nextActionHour,
34
+ );
35
+ if (scheduledTime.getTime() > now.getTime()) {
36
+ continue;
37
+ }
38
+ await this.issueRepository.clearProjectField(
39
+ input.project,
40
+ nextActionHourField.fieldId,
41
+ issue,
31
42
  );
32
- const targetHour = targetDate.getHours() + 1;
33
- for (const issue of input.issues) {
34
- if (
35
- issue.nextActionHour === null ||
36
- issue.nextActionHour > targetHour ||
37
- (issue.nextActionDate !== null &&
38
- issue.nextActionDate.getTime() > targetDate.getTime()) ||
39
- issue.state !== 'OPEN'
40
- ) {
41
- continue;
42
- }
43
- await this.issueRepository.clearProjectField(
44
- input.project,
45
- nextActionHour.fieldId,
46
- issue,
47
- );
48
- await new Promise((resolve) => setTimeout(resolve, 5000));
49
- if (!nextActionDate) {
50
- continue;
51
- }
52
- await this.issueRepository.clearProjectField(
53
- input.project,
54
- nextActionDate.fieldId,
55
- issue,
56
- );
57
- await new Promise((resolve) => setTimeout(resolve, 5000));
43
+ await new Promise((resolve) => setTimeout(resolve, 5000));
44
+ if (!nextActionDateField) {
45
+ continue;
58
46
  }
47
+ await this.issueRepository.clearProjectField(
48
+ input.project,
49
+ nextActionDateField.fieldId,
50
+ issue,
51
+ );
52
+ await new Promise((resolve) => setTimeout(resolve, 5000));
59
53
  }
60
54
  }
61
55
 
@@ -1 +1 @@
1
- {"version":3,"file":"ClearPastNextActionDateHourUseCase.d.ts","sourceRoot":"","sources":["../../../src/domain/usecases/ClearPastNextActionDateHourUseCase.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAC1C,OAAO,EAAE,eAAe,EAAE,MAAM,sCAAsC,CAAC;AACvE,OAAO,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAE9C,qBAAa,kCAAkC;IAE3C,QAAQ,CAAC,eAAe,EAAE,IAAI,CAAC,eAAe,EAAE,mBAAmB,CAAC;gBAA3D,eAAe,EAAE,IAAI,CAAC,eAAe,EAAE,mBAAmB,CAAC;IAGtE,GAAG,GAAU,OAAO;QAClB,WAAW,EAAE,IAAI,EAAE,CAAC;QACpB,OAAO,EAAE,OAAO,CAAC;QACjB,MAAM,EAAE,KAAK,EAAE,CAAC;QAChB,SAAS,EAAE,OAAO,CAAC;KACpB,KAAG,OAAO,CAAC,IAAI,CAAC,CAwEf;CACH"}
1
+ {"version":3,"file":"ClearPastNextActionDateHourUseCase.d.ts","sourceRoot":"","sources":["../../../src/domain/usecases/ClearPastNextActionDateHourUseCase.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAC1C,OAAO,EAAE,eAAe,EAAE,MAAM,sCAAsC,CAAC;AACvE,OAAO,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAE9C,qBAAa,kCAAkC;IAE3C,QAAQ,CAAC,eAAe,EAAE,IAAI,CAAC,eAAe,EAAE,mBAAmB,CAAC;gBAA3D,eAAe,EAAE,IAAI,CAAC,eAAe,EAAE,mBAAmB,CAAC;IAGtE,GAAG,GAAU,OAAO;QAClB,WAAW,EAAE,IAAI,EAAE,CAAC;QACpB,OAAO,EAAE,OAAO,CAAC;QACjB,MAAM,EAAE,KAAK,EAAE,CAAC;QAChB,SAAS,EAAE,OAAO,CAAC;KACpB,KAAG,OAAO,CAAC,IAAI,CAAC,CAkEf;CACH"}