github-issue-tower-defence-management 1.31.0 → 1.32.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/.github/workflows/umino-project.yml +1 -0
- package/CHANGELOG.md +7 -0
- package/README.md +12 -0
- package/bin/adapter/entry-points/handlers/HandleScheduledEventUseCaseHandler.js +65 -31
- package/bin/adapter/entry-points/handlers/HandleScheduledEventUseCaseHandler.js.map +1 -1
- package/bin/adapter/repositories/NodeLocalCommandRunner.js +34 -0
- package/bin/adapter/repositories/NodeLocalCommandRunner.js.map +1 -0
- package/bin/adapter/repositories/StubClaudeRepository.js +13 -0
- package/bin/adapter/repositories/StubClaudeRepository.js.map +1 -0
- package/bin/domain/usecases/HandleScheduledEventUseCase.js +13 -1
- package/bin/domain/usecases/HandleScheduledEventUseCase.js.map +1 -1
- package/package.json +1 -1
- package/src/adapter/entry-points/handlers/HandleScheduledEventUseCaseHandler.test.ts +9 -0
- package/src/adapter/entry-points/handlers/HandleScheduledEventUseCaseHandler.ts +12 -0
- package/src/adapter/repositories/NodeLocalCommandRunner.test.ts +80 -0
- package/src/adapter/repositories/NodeLocalCommandRunner.ts +37 -0
- package/src/adapter/repositories/StubClaudeRepository.test.ts +19 -0
- package/src/adapter/repositories/StubClaudeRepository.ts +12 -0
- package/src/domain/usecases/HandleScheduledEventUseCase.test.ts +3 -0
- package/src/domain/usecases/HandleScheduledEventUseCase.ts +21 -0
- package/types/adapter/entry-points/handlers/HandleScheduledEventUseCaseHandler.d.ts.map +1 -1
- package/types/adapter/repositories/NodeLocalCommandRunner.d.ts +9 -0
- package/types/adapter/repositories/NodeLocalCommandRunner.d.ts.map +1 -0
- package/types/adapter/repositories/StubClaudeRepository.d.ts +7 -0
- package/types/adapter/repositories/StubClaudeRepository.d.ts.map +1 -0
- package/types/domain/usecases/HandleScheduledEventUseCase.d.ts +10 -1
- package/types/domain/usecases/HandleScheduledEventUseCase.d.ts.map +1 -1
|
@@ -183,6 +183,7 @@ jobs:
|
|
|
183
183
|
steps:
|
|
184
184
|
- uses: nearform-actions/github-action-check-linked-issues@v1
|
|
185
185
|
id: check-linked-issues
|
|
186
|
+
if: github.event.pull_request.user.login != 'dependabot[bot]'
|
|
186
187
|
with:
|
|
187
188
|
exclude-branches: 'release/**, dependabot/**, project-common/**, renovate/**'
|
|
188
189
|
github-token: ${{ secrets.GH_TOKEN }}
|
package/CHANGELOG.md
CHANGED
|
@@ -1,3 +1,10 @@
|
|
|
1
|
+
# [1.32.0](https://github.com/HiromiShikata/npm-cli-github-issue-tower-defence-management/compare/v1.31.0...v1.32.0) (2026-03-21)
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
### Features
|
|
5
|
+
|
|
6
|
+
* **core:** integrate StartPreparationUseCase into HandleScheduledEventUseCase chain ([d346cfc](https://github.com/HiromiShikata/npm-cli-github-issue-tower-defence-management/commit/d346cfc65480bd1f8b86b8d915404bc975abe97a))
|
|
7
|
+
|
|
1
8
|
# [1.31.0](https://github.com/HiromiShikata/npm-cli-github-issue-tower-defence-management/compare/v1.30.2...v1.31.0) (2026-03-16)
|
|
2
9
|
|
|
3
10
|
|
package/README.md
CHANGED
|
@@ -54,6 +54,12 @@ workingReport:
|
|
|
54
54
|
reportIssueLabels: # Array of issue labels
|
|
55
55
|
- string
|
|
56
56
|
- string
|
|
57
|
+
startPreparation?: # Optional: Enable automatic issue preparation workflow
|
|
58
|
+
awaitingWorkspaceStatus: string # Project status name for issues awaiting workspace
|
|
59
|
+
preparationStatus: string # Project status name for issues in preparation
|
|
60
|
+
defaultAgentName: string # Default agent name to assign for preparation
|
|
61
|
+
logFilePath?: string # Optional: Path to log file for preparation output
|
|
62
|
+
maximumPreparingIssuesCount: number | null # Max concurrent preparing issues (null = unlimited)
|
|
57
63
|
```
|
|
58
64
|
|
|
59
65
|
Example:
|
|
@@ -84,6 +90,12 @@ workingReport:
|
|
|
84
90
|
- 'working-time'
|
|
85
91
|
slack:
|
|
86
92
|
userToken: 'xoxp-xxx'
|
|
93
|
+
startPreparation:
|
|
94
|
+
awaitingWorkspaceStatus: 'Awaiting Workspace'
|
|
95
|
+
preparationStatus: 'Preparation'
|
|
96
|
+
defaultAgentName: 'umino-bot'
|
|
97
|
+
logFilePath: '/tmp/preparation.log'
|
|
98
|
+
maximumPreparingIssuesCount: 3
|
|
87
99
|
```
|
|
88
100
|
|
|
89
101
|
### Slack User Token
|
|
@@ -56,6 +56,9 @@ const CreateNewStoryByLabelUseCase_1 = require("../../../domain/usecases/CreateN
|
|
|
56
56
|
const CheerioProjectRepository_1 = require("../../repositories/CheerioProjectRepository");
|
|
57
57
|
const AssignNoAssigneeIssueToManagerUseCase_1 = require("../../../domain/usecases/AssignNoAssigneeIssueToManagerUseCase");
|
|
58
58
|
const UpdateIssueStatusByLabelUseCase_1 = require("../../../domain/usecases/UpdateIssueStatusByLabelUseCase");
|
|
59
|
+
const StartPreparationUseCase_1 = require("../../../domain/usecases/StartPreparationUseCase");
|
|
60
|
+
const NodeLocalCommandRunner_1 = require("../../repositories/NodeLocalCommandRunner");
|
|
61
|
+
const StubClaudeRepository_1 = require("../../repositories/StubClaudeRepository");
|
|
59
62
|
class HandleScheduledEventUseCaseHandler {
|
|
60
63
|
constructor() {
|
|
61
64
|
this.handle = async (configFilePath, verbose) => {
|
|
@@ -70,8 +73,8 @@ class HandleScheduledEventUseCaseHandler {
|
|
|
70
73
|
});
|
|
71
74
|
const configFileContent = fs_1.default.readFileSync(configFilePath, 'utf8');
|
|
72
75
|
const input = yaml_1.default.parse(configFileContent);
|
|
73
|
-
if (!(() => { const _io0 = input => "string" === typeof input.projectName && "string" === typeof input.org && "string" === typeof input.projectUrl && "string" === typeof input.manager && ("object" === typeof input.workingReport && null !== input.workingReport && _io1(input.workingReport)) && "string" === typeof input.urlOfStoryView && "string" === typeof input.disabledStatus && (null === input.defaultStatus || "string" === typeof input.defaultStatus) && "boolean" === typeof input.disabled && "number" === typeof input.allowIssueCacheMinutes && ("object" === typeof input.credentials && null !== input.credentials &&
|
|
74
|
-
throw new Error(`Invalid input: ${JSON.stringify(input)}\n\n${JSON.stringify((() => { const _io0 = input => "string" === typeof input.projectName && "string" === typeof input.org && "string" === typeof input.projectUrl && "string" === typeof input.manager && ("object" === typeof input.workingReport && null !== input.workingReport && _io1(input.workingReport)) && "string" === typeof input.urlOfStoryView && "string" === typeof input.disabledStatus && (null === input.defaultStatus || "string" === typeof input.defaultStatus) && "boolean" === typeof input.disabled && "number" === typeof input.allowIssueCacheMinutes && ("object" === typeof input.credentials && null !== input.credentials &&
|
|
76
|
+
if (!(() => { const _io0 = input => "string" === typeof input.projectName && "string" === typeof input.org && "string" === typeof input.projectUrl && "string" === typeof input.manager && ("object" === typeof input.workingReport && null !== input.workingReport && _io1(input.workingReport)) && "string" === typeof input.urlOfStoryView && "string" === typeof input.disabledStatus && (null === input.defaultStatus || "string" === typeof input.defaultStatus) && "boolean" === typeof input.disabled && "number" === typeof input.allowIssueCacheMinutes && (null === input.startPreparation || undefined === input.startPreparation || "object" === typeof input.startPreparation && null !== input.startPreparation && _io2(input.startPreparation)) && ("object" === typeof input.credentials && null !== input.credentials && _io3(input.credentials)); const _io1 = input => "string" === typeof input.repo && (Array.isArray(input.members) && input.members.every(elem => "string" === typeof elem)) && "string" === typeof input.spreadsheetUrl; const _io2 = input => "string" === typeof input.awaitingWorkspaceStatus && "string" === typeof input.preparationStatus && "string" === typeof input.defaultAgentName && (undefined === input.logFilePath || "string" === typeof input.logFilePath) && (null === input.maximumPreparingIssuesCount || "number" === typeof input.maximumPreparingIssuesCount); const _io3 = input => "object" === typeof input.manager && null !== input.manager && _io4(input.manager) && ("object" === typeof input.bot && null !== input.bot && _io8(input.bot)); const _io4 = input => "object" === typeof input.github && null !== input.github && _io5(input.github) && ("object" === typeof input.slack && null !== input.slack && _io6(input.slack)) && ("object" === typeof input.googleServiceAccount && null !== input.googleServiceAccount && _io7(input.googleServiceAccount)); const _io5 = input => "string" === typeof input.token; const _io6 = input => "string" === typeof input.userToken; const _io7 = input => "string" === typeof input.serviceAccountKey; const _io8 = input => "object" === typeof input.github && null !== input.github && _io9(input.github); const _io9 = input => "string" === typeof input.token && (undefined === input.name || "string" === typeof input.name) && (undefined === input.password || "string" === typeof input.password) && (undefined === input.authenticatorKey || "string" === typeof input.authenticatorKey); return input => "object" === typeof input && null !== input && _io0(input); })()(input)) {
|
|
77
|
+
throw new Error(`Invalid input: ${JSON.stringify(input)}\n\n${JSON.stringify((() => { const _io0 = input => "string" === typeof input.projectName && "string" === typeof input.org && "string" === typeof input.projectUrl && "string" === typeof input.manager && ("object" === typeof input.workingReport && null !== input.workingReport && _io1(input.workingReport)) && "string" === typeof input.urlOfStoryView && "string" === typeof input.disabledStatus && (null === input.defaultStatus || "string" === typeof input.defaultStatus) && "boolean" === typeof input.disabled && "number" === typeof input.allowIssueCacheMinutes && (null === input.startPreparation || undefined === input.startPreparation || "object" === typeof input.startPreparation && null !== input.startPreparation && _io2(input.startPreparation)) && ("object" === typeof input.credentials && null !== input.credentials && _io3(input.credentials)); const _io1 = input => "string" === typeof input.repo && (Array.isArray(input.members) && input.members.every(elem => "string" === typeof elem)) && "string" === typeof input.spreadsheetUrl; const _io2 = input => "string" === typeof input.awaitingWorkspaceStatus && "string" === typeof input.preparationStatus && "string" === typeof input.defaultAgentName && (undefined === input.logFilePath || "string" === typeof input.logFilePath) && (null === input.maximumPreparingIssuesCount || "number" === typeof input.maximumPreparingIssuesCount); const _io3 = input => "object" === typeof input.manager && null !== input.manager && _io4(input.manager) && ("object" === typeof input.bot && null !== input.bot && _io8(input.bot)); const _io4 = input => "object" === typeof input.github && null !== input.github && _io5(input.github) && ("object" === typeof input.slack && null !== input.slack && _io6(input.slack)) && ("object" === typeof input.googleServiceAccount && null !== input.googleServiceAccount && _io7(input.googleServiceAccount)); const _io5 = input => "string" === typeof input.token; const _io6 = input => "string" === typeof input.userToken; const _io7 = input => "string" === typeof input.serviceAccountKey; const _io8 = input => "object" === typeof input.github && null !== input.github && _io9(input.github); const _io9 = input => "string" === typeof input.token && (undefined === input.name || "string" === typeof input.name) && (undefined === input.password || "string" === typeof input.password) && (undefined === input.authenticatorKey || "string" === typeof input.authenticatorKey); const _vo0 = (input, _path, _exceptionable = true) => ["string" === typeof input.projectName || _report(_exceptionable, {
|
|
75
78
|
path: _path + ".projectName",
|
|
76
79
|
expected: "string",
|
|
77
80
|
value: input.projectName
|
|
@@ -115,13 +118,21 @@ class HandleScheduledEventUseCaseHandler {
|
|
|
115
118
|
path: _path + ".allowIssueCacheMinutes",
|
|
116
119
|
expected: "number",
|
|
117
120
|
value: input.allowIssueCacheMinutes
|
|
121
|
+
}), null === input.startPreparation || undefined === input.startPreparation || ("object" === typeof input.startPreparation && null !== input.startPreparation || _report(_exceptionable, {
|
|
122
|
+
path: _path + ".startPreparation",
|
|
123
|
+
expected: "(__type.o1 | null | undefined)",
|
|
124
|
+
value: input.startPreparation
|
|
125
|
+
})) && _vo2(input.startPreparation, _path + ".startPreparation", true && _exceptionable) || _report(_exceptionable, {
|
|
126
|
+
path: _path + ".startPreparation",
|
|
127
|
+
expected: "(__type.o1 | null | undefined)",
|
|
128
|
+
value: input.startPreparation
|
|
118
129
|
}), ("object" === typeof input.credentials && null !== input.credentials || _report(_exceptionable, {
|
|
119
130
|
path: _path + ".credentials",
|
|
120
|
-
expected: "__type.
|
|
131
|
+
expected: "__type.o2",
|
|
121
132
|
value: input.credentials
|
|
122
|
-
})) &&
|
|
133
|
+
})) && _vo3(input.credentials, _path + ".credentials", true && _exceptionable) || _report(_exceptionable, {
|
|
123
134
|
path: _path + ".credentials",
|
|
124
|
-
expected: "__type.
|
|
135
|
+
expected: "__type.o2",
|
|
125
136
|
value: input.credentials
|
|
126
137
|
})].every(flag => flag); const _vo1 = (input, _path, _exceptionable = true) => ["string" === typeof input.repo || _report(_exceptionable, {
|
|
127
138
|
path: _path + ".repo",
|
|
@@ -143,67 +154,87 @@ class HandleScheduledEventUseCaseHandler {
|
|
|
143
154
|
path: _path + ".spreadsheetUrl",
|
|
144
155
|
expected: "string",
|
|
145
156
|
value: input.spreadsheetUrl
|
|
146
|
-
})].every(flag => flag); const _vo2 = (input, _path, _exceptionable = true) => [
|
|
157
|
+
})].every(flag => flag); const _vo2 = (input, _path, _exceptionable = true) => ["string" === typeof input.awaitingWorkspaceStatus || _report(_exceptionable, {
|
|
158
|
+
path: _path + ".awaitingWorkspaceStatus",
|
|
159
|
+
expected: "string",
|
|
160
|
+
value: input.awaitingWorkspaceStatus
|
|
161
|
+
}), "string" === typeof input.preparationStatus || _report(_exceptionable, {
|
|
162
|
+
path: _path + ".preparationStatus",
|
|
163
|
+
expected: "string",
|
|
164
|
+
value: input.preparationStatus
|
|
165
|
+
}), "string" === typeof input.defaultAgentName || _report(_exceptionable, {
|
|
166
|
+
path: _path + ".defaultAgentName",
|
|
167
|
+
expected: "string",
|
|
168
|
+
value: input.defaultAgentName
|
|
169
|
+
}), undefined === input.logFilePath || "string" === typeof input.logFilePath || _report(_exceptionable, {
|
|
170
|
+
path: _path + ".logFilePath",
|
|
171
|
+
expected: "(string | undefined)",
|
|
172
|
+
value: input.logFilePath
|
|
173
|
+
}), null === input.maximumPreparingIssuesCount || "number" === typeof input.maximumPreparingIssuesCount || _report(_exceptionable, {
|
|
174
|
+
path: _path + ".maximumPreparingIssuesCount",
|
|
175
|
+
expected: "(null | number)",
|
|
176
|
+
value: input.maximumPreparingIssuesCount
|
|
177
|
+
})].every(flag => flag); const _vo3 = (input, _path, _exceptionable = true) => [("object" === typeof input.manager && null !== input.manager || _report(_exceptionable, {
|
|
147
178
|
path: _path + ".manager",
|
|
148
|
-
expected: "__type.
|
|
179
|
+
expected: "__type.o3",
|
|
149
180
|
value: input.manager
|
|
150
|
-
})) &&
|
|
181
|
+
})) && _vo4(input.manager, _path + ".manager", true && _exceptionable) || _report(_exceptionable, {
|
|
151
182
|
path: _path + ".manager",
|
|
152
|
-
expected: "__type.
|
|
183
|
+
expected: "__type.o3",
|
|
153
184
|
value: input.manager
|
|
154
185
|
}), ("object" === typeof input.bot && null !== input.bot || _report(_exceptionable, {
|
|
155
186
|
path: _path + ".bot",
|
|
156
|
-
expected: "__type.
|
|
187
|
+
expected: "__type.o7",
|
|
157
188
|
value: input.bot
|
|
158
|
-
})) &&
|
|
189
|
+
})) && _vo8(input.bot, _path + ".bot", true && _exceptionable) || _report(_exceptionable, {
|
|
159
190
|
path: _path + ".bot",
|
|
160
|
-
expected: "__type.
|
|
191
|
+
expected: "__type.o7",
|
|
161
192
|
value: input.bot
|
|
162
|
-
})].every(flag => flag); const
|
|
193
|
+
})].every(flag => flag); const _vo4 = (input, _path, _exceptionable = true) => [("object" === typeof input.github && null !== input.github || _report(_exceptionable, {
|
|
163
194
|
path: _path + ".github",
|
|
164
|
-
expected: "__type.
|
|
195
|
+
expected: "__type.o4",
|
|
165
196
|
value: input.github
|
|
166
|
-
})) &&
|
|
197
|
+
})) && _vo5(input.github, _path + ".github", true && _exceptionable) || _report(_exceptionable, {
|
|
167
198
|
path: _path + ".github",
|
|
168
|
-
expected: "__type.
|
|
199
|
+
expected: "__type.o4",
|
|
169
200
|
value: input.github
|
|
170
201
|
}), ("object" === typeof input.slack && null !== input.slack || _report(_exceptionable, {
|
|
171
202
|
path: _path + ".slack",
|
|
172
|
-
expected: "__type.
|
|
203
|
+
expected: "__type.o5",
|
|
173
204
|
value: input.slack
|
|
174
|
-
})) &&
|
|
205
|
+
})) && _vo6(input.slack, _path + ".slack", true && _exceptionable) || _report(_exceptionable, {
|
|
175
206
|
path: _path + ".slack",
|
|
176
|
-
expected: "__type.
|
|
207
|
+
expected: "__type.o5",
|
|
177
208
|
value: input.slack
|
|
178
209
|
}), ("object" === typeof input.googleServiceAccount && null !== input.googleServiceAccount || _report(_exceptionable, {
|
|
179
210
|
path: _path + ".googleServiceAccount",
|
|
180
|
-
expected: "__type.
|
|
211
|
+
expected: "__type.o6",
|
|
181
212
|
value: input.googleServiceAccount
|
|
182
|
-
})) &&
|
|
213
|
+
})) && _vo7(input.googleServiceAccount, _path + ".googleServiceAccount", true && _exceptionable) || _report(_exceptionable, {
|
|
183
214
|
path: _path + ".googleServiceAccount",
|
|
184
|
-
expected: "__type.
|
|
215
|
+
expected: "__type.o6",
|
|
185
216
|
value: input.googleServiceAccount
|
|
186
|
-
})].every(flag => flag); const
|
|
217
|
+
})].every(flag => flag); const _vo5 = (input, _path, _exceptionable = true) => ["string" === typeof input.token || _report(_exceptionable, {
|
|
187
218
|
path: _path + ".token",
|
|
188
219
|
expected: "string",
|
|
189
220
|
value: input.token
|
|
190
|
-
})].every(flag => flag); const
|
|
221
|
+
})].every(flag => flag); const _vo6 = (input, _path, _exceptionable = true) => ["string" === typeof input.userToken || _report(_exceptionable, {
|
|
191
222
|
path: _path + ".userToken",
|
|
192
223
|
expected: "string",
|
|
193
224
|
value: input.userToken
|
|
194
|
-
})].every(flag => flag); const
|
|
225
|
+
})].every(flag => flag); const _vo7 = (input, _path, _exceptionable = true) => ["string" === typeof input.serviceAccountKey || _report(_exceptionable, {
|
|
195
226
|
path: _path + ".serviceAccountKey",
|
|
196
227
|
expected: "string",
|
|
197
228
|
value: input.serviceAccountKey
|
|
198
|
-
})].every(flag => flag); const
|
|
229
|
+
})].every(flag => flag); const _vo8 = (input, _path, _exceptionable = true) => [("object" === typeof input.github && null !== input.github || _report(_exceptionable, {
|
|
199
230
|
path: _path + ".github",
|
|
200
|
-
expected: "__type.
|
|
231
|
+
expected: "__type.o8",
|
|
201
232
|
value: input.github
|
|
202
|
-
})) &&
|
|
233
|
+
})) && _vo9(input.github, _path + ".github", true && _exceptionable) || _report(_exceptionable, {
|
|
203
234
|
path: _path + ".github",
|
|
204
|
-
expected: "__type.
|
|
235
|
+
expected: "__type.o8",
|
|
205
236
|
value: input.github
|
|
206
|
-
})].every(flag => flag); const
|
|
237
|
+
})].every(flag => flag); const _vo9 = (input, _path, _exceptionable = true) => ["string" === typeof input.token || _report(_exceptionable, {
|
|
207
238
|
path: _path + ".token",
|
|
208
239
|
expected: "string",
|
|
209
240
|
value: input.token
|
|
@@ -288,7 +319,10 @@ class HandleScheduledEventUseCaseHandler {
|
|
|
288
319
|
const createNewStoryByLabel = new CreateNewStoryByLabelUseCase_1.CreateNewStoryByLabelUseCase(projectRepository, issueRepository);
|
|
289
320
|
const assignNoAssigneeIssueToManagerUseCase = new AssignNoAssigneeIssueToManagerUseCase_1.AssignNoAssigneeIssueToManagerUseCase(issueRepository);
|
|
290
321
|
const updateIssueStatusByLabelUseCase = new UpdateIssueStatusByLabelUseCase_1.UpdateIssueStatusByLabelUseCase(issueRepository);
|
|
291
|
-
const
|
|
322
|
+
const nodeLocalCommandRunner = new NodeLocalCommandRunner_1.NodeLocalCommandRunner();
|
|
323
|
+
const stubClaudeRepository = new StubClaudeRepository_1.StubClaudeRepository();
|
|
324
|
+
const startPreparationUseCase = new StartPreparationUseCase_1.StartPreparationUseCase(projectRepository, issueRepository, stubClaudeRepository, nodeLocalCommandRunner);
|
|
325
|
+
const handleScheduledEventUseCase = new HandleScheduledEventUseCase_1.HandleScheduledEventUseCase(actionAnnouncement, setWorkflowManagementIssueToStoryUseCase, clearNextActionHourUseCase, analyzeProblemByIssueUseCase, analyzeStoriesUseCase, clearDependedIssueURLUseCase, createEstimationIssueUseCase, convertCheckboxToIssueInStoryIssueUseCase, changeStatusByStoryColorUseCase, setNoStoryIssueToStoryUseCase, createNewStoryByLabel, assignNoAssigneeIssueToManagerUseCase, updateIssueStatusByLabelUseCase, startPreparationUseCase, systemDateRepository, googleSpreadsheetRepository, projectRepository, issueRepository);
|
|
292
326
|
return await handleScheduledEventUseCase.run(input);
|
|
293
327
|
};
|
|
294
328
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"HandleScheduledEventUseCaseHandler.js","sourceRoot":"","sources":["../../../../src/adapter/entry-points/handlers/HandleScheduledEventUseCaseHandler.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,gDAAwB;AACxB,kDAA0B;AAC1B,4CAAoB;AACpB,kFAA+E;AAC/E,sFAAmF;AACnF,gGAA6F;AAC7F,0FAAuF;AACvF,wFAAqF;AACrF,sFAAmF;AACnF,wGAAqG;AACrG,8GAA2G;AAC3G,sGAAmG;AACnG,gGAA6F;AAC7F,kGAA+F;AAC/F,gIAA6H;AAC7H,oGAAiG;AACjG,wGAAqG;AAIrG,0FAAuF;AACvF,wGAAqG;AACrG,wGAAqG;AACrG,kDAA0C;AAC1C,kIAA+H;AAC/H,8GAA2G;AAC3G,0GAAuG;AACvG,wGAAqG;AACrG,0FAAuF;AAEvF,0HAAuH;AACvH,8GAA2G;
|
|
1
|
+
{"version":3,"file":"HandleScheduledEventUseCaseHandler.js","sourceRoot":"","sources":["../../../../src/adapter/entry-points/handlers/HandleScheduledEventUseCaseHandler.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.NodeLocalCommandRunner = void 0;
|
|
4
|
+
const child_process_1 = require("child_process");
|
|
5
|
+
const util_1 = require("util");
|
|
6
|
+
const execAsync = (0, util_1.promisify)(child_process_1.exec);
|
|
7
|
+
class NodeLocalCommandRunner {
|
|
8
|
+
async runCommand(command) {
|
|
9
|
+
try {
|
|
10
|
+
const { stdout, stderr } = await execAsync(command);
|
|
11
|
+
return {
|
|
12
|
+
stdout,
|
|
13
|
+
stderr,
|
|
14
|
+
exitCode: 0,
|
|
15
|
+
};
|
|
16
|
+
}
|
|
17
|
+
catch (error) {
|
|
18
|
+
if (error &&
|
|
19
|
+
typeof error === 'object' &&
|
|
20
|
+
'stdout' in error &&
|
|
21
|
+
'stderr' in error &&
|
|
22
|
+
'code' in error) {
|
|
23
|
+
return {
|
|
24
|
+
stdout: String(error.stdout),
|
|
25
|
+
stderr: String(error.stderr),
|
|
26
|
+
exitCode: typeof error.code === 'number' ? error.code : 1,
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
throw error;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
exports.NodeLocalCommandRunner = NodeLocalCommandRunner;
|
|
34
|
+
//# sourceMappingURL=NodeLocalCommandRunner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"NodeLocalCommandRunner.js","sourceRoot":"","sources":["../../../src/adapter/repositories/NodeLocalCommandRunner.ts"],"names":[],"mappings":";;;AACA,iDAAqC;AACrC,+BAAiC;AAEjC,MAAM,SAAS,GAAG,IAAA,gBAAS,EAAC,oBAAI,CAAC,CAAC;AAElC,MAAa,sBAAsB;IACjC,KAAK,CAAC,UAAU,CAAC,OAAe;QAK9B,IAAI,CAAC;YACH,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,SAAS,CAAC,OAAO,CAAC,CAAC;YACpD,OAAO;gBACL,MAAM;gBACN,MAAM;gBACN,QAAQ,EAAE,CAAC;aACZ,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IACE,KAAK;gBACL,OAAO,KAAK,KAAK,QAAQ;gBACzB,QAAQ,IAAI,KAAK;gBACjB,QAAQ,IAAI,KAAK;gBACjB,MAAM,IAAI,KAAK,EACf,CAAC;gBACD,OAAO;oBACL,MAAM,EAAE,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC;oBAC5B,MAAM,EAAE,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC;oBAC5B,QAAQ,EAAE,OAAO,KAAK,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;iBAC1D,CAAC;YACJ,CAAC;YACD,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;CACF;AA9BD,wDA8BC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.StubClaudeRepository = void 0;
|
|
4
|
+
class StubClaudeRepository {
|
|
5
|
+
async getUsage() {
|
|
6
|
+
return [];
|
|
7
|
+
}
|
|
8
|
+
async isClaudeAvailable(_threshold) {
|
|
9
|
+
return true;
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
exports.StubClaudeRepository = StubClaudeRepository;
|
|
13
|
+
//# sourceMappingURL=StubClaudeRepository.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"StubClaudeRepository.js","sourceRoot":"","sources":["../../../src/adapter/repositories/StubClaudeRepository.ts"],"names":[],"mappings":";;;AAGA,MAAa,oBAAoB;IAC/B,KAAK,CAAC,QAAQ;QACZ,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,KAAK,CAAC,iBAAiB,CAAC,UAAkB;QACxC,OAAO,IAAI,CAAC;IACd,CAAC;CACF;AARD,oDAQC"}
|
|
@@ -9,7 +9,7 @@ class ProjectNotFoundError extends Error {
|
|
|
9
9
|
}
|
|
10
10
|
exports.ProjectNotFoundError = ProjectNotFoundError;
|
|
11
11
|
class HandleScheduledEventUseCase {
|
|
12
|
-
constructor(actionAnnouncementUseCase, setWorkflowManagementIssueToStoryUseCase, clearNextActionHourUseCase, analyzeProblemByIssueUseCase, analyzeStoriesUseCase, clearDependedIssueURLUseCase, createEstimationIssueUseCase, convertCheckboxToIssueInStoryIssueUseCase, changeStatusByStoryColorUseCase, setNoStoryIssueToStoryUseCase, createNewStoryByLabelUseCase, assignNoAssigneeIssueToManagerUseCase, updateIssueStatusByLabelUseCase, dateRepository, spreadsheetRepository, projectRepository, issueRepository) {
|
|
12
|
+
constructor(actionAnnouncementUseCase, setWorkflowManagementIssueToStoryUseCase, clearNextActionHourUseCase, analyzeProblemByIssueUseCase, analyzeStoriesUseCase, clearDependedIssueURLUseCase, createEstimationIssueUseCase, convertCheckboxToIssueInStoryIssueUseCase, changeStatusByStoryColorUseCase, setNoStoryIssueToStoryUseCase, createNewStoryByLabelUseCase, assignNoAssigneeIssueToManagerUseCase, updateIssueStatusByLabelUseCase, startPreparationUseCase, dateRepository, spreadsheetRepository, projectRepository, issueRepository) {
|
|
13
13
|
this.actionAnnouncementUseCase = actionAnnouncementUseCase;
|
|
14
14
|
this.setWorkflowManagementIssueToStoryUseCase = setWorkflowManagementIssueToStoryUseCase;
|
|
15
15
|
this.clearNextActionHourUseCase = clearNextActionHourUseCase;
|
|
@@ -23,6 +23,7 @@ class HandleScheduledEventUseCase {
|
|
|
23
23
|
this.createNewStoryByLabelUseCase = createNewStoryByLabelUseCase;
|
|
24
24
|
this.assignNoAssigneeIssueToManagerUseCase = assignNoAssigneeIssueToManagerUseCase;
|
|
25
25
|
this.updateIssueStatusByLabelUseCase = updateIssueStatusByLabelUseCase;
|
|
26
|
+
this.startPreparationUseCase = startPreparationUseCase;
|
|
26
27
|
this.dateRepository = dateRepository;
|
|
27
28
|
this.spreadsheetRepository = spreadsheetRepository;
|
|
28
29
|
this.projectRepository = projectRepository;
|
|
@@ -200,6 +201,17 @@ ${JSON.stringify(e)}
|
|
|
200
201
|
issues,
|
|
201
202
|
defaultStatus: input.defaultStatus,
|
|
202
203
|
});
|
|
204
|
+
if (input.startPreparation) {
|
|
205
|
+
await this.startPreparationUseCase.run({
|
|
206
|
+
projectUrl: input.projectUrl,
|
|
207
|
+
awaitingWorkspaceStatus: input.startPreparation.awaitingWorkspaceStatus,
|
|
208
|
+
preparationStatus: input.startPreparation.preparationStatus,
|
|
209
|
+
defaultAgentName: input.startPreparation.defaultAgentName,
|
|
210
|
+
logFilePath: input.startPreparation.logFilePath,
|
|
211
|
+
maximumPreparingIssuesCount: input.startPreparation.maximumPreparingIssuesCount,
|
|
212
|
+
allowIssueCacheMinutes: input.allowIssueCacheMinutes,
|
|
213
|
+
});
|
|
214
|
+
}
|
|
203
215
|
};
|
|
204
216
|
this.findTargetDateAndUpdateLastExecutionDateTime = async (spreadsheetUrl, now) => {
|
|
205
217
|
const sheetValues = await this.spreadsheetRepository.getSheet(spreadsheetUrl, 'HandleScheduledEvent');
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"HandleScheduledEventUseCase.js","sourceRoot":"","sources":["../../../src/domain/usecases/HandleScheduledEventUseCase.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"HandleScheduledEventUseCase.js","sourceRoot":"","sources":["../../../src/domain/usecases/HandleScheduledEventUseCase.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -81,6 +81,15 @@ jest.mock(
|
|
|
81
81
|
jest.mock('../../../domain/usecases/UpdateIssueStatusByLabelUseCase', () => ({
|
|
82
82
|
UpdateIssueStatusByLabelUseCase: jest.fn().mockImplementation(() => ({})),
|
|
83
83
|
}));
|
|
84
|
+
jest.mock('../../../domain/usecases/StartPreparationUseCase', () => ({
|
|
85
|
+
StartPreparationUseCase: jest.fn().mockImplementation(() => ({})),
|
|
86
|
+
}));
|
|
87
|
+
jest.mock('../../repositories/NodeLocalCommandRunner', () => ({
|
|
88
|
+
NodeLocalCommandRunner: jest.fn().mockImplementation(() => ({})),
|
|
89
|
+
}));
|
|
90
|
+
jest.mock('../../repositories/StubClaudeRepository', () => ({
|
|
91
|
+
StubClaudeRepository: jest.fn().mockImplementation(() => ({})),
|
|
92
|
+
}));
|
|
84
93
|
|
|
85
94
|
import { HandleScheduledEventUseCaseHandler } from './HandleScheduledEventUseCaseHandler';
|
|
86
95
|
import { GraphqlProjectRepository } from '../../repositories/GraphqlProjectRepository';
|
|
@@ -30,6 +30,9 @@ import { CheerioProjectRepository } from '../../repositories/CheerioProjectRepos
|
|
|
30
30
|
import { ProjectRepository } from '../../../domain/usecases/adapter-interfaces/ProjectRepository';
|
|
31
31
|
import { AssignNoAssigneeIssueToManagerUseCase } from '../../../domain/usecases/AssignNoAssigneeIssueToManagerUseCase';
|
|
32
32
|
import { UpdateIssueStatusByLabelUseCase } from '../../../domain/usecases/UpdateIssueStatusByLabelUseCase';
|
|
33
|
+
import { StartPreparationUseCase } from '../../../domain/usecases/StartPreparationUseCase';
|
|
34
|
+
import { NodeLocalCommandRunner } from '../../repositories/NodeLocalCommandRunner';
|
|
35
|
+
import { StubClaudeRepository } from '../../repositories/StubClaudeRepository';
|
|
33
36
|
|
|
34
37
|
export class HandleScheduledEventUseCaseHandler {
|
|
35
38
|
handle = async (
|
|
@@ -175,6 +178,14 @@ export class HandleScheduledEventUseCaseHandler {
|
|
|
175
178
|
const updateIssueStatusByLabelUseCase = new UpdateIssueStatusByLabelUseCase(
|
|
176
179
|
issueRepository,
|
|
177
180
|
);
|
|
181
|
+
const nodeLocalCommandRunner = new NodeLocalCommandRunner();
|
|
182
|
+
const stubClaudeRepository = new StubClaudeRepository();
|
|
183
|
+
const startPreparationUseCase = new StartPreparationUseCase(
|
|
184
|
+
projectRepository,
|
|
185
|
+
issueRepository,
|
|
186
|
+
stubClaudeRepository,
|
|
187
|
+
nodeLocalCommandRunner,
|
|
188
|
+
);
|
|
178
189
|
|
|
179
190
|
const handleScheduledEventUseCase = new HandleScheduledEventUseCase(
|
|
180
191
|
actionAnnouncement,
|
|
@@ -190,6 +201,7 @@ export class HandleScheduledEventUseCaseHandler {
|
|
|
190
201
|
createNewStoryByLabel,
|
|
191
202
|
assignNoAssigneeIssueToManagerUseCase,
|
|
192
203
|
updateIssueStatusByLabelUseCase,
|
|
204
|
+
startPreparationUseCase,
|
|
193
205
|
systemDateRepository,
|
|
194
206
|
googleSpreadsheetRepository,
|
|
195
207
|
projectRepository,
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
const mockExecAsync = jest.fn();
|
|
2
|
+
|
|
3
|
+
jest.mock('child_process', () => ({
|
|
4
|
+
exec: jest.fn(),
|
|
5
|
+
}));
|
|
6
|
+
|
|
7
|
+
jest.mock('util', () => ({
|
|
8
|
+
promisify: jest.fn(() => mockExecAsync),
|
|
9
|
+
}));
|
|
10
|
+
|
|
11
|
+
import { NodeLocalCommandRunner } from './NodeLocalCommandRunner';
|
|
12
|
+
|
|
13
|
+
describe('NodeLocalCommandRunner', () => {
|
|
14
|
+
let runner: NodeLocalCommandRunner;
|
|
15
|
+
|
|
16
|
+
beforeEach(() => {
|
|
17
|
+
jest.clearAllMocks();
|
|
18
|
+
runner = new NodeLocalCommandRunner();
|
|
19
|
+
});
|
|
20
|
+
|
|
21
|
+
describe('runCommand', () => {
|
|
22
|
+
it('should execute command successfully', async () => {
|
|
23
|
+
mockExecAsync.mockResolvedValue({
|
|
24
|
+
stdout: 'command output',
|
|
25
|
+
stderr: '',
|
|
26
|
+
});
|
|
27
|
+
|
|
28
|
+
const result = await runner.runCommand('echo "test"');
|
|
29
|
+
|
|
30
|
+
expect(result).toEqual({
|
|
31
|
+
stdout: 'command output',
|
|
32
|
+
stderr: '',
|
|
33
|
+
exitCode: 0,
|
|
34
|
+
});
|
|
35
|
+
expect(mockExecAsync).toHaveBeenCalledWith('echo "test"');
|
|
36
|
+
});
|
|
37
|
+
|
|
38
|
+
it('should handle command errors with exit code', async () => {
|
|
39
|
+
const error = Object.assign(new Error('Command failed'), {
|
|
40
|
+
code: 2,
|
|
41
|
+
stdout: 'partial output',
|
|
42
|
+
stderr: 'error message',
|
|
43
|
+
});
|
|
44
|
+
mockExecAsync.mockRejectedValue(error);
|
|
45
|
+
|
|
46
|
+
const result = await runner.runCommand('invalid-command');
|
|
47
|
+
|
|
48
|
+
expect(result).toEqual({
|
|
49
|
+
stdout: 'partial output',
|
|
50
|
+
stderr: 'error message',
|
|
51
|
+
exitCode: 2,
|
|
52
|
+
});
|
|
53
|
+
});
|
|
54
|
+
|
|
55
|
+
it('should default to exit code 1 when code is not a number', async () => {
|
|
56
|
+
const error = Object.assign(new Error('Command failed'), {
|
|
57
|
+
code: 'ENOENT',
|
|
58
|
+
stdout: '',
|
|
59
|
+
stderr: 'command not found',
|
|
60
|
+
});
|
|
61
|
+
mockExecAsync.mockRejectedValue(error);
|
|
62
|
+
|
|
63
|
+
const result = await runner.runCommand('nonexistent');
|
|
64
|
+
|
|
65
|
+
expect(result).toEqual({
|
|
66
|
+
stdout: '',
|
|
67
|
+
stderr: 'command not found',
|
|
68
|
+
exitCode: 1,
|
|
69
|
+
});
|
|
70
|
+
});
|
|
71
|
+
|
|
72
|
+
it('should throw error if error format is unexpected', async () => {
|
|
73
|
+
mockExecAsync.mockRejectedValue(new Error('Unexpected error'));
|
|
74
|
+
|
|
75
|
+
await expect(runner.runCommand('command')).rejects.toThrow(
|
|
76
|
+
'Unexpected error',
|
|
77
|
+
);
|
|
78
|
+
});
|
|
79
|
+
});
|
|
80
|
+
});
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { LocalCommandRunner } from '../../domain/usecases/adapter-interfaces/LocalCommandRunner';
|
|
2
|
+
import { exec } from 'child_process';
|
|
3
|
+
import { promisify } from 'util';
|
|
4
|
+
|
|
5
|
+
const execAsync = promisify(exec);
|
|
6
|
+
|
|
7
|
+
export class NodeLocalCommandRunner implements LocalCommandRunner {
|
|
8
|
+
async runCommand(command: string): Promise<{
|
|
9
|
+
stdout: string;
|
|
10
|
+
stderr: string;
|
|
11
|
+
exitCode: number;
|
|
12
|
+
}> {
|
|
13
|
+
try {
|
|
14
|
+
const { stdout, stderr } = await execAsync(command);
|
|
15
|
+
return {
|
|
16
|
+
stdout,
|
|
17
|
+
stderr,
|
|
18
|
+
exitCode: 0,
|
|
19
|
+
};
|
|
20
|
+
} catch (error) {
|
|
21
|
+
if (
|
|
22
|
+
error &&
|
|
23
|
+
typeof error === 'object' &&
|
|
24
|
+
'stdout' in error &&
|
|
25
|
+
'stderr' in error &&
|
|
26
|
+
'code' in error
|
|
27
|
+
) {
|
|
28
|
+
return {
|
|
29
|
+
stdout: String(error.stdout),
|
|
30
|
+
stderr: String(error.stderr),
|
|
31
|
+
exitCode: typeof error.code === 'number' ? error.code : 1,
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
throw error;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { StubClaudeRepository } from './StubClaudeRepository';
|
|
2
|
+
|
|
3
|
+
describe('StubClaudeRepository', () => {
|
|
4
|
+
let repository: StubClaudeRepository;
|
|
5
|
+
|
|
6
|
+
beforeEach(() => {
|
|
7
|
+
repository = new StubClaudeRepository();
|
|
8
|
+
});
|
|
9
|
+
|
|
10
|
+
it('should return empty usage array', async () => {
|
|
11
|
+
const result = await repository.getUsage();
|
|
12
|
+
expect(result).toEqual([]);
|
|
13
|
+
});
|
|
14
|
+
|
|
15
|
+
it('should return true for isClaudeAvailable', async () => {
|
|
16
|
+
const result = await repository.isClaudeAvailable(90);
|
|
17
|
+
expect(result).toBe(true);
|
|
18
|
+
});
|
|
19
|
+
});
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { ClaudeRepository } from '../../domain/usecases/adapter-interfaces/ClaudeRepository';
|
|
2
|
+
import { ClaudeWindowUsage } from '../../domain/entities/ClaudeWindowUsage';
|
|
3
|
+
|
|
4
|
+
export class StubClaudeRepository implements ClaudeRepository {
|
|
5
|
+
async getUsage(): Promise<ClaudeWindowUsage[]> {
|
|
6
|
+
return [];
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
async isClaudeAvailable(_threshold: number): Promise<boolean> {
|
|
10
|
+
return true;
|
|
11
|
+
}
|
|
12
|
+
}
|
|
@@ -18,6 +18,7 @@ import { SetNoStoryIssueToStoryUseCase } from './SetNoStoryIssueToStoryUseCase';
|
|
|
18
18
|
import { CreateNewStoryByLabelUseCase } from './CreateNewStoryByLabelUseCase';
|
|
19
19
|
import { AssignNoAssigneeIssueToManagerUseCase } from './AssignNoAssigneeIssueToManagerUseCase';
|
|
20
20
|
import { UpdateIssueStatusByLabelUseCase } from './UpdateIssueStatusByLabelUseCase';
|
|
21
|
+
import { StartPreparationUseCase } from './StartPreparationUseCase';
|
|
21
22
|
|
|
22
23
|
describe('HandleScheduledEventUseCase', () => {
|
|
23
24
|
describe('createTargetDateTimes', () => {
|
|
@@ -99,6 +100,7 @@ describe('HandleScheduledEventUseCase', () => {
|
|
|
99
100
|
mock<AssignNoAssigneeIssueToManagerUseCase>();
|
|
100
101
|
const mockUpdateIssueStatusByLabelUseCase =
|
|
101
102
|
mock<UpdateIssueStatusByLabelUseCase>();
|
|
103
|
+
const mockStartPreparationUseCase = mock<StartPreparationUseCase>();
|
|
102
104
|
const mockDateRepository = mock<DateRepository>();
|
|
103
105
|
const mockSpreadsheetRepository = mock<SpreadsheetRepository>();
|
|
104
106
|
const mockProjectRepository = mock<ProjectRepository>();
|
|
@@ -118,6 +120,7 @@ describe('HandleScheduledEventUseCase', () => {
|
|
|
118
120
|
mockCreateNewStoryByLabelUseCase,
|
|
119
121
|
mockAssignNoAssigneeIssueToManagerUseCase,
|
|
120
122
|
mockUpdateIssueStatusByLabelUseCase,
|
|
123
|
+
mockStartPreparationUseCase,
|
|
121
124
|
mockDateRepository,
|
|
122
125
|
mockSpreadsheetRepository,
|
|
123
126
|
mockProjectRepository,
|
|
@@ -19,6 +19,7 @@ import { SetNoStoryIssueToStoryUseCase } from './SetNoStoryIssueToStoryUseCase';
|
|
|
19
19
|
import { CreateNewStoryByLabelUseCase } from './CreateNewStoryByLabelUseCase';
|
|
20
20
|
import { AssignNoAssigneeIssueToManagerUseCase } from './AssignNoAssigneeIssueToManagerUseCase';
|
|
21
21
|
import { UpdateIssueStatusByLabelUseCase } from './UpdateIssueStatusByLabelUseCase';
|
|
22
|
+
import { StartPreparationUseCase } from './StartPreparationUseCase';
|
|
22
23
|
|
|
23
24
|
export class ProjectNotFoundError extends Error {
|
|
24
25
|
constructor(message: string) {
|
|
@@ -42,6 +43,7 @@ export class HandleScheduledEventUseCase {
|
|
|
42
43
|
readonly createNewStoryByLabelUseCase: CreateNewStoryByLabelUseCase,
|
|
43
44
|
readonly assignNoAssigneeIssueToManagerUseCase: AssignNoAssigneeIssueToManagerUseCase,
|
|
44
45
|
readonly updateIssueStatusByLabelUseCase: UpdateIssueStatusByLabelUseCase,
|
|
46
|
+
readonly startPreparationUseCase: StartPreparationUseCase,
|
|
45
47
|
readonly dateRepository: DateRepository,
|
|
46
48
|
readonly spreadsheetRepository: SpreadsheetRepository,
|
|
47
49
|
readonly projectRepository: ProjectRepository,
|
|
@@ -63,6 +65,13 @@ export class HandleScheduledEventUseCase {
|
|
|
63
65
|
defaultStatus: string | null;
|
|
64
66
|
disabled: boolean;
|
|
65
67
|
allowIssueCacheMinutes: number;
|
|
68
|
+
startPreparation?: {
|
|
69
|
+
awaitingWorkspaceStatus: string;
|
|
70
|
+
preparationStatus: string;
|
|
71
|
+
defaultAgentName: string;
|
|
72
|
+
logFilePath?: string;
|
|
73
|
+
maximumPreparingIssuesCount: number | null;
|
|
74
|
+
} | null;
|
|
66
75
|
}): Promise<{
|
|
67
76
|
project: Project;
|
|
68
77
|
issues: Issue[];
|
|
@@ -292,6 +301,18 @@ ${JSON.stringify(e)}
|
|
|
292
301
|
issues,
|
|
293
302
|
defaultStatus: input.defaultStatus,
|
|
294
303
|
});
|
|
304
|
+
if (input.startPreparation) {
|
|
305
|
+
await this.startPreparationUseCase.run({
|
|
306
|
+
projectUrl: input.projectUrl,
|
|
307
|
+
awaitingWorkspaceStatus: input.startPreparation.awaitingWorkspaceStatus,
|
|
308
|
+
preparationStatus: input.startPreparation.preparationStatus,
|
|
309
|
+
defaultAgentName: input.startPreparation.defaultAgentName,
|
|
310
|
+
logFilePath: input.startPreparation.logFilePath,
|
|
311
|
+
maximumPreparingIssuesCount:
|
|
312
|
+
input.startPreparation.maximumPreparingIssuesCount,
|
|
313
|
+
allowIssueCacheMinutes: input.allowIssueCacheMinutes,
|
|
314
|
+
});
|
|
315
|
+
}
|
|
295
316
|
};
|
|
296
317
|
static createTargetDateTimes = (from: Date, to: Date): Date[] => {
|
|
297
318
|
const targetDateTimes: Date[] = [];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"HandleScheduledEventUseCaseHandler.d.ts","sourceRoot":"","sources":["../../../../src/adapter/entry-points/handlers/HandleScheduledEventUseCaseHandler.ts"],"names":[],"mappings":"AAiBA,OAAO,EAAE,KAAK,EAAE,MAAM,gCAAgC,CAAC;AACvD,OAAO,EAAE,OAAO,EAAE,MAAM,kCAAkC,CAAC;
|
|
1
|
+
{"version":3,"file":"HandleScheduledEventUseCaseHandler.d.ts","sourceRoot":"","sources":["../../../../src/adapter/entry-points/handlers/HandleScheduledEventUseCaseHandler.ts"],"names":[],"mappings":"AAiBA,OAAO,EAAE,KAAK,EAAE,MAAM,gCAAgC,CAAC;AACvD,OAAO,EAAE,OAAO,EAAE,MAAM,kCAAkC,CAAC;AAkB3D,qBAAa,kCAAkC;IAC7C,MAAM,mBACY,MAAM,WACb,OAAO,KACf,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,CAsKP;CACH"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { LocalCommandRunner } from '../../domain/usecases/adapter-interfaces/LocalCommandRunner';
|
|
2
|
+
export declare class NodeLocalCommandRunner implements LocalCommandRunner {
|
|
3
|
+
runCommand(command: string): Promise<{
|
|
4
|
+
stdout: string;
|
|
5
|
+
stderr: string;
|
|
6
|
+
exitCode: number;
|
|
7
|
+
}>;
|
|
8
|
+
}
|
|
9
|
+
//# sourceMappingURL=NodeLocalCommandRunner.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"NodeLocalCommandRunner.d.ts","sourceRoot":"","sources":["../../../src/adapter/repositories/NodeLocalCommandRunner.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,6DAA6D,CAAC;AAMjG,qBAAa,sBAAuB,YAAW,kBAAkB;IACzD,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC;QACzC,MAAM,EAAE,MAAM,CAAC;QACf,MAAM,EAAE,MAAM,CAAC;QACf,QAAQ,EAAE,MAAM,CAAC;KAClB,CAAC;CAyBH"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { ClaudeRepository } from '../../domain/usecases/adapter-interfaces/ClaudeRepository';
|
|
2
|
+
import { ClaudeWindowUsage } from '../../domain/entities/ClaudeWindowUsage';
|
|
3
|
+
export declare class StubClaudeRepository implements ClaudeRepository {
|
|
4
|
+
getUsage(): Promise<ClaudeWindowUsage[]>;
|
|
5
|
+
isClaudeAvailable(_threshold: number): Promise<boolean>;
|
|
6
|
+
}
|
|
7
|
+
//# sourceMappingURL=StubClaudeRepository.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"StubClaudeRepository.d.ts","sourceRoot":"","sources":["../../../src/adapter/repositories/StubClaudeRepository.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,2DAA2D,CAAC;AAC7F,OAAO,EAAE,iBAAiB,EAAE,MAAM,yCAAyC,CAAC;AAE5E,qBAAa,oBAAqB,YAAW,gBAAgB;IACrD,QAAQ,IAAI,OAAO,CAAC,iBAAiB,EAAE,CAAC;IAIxC,iBAAiB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;CAG9D"}
|
|
@@ -19,6 +19,7 @@ import { SetNoStoryIssueToStoryUseCase } from './SetNoStoryIssueToStoryUseCase';
|
|
|
19
19
|
import { CreateNewStoryByLabelUseCase } from './CreateNewStoryByLabelUseCase';
|
|
20
20
|
import { AssignNoAssigneeIssueToManagerUseCase } from './AssignNoAssigneeIssueToManagerUseCase';
|
|
21
21
|
import { UpdateIssueStatusByLabelUseCase } from './UpdateIssueStatusByLabelUseCase';
|
|
22
|
+
import { StartPreparationUseCase } from './StartPreparationUseCase';
|
|
22
23
|
export declare class ProjectNotFoundError extends Error {
|
|
23
24
|
constructor(message: string);
|
|
24
25
|
}
|
|
@@ -36,11 +37,12 @@ export declare class HandleScheduledEventUseCase {
|
|
|
36
37
|
readonly createNewStoryByLabelUseCase: CreateNewStoryByLabelUseCase;
|
|
37
38
|
readonly assignNoAssigneeIssueToManagerUseCase: AssignNoAssigneeIssueToManagerUseCase;
|
|
38
39
|
readonly updateIssueStatusByLabelUseCase: UpdateIssueStatusByLabelUseCase;
|
|
40
|
+
readonly startPreparationUseCase: StartPreparationUseCase;
|
|
39
41
|
readonly dateRepository: DateRepository;
|
|
40
42
|
readonly spreadsheetRepository: SpreadsheetRepository;
|
|
41
43
|
readonly projectRepository: ProjectRepository;
|
|
42
44
|
readonly issueRepository: IssueRepository;
|
|
43
|
-
constructor(actionAnnouncementUseCase: ActionAnnouncementUseCase, setWorkflowManagementIssueToStoryUseCase: SetWorkflowManagementIssueToStoryUseCase, clearNextActionHourUseCase: ClearNextActionHourUseCase, analyzeProblemByIssueUseCase: AnalyzeProblemByIssueUseCase, analyzeStoriesUseCase: AnalyzeStoriesUseCase, clearDependedIssueURLUseCase: ClearDependedIssueURLUseCase, createEstimationIssueUseCase: CreateEstimationIssueUseCase, convertCheckboxToIssueInStoryIssueUseCase: ConvertCheckboxToIssueInStoryIssueUseCase, changeStatusByStoryColorUseCase: ChangeStatusByStoryColorUseCase, setNoStoryIssueToStoryUseCase: SetNoStoryIssueToStoryUseCase, createNewStoryByLabelUseCase: CreateNewStoryByLabelUseCase, assignNoAssigneeIssueToManagerUseCase: AssignNoAssigneeIssueToManagerUseCase, updateIssueStatusByLabelUseCase: UpdateIssueStatusByLabelUseCase, dateRepository: DateRepository, spreadsheetRepository: SpreadsheetRepository, projectRepository: ProjectRepository, issueRepository: IssueRepository);
|
|
45
|
+
constructor(actionAnnouncementUseCase: ActionAnnouncementUseCase, setWorkflowManagementIssueToStoryUseCase: SetWorkflowManagementIssueToStoryUseCase, clearNextActionHourUseCase: ClearNextActionHourUseCase, analyzeProblemByIssueUseCase: AnalyzeProblemByIssueUseCase, analyzeStoriesUseCase: AnalyzeStoriesUseCase, clearDependedIssueURLUseCase: ClearDependedIssueURLUseCase, createEstimationIssueUseCase: CreateEstimationIssueUseCase, convertCheckboxToIssueInStoryIssueUseCase: ConvertCheckboxToIssueInStoryIssueUseCase, changeStatusByStoryColorUseCase: ChangeStatusByStoryColorUseCase, setNoStoryIssueToStoryUseCase: SetNoStoryIssueToStoryUseCase, createNewStoryByLabelUseCase: CreateNewStoryByLabelUseCase, assignNoAssigneeIssueToManagerUseCase: AssignNoAssigneeIssueToManagerUseCase, updateIssueStatusByLabelUseCase: UpdateIssueStatusByLabelUseCase, startPreparationUseCase: StartPreparationUseCase, dateRepository: DateRepository, spreadsheetRepository: SpreadsheetRepository, projectRepository: ProjectRepository, issueRepository: IssueRepository);
|
|
44
46
|
run: (input: {
|
|
45
47
|
projectName: string;
|
|
46
48
|
org: string;
|
|
@@ -56,6 +58,13 @@ export declare class HandleScheduledEventUseCase {
|
|
|
56
58
|
defaultStatus: string | null;
|
|
57
59
|
disabled: boolean;
|
|
58
60
|
allowIssueCacheMinutes: number;
|
|
61
|
+
startPreparation?: {
|
|
62
|
+
awaitingWorkspaceStatus: string;
|
|
63
|
+
preparationStatus: string;
|
|
64
|
+
defaultAgentName: string;
|
|
65
|
+
logFilePath?: string;
|
|
66
|
+
maximumPreparingIssuesCount: number | null;
|
|
67
|
+
} | null;
|
|
59
68
|
}) => Promise<{
|
|
60
69
|
project: Project;
|
|
61
70
|
issues: Issue[];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"HandleScheduledEventUseCase.d.ts","sourceRoot":"","sources":["../../../src/domain/usecases/HandleScheduledEventUseCase.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;AAC9C,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAC5D,OAAO,EAAE,iBAAiB,EAAE,MAAM,wCAAwC,CAAC;AAC3E,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAC5C,OAAO,EAAE,cAAc,EAAE,MAAM,qCAAqC,CAAC;AACrE,OAAO,EAAE,qBAAqB,EAAE,MAAM,4CAA4C,CAAC;AACnF,OAAO,EAAE,yBAAyB,EAAE,MAAM,6BAA6B,CAAC;AACxE,OAAO,EAAE,wCAAwC,EAAE,MAAM,4CAA4C,CAAC;AACtG,OAAO,EAAE,0BAA0B,EAAE,MAAM,8BAA8B,CAAC;AAC1E,OAAO,EAAE,4BAA4B,EAAE,MAAM,gCAAgC,CAAC;AAC9E,OAAO,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AAChE,OAAO,EAAE,4BAA4B,EAAE,MAAM,gCAAgC,CAAC;AAC9E,OAAO,EAAE,4BAA4B,EAAE,MAAM,gCAAgC,CAAC;AAC9E,OAAO,EAAE,yCAAyC,EAAE,MAAM,6CAA6C,CAAC;AACxG,OAAO,EAAE,+BAA+B,EAAE,MAAM,mCAAmC,CAAC;AACpF,OAAO,EAAE,6BAA6B,EAAE,MAAM,iCAAiC,CAAC;AAChF,OAAO,EAAE,4BAA4B,EAAE,MAAM,gCAAgC,CAAC;AAC9E,OAAO,EAAE,qCAAqC,EAAE,MAAM,yCAAyC,CAAC;AAChG,OAAO,EAAE,+BAA+B,EAAE,MAAM,mCAAmC,CAAC;
|
|
1
|
+
{"version":3,"file":"HandleScheduledEventUseCase.d.ts","sourceRoot":"","sources":["../../../src/domain/usecases/HandleScheduledEventUseCase.ts"],"names":[],"mappings":"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"}
|