github-issue-tower-defence-management 1.33.0 → 1.34.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 CHANGED
@@ -1,3 +1,10 @@
1
+ # [1.34.0](https://github.com/HiromiShikata/npm-cli-github-issue-tower-defence-management/compare/v1.33.0...v1.34.0) (2026-03-22)
2
+
3
+
4
+ ### Features
5
+
6
+ * **cli:** add startDaemon and notifyFinishedIssuePreparation commands ([72fe2c4](https://github.com/HiromiShikata/npm-cli-github-issue-tower-defence-management/commit/72fe2c43c0423f5760f27640704fc79af1078b5d))
7
+
1
8
  # [1.33.0](https://github.com/HiromiShikata/npm-cli-github-issue-tower-defence-management/compare/v1.32.0...v1.33.0) (2026-03-21)
2
9
 
3
10
 
package/README.md CHANGED
@@ -11,15 +11,41 @@ Welcome to npm-cli-github-issue-tower-defence-management :tada:
11
11
  Here's how you can use github-issue-tower-defence-management:
12
12
 
13
13
  ```
14
- Usage: github-issue-tower-defence-management [options]
14
+ Usage: github-issue-tower-defence-management [command] [options]
15
15
 
16
16
  CLI tool for GitHub Issue Tower Defence Management
17
17
 
18
- Options:
18
+ Commands:
19
+ schedule [options] Handle scheduled events (trigger: issue or schedule) (default)
20
+ startDaemon [options] Start daemon to prepare GitHub issues
21
+ notifyFinishedIssuePreparation [options] Notify that issue preparation is finished
22
+ help [command] display help for command
23
+
24
+ Options for schedule:
19
25
  -t, --trigger <type> Trigger type: issue or schedule
20
26
  -c, --config <path> Path to config YAML file
27
+ -v, --verbose Verbose output
21
28
  -i, --issue <url> GitHub Issue URL
22
- -h, --help display help for command
29
+
30
+ Options for startDaemon:
31
+ --configFilePath <path> Path to config file for tower defence management (required)
32
+ --projectUrl <url> GitHub project URL
33
+ --awaitingWorkspaceStatus <status> Status for issues awaiting workspace
34
+ --preparationStatus <status> Status for issues in preparation
35
+ --defaultAgentName <name> Default agent name
36
+ --logFilePath <path> Path to log file
37
+ --maximumPreparingIssuesCount <count> Maximum number of issues in preparation status (default: 6)
38
+ --allowIssueCacheMinutes <minutes> Allow cache for issues in minutes (default: 0)
39
+
40
+ Options for notifyFinishedIssuePreparation:
41
+ --configFilePath <path> Path to config file for tower defence management (required)
42
+ --issueUrl <url> GitHub issue URL (required)
43
+ --projectUrl <url> GitHub project URL
44
+ --preparationStatus <status> Status for issues in preparation
45
+ --awaitingWorkspaceStatus <status> Status for issues awaiting workspace
46
+ --awaitingQualityCheckStatus <status> Status for issues awaiting quality check
47
+ --thresholdForAutoReject <count> Threshold for auto-escalation after consecutive rejections (default: 3)
48
+ --workflowBlockerResolvedWebhookUrl <url> Webhook URL to notify when a workflow blocker issue status changes
23
49
  ```
24
50
 
25
51
  ## Example 📖
@@ -27,16 +53,26 @@ Options:
27
53
  Here's a quick example to illustrate its usage:
28
54
 
29
55
  ```
30
- npx github-issue-tower-defence-management -t schedule -c ./config.yml
56
+ npx github-issue-tower-defence-management schedule -t schedule -c ./config.yml
57
+ ```
58
+
59
+ ```
60
+ npx github-issue-tower-defence-management schedule -t issue -c ./config.yml -i https://github.com/HiromiShikata/test-repository/issues/1
31
61
  ```
32
62
 
33
63
  ```
34
- npx github-issue-tower-defence-management -t issue -c ./config.yml -i https://github.com/HiromiShikata/test-repository/issues/1
64
+ npx github-issue-tower-defence-management startDaemon --configFilePath ./preparator-config.yml
65
+ ```
66
+
67
+ ```
68
+ npx github-issue-tower-defence-management notifyFinishedIssuePreparation --configFilePath ./preparator-config.yml --issueUrl https://github.com/HiromiShikata/test-repository/issues/1
35
69
  ```
36
70
 
37
71
  ## Config
38
72
 
39
- The `config.yaml` must match the input type of `HandleScheduledEventUseCase.run()`. Below is the structure:
73
+ ### Schedule Command Config
74
+
75
+ The `config.yaml` for the `schedule` command must match the input type of `HandleScheduledEventUseCase.run()`. Below is the structure:
40
76
 
41
77
  ```yaml
42
78
  disabled: boolean # When true, skip all processing and return null
@@ -110,6 +146,44 @@ notifyFinishedPreparation:
110
146
  workflowBlockerResolvedWebhookUrl: 'https://example.com/webhook?url={URL}&msg={MESSAGE}'
111
147
  ```
112
148
 
149
+ ### startDaemon and notifyFinishedIssuePreparation Commands Config
150
+
151
+ The config YAML for `startDaemon` and `notifyFinishedIssuePreparation` commands:
152
+
153
+ ```yaml
154
+ projectUrl: string # URL of the GitHub project
155
+ projectName: string # Project name (used for cache directory path)
156
+ awaitingWorkspaceStatus: string # Status name for issues awaiting workspace
157
+ preparationStatus: string # Status name for issues in preparation
158
+ defaultAgentName: string # Default agent name for issue preparation
159
+ logFilePath?: string # Optional: Path to log file for preparation output
160
+ maximumPreparingIssuesCount?: number # Optional: Max concurrent preparing issues (null/omitted = 6)
161
+ allowIssueCacheMinutes?: number # Optional: Allow cache for issues in minutes (default: 0)
162
+ awaitingQualityCheckStatus: string # Status name for issues awaiting quality check
163
+ thresholdForAutoReject?: number # Optional: Consecutive rejections before escalation (default: 3)
164
+ workflowBlockerResolvedWebhookUrl?: string # Optional: Webhook URL. Supports {URL} and {MESSAGE} placeholders
165
+ ```
166
+
167
+ Example:
168
+
169
+ ```yaml
170
+ projectUrl: 'https://github.com/orgs/my-org/projects/1'
171
+ projectName: 'my-project'
172
+ awaitingWorkspaceStatus: 'Awaiting Workspace'
173
+ preparationStatus: 'Preparation'
174
+ defaultAgentName: 'umino-bot'
175
+ logFilePath: '/tmp/preparation.log'
176
+ maximumPreparingIssuesCount: 3
177
+ allowIssueCacheMinutes: 5
178
+ awaitingQualityCheckStatus: 'Awaiting Quality Check'
179
+ thresholdForAutoReject: 3
180
+ workflowBlockerResolvedWebhookUrl: 'https://example.com/webhook?url={URL}&msg={MESSAGE}'
181
+ ```
182
+
183
+ #### README-based Config Overrides
184
+
185
+ For `startDaemon` and `notifyFinishedIssuePreparation`, the GitHub project README can override config file values. Add a `<details><summary>config</summary>...</details>` section with YAML content to the project README. This takes highest priority over both the config file and CLI arguments.
186
+
113
187
  ### Slack User Token
114
188
 
115
189
  #### scope
@@ -1,12 +1,228 @@
1
1
  #!/usr/bin/env node
2
2
  "use strict";
3
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
4
+ if (k2 === undefined) k2 = k;
5
+ var desc = Object.getOwnPropertyDescriptor(m, k);
6
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
7
+ desc = { enumerable: true, get: function() { return m[k]; } };
8
+ }
9
+ Object.defineProperty(o, k2, desc);
10
+ }) : (function(o, m, k, k2) {
11
+ if (k2 === undefined) k2 = k;
12
+ o[k2] = m[k];
13
+ }));
14
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
15
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
16
+ }) : function(o, v) {
17
+ o["default"] = v;
18
+ });
19
+ var __importStar = (this && this.__importStar) || function (mod) {
20
+ if (mod && mod.__esModule) return mod;
21
+ var result = {};
22
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
23
+ __setModuleDefault(result, mod);
24
+ return result;
25
+ };
26
+ var __importDefault = (this && this.__importDefault) || function (mod) {
27
+ return (mod && mod.__esModule) ? mod : { "default": mod };
28
+ };
3
29
  Object.defineProperty(exports, "__esModule", { value: true });
