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.
Files changed (88) hide show
  1. package/LICENSE +8 -0
  2. package/README.md +248 -0
  3. package/commands/millhouse.md +223 -0
  4. package/dist/analysis/graph-builder.d.ts +42 -0
  5. package/dist/analysis/graph-builder.d.ts.map +1 -0
  6. package/dist/analysis/graph-builder.js +98 -0
  7. package/dist/analysis/graph-builder.js.map +1 -0
  8. package/dist/analysis/issue-analyzer.d.ts +20 -0
  9. package/dist/analysis/issue-analyzer.d.ts.map +1 -0
  10. package/dist/analysis/issue-analyzer.js +167 -0
  11. package/dist/analysis/issue-analyzer.js.map +1 -0
  12. package/dist/analysis/plan-parser.d.ts +8 -0
  13. package/dist/analysis/plan-parser.d.ts.map +1 -0
  14. package/dist/analysis/plan-parser.js +112 -0
  15. package/dist/analysis/plan-parser.js.map +1 -0
  16. package/dist/cli/cleanup.d.ts +20 -0
  17. package/dist/cli/cleanup.d.ts.map +1 -0
  18. package/dist/cli/cleanup.js +186 -0
  19. package/dist/cli/cleanup.js.map +1 -0
  20. package/dist/cli/commands/clean.d.ts +2 -0
  21. package/dist/cli/commands/clean.d.ts.map +1 -0
  22. package/dist/cli/commands/clean.js +16 -0
  23. package/dist/cli/commands/clean.js.map +1 -0
  24. package/dist/cli/commands/resume.d.ts +2 -0
  25. package/dist/cli/commands/resume.d.ts.map +1 -0
  26. package/dist/cli/commands/resume.js +82 -0
  27. package/dist/cli/commands/resume.js.map +1 -0
  28. package/dist/cli/commands/run.d.ts +10 -0
  29. package/dist/cli/commands/run.d.ts.map +1 -0
  30. package/dist/cli/commands/run.js +352 -0
  31. package/dist/cli/commands/run.js.map +1 -0
  32. package/dist/cli/commands/setup.d.ts +6 -0
  33. package/dist/cli/commands/setup.d.ts.map +1 -0
  34. package/dist/cli/commands/setup.js +74 -0
  35. package/dist/cli/commands/setup.js.map +1 -0
  36. package/dist/cli/commands/status.d.ts +7 -0
  37. package/dist/cli/commands/status.d.ts.map +1 -0
  38. package/dist/cli/commands/status.js +83 -0
  39. package/dist/cli/commands/status.js.map +1 -0
  40. package/dist/cli/progress-display.d.ts +93 -0
  41. package/dist/cli/progress-display.d.ts.map +1 -0
  42. package/dist/cli/progress-display.js +318 -0
  43. package/dist/cli/progress-display.js.map +1 -0
  44. package/dist/core/orchestrator.d.ts +79 -0
  45. package/dist/core/orchestrator.d.ts.map +1 -0
  46. package/dist/core/orchestrator.js +389 -0
  47. package/dist/core/orchestrator.js.map +1 -0
  48. package/dist/core/scheduler.d.ts +72 -0
  49. package/dist/core/scheduler.d.ts.map +1 -0
  50. package/dist/core/scheduler.js +234 -0
  51. package/dist/core/scheduler.js.map +1 -0
  52. package/dist/execution/claude-runner.d.ts +41 -0
  53. package/dist/execution/claude-runner.d.ts.map +1 -0
  54. package/dist/execution/claude-runner.js +241 -0
  55. package/dist/execution/claude-runner.js.map +1 -0
  56. package/dist/execution/worktree-manager.d.ts +52 -0
  57. package/dist/execution/worktree-manager.d.ts.map +1 -0
  58. package/dist/execution/worktree-manager.js +208 -0
  59. package/dist/execution/worktree-manager.js.map +1 -0
  60. package/dist/github/client.d.ts +27 -0
  61. package/dist/github/client.d.ts.map +1 -0
  62. package/dist/github/client.js +178 -0
  63. package/dist/github/client.js.map +1 -0
  64. package/dist/github/issue-discoverer.d.ts +20 -0
  65. package/dist/github/issue-discoverer.d.ts.map +1 -0
  66. package/dist/github/issue-discoverer.js +83 -0
  67. package/dist/github/issue-discoverer.js.map +1 -0
  68. package/dist/github/label-manager.d.ts +44 -0
  69. package/dist/github/label-manager.d.ts.map +1 -0
  70. package/dist/github/label-manager.js +93 -0
  71. package/dist/github/label-manager.js.map +1 -0
  72. package/dist/index.d.ts +3 -0
  73. package/dist/index.d.ts.map +1 -0
  74. package/dist/index.js +54 -0
  75. package/dist/index.js.map +1 -0
  76. package/dist/storage/config.d.ts +4 -0
  77. package/dist/storage/config.d.ts.map +1 -0
  78. package/dist/storage/config.js +25 -0
  79. package/dist/storage/config.js.map +1 -0
  80. package/dist/storage/json-store.d.ts +20 -0
  81. package/dist/storage/json-store.d.ts.map +1 -0
  82. package/dist/storage/json-store.js +92 -0
  83. package/dist/storage/json-store.js.map +1 -0
  84. package/dist/types.d.ts +142 -0
  85. package/dist/types.d.ts.map +1 -0
  86. package/dist/types.js +36 -0
  87. package/dist/types.js.map +1 -0
  88. package/package.json +60 -0
