millhouse 0.1.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/LICENSE +8 -0
- package/README.md +248 -0
- package/commands/millhouse.md +223 -0
- package/dist/analysis/graph-builder.d.ts +42 -0
- package/dist/analysis/graph-builder.d.ts.map +1 -0
- package/dist/analysis/graph-builder.js +98 -0
- package/dist/analysis/graph-builder.js.map +1 -0
- package/dist/analysis/issue-analyzer.d.ts +20 -0
- package/dist/analysis/issue-analyzer.d.ts.map +1 -0
- package/dist/analysis/issue-analyzer.js +167 -0
- package/dist/analysis/issue-analyzer.js.map +1 -0
- package/dist/analysis/plan-parser.d.ts +8 -0
- package/dist/analysis/plan-parser.d.ts.map +1 -0
- package/dist/analysis/plan-parser.js +112 -0
- package/dist/analysis/plan-parser.js.map +1 -0
- package/dist/cli/cleanup.d.ts +20 -0
- package/dist/cli/cleanup.d.ts.map +1 -0
- package/dist/cli/cleanup.js +186 -0
- package/dist/cli/cleanup.js.map +1 -0
- package/dist/cli/commands/clean.d.ts +2 -0
- package/dist/cli/commands/clean.d.ts.map +1 -0
- package/dist/cli/commands/clean.js +16 -0
- package/dist/cli/commands/clean.js.map +1 -0
- package/dist/cli/commands/resume.d.ts +2 -0
- package/dist/cli/commands/resume.d.ts.map +1 -0
- package/dist/cli/commands/resume.js +82 -0
- package/dist/cli/commands/resume.js.map +1 -0
- package/dist/cli/commands/run.d.ts +10 -0
- package/dist/cli/commands/run.d.ts.map +1 -0
- package/dist/cli/commands/run.js +352 -0
- package/dist/cli/commands/run.js.map +1 -0
- package/dist/cli/commands/setup.d.ts +6 -0
- package/dist/cli/commands/setup.d.ts.map +1 -0
- package/dist/cli/commands/setup.js +74 -0
- package/dist/cli/commands/setup.js.map +1 -0
- package/dist/cli/commands/status.d.ts +7 -0
- package/dist/cli/commands/status.d.ts.map +1 -0
- package/dist/cli/commands/status.js +83 -0
- package/dist/cli/commands/status.js.map +1 -0
- package/dist/cli/progress-display.d.ts +93 -0
- package/dist/cli/progress-display.d.ts.map +1 -0
- package/dist/cli/progress-display.js +318 -0
- package/dist/cli/progress-display.js.map +1 -0
- package/dist/core/orchestrator.d.ts +79 -0
- package/dist/core/orchestrator.d.ts.map +1 -0
- package/dist/core/orchestrator.js +389 -0
- package/dist/core/orchestrator.js.map +1 -0
- package/dist/core/scheduler.d.ts +72 -0
- package/dist/core/scheduler.d.ts.map +1 -0
- package/dist/core/scheduler.js +234 -0
- package/dist/core/scheduler.js.map +1 -0
- package/dist/execution/claude-runner.d.ts +41 -0
- package/dist/execution/claude-runner.d.ts.map +1 -0
- package/dist/execution/claude-runner.js +241 -0
- package/dist/execution/claude-runner.js.map +1 -0
- package/dist/execution/worktree-manager.d.ts +52 -0
- package/dist/execution/worktree-manager.d.ts.map +1 -0
- package/dist/execution/worktree-manager.js +208 -0
- package/dist/execution/worktree-manager.js.map +1 -0
- package/dist/github/client.d.ts +27 -0
- package/dist/github/client.d.ts.map +1 -0
- package/dist/github/client.js +178 -0
- package/dist/github/client.js.map +1 -0
- package/dist/github/issue-discoverer.d.ts +20 -0
- package/dist/github/issue-discoverer.d.ts.map +1 -0
- package/dist/github/issue-discoverer.js +83 -0
- package/dist/github/issue-discoverer.js.map +1 -0
- package/dist/github/label-manager.d.ts +44 -0
- package/dist/github/label-manager.d.ts.map +1 -0
- package/dist/github/label-manager.js +93 -0
- package/dist/github/label-manager.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +54 -0
- package/dist/index.js.map +1 -0
- package/dist/storage/config.d.ts +4 -0
- package/dist/storage/config.d.ts.map +1 -0
- package/dist/storage/config.js +25 -0
- package/dist/storage/config.js.map +1 -0
- package/dist/storage/json-store.d.ts +20 -0
- package/dist/storage/json-store.d.ts.map +1 -0
- package/dist/storage/json-store.js +92 -0
- package/dist/storage/json-store.js.map +1 -0
- package/dist/types.d.ts +142 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +36 -0
- package/dist/types.js.map +1 -0
- package/package.json +60 -0
|
@@ -0,0 +1,389 @@
|
|
|
1
|
+
import chalk from 'chalk';
|
|
2
|
+
export class Orchestrator {
|
|
3
|
+
config;
|
|
4
|
+
store;
|
|
5
|
+
graphBuilder;
|
|
6
|
+
worktreeManager;
|
|
7
|
+
claudeRunner;
|
|
8
|
+
scheduler;
|
|
9
|
+
// GitHub-specific (optional for local mode)
|
|
10
|
+
githubClient;
|
|
11
|
+
labelManager;
|
|
12
|
+
issueDiscoverer;
|
|
13
|
+
issueAnalyzer;
|
|
14
|
+
progressDisplay;
|
|
15
|
+
runState = null;
|
|
16
|
+
graph = null;
|
|
17
|
+
isShuttingDown = false;
|
|
18
|
+
originalBranch = null;
|
|
19
|
+
constructor(options) {
|
|
20
|
+
this.config = options.config;
|
|
21
|
+
this.store = options.store;
|
|
22
|
+
this.graphBuilder = options.graphBuilder;
|
|
23
|
+
this.worktreeManager = options.worktreeManager;
|
|
24
|
+
this.claudeRunner = options.claudeRunner;
|
|
25
|
+
this.scheduler = options.scheduler;
|
|
26
|
+
// GitHub-specific
|
|
27
|
+
this.githubClient = options.githubClient;
|
|
28
|
+
this.labelManager = options.labelManager;
|
|
29
|
+
this.issueDiscoverer = options.issueDiscoverer;
|
|
30
|
+
this.issueAnalyzer = options.issueAnalyzer;
|
|
31
|
+
this.progressDisplay = options.progressDisplay;
|
|
32
|
+
// Handle graceful shutdown
|
|
33
|
+
this.setupShutdownHandlers();
|
|
34
|
+
}
|
|
35
|
+
setupShutdownHandlers() {
|
|
36
|
+
const shutdown = async () => {
|
|
37
|
+
if (this.isShuttingDown)
|
|
38
|
+
return;
|
|
39
|
+
this.isShuttingDown = true;
|
|
40
|
+
console.log(chalk.yellow('\n\n⚠️ Graceful shutdown initiated...'));
|
|
41
|
+
if (this.runState) {
|
|
42
|
+
this.runState.status = 'interrupted';
|
|
43
|
+
this.runState.updatedAt = new Date().toISOString();
|
|
44
|
+
await this.store.saveRun(this.runState);
|
|
45
|
+
console.log(chalk.yellow(` Run saved. Resume with: millhouse resume ${this.runState.id}`));
|
|
46
|
+
}
|
|
47
|
+
// Restore original branch
|
|
48
|
+
if (this.originalBranch) {
|
|
49
|
+
console.log(chalk.yellow(` Restoring branch: ${this.originalBranch}`));
|
|
50
|
+
await this.worktreeManager.restoreBranch(this.originalBranch);
|
|
51
|
+
}
|
|
52
|
+
process.exit(0);
|
|
53
|
+
};
|
|
54
|
+
process.on('SIGINT', shutdown);
|
|
55
|
+
process.on('SIGTERM', shutdown);
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Discover all issues starting from the given issue numbers.
|
|
59
|
+
* Only available in GitHub mode.
|
|
60
|
+
*/
|
|
61
|
+
async discoverIssues(issueNumbers, recursive) {
|
|
62
|
+
if (!this.issueDiscoverer) {
|
|
63
|
+
throw new Error('discoverIssues is only available in GitHub mode');
|
|
64
|
+
}
|
|
65
|
+
return this.issueDiscoverer.discover(issueNumbers, recursive);
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Analyze issues for dependencies.
|
|
69
|
+
* Only available in GitHub mode.
|
|
70
|
+
*/
|
|
71
|
+
async analyzeIssues(issues) {
|
|
72
|
+
if (!this.issueAnalyzer) {
|
|
73
|
+
throw new Error('analyzeIssues is only available in GitHub mode');
|
|
74
|
+
}
|
|
75
|
+
return this.issueAnalyzer.analyzeIssues(issues);
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Run the full orchestration pipeline.
|
|
79
|
+
*/
|
|
80
|
+
async run(analyzedIssues) {
|
|
81
|
+
// Save original branch to restore later
|
|
82
|
+
this.originalBranch = await this.worktreeManager.getCurrentBranch();
|
|
83
|
+
// Create run state
|
|
84
|
+
const runId = this.store.generateRunId();
|
|
85
|
+
const baseBranch = this.config.execution.baseBranch;
|
|
86
|
+
// Build dependency graph
|
|
87
|
+
this.graph = this.graphBuilder.build(analyzedIssues);
|
|
88
|
+
// Check for cycles
|
|
89
|
+
if (!this.graph.isAcyclic()) {
|
|
90
|
+
const cycles = this.graph.getCycles();
|
|
91
|
+
throw new Error(`Circular dependencies detected: ${cycles.map(c => c.map(n => `#${n}`).join(' → ')).join('; ')}`);
|
|
92
|
+
}
|
|
93
|
+
// Create run branch
|
|
94
|
+
console.log(chalk.blue(` Creating run branch: millhouse/run-${runId}`));
|
|
95
|
+
const runBranch = await this.worktreeManager.createRunBranch(runId, baseBranch);
|
|
96
|
+
// Initialize run state
|
|
97
|
+
this.runState = {
|
|
98
|
+
id: runId,
|
|
99
|
+
createdAt: new Date().toISOString(),
|
|
100
|
+
updatedAt: new Date().toISOString(),
|
|
101
|
+
status: 'running',
|
|
102
|
+
baseBranch,
|
|
103
|
+
runBranch,
|
|
104
|
+
issues: analyzedIssues,
|
|
105
|
+
tasks: analyzedIssues.map(issue => ({
|
|
106
|
+
issueNumber: issue.number,
|
|
107
|
+
status: 'queued',
|
|
108
|
+
})),
|
|
109
|
+
completedIssues: [],
|
|
110
|
+
failedIssues: [],
|
|
111
|
+
};
|
|
112
|
+
await this.store.saveRun(this.runState);
|
|
113
|
+
// GitHub-specific: manage labels
|
|
114
|
+
if (this.labelManager) {
|
|
115
|
+
await this.labelManager.ensureLabelsExist();
|
|
116
|
+
await this.labelManager.setStatusBatch(analyzedIssues.map(i => i.number), 'queued');
|
|
117
|
+
}
|
|
118
|
+
// Initialize progress display
|
|
119
|
+
if (this.progressDisplay) {
|
|
120
|
+
this.progressDisplay.initialize(analyzedIssues);
|
|
121
|
+
this.progressDisplay.start();
|
|
122
|
+
}
|
|
123
|
+
// Run the scheduler
|
|
124
|
+
try {
|
|
125
|
+
return await this.executeScheduler(runId, runBranch, analyzedIssues);
|
|
126
|
+
}
|
|
127
|
+
finally {
|
|
128
|
+
if (this.progressDisplay) {
|
|
129
|
+
this.progressDisplay.stop();
|
|
130
|
+
}
|
|
131
|
+
// Restore original branch
|
|
132
|
+
if (this.originalBranch) {
|
|
133
|
+
await this.worktreeManager.restoreBranch(this.originalBranch);
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
/**
|
|
138
|
+
* Resume an interrupted run.
|
|
139
|
+
*/
|
|
140
|
+
async resume(runState) {
|
|
141
|
+
// Save original branch to restore later
|
|
142
|
+
this.originalBranch = await this.worktreeManager.getCurrentBranch();
|
|
143
|
+
this.runState = runState;
|
|
144
|
+
// Rebuild graph from issues
|
|
145
|
+
this.graph = this.graphBuilder.build(runState.issues);
|
|
146
|
+
// Update status
|
|
147
|
+
this.runState.status = 'running';
|
|
148
|
+
this.runState.updatedAt = new Date().toISOString();
|
|
149
|
+
await this.store.saveRun(this.runState);
|
|
150
|
+
// Continue from where we left off
|
|
151
|
+
try {
|
|
152
|
+
return await this.executeScheduler(runState.id, runState.runBranch, runState.issues);
|
|
153
|
+
}
|
|
154
|
+
finally {
|
|
155
|
+
// Restore original branch
|
|
156
|
+
if (this.originalBranch) {
|
|
157
|
+
await this.worktreeManager.restoreBranch(this.originalBranch);
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
/**
|
|
162
|
+
* Execute the scheduler loop.
|
|
163
|
+
*/
|
|
164
|
+
async executeScheduler(runId, runBranch, issues) {
|
|
165
|
+
if (!this.runState || !this.graph) {
|
|
166
|
+
throw new Error('Run state not initialized');
|
|
167
|
+
}
|
|
168
|
+
const issueMap = new Map(issues.map(i => [i.number, i]));
|
|
169
|
+
// Initialize scheduler
|
|
170
|
+
this.scheduler.initialize(this.graph, this.runState.completedIssues, this.runState.failedIssues);
|
|
171
|
+
// Set up event handlers
|
|
172
|
+
this.scheduler.on('event', async (event) => {
|
|
173
|
+
await this.handleSchedulerEvent(event, runId, runBranch);
|
|
174
|
+
});
|
|
175
|
+
// Create task executor
|
|
176
|
+
const executor = async (issueNumber) => {
|
|
177
|
+
const issue = issueMap.get(issueNumber);
|
|
178
|
+
if (!issue) {
|
|
179
|
+
return { success: false, commits: [], error: 'Issue not found' };
|
|
180
|
+
}
|
|
181
|
+
try {
|
|
182
|
+
// Create worktree
|
|
183
|
+
if (this.progressDisplay) {
|
|
184
|
+
this.progressDisplay.logDetailed(issueNumber, 'Creating worktree...');
|
|
185
|
+
}
|
|
186
|
+
else {
|
|
187
|
+
console.log(chalk.blue(` Creating worktree for #${issueNumber}...`));
|
|
188
|
+
}
|
|
189
|
+
const worktree = await this.worktreeManager.createWorktree(runId, issueNumber, runBranch);
|
|
190
|
+
await this.store.saveWorktree(worktree);
|
|
191
|
+
// Run Claude
|
|
192
|
+
if (this.progressDisplay) {
|
|
193
|
+
this.progressDisplay.logDetailed(issueNumber, 'Running Claude...');
|
|
194
|
+
}
|
|
195
|
+
else {
|
|
196
|
+
console.log(chalk.blue(` Running Claude for #${issueNumber}...`));
|
|
197
|
+
}
|
|
198
|
+
const result = await this.claudeRunner.run(issue, runId, worktree.path);
|
|
199
|
+
if (result.success) {
|
|
200
|
+
// Merge changes back
|
|
201
|
+
if (this.progressDisplay) {
|
|
202
|
+
this.progressDisplay.logDetailed(issueNumber, 'Merging changes...');
|
|
203
|
+
}
|
|
204
|
+
else {
|
|
205
|
+
console.log(chalk.blue(` Merging changes for #${issueNumber}...`));
|
|
206
|
+
}
|
|
207
|
+
const mergeResult = await this.worktreeManager.mergeWorktree(worktree.path, runBranch);
|
|
208
|
+
if (!mergeResult.success) {
|
|
209
|
+
return {
|
|
210
|
+
success: false,
|
|
211
|
+
commits: result.commits,
|
|
212
|
+
error: mergeResult.error || 'Merge failed',
|
|
213
|
+
};
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
// Clean up worktree and its branch
|
|
217
|
+
await this.worktreeManager.removeWorktree(worktree.path, worktree.branch);
|
|
218
|
+
await this.store.removeWorktree(worktree.path);
|
|
219
|
+
return result;
|
|
220
|
+
}
|
|
221
|
+
catch (error) {
|
|
222
|
+
return {
|
|
223
|
+
success: false,
|
|
224
|
+
commits: [],
|
|
225
|
+
error: error instanceof Error ? error.message : String(error),
|
|
226
|
+
};
|
|
227
|
+
}
|
|
228
|
+
};
|
|
229
|
+
// Run scheduler
|
|
230
|
+
const { completed, failed } = await this.scheduler.run(executor);
|
|
231
|
+
// Update final state
|
|
232
|
+
this.runState.completedIssues = completed;
|
|
233
|
+
this.runState.failedIssues = failed;
|
|
234
|
+
this.runState.updatedAt = new Date().toISOString();
|
|
235
|
+
// Create PR if all completed (GitHub mode only)
|
|
236
|
+
if (failed.length === 0 && completed.length > 0) {
|
|
237
|
+
if (this.githubClient) {
|
|
238
|
+
try {
|
|
239
|
+
// Push run branch
|
|
240
|
+
console.log(chalk.blue(' Pushing changes...'));
|
|
241
|
+
await this.worktreeManager.pushRunBranch(runBranch);
|
|
242
|
+
// Create PR
|
|
243
|
+
console.log(chalk.blue(' Creating pull request...'));
|
|
244
|
+
const prUrl = await this.createFinalPR(runId, runBranch, issues, completed);
|
|
245
|
+
this.runState.pullRequestUrl = prUrl;
|
|
246
|
+
this.runState.status = 'completed';
|
|
247
|
+
}
|
|
248
|
+
catch (error) {
|
|
249
|
+
this.runState.error = error instanceof Error ? error.message : String(error);
|
|
250
|
+
this.runState.status = 'failed';
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
else {
|
|
254
|
+
// Local mode - just mark as completed
|
|
255
|
+
this.runState.status = 'completed';
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
else if (failed.length > 0) {
|
|
259
|
+
this.runState.status = 'failed';
|
|
260
|
+
this.runState.error = `${failed.length} issue(s) failed`;
|
|
261
|
+
}
|
|
262
|
+
else {
|
|
263
|
+
this.runState.status = 'completed';
|
|
264
|
+
}
|
|
265
|
+
await this.store.saveRun(this.runState);
|
|
266
|
+
return this.runState;
|
|
267
|
+
}
|
|
268
|
+
/**
|
|
269
|
+
* Handle scheduler events.
|
|
270
|
+
*/
|
|
271
|
+
async handleSchedulerEvent(event, _runId, _runBranch) {
|
|
272
|
+
if (!this.runState)
|
|
273
|
+
return;
|
|
274
|
+
switch (event.type) {
|
|
275
|
+
case 'task-started':
|
|
276
|
+
if (this.progressDisplay) {
|
|
277
|
+
this.progressDisplay.handleEvent({ type: 'issue-started', issueNumber: event.issueNumber });
|
|
278
|
+
}
|
|
279
|
+
else {
|
|
280
|
+
console.log(chalk.cyan(` ▶ Started: #${event.issueNumber}`));
|
|
281
|
+
}
|
|
282
|
+
if (this.labelManager) {
|
|
283
|
+
await this.labelManager.markInProgress(event.issueNumber);
|
|
284
|
+
}
|
|
285
|
+
this.updateTaskStatus(event.issueNumber, 'in-progress');
|
|
286
|
+
break;
|
|
287
|
+
case 'task-completed':
|
|
288
|
+
if (this.progressDisplay) {
|
|
289
|
+
this.progressDisplay.handleEvent({ type: 'issue-completed', issueNumber: event.issueNumber });
|
|
290
|
+
}
|
|
291
|
+
else {
|
|
292
|
+
console.log(chalk.green(` ✓ Completed: #${event.issueNumber}`));
|
|
293
|
+
}
|
|
294
|
+
if (this.labelManager) {
|
|
295
|
+
await this.labelManager.markDone(event.issueNumber);
|
|
296
|
+
}
|
|
297
|
+
this.updateTaskStatus(event.issueNumber, 'completed', event.commits);
|
|
298
|
+
break;
|
|
299
|
+
case 'task-failed':
|
|
300
|
+
if (this.progressDisplay) {
|
|
301
|
+
this.progressDisplay.handleEvent({ type: 'issue-failed', issueNumber: event.issueNumber, error: event.error || 'Unknown error' });
|
|
302
|
+
}
|
|
303
|
+
else {
|
|
304
|
+
console.log(chalk.red(` ✗ Failed: #${event.issueNumber} - ${event.error}`));
|
|
305
|
+
}
|
|
306
|
+
if (this.labelManager) {
|
|
307
|
+
await this.labelManager.markFailed(event.issueNumber);
|
|
308
|
+
}
|
|
309
|
+
if (this.githubClient) {
|
|
310
|
+
await this.githubClient.addComment(event.issueNumber, `❌ Millhouse failed to implement this issue:\n\n\`\`\`\n${event.error}\n\`\`\``);
|
|
311
|
+
}
|
|
312
|
+
this.updateTaskStatus(event.issueNumber, 'failed', undefined, event.error);
|
|
313
|
+
break;
|
|
314
|
+
case 'tasks-unblocked':
|
|
315
|
+
if (this.progressDisplay) {
|
|
316
|
+
for (const num of event.issueNumbers) {
|
|
317
|
+
this.progressDisplay.handleEvent({ type: 'issue-unblocked', issueNumber: num });
|
|
318
|
+
}
|
|
319
|
+
}
|
|
320
|
+
else {
|
|
321
|
+
console.log(chalk.cyan(` ⏳ Unblocked: ${event.issueNumbers.map(n => `#${n}`).join(', ')}`));
|
|
322
|
+
}
|
|
323
|
+
for (const num of event.issueNumbers) {
|
|
324
|
+
this.updateTaskStatus(num, 'ready');
|
|
325
|
+
}
|
|
326
|
+
break;
|
|
327
|
+
}
|
|
328
|
+
// Save state after each event
|
|
329
|
+
this.runState.updatedAt = new Date().toISOString();
|
|
330
|
+
await this.store.saveRun(this.runState);
|
|
331
|
+
}
|
|
332
|
+
/**
|
|
333
|
+
* Update a task's status in the run state.
|
|
334
|
+
*/
|
|
335
|
+
updateTaskStatus(issueNumber, status, commits, error) {
|
|
336
|
+
if (!this.runState)
|
|
337
|
+
return;
|
|
338
|
+
const task = this.runState.tasks.find(t => t.issueNumber === issueNumber);
|
|
339
|
+
if (task) {
|
|
340
|
+
task.status = status;
|
|
341
|
+
if (status === 'in-progress') {
|
|
342
|
+
task.startedAt = new Date().toISOString();
|
|
343
|
+
}
|
|
344
|
+
if (status === 'completed' || status === 'failed') {
|
|
345
|
+
task.completedAt = new Date().toISOString();
|
|
346
|
+
}
|
|
347
|
+
if (commits) {
|
|
348
|
+
task.commits = commits;
|
|
349
|
+
}
|
|
350
|
+
if (error) {
|
|
351
|
+
task.error = error;
|
|
352
|
+
}
|
|
353
|
+
}
|
|
354
|
+
}
|
|
355
|
+
/**
|
|
356
|
+
* Create the final pull request.
|
|
357
|
+
*/
|
|
358
|
+
async createFinalPR(runId, runBranch, issues, completedIssues) {
|
|
359
|
+
const completedSet = new Set(completedIssues);
|
|
360
|
+
const completed = issues.filter(i => completedSet.has(i.number));
|
|
361
|
+
const title = completed.length === 1
|
|
362
|
+
? `Fix #${completed[0].number}: ${completed[0].title}`
|
|
363
|
+
: `Millhouse: Implement ${completed.length} issues`;
|
|
364
|
+
const issueList = completed
|
|
365
|
+
.map(i => `- Fixes #${i.number}: ${i.title}`)
|
|
366
|
+
.join('\n');
|
|
367
|
+
const body = `## Summary
|
|
368
|
+
|
|
369
|
+
This PR implements the following issues:
|
|
370
|
+
|
|
371
|
+
${issueList}
|
|
372
|
+
|
|
373
|
+
## Details
|
|
374
|
+
|
|
375
|
+
Run ID: \`${runId}\`
|
|
376
|
+
Branch: \`${runBranch}\`
|
|
377
|
+
|
|
378
|
+
---
|
|
379
|
+
🤖 Generated by [Millhouse](https://github.com/dave/millhouse)`;
|
|
380
|
+
return this.githubClient.createPullRequest({
|
|
381
|
+
title,
|
|
382
|
+
body,
|
|
383
|
+
head: runBranch,
|
|
384
|
+
base: this.config.execution.baseBranch,
|
|
385
|
+
draft: this.config.pullRequests.createAsDraft,
|
|
386
|
+
});
|
|
387
|
+
}
|
|
388
|
+
}
|
|
389
|
+
//# sourceMappingURL=orchestrator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"orchestrator.js","sourceRoot":"","sources":["../../src/core/orchestrator.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import { EventEmitter } from 'node:events';
|
|
2
|
+
import type { DependencyGraph } from '../analysis/graph-builder.js';
|
|
3
|
+
import type { TaskStatus } from '../types.js';
|
|
4
|
+
interface SchedulerOptions {
|
|
5
|
+
concurrency: number;
|
|
6
|
+
continueOnError: boolean;
|
|
7
|
+
}
|
|
8
|
+
type TaskExecutor = (issueNumber: number) => Promise<{
|
|
9
|
+
success: boolean;
|
|
10
|
+
commits: string[];
|
|
11
|
+
error?: string;
|
|
12
|
+
}>;
|
|
13
|
+
export declare class Scheduler extends EventEmitter {
|
|
14
|
+
private readonly concurrency;
|
|
15
|
+
private readonly continueOnError;
|
|
16
|
+
private graph;
|
|
17
|
+
private completed;
|
|
18
|
+
private failed;
|
|
19
|
+
private running;
|
|
20
|
+
private blocked;
|
|
21
|
+
constructor(options: SchedulerOptions);
|
|
22
|
+
/**
|
|
23
|
+
* Initialize the scheduler with a dependency graph.
|
|
24
|
+
*/
|
|
25
|
+
initialize(graph: DependencyGraph, completed?: number[], failed?: number[]): void;
|
|
26
|
+
/**
|
|
27
|
+
* Get all tasks that are ready to run (dependencies satisfied, not running).
|
|
28
|
+
*/
|
|
29
|
+
getReadyTasks(): number[];
|
|
30
|
+
/**
|
|
31
|
+
* Get the number of available slots for new tasks.
|
|
32
|
+
*/
|
|
33
|
+
getAvailableSlots(): number;
|
|
34
|
+
/**
|
|
35
|
+
* Check if all tasks are complete (or failed if continueOnError is false).
|
|
36
|
+
*/
|
|
37
|
+
isComplete(): boolean;
|
|
38
|
+
/**
|
|
39
|
+
* Run the scheduler with the given task executor.
|
|
40
|
+
* Returns when all possible tasks are complete.
|
|
41
|
+
*/
|
|
42
|
+
run(executor: TaskExecutor): Promise<{
|
|
43
|
+
completed: number[];
|
|
44
|
+
failed: number[];
|
|
45
|
+
}>;
|
|
46
|
+
/**
|
|
47
|
+
* Start a single task.
|
|
48
|
+
*/
|
|
49
|
+
private startTask;
|
|
50
|
+
/**
|
|
51
|
+
* Handle task completion.
|
|
52
|
+
*/
|
|
53
|
+
private handleTaskComplete;
|
|
54
|
+
/**
|
|
55
|
+
* Check which blocked tasks are now unblocked.
|
|
56
|
+
*/
|
|
57
|
+
private checkUnblockedTasks;
|
|
58
|
+
/**
|
|
59
|
+
* Wait for any running task to complete.
|
|
60
|
+
*/
|
|
61
|
+
private waitForAny;
|
|
62
|
+
/**
|
|
63
|
+
* Get current status of all tasks.
|
|
64
|
+
*/
|
|
65
|
+
getTaskStatuses(): Map<number, TaskStatus>;
|
|
66
|
+
/**
|
|
67
|
+
* Get counts of tasks in each status.
|
|
68
|
+
*/
|
|
69
|
+
getStatusCounts(): Record<TaskStatus, number>;
|
|
70
|
+
}
|
|
71
|
+
export {};
|
|
72
|
+
//# sourceMappingURL=scheduler.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scheduler.d.ts","sourceRoot":"","sources":["../../src/core/scheduler.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AACpE,OAAO,KAAK,EAAkB,UAAU,EAAE,MAAM,aAAa,CAAC;AAE9D,UAAU,gBAAgB;IACxB,WAAW,EAAE,MAAM,CAAC;IACpB,eAAe,EAAE,OAAO,CAAC;CAC1B;AAOD,KAAK,YAAY,GAAG,CAAC,WAAW,EAAE,MAAM,KAAK,OAAO,CAAC;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,MAAM,EAAE,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAAC;AAE9G,qBAAa,SAAU,SAAQ,YAAY;IACzC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAS;IACrC,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAU;IAE1C,OAAO,CAAC,KAAK,CAAgC;IAC7C,OAAO,CAAC,SAAS,CAA0B;IAC3C,OAAO,CAAC,MAAM,CAA0B;IACxC,OAAO,CAAC,OAAO,CAAyC;IACxD,OAAO,CAAC,OAAO,CAA0B;gBAE7B,OAAO,EAAE,gBAAgB;IAMrC;;OAEG;IACH,UAAU,CAAC,KAAK,EAAE,eAAe,EAAE,SAAS,GAAE,MAAM,EAAO,EAAE,MAAM,GAAE,MAAM,EAAO,GAAG,IAAI;IAqBzF;;OAEG;IACH,aAAa,IAAI,MAAM,EAAE;IAqBzB;;OAEG;IACH,iBAAiB,IAAI,MAAM;IAI3B;;OAEG;IACH,UAAU,IAAI,OAAO;IA2BrB;;;OAGG;IACG,GAAG,CAAC,QAAQ,EAAE,YAAY,GAAG,OAAO,CAAC;QAAE,SAAS,EAAE,MAAM,EAAE,CAAC;QAAC,MAAM,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC;IAgCrF;;OAEG;IACH,OAAO,CAAC,SAAS;IAoBjB;;OAEG;IACH,OAAO,CAAC,kBAAkB;IA6B1B;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAkB3B;;OAEG;YACW,UAAU;IAaxB;;OAEG;IACH,eAAe,IAAI,GAAG,CAAC,MAAM,EAAE,UAAU,CAAC;IAsB1C;;OAEG;IACH,eAAe,IAAI,MAAM,CAAC,UAAU,EAAE,MAAM,CAAC;CAe9C"}
|