30
+ exports.program = exports.fetchProjectReadme = exports.mergeConfigs = exports.parseProjectReadmeConfig = exports.loadConfigFile = void 0;
31
+ const yaml_1 = __importDefault(require("yaml"));
4
32
  const commander_1 = require("commander");
33
+ const fs = __importStar(require("fs"));
5
34
  const HandleScheduledEventUseCaseHandler_1 = require("../handlers/HandleScheduledEventUseCaseHandler");
6
- const program = new commander_1.Command();
7
- program
35
+ const StartPreparationUseCase_1 = require("../../../domain/usecases/StartPreparationUseCase");
36
+ const NotifyFinishedIssuePreparationUseCase_1 = require("../../../domain/usecases/NotifyFinishedIssuePreparationUseCase");
37
+ const LocalStorageRepository_1 = require("../../repositories/LocalStorageRepository");
38
+ const GraphqlProjectRepository_1 = require("../../repositories/GraphqlProjectRepository");
39
+ const ApiV3IssueRepository_1 = require("../../repositories/issue/ApiV3IssueRepository");
40
+ const RestIssueRepository_1 = require("../../repositories/issue/RestIssueRepository");
41
+ const GraphqlProjectItemRepository_1 = require("../../repositories/issue/GraphqlProjectItemRepository");
42
+ const ApiV3CheerioRestIssueRepository_1 = require("../../repositories/issue/ApiV3CheerioRestIssueRepository");
43
+ const LocalStorageCacheRepository_1 = require("../../repositories/LocalStorageCacheRepository");
44
+ const CheerioProjectRepository_1 = require("../../repositories/CheerioProjectRepository");
45
+ const NodeLocalCommandRunner_1 = require("../../repositories/NodeLocalCommandRunner");
46
+ const OauthAPIClaudeRepository_1 = require("../../repositories/OauthAPIClaudeRepository");
47
+ const GitHubIssueCommentRepository_1 = require("../../repositories/GitHubIssueCommentRepository");
48
+ const FetchWebhookRepository_1 = require("../../repositories/FetchWebhookRepository");
49
+ const getStringValue = (obj, key) => {
50
+ const value = obj[key];
51
+ return typeof value === 'string' ? value : undefined;
52
+ };
53
+ const getNumberValue = (obj, key) => {
54
+ const value = obj[key];
55
+ return typeof value === 'number' ? value : undefined;
56
+ };
57
+ const isRecord = (value) => typeof value === 'object' && value !== null && !Array.isArray(value);
58
+ const loadConfigFile = (configFilePath) => {
59
+ try {
60
+ const content = fs.readFileSync(configFilePath, 'utf-8');
61
+ const parsed = yaml_1.default.parse(content);
62
+ if (!isRecord(parsed)) {
63
+ return {};
64
+ }
65
+ return {
66
+ projectUrl: getStringValue(parsed, 'projectUrl'),
67
+ awaitingWorkspaceStatus: getStringValue(parsed, 'awaitingWorkspaceStatus'),
68
+ preparationStatus: getStringValue(parsed, 'preparationStatus'),
69
+ defaultAgentName: getStringValue(parsed, 'defaultAgentName'),
70
+ logFilePath: getStringValue(parsed, 'logFilePath'),
71
+ maximumPreparingIssuesCount: getNumberValue(parsed, 'maximumPreparingIssuesCount'),
72
+ allowIssueCacheMinutes: getNumberValue(parsed, 'allowIssueCacheMinutes'),
73
+ awaitingQualityCheckStatus: getStringValue(parsed, 'awaitingQualityCheckStatus'),
74
+ thresholdForAutoReject: getNumberValue(parsed, 'thresholdForAutoReject'),
75
+ workflowBlockerResolvedWebhookUrl: getStringValue(parsed, 'workflowBlockerResolvedWebhookUrl'),
76
+ projectName: getStringValue(parsed, 'projectName'),
77
+ };
78
+ }
79
+ catch (error) {
80
+ const message = error instanceof Error ? error.message : String(error);
81
+ console.error(`Failed to load configuration file "${configFilePath}": ${message}`);
82
+ process.exit(1);
83
+ }
84
+ };
85
+ exports.loadConfigFile = loadConfigFile;
86
+ const parseProjectReadmeConfig = (readme) => {
87
+ const detailsRegex = /<details>\s*<summary>config<\/summary>([\s\S]*?)<\/details>/i;
88
+ const match = detailsRegex.exec(readme);
89
+ if (!match) {
90
+ return {};
91
+ }
92
+ const yamlContent = match[1].trim();
93
+ if (!yamlContent) {
94
+ return {};
95
+ }
96
+ try {
97
+ const parsed = yaml_1.default.parse(yamlContent);
98
+ if (!isRecord(parsed)) {
99
+ return {};
100
+ }
101
+ return {
102
+ awaitingWorkspaceStatus: getStringValue(parsed, 'awaitingWorkspaceStatus'),
103
+ preparationStatus: getStringValue(parsed, 'preparationStatus'),
104
+ defaultAgentName: getStringValue(parsed, 'defaultAgentName'),
105
+ logFilePath: getStringValue(parsed, 'logFilePath'),
106
+ maximumPreparingIssuesCount: getNumberValue(parsed, 'maximumPreparingIssuesCount'),
107
+ allowIssueCacheMinutes: getNumberValue(parsed, 'allowIssueCacheMinutes'),
108
+ awaitingQualityCheckStatus: getStringValue(parsed, 'awaitingQualityCheckStatus'),
109
+ thresholdForAutoReject: getNumberValue(parsed, 'thresholdForAutoReject'),
110
+ workflowBlockerResolvedWebhookUrl: getStringValue(parsed, 'workflowBlockerResolvedWebhookUrl'),
111
+ };
112
+ }
113
+ catch {
114
+ console.warn('Failed to parse YAML from project README config section');
115
+ return {};
116
+ }
117
+ };
118
+ exports.parseProjectReadmeConfig = parseProjectReadmeConfig;
119
+ const mergeConfigs = (configFile, cliOverrides, readmeOverrides) => ({
120
+ projectUrl: cliOverrides.projectUrl ?? configFile.projectUrl,
121
+ awaitingWorkspaceStatus: readmeOverrides.awaitingWorkspaceStatus ??
122
+ cliOverrides.awaitingWorkspaceStatus ??
123
+ configFile.awaitingWorkspaceStatus,
124
+ preparationStatus: readmeOverrides.preparationStatus ??
125
+ cliOverrides.preparationStatus ??
126
+ configFile.preparationStatus,
127
+ defaultAgentName: readmeOverrides.defaultAgentName ??
128
+ cliOverrides.defaultAgentName ??
129
+ configFile.defaultAgentName,
130
+ logFilePath: readmeOverrides.logFilePath ??
131
+ cliOverrides.logFilePath ??
132
+ configFile.logFilePath,
133
+ maximumPreparingIssuesCount: readmeOverrides.maximumPreparingIssuesCount ??
134
+ cliOverrides.maximumPreparingIssuesCount ??
135
+ configFile.maximumPreparingIssuesCount,
136
+ allowIssueCacheMinutes: readmeOverrides.allowIssueCacheMinutes ??
137
+ cliOverrides.allowIssueCacheMinutes ??
138
+ configFile.allowIssueCacheMinutes,
139
+ awaitingQualityCheckStatus: readmeOverrides.awaitingQualityCheckStatus ??
140
+ cliOverrides.awaitingQualityCheckStatus ??
141
+ configFile.awaitingQualityCheckStatus,
142
+ thresholdForAutoReject: readmeOverrides.thresholdForAutoReject ??
143
+ cliOverrides.thresholdForAutoReject ??
144
+ configFile.thresholdForAutoReject,
145
+ workflowBlockerResolvedWebhookUrl: readmeOverrides.workflowBlockerResolvedWebhookUrl ??
146
+ cliOverrides.workflowBlockerResolvedWebhookUrl ??
147
+ configFile.workflowBlockerResolvedWebhookUrl,
148
+ projectName: configFile.projectName,
149
+ });
150
+ exports.mergeConfigs = mergeConfigs;
151
+ const isGraphqlProjectV2ReadmeResponse = (value) => {
152
+ if (!isRecord(value))
153
+ return false;
154
+ const data = value['data'];
155
+ if (data !== undefined && !isRecord(data))
156
+ return false;
157
+ return true;
158
+ };
159
+ const fetchProjectReadme = async (projectUrl, token) => {
160
+ try {
161
+ const urlParts = projectUrl.split('/');
162
+ const projectNumber = parseInt(urlParts[urlParts.length - 1], 10);
163
+ const owner = urlParts[urlParts.length - 3];
164
+ const query = `
165
+ query($owner: String!, $number: Int!) {
166
+ organization(login: $owner) {
167
+ projectV2(number: $number) {
168
+ readme
169
+ }
170
+ }
171
+ user(login: $owner) {
172
+ projectV2(number: $number) {
173
+ readme
174
+ }
175
+ }
176
+ }
177
+ `;
178
+ const response = await fetch('https://api.github.com/graphql', {
179
+ method: 'POST',
180
+ headers: {
181
+ Authorization: `Bearer ${token}`,
182
+ 'Content-Type': 'application/json',
183
+ },
184
+ body: JSON.stringify({
185
+ query,
186
+ variables: { owner, number: projectNumber },
187
+ }),
188
+ });
189
+ if (!response.ok) {
190
+ throw new Error(`GraphQL request failed: ${response.status}`);
191
+ }
192
+ const responseData = await response.json();
193
+ if (!isGraphqlProjectV2ReadmeResponse(responseData)) {
194
+ return null;
195
+ }
196
+ const orgReadme = responseData.data?.organization?.projectV2?.readme;
197
+ const userReadme = responseData.data?.user?.projectV2?.readme;
198
+ const readme = typeof orgReadme === 'string'
199
+ ? orgReadme
200
+ : typeof userReadme === 'string'
201
+ ? userReadme
202
+ : null;
203
+ return readme;
204
+ }
205
+ catch {
206
+ console.warn('Failed to fetch project README');
207
+ return null;
208
+ }
209
+ };
210
+ exports.fetchProjectReadme = fetchProjectReadme;
211
+ const buildGithubRepositoryParams = (localStorageRepository, cachePath, token) => [
212
+ localStorageRepository,
213
+ `${cachePath}/github.com.cookies.json`,
214
+ token,
215
+ undefined,
216
+ undefined,
217
+ undefined,
218
+ ];
219
+ exports.program = new commander_1.Command();
220
+ exports.program
8
221
  .name('github-issue-tower-defence-management')