@@ -0,0 +1,10 @@
1
+ interface RunOptions {
2
+ concurrency?: string;
3
+ display?: 'compact' | 'detailed';
4
+ dryRun?: boolean;
5
+ dangerouslySkipPermissions?: boolean;
6
+ }
7
+ export declare function runPlanCommand(plan: string | undefined, options: RunOptions): Promise<void>;
8
+ export declare function runIssuesCommand(numbers: string | undefined, options: RunOptions): Promise<void>;
9
+ export {};
10
+ //# sourceMappingURL=run.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/run.ts"],"names":[],"mappings":"AA0BA,UAAU,UAAU;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,SAAS,GAAG,UAAU,CAAC;IACjC,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,0BAA0B,CAAC,EAAE,OAAO,CAAC;CACtC;AAqKD,wBAAsB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,EAAE,OAAO,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAyFjG;AAGD,wBAAsB,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,SAAS,EAAE,OAAO,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CA4HtG"}
@@ -0,0 +1,352 @@
1
+ import chalk from 'chalk';
2
+ import ora from 'ora';
3
+ import readline from 'node:readline';
4
+ import path from 'node:path';
5
+ import os from 'node:os';
6
+ import { promises as fs } from 'node:fs';
7
+ import { Orchestrator } from '../../core/orchestrator.js';
8
+ import { loadConfig } from '../../storage/config.js';
9
+ import { JsonStore } from '../../storage/json-store.js';
10
+ import { GitHubClient } from '../../github/client.js';
11
+ import { IssueDiscoverer } from '../../github/issue-discoverer.js';
12
+ import { LabelManager } from '../../github/label-manager.js';
13
+ import { IssueAnalyzer } from '../../analysis/issue-analyzer.js';
14
+ import { PlanParser } from '../../analysis/plan-parser.js';
15
+ import { GraphBuilder } from '../../analysis/graph-builder.js';
16
+ import { WorktreeManager } from '../../execution/worktree-manager.js';
17
+ import { ClaudeRunner } from '../../execution/claude-runner.js';
18
+ import { Scheduler } from '../../core/scheduler.js';
19
+ import { detectLeftoverState, cleanupAllState, displayLeftoverState, } from '../cleanup.js';
20
+ import { resumeCommand } from './resume.js';
21
+ import { ProgressDisplay } from '../progress-display.js';
22
+ async function promptUser(question) {
23
+ const rl = readline.createInterface({
24
+ input: process.stdin,
25
+ output: process.stdout,
26
+ });
27
+ return new Promise((resolve) => {
28
+ rl.question(question, (answer) => {
29
+ rl.close();
30
+ resolve(answer.trim().toLowerCase());
31
+ });
32
+ });
33
+ }
34
+ async function checkLeftoverState() {
35
+ const leftoverState = await detectLeftoverState();
36
+ if (leftoverState.hasLeftovers) {
37
+ displayLeftoverState(leftoverState);
38
+ let prompt = 'What would you like to do?\n';
39
+ if (leftoverState.interruptedRuns.length > 0) {
40
+ prompt += ' [r] Resume the most recent interrupted run\n';
41
+ }
42
+ prompt += ' [c] Clean up and start fresh\n';
43
+ prompt += ' [q] Quit\n';
44
+ prompt += 'Choice: ';
45
+ const choice = await promptUser(prompt);
46
+ if (choice === 'r' && leftoverState.interruptedRuns.length > 0) {
47
+ const mostRecent = leftoverState.interruptedRuns.sort((a, b) => new Date(b.updatedAt).getTime() - new Date(a.updatedAt).getTime())[0];
48
+ console.log(chalk.blue(`\nResuming run: ${mostRecent.id}\n`));
49
+ await resumeCommand(mostRecent.id);
50
+ return false; // Don't continue with new run
51
+ }
52
+ else if (choice === 'c') {
53
+ const spinner = ora('Cleaning up...').start();
54
+ await cleanupAllState();
55
+ spinner.succeed('Cleaned up previous state');
56
+ console.log('');
57
+ return true; // Continue with new run
58
+ }
59
+ else {
60
+ console.log(chalk.gray('Exiting.'));
61
+ process.exit(0);
62
+ }
63
+ }
64
+ return true; // No leftovers, continue
65
+ }
66
+ async function findProjectPlans() {
67
+ // Convert cwd to Claude project path format: /Users/dave/src/foo -> -Users-dave-src-foo
68
+ const cwd = process.cwd();
69
+ const projectDirName = cwd.replace(/\//g, '-');
70
+ const projectDir = path.join(os.homedir(), '.claude', 'projects', projectDirName);
71
+ const planRefs = new Set();
72
+ try {
73
+ const files = await fs.readdir(projectDir);
74
+ const jsonlFiles = files.filter(f => f.endsWith('.jsonl'));
75
+ // Search transcript files for plan references
76
+ for (const file of jsonlFiles) {
77
+ try {
78
+ const content = await fs.readFile(path.join(projectDir, file), 'utf-8');
79
+ // Match plan file paths like .claude/plans/name.md or ~/.claude/plans/name.md
80
+ const matches = content.match(/\.claude\/plans\/[a-z-]+\.md/g);
81
+ if (matches) {
82
+ for (const match of matches) {
83
+ // Extract just the filename
84
+ const filename = match.split('/').pop();
85
+ if (filename && !filename.includes('-agent-')) {
86
+ // Skip agent subplans
87
+ planRefs.add(filename);
88
+ }
89
+ }
90
+ }
91
+ }
92
+ catch {
93
+ // Skip files we can't read
94
+ }
95
+ }
96
+ }
97
+ catch {
98
+ // Project directory doesn't exist
99
+ }
100
+ return Array.from(planRefs);
101
+ }
102
+ async function findMostRecentPlan() {
103
+ const plansDir = path.join(os.homedir(), '.claude', 'plans');
104
+ // First, get plans associated with this project
105
+ const projectPlans = await findProjectPlans();
106
+ try {
107
+ const files = await fs.readdir(plansDir);
108
+ const mdFiles = files.filter(f => f.endsWith('.md'));
109
+ if (mdFiles.length === 0) {
110
+ return null;
111
+ }
112
+ // Filter to only project-specific plans if we found any
113
+ const relevantFiles = projectPlans.length > 0
114
+ ? mdFiles.filter(f => projectPlans.includes(f))
115
+ : mdFiles;
116
+ if (relevantFiles.length === 0) {
117
+ return null;
118
+ }
119
+ const fileStats = await Promise.all(relevantFiles.map(async (f) => {
120
+ const fullPath = path.join(plansDir, f);
121
+ const stat = await fs.stat(fullPath);
122
+ return { path: fullPath, mtime: stat.mtime };
123
+ }));
124
+ fileStats.sort((a, b) => b.mtime.getTime() - a.mtime.getTime());
125
+ return fileStats[0].path;
126
+ }
127
+ catch {
128
+ return null;
129
+ }
130
+ }
131
+ async function resolvePlanPath(planPath) {
132
+ // If no plan specified, find most recent plan
133
+ if (!planPath) {
134
+ const recentPlan = await findMostRecentPlan();
135
+ if (!recentPlan) {
136
+ throw new Error('No plan files found in ~/.claude/plans/');
137
+ }
138
+ return recentPlan;
139
+ }
140
+ // First, try the path as given
141
+ try {
142
+ await fs.access(planPath);
143
+ return planPath;
144
+ }
145
+ catch {
146
+ // Not found locally
147
+ }
148
+ // If it's just a filename (no directory), check ~/.claude/plans/
149
+ if (!planPath.includes(path.sep) && !planPath.startsWith('.')) {
150
+ const claudePlansPath = path.join(os.homedir(), '.claude', 'plans', planPath);
151
+ try {
152
+ await fs.access(claudePlansPath);
153
+ return claudePlansPath;
154
+ }
155
+ catch {
156
+ // Not found there either
157
+ }
158
+ }
159
+ // Return original path - will fail with helpful error
160
+ return planPath;
161
+ }
162
+ // Plan mode: millhouse run [plan-file]
163
+ export async function runPlanCommand(plan, options) {
164
+ const shouldContinue = await checkLeftoverState();
165
+ if (!shouldContinue)
166
+ return;
167
+ const spinner = ora('Initializing Millhouse (plan mode)...').start();
168
+ try {
169
+ const concurrency = parseInt(options.concurrency || '8', 10);
170
+ // Load plan from file (check ~/.claude/plans/ if not found locally)
171
+ spinner.text = 'Loading plan...';
172
+ const planPath = await resolvePlanPath(plan);
173
+ const planContent = await fs.readFile(planPath, 'utf-8');
174
+ spinner.succeed(`Loaded plan from ${planPath}`);
175
+ // Parse plan into work items
176
+ console.log(chalk.blue('\nšŸ” Analyzing plan...'));
177
+ const planParser = new PlanParser();
178
+ const analyzedIssues = await planParser.parse(planContent);
179
+ console.log(chalk.green(` āœ“ Created ${analyzedIssues.length} work item(s)`));
180
+ // Load config
181
+ const config = await loadConfig();
182
+ // Initialize components (no GitHub needed)
183
+ const store = new JsonStore();
184
+ const graphBuilder = new GraphBuilder();
185
+ const worktreeManager = new WorktreeManager();
186
+ const progressDisplay = new ProgressDisplay({ displayMode: options.display });
187
+ const claudeRunner = new ClaudeRunner(config, {
188
+ dangerouslySkipPermissions: options.dangerouslySkipPermissions,
189
+ onLog: (issueNumber, message) => {
190
+ progressDisplay.logDetailed(issueNumber, message);
191
+ },
192
+ });
193
+ const scheduler = new Scheduler({
194
+ concurrency,
195
+ continueOnError: config.execution.continueOnError,
196
+ });
197
+ // Create orchestrator without GitHub components
198
+ const orchestrator = new Orchestrator({
199
+ config,
200
+ store,
201
+ graphBuilder,
202
+ worktreeManager,
203
+ claudeRunner,
204
+ scheduler,
205
+ progressDisplay,
206
+ });
207
+ // Build graph
208
+ console.log(chalk.blue('\nšŸ”— Building dependency graph...'));
209
+ const graph = graphBuilder.build(analyzedIssues);
210
+ console.log(chalk.green(` āœ“ Graph built`));
211
+ // Show execution plan
212
+ console.log(chalk.blue('\nšŸ“Š Execution Plan:'));
213
+ const readyIssues = graph.getReady([]);
214
+ const blockedCount = analyzedIssues.length - readyIssues.length;
215
+ console.log(` Total items: ${analyzedIssues.length}`);
216
+ console.log(` Ready to start: ${readyIssues.length} (${readyIssues.map(i => `#${i}`).join(', ')})`);
217
+ console.log(` Blocked by dependencies: ${blockedCount}`);
218
+ console.log(` Concurrency: ${concurrency}`);
219
+ if (options.dryRun) {
220
+ console.log(chalk.yellow('\nšŸ” Dry run complete. No changes made.'));
221
+ return;
222
+ }
223
+ // Run orchestration
224
+ console.log(chalk.blue('\nšŸš€ Starting execution...'));
225
+ const result = await orchestrator.run(analyzedIssues);
226
+ if (result.status === 'completed') {
227
+ console.log(chalk.green('\nāœ… All items completed successfully!'));
228
+ }
229
+ else if (result.status === 'failed') {
230
+ console.log(chalk.red(`\nāŒ Run failed: ${result.error}`));
231
+ console.log(` Completed: ${result.completedIssues.length}`);
232
+ console.log(` Failed: ${result.failedIssues.length}`);
233
+ process.exit(1);
234
+ }
235
+ }
236
+ catch (error) {
237
+ spinner.fail('Error');
238
+ console.error(chalk.red(`\n${error instanceof Error ? error.message : error}`));
239
+ process.exit(1);
240
+ }
241
+ }
242
+ // GitHub issues mode: millhouse run issues [numbers]
243
+ export async function runIssuesCommand(numbers, options) {
244
+ const shouldContinue = await checkLeftoverState();
245
+ if (!shouldContinue)
246
+ return;
247
+ const spinner = ora('Initializing Millhouse (GitHub issues mode)...').start();
248
+ try {
249
+ const concurrency = parseInt(options.concurrency || '8', 10);
250
+ spinner.text = 'Loading configuration...';
251
+ const config = await loadConfig();
252
+ // Initialize components
253
+ spinner.text = 'Connecting to GitHub...';
254
+ const githubClient = new GitHubClient();
255
+ // Parse issue numbers or fetch all open issues
256
+ let issueNumbers = [];
257
+ if (numbers) {
258
+ issueNumbers = numbers.split(',').map(s => parseInt(s.trim(), 10));
259
+ }
260
+ if (issueNumbers.length === 0) {
261
+ spinner.text = 'Fetching all open issues...';
262
+ const openIssues = await githubClient.listOpenIssues();
263
+ issueNumbers = openIssues.map(i => i.number);
264
+ if (issueNumbers.length === 0) {
265
+ spinner.fail('No open issues found in this repository');
266
+ process.exit(1);
267
+ }
268
+ spinner.succeed(`Found ${issueNumbers.length} open issue(s)`);
269
+ }
270
+ else {
271
+ spinner.succeed('Initialized');
272
+ }
273
+ const store = new JsonStore();
274
+ const labelManager = new LabelManager(githubClient);
275
+ const issueDiscoverer = new IssueDiscoverer(githubClient);
276
+ const issueAnalyzer = new IssueAnalyzer();
277
+ const graphBuilder = new GraphBuilder();
278
+ const worktreeManager = new WorktreeManager();
279
+ // Create progress display
280
+ const progressDisplay = new ProgressDisplay({ displayMode: options.display });
281
+ const claudeRunner = new ClaudeRunner(config, {
282
+ dangerouslySkipPermissions: options.dangerouslySkipPermissions,
283
+ onLog: (issueNumber, message) => {
284
+ progressDisplay.logDetailed(issueNumber, message);
285
+ },
286
+ });
287
+ // Create scheduler
288
+ const scheduler = new Scheduler({
289
+ concurrency,
290
+ continueOnError: config.execution.continueOnError,
291
+ });
292
+ // Create orchestrator
293
+ const orchestrator = new Orchestrator({
294
+ config,
295
+ store,
296
+ githubClient,
297
+ labelManager,
298
+ issueDiscoverer,
299
+ issueAnalyzer,
300
+ graphBuilder,
301
+ worktreeManager,
302
+ claudeRunner,
303
+ scheduler,
304
+ progressDisplay,
305
+ });
306
+ // Discover issues (always recursive to find linked issues)
307
+ console.log(chalk.blue('\nšŸ“‹ Discovering issues...'));
308
+ const issues = await orchestrator.discoverIssues(issueNumbers, true);
309
+ console.log(chalk.green(` āœ“ Found ${issues.length} issue(s)`));
310
+ // Analyze dependencies
311
+ console.log(chalk.blue('\nšŸ” Analyzing dependencies...'));
312
+ const analyzedIssues = await orchestrator.analyzeIssues(issues);
313
+ console.log(chalk.green(` āœ“ Analysis complete`));
314
+ // Build graph
315
+ console.log(chalk.blue('\nšŸ”— Building dependency graph...'));
316
+ const graph = graphBuilder.build(analyzedIssues);
317
+ console.log(chalk.green(` āœ“ Graph built`));
318
+ // Show execution plan
319
+ console.log(chalk.blue('\nšŸ“Š Execution Plan:'));
320
+ const readyIssues = graph.getReady([]);
321
+ const blockedCount = analyzedIssues.length - readyIssues.length;
322
+ console.log(` Total issues: ${analyzedIssues.length}`);
323
+ console.log(` Ready to start: ${readyIssues.length} (${readyIssues.map(i => `#${i}`).join(', ')})`);
324
+ console.log(` Blocked by dependencies: ${blockedCount}`);
325
+ console.log(` Concurrency: ${concurrency}`);
326
+ if (options.dryRun) {
327
+ console.log(chalk.yellow('\nšŸ” Dry run complete. No changes made.'));
328
+ return;
329
+ }
330
+ // Run orchestration
331
+ console.log(chalk.blue('\nšŸš€ Starting execution...'));
332
+ const result = await orchestrator.run(analyzedIssues);
333
+ if (result.status === 'completed') {
334
+ console.log(chalk.green('\nāœ… All issues completed successfully!'));
335
+ if (result.pullRequestUrl) {
336
+ console.log(chalk.blue(` Pull request: ${result.pullRequestUrl}`));
337
+ }
338
+ }
339
+ else if (result.status === 'failed') {
340
+ console.log(chalk.red(`\nāŒ Run failed: ${result.error}`));
341
+ console.log(` Completed: ${result.completedIssues.length}`);
342
+ console.log(` Failed: ${result.failedIssues.length}`);
343
+ process.exit(1);
344
+ }
345
+ }
346
+ catch (error) {
347
+ spinner.fail('Error');
348
+ console.error(chalk.red(`\n${error instanceof Error ? error.message : error}`));
349
+ process.exit(1);
350
+ }
351
+ }
352
+ //# sourceMappingURL=run.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run.js","sourceRoot":"","sources":["../../../src/cli/commands/run.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ interface SetupOptions {
2
+ global?: boolean;
3
+ }
4
+ export declare function setupCommand(options: SetupOptions): Promise<void>;
5
+ export {};
6
+ //# sourceMappingURL=setup.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"setup.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/setup.ts"],"names":[],"mappings":"AASA,UAAU,YAAY;IACpB,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED,wBAAsB,YAAY,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAuEvE"}
@@ -0,0 +1,74 @@
1
+ import chalk from 'chalk';
2
+ import { promises as fs } from 'node:fs';
3
+ import path from 'node:path';
4
+ import os from 'node:os';
5
+ import { fileURLToPath } from 'node:url';
6
+ const __filename = fileURLToPath(import.meta.url);
7
+ const __dirname = path.dirname(__filename);
8
+ export async function setupCommand(options) {
9
+ try {
10
+ // Find the commands directory in the package
11
+ const packageRoot = path.resolve(__dirname, '..', '..', '..');
12
+ const sourceDir = path.join(packageRoot, 'commands');
13
+ // Determine target directory
14
+ const targetDir = options.global
15
+ ? path.join(os.homedir(), '.claude', 'commands')
16
+ : path.join(process.cwd(), '.claude', 'commands');
17
+ // Check if source directory exists
18
+ try {
19
+ await fs.access(sourceDir);
20
+ }
21
+ catch {
22
+ console.error(chalk.red(`Commands directory not found: ${sourceDir}`));
23
+ process.exit(1);
24
+ }
25
+ // Create target directory if needed
26
+ await fs.mkdir(targetDir, { recursive: true });
27
+ // Copy all command files
28
+ const files = await fs.readdir(sourceDir);
29
+ const mdFiles = files.filter(f => f.endsWith('.md'));
30
+ if (mdFiles.length === 0) {
31
+ console.log(chalk.yellow('No command files found to install.'));
32
+ return;
33
+ }
34
+ let installed = 0;
35
+ for (const file of mdFiles) {
36
+ const sourcePath = path.join(sourceDir, file);
37
+ const targetPath = path.join(targetDir, file);
38
+ // Check if file already exists
39
+ try {
40
+ await fs.access(targetPath);
41
+ console.log(chalk.yellow(` Skipping ${file} (already exists)`));
42
+ continue;
43
+ }
44
+ catch {
45
+ // File doesn't exist, proceed with copy
46
+ }
47
+ await fs.copyFile(sourcePath, targetPath);
48
+ console.log(chalk.green(` Installed ${file}`));
49
+ installed++;
50
+ }
51
+ const location = options.global ? 'globally' : `in ${targetDir}`;
52
+ if (installed > 0) {
53
+ console.log(chalk.green(`\nāœ“ Installed ${installed} command(s) ${location}`));
54
+ }
55
+ else {
56
+ console.log(chalk.yellow(`\nNo new commands to install ${location}`));
57
+ }
58
+ console.log(`
59
+ ${chalk.bold('Slash commands (in Claude Code):')}
60
+ /millhouse plan [file] Refine a plan (omit file to use current plan)
61
+ /millhouse issues [file] Create GitHub issues (omit file to use current plan)
62
+
63
+ ${chalk.bold('Then run from terminal:')}
64
+ millhouse run [file] Execute plan (omit file to use latest plan)
65
+ millhouse run issues [id] Execute GitHub issues (omit id to run all)
66
+ millhouse status Show run status
67
+ `);
68
+ }
69
+ catch (error) {
70
+ console.error(chalk.red(`Error: ${error instanceof Error ? error.message : error}`));
71
+ process.exit(1);
72
+ }
73
+ }
74
+ //# sourceMappingURL=setup.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"setup.js","sourceRoot":"","sources":["../../../src/cli/commands/setup.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ interface StatusOptions {
2
+ runId?: string;
3
+ json?: boolean;
4
+ }
5
+ export declare function statusCommand(options: StatusOptions): Promise<void>;
6
+ export {};
7
+ //# sourceMappingURL=status.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/status.ts"],"names":[],"mappings":"AAIA,UAAU,aAAa;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAED,wBAAsB,aAAa,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAiCzE"}
@@ -0,0 +1,83 @@
1
+ import chalk from 'chalk';
2
+ import { JsonStore } from '../../storage/json-store.js';
3
+ export async function statusCommand(options) {
4
+ try {
5
+ const store = new JsonStore();
6
+ let runs;
7
+ if (options.runId) {
8
+ const run = await store.getRun(options.runId);
9
+ if (!run) {
10
+ console.error(chalk.red(`Run not found: ${options.runId}`));
11
+ process.exit(1);
12
+ }
13
+ runs = [run];
14
+ }
15
+ else {
16
+ runs = await store.listRuns();
17
+ }
18
+ if (runs.length === 0) {
19
+ console.log(chalk.yellow('No runs found.'));
20
+ return;
21
+ }
22
+ if (options.json) {
23
+ console.log(JSON.stringify(runs, null, 2));
24
+ return;
25
+ }
26
+ for (const run of runs) {
27
+ printRunStatus(run);
28
+ }
29
+ }
30
+ catch (error) {
31
+ console.error(chalk.red(`Error: ${error instanceof Error ? error.message : error}`));
32
+ process.exit(1);
33
+ }
34
+ }
35
+ function printRunStatus(run) {
36
+ const statusColors = {
37
+ running: chalk.blue,
38
+ completed: chalk.green,
39
+ failed: chalk.red,
40
+ interrupted: chalk.yellow,
41
+ };
42
+ const statusColor = statusColors[run.status] || chalk.white;
43
+ console.log(chalk.bold(`\nšŸ“¦ Run: ${run.id}`));
44
+ console.log(` Status: ${statusColor(run.status)}`);
45
+ console.log(` Created: ${new Date(run.createdAt).toLocaleString()}`);
46
+ console.log(` Branch: ${run.runBranch}`);
47
+ if (run.pullRequestUrl) {
48
+ console.log(` PR: ${chalk.blue(run.pullRequestUrl)}`);
49
+ }
50
+ // Task summary
51
+ const tasksByStatus = groupBy(run.tasks, t => t.status);
52
+ console.log('\n Tasks:');
53
+ const taskStatusDisplay = [
54
+ { status: 'completed', icon: 'āœ…', color: chalk.green },
55
+ { status: 'in-progress', icon: 'šŸ”„', color: chalk.blue },
56
+ { status: 'ready', icon: 'ā³', color: chalk.cyan },
57
+ { status: 'blocked', icon: '🚫', color: chalk.yellow },
58
+ { status: 'queued', icon: 'šŸ“‹', color: chalk.gray },
59
+ { status: 'failed', icon: 'āŒ', color: chalk.red },
60
+ ];
61
+ for (const { status, icon, color } of taskStatusDisplay) {
62
+ const tasks = tasksByStatus[status] || [];
63
+ if (tasks.length > 0) {
64
+ const issueNums = tasks.map(t => `#${t.issueNumber}`).join(', ');
65
+ console.log(` ${icon} ${color(status)}: ${issueNums}`);
66
+ }
67
+ }
68
+ if (run.error) {
69
+ console.log(chalk.red(`\n Error: ${run.error}`));
70
+ }
71
+ }
72
+ function groupBy(array, keyFn) {
73
+ const result = {};
74
+ for (const item of array) {
75
+ const key = keyFn(item);
76
+ if (!result[key]) {
77
+ result[key] = [];
78
+ }
79
+ result[key].push(item);
80
+ }
81
+ return result;
82
+ }
83
+ //# sourceMappingURL=status.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status.js","sourceRoot":"","sources":["../../../src/cli/commands/status.ts"],"names":[],"mappings":"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"}