9
- .description('CLI tool for GitHub Issue Tower Defence Management')
222
+ .description('CLI tool for GitHub Issue Tower Defence Management');
223
+ exports.program
224
+ .command('schedule', { isDefault: true })
225
+ .description('Handle scheduled events (trigger: issue or schedule)')
10
226
  .requiredOption('-t, --trigger <type>', 'Trigger type: issue or schedule', /^(issue|schedule)$/i)
11
227
  .requiredOption('-c, --config <path>', 'Path to config YAML file')
12
228
  .option('-v, --verbose', 'Verbose output')
@@ -21,7 +237,208 @@ program
21
237
  await handler.handle(options.config, options.verbose);
22
238
  }
23
239
  });
24
- if (process.argv) {
25
- program.parse(process.argv);
240
+ exports.program
241
+ .command('startDaemon')
242
+ .description('Start daemon to prepare GitHub issues')
243
+ .requiredOption('--configFilePath <path>', 'Path to config file for tower defence management')
244
+ .option('--projectUrl <url>', 'GitHub project URL')
245
+ .option('--awaitingWorkspaceStatus <status>', 'Status for issues awaiting workspace')
246
+ .option('--preparationStatus <status>', 'Status for issues in preparation')
247
+ .option('--defaultAgentName <name>', 'Default agent name')
248
+ .option('--logFilePath <path>', 'Path to log file')
249
+ .option('--maximumPreparingIssuesCount <count>', 'Maximum number of issues in preparation status (default: 6)')
250
+ .option('--allowIssueCacheMinutes <minutes>', 'Allow cache for issues in minutes (default: 0)')
251
+ .action(async (options) => {
252
+ const token = process.env.GH_TOKEN;
253
+ if (!token) {
254
+ console.error('GH_TOKEN environment variable is required');
255
+ process.exit(1);
256
+ }
257
+ const configFileValues = (0, exports.loadConfigFile)(options.configFilePath);
258
+ const cliOverrides = {
259
+ projectUrl: options.projectUrl,
260
+ awaitingWorkspaceStatus: options.awaitingWorkspaceStatus,
261
+ preparationStatus: options.preparationStatus,
262
+ defaultAgentName: options.defaultAgentName,
263
+ logFilePath: options.logFilePath,
264
+ maximumPreparingIssuesCount: options.maximumPreparingIssuesCount
265
+ ? Number(options.maximumPreparingIssuesCount)
266
+ : undefined,
267
+ allowIssueCacheMinutes: options.allowIssueCacheMinutes
268
+ ? Number(options.allowIssueCacheMinutes)
269
+ : undefined,
270
+ };
271
+ const tempProjectUrl = cliOverrides.projectUrl ?? configFileValues.projectUrl;
272
+ let readmeOverrides = {};
273
+ if (tempProjectUrl) {
274
+ const readme = await (0, exports.fetchProjectReadme)(tempProjectUrl, token);
275
+ if (readme) {
276
+ readmeOverrides = (0, exports.parseProjectReadmeConfig)(readme);
277
+ }
278
+ }
279
+ const config = (0, exports.mergeConfigs)(configFileValues, cliOverrides, readmeOverrides);
280
+ const projectUrl = config.projectUrl;
281
+ const awaitingWorkspaceStatus = config.awaitingWorkspaceStatus;
282
+ const preparationStatus = config.preparationStatus;
283
+ const defaultAgentName = config.defaultAgentName;
284
+ const logFilePath = config.logFilePath;
285
+ if (!projectUrl) {
286
+ console.error('projectUrl is required. Provide via --projectUrl, config file, or project README.');
287
+ process.exit(1);
288
+ }
289
+ if (!awaitingWorkspaceStatus) {
290
+ console.error('awaitingWorkspaceStatus is required. Provide via --awaitingWorkspaceStatus, config file, or project README.');
291
+ process.exit(1);
292
+ }
293
+ if (!preparationStatus) {
294
+ console.error('preparationStatus is required. Provide via --preparationStatus, config file, or project README.');
295
+ process.exit(1);
296
+ }
297
+ if (!defaultAgentName) {
298
+ console.error('defaultAgentName is required. Provide via --defaultAgentName, config file, or project README.');
299
+ process.exit(1);
300
+ }
301
+ let maximumPreparingIssuesCount = null;
302
+ const rawMaxCount = config.maximumPreparingIssuesCount;
303
+ if (rawMaxCount !== undefined) {
304
+ const parsedCount = Number(rawMaxCount);
305
+ if (!Number.isFinite(parsedCount) ||
306
+ !Number.isInteger(parsedCount) ||
307
+ parsedCount <= 0) {
308
+ console.error('Invalid value for --maximumPreparingIssuesCount. It must be a positive integer.');
309
+ process.exit(1);
310
+ }
311
+ maximumPreparingIssuesCount = parsedCount;
312
+ }
313
+ const allowIssueCacheMinutes = config.allowIssueCacheMinutes ?? 0;
314
+ console.log(`maximumPreparingIssuesCount: ${maximumPreparingIssuesCount ?? 'null (default: 6)'}`);
315
+ const projectName = config.projectName ?? 'default';
316
+ const localStorageRepository = new LocalStorageRepository_1.LocalStorageRepository();
317
+ const cachePath = `./tmp/cache/${projectName}`;
318
+ const localStorageCacheRepository = new LocalStorageCacheRepository_1.LocalStorageCacheRepository(localStorageRepository, cachePath);
319
+ const githubRepositoryParams = buildGithubRepositoryParams(localStorageRepository, cachePath, token);
320
+ const projectRepository = {
321
+ ...new GraphqlProjectRepository_1.GraphqlProjectRepository(...githubRepositoryParams),
322
+ ...new CheerioProjectRepository_1.CheerioProjectRepository(...githubRepositoryParams),
323
+ };
324
+ const apiV3IssueRepository = new ApiV3IssueRepository_1.ApiV3IssueRepository(...githubRepositoryParams);
325
+ const restIssueRepository = new RestIssueRepository_1.RestIssueRepository(...githubRepositoryParams);
326
+ const graphqlProjectItemRepository = new GraphqlProjectItemRepository_1.GraphqlProjectItemRepository(...githubRepositoryParams);
327
+ const issueRepository = new ApiV3CheerioRestIssueRepository_1.ApiV3CheerioRestIssueRepository(apiV3IssueRepository, restIssueRepository, graphqlProjectItemRepository, localStorageCacheRepository, ...githubRepositoryParams);
328
+ const claudeRepository = new OauthAPIClaudeRepository_1.OauthAPIClaudeRepository();
329
+ const localCommandRunner = new NodeLocalCommandRunner_1.NodeLocalCommandRunner();
330
+ const useCase = new StartPreparationUseCase_1.StartPreparationUseCase(projectRepository, issueRepository, claudeRepository, localCommandRunner);
331
+ await useCase.run({
332
+ projectUrl,
333
+ awaitingWorkspaceStatus,
334
+ preparationStatus,
335
+ defaultAgentName,
336
+ logFilePath: logFilePath ?? undefined,
337
+ maximumPreparingIssuesCount,
338
+ allowIssueCacheMinutes,
339
+ });
340
+ });
341
+ exports.program
342
+ .command('notifyFinishedIssuePreparation')
343
+ .description('Notify that issue preparation is finished')
344
+ .requiredOption('--configFilePath <path>', 'Path to config file for tower defence management')
345
+ .requiredOption('--issueUrl <url>', 'GitHub issue URL')
346
+ .option('--projectUrl <url>', 'GitHub project URL')
347
+ .option('--preparationStatus <status>', 'Status for issues in preparation')
348
+ .option('--awaitingWorkspaceStatus <status>', 'Status for issues awaiting workspace')
349
+ .option('--awaitingQualityCheckStatus <status>', 'Status for issues awaiting quality check')
350
+ .option('--thresholdForAutoReject <count>', 'Threshold for auto-escalation after consecutive rejections (default: 3)')
351
+ .option('--workflowBlockerResolvedWebhookUrl <url>', 'Webhook URL to notify when a workflow blocker issue status changes to awaiting quality check. Supports {URL} and {MESSAGE} placeholders.')
352
+ .action(async (options) => {
353
+ const token = process.env.GH_TOKEN;
354
+ if (!token) {
355
+ console.error('GH_TOKEN environment variable is required');
356
+ process.exit(1);
357
+ }
358
+ const configFileValues = (0, exports.loadConfigFile)(options.configFilePath);
359
+ const cliOverrides = {
360
+ projectUrl: options.projectUrl,
361
+ preparationStatus: options.preparationStatus,
362
+ awaitingWorkspaceStatus: options.awaitingWorkspaceStatus,
363
+ awaitingQualityCheckStatus: options.awaitingQualityCheckStatus,
364
+ thresholdForAutoReject: options.thresholdForAutoReject
365
+ ? Number(options.thresholdForAutoReject)
366
+ : undefined,
367
+ workflowBlockerResolvedWebhookUrl: options.workflowBlockerResolvedWebhookUrl,
368
+ };
369
+ const tempProjectUrl = cliOverrides.projectUrl ?? configFileValues.projectUrl;
370
+ let readmeOverrides = {};
371
+ if (tempProjectUrl) {
372
+ const readme = await (0, exports.fetchProjectReadme)(tempProjectUrl, token);
373
+ if (readme) {
374
+ readmeOverrides = (0, exports.parseProjectReadmeConfig)(readme);
375
+ }
376
+ }
377
+ const config = (0, exports.mergeConfigs)(configFileValues, cliOverrides, readmeOverrides);
378
+ const projectUrl = config.projectUrl;
379
+ const preparationStatus = config.preparationStatus;
380
+ const awaitingWorkspaceStatus = config.awaitingWorkspaceStatus;
381
+ const awaitingQualityCheckStatus = config.awaitingQualityCheckStatus;
382
+ if (!projectUrl) {
383
+ console.error('projectUrl is required. Provide via --projectUrl, config file, or project README.');
384
+ process.exit(1);
385
+ }
386
+ if (!preparationStatus) {
387
+ console.error('preparationStatus is required. Provide via --preparationStatus, config file, or project README.');
388
+ process.exit(1);
389
+ }
390
+ if (!awaitingWorkspaceStatus) {
391
+ console.error('awaitingWorkspaceStatus is required. Provide via --awaitingWorkspaceStatus, config file, or project README.');
392
+ process.exit(1);
393
+ }
394
+ if (!awaitingQualityCheckStatus) {
395
+ console.error('awaitingQualityCheckStatus is required. Provide via --awaitingQualityCheckStatus, config file, or project README.');
396
+ process.exit(1);
397
+ }
398
+ let thresholdForAutoReject = 3;
399
+ const rawThreshold = config.thresholdForAutoReject;
400
+ if (rawThreshold !== undefined) {
401
+ const parsed = Number(rawThreshold);
402
+ if (!Number.isFinite(parsed) ||
403
+ !Number.isInteger(parsed) ||
404
+ parsed <= 0) {
405
+ console.error('Invalid value for --thresholdForAutoReject. It must be a positive integer.');
406
+ process.exit(1);
407
+ }
408
+ thresholdForAutoReject = parsed;
409
+ }
410
+ const workflowBlockerResolvedWebhookUrl = config.workflowBlockerResolvedWebhookUrl ?? null;
411
+ const projectName = config.projectName ?? 'default';
412
+ const localStorageRepository = new LocalStorageRepository_1.LocalStorageRepository();
413
+ const cachePath = `./tmp/cache/${projectName}`;
414
+ const localStorageCacheRepository = new LocalStorageCacheRepository_1.LocalStorageCacheRepository(localStorageRepository, cachePath);
415
+ const githubRepositoryParams = buildGithubRepositoryParams(localStorageRepository, cachePath, token);
416
+ const projectRepository = {
417
+ ...new GraphqlProjectRepository_1.GraphqlProjectRepository(...githubRepositoryParams),
418
+ ...new CheerioProjectRepository_1.CheerioProjectRepository(...githubRepositoryParams),
419
+ prepareStatus: async (_name, project) => {
420
+ return project;
421
+ },
422
+ };
423
+ const apiV3IssueRepository = new ApiV3IssueRepository_1.ApiV3IssueRepository(...githubRepositoryParams);
424
+ const restIssueRepository = new RestIssueRepository_1.RestIssueRepository(...githubRepositoryParams);
425
+ const graphqlProjectItemRepository = new GraphqlProjectItemRepository_1.GraphqlProjectItemRepository(...githubRepositoryParams);
426
+ const issueRepository = new ApiV3CheerioRestIssueRepository_1.ApiV3CheerioRestIssueRepository(apiV3IssueRepository, restIssueRepository, graphqlProjectItemRepository, localStorageCacheRepository, ...githubRepositoryParams);
427
+ const issueCommentRepository = new GitHubIssueCommentRepository_1.GitHubIssueCommentRepository(token);
428
+ const webhookRepository = new FetchWebhookRepository_1.FetchWebhookRepository();
429
+ const useCase = new NotifyFinishedIssuePreparationUseCase_1.NotifyFinishedIssuePreparationUseCase(projectRepository, issueRepository, issueCommentRepository, webhookRepository);
430
+ await useCase.run({
431
+ projectUrl,
432
+ issueUrl: options.issueUrl,
433
+ preparationStatus,
434
+ awaitingWorkspaceStatus,
435
+ awaitingQualityCheckStatus,
436
+ thresholdForAutoReject,
437
+ workflowBlockerResolvedWebhookUrl,
438
+ });
439
+ });
440
+ /* istanbul ignore next */
441
+ if (process.argv && require.main === module) {
442
+ exports.program.parse(process.argv);
26
443
  }
27
444
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/adapter/entry-points/cli/index.ts"],"names":[],"mappings":";;;AACA,yCAAoC;AACpC,uGAAoG;AAEpG,MAAM,OAAO,GAAG,IAAI,mBAAO,EAAE,CAAC;AAS9B,OAAO;KACJ,IAAI,CAAC,uCAAuC,CAAC;KAC7C,WAAW,CAAC,oDAAoD,CAAC;KACjE,cAAc,CACb,sBAAsB,EACtB,iCAAiC,EACjC,qBAAqB,CACtB;KACA,cAAc,CAAC,qBAAqB,EAAE,0BAA0B,CAAC;KACjE,MAAM,CAAC,eAAe,EAAE,gBAAgB,CAAC;KACzC,MAAM,CAAC,mBAAmB,EAAE,kBAAkB,CAAC;KAC/C,MAAM,CAAC,KAAK,EAAE,OAAgB,EAAE,EAAE;IACjC,IAAI,OAAO,CAAC,OAAO,KAAK,OAAO,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;QAClD,OAAO,CAAC,KAAK,CAAC,oDAAoD,CAAC,CAAC;QACpE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IACD,IAAI,OAAO,CAAC,OAAO,KAAK,UAAU,EAAE,CAAC;QACnC,MAAM,OAAO,GAAG,IAAI,uEAAkC,EAAE,CAAC;QACzD,MAAM,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC;IACxD,CAAC;AACH,CAAC,CAAC,CAAC;AAEL,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;IACjB,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;AAC9B,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/adapter/entry-points/cli/index.ts"],"names":[],"mappings":"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"}