millhouse 0.3.9 → 1.0.1
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/README.md +88 -161
- package/dist/analysis/issue-analyzer.d.ts +6 -1
- package/dist/analysis/issue-analyzer.d.ts.map +1 -1
- package/dist/analysis/issue-analyzer.js +45 -13
- package/dist/analysis/issue-analyzer.js.map +1 -1
- package/dist/analysis/plan-parser.d.ts +7 -1
- package/dist/analysis/plan-parser.d.ts.map +1 -1
- package/dist/analysis/plan-parser.js +81 -22
- package/dist/analysis/plan-parser.js.map +1 -1
- package/dist/cli/cleanup.d.ts +1 -1
- package/dist/cli/cleanup.d.ts.map +1 -1
- package/dist/cli/cleanup.js +24 -28
- package/dist/cli/cleanup.js.map +1 -1
- package/dist/cli/commands/init.d.ts +6 -0
- package/dist/cli/commands/init.d.ts.map +1 -0
- package/dist/cli/commands/init.js +156 -0
- package/dist/cli/commands/init.js.map +1 -0
- package/dist/cli/commands/list.d.ts +6 -0
- package/dist/cli/commands/list.d.ts.map +1 -0
- package/dist/cli/commands/list.js +111 -0
- package/dist/cli/commands/list.js.map +1 -0
- package/dist/cli/commands/load.d.ts +2 -0
- package/dist/cli/commands/load.d.ts.map +1 -0
- package/dist/cli/commands/load.js +111 -0
- package/dist/cli/commands/load.js.map +1 -0
- package/dist/cli/commands/resume.d.ts.map +1 -1
- package/dist/cli/commands/resume.js +5 -28
- package/dist/cli/commands/resume.js.map +1 -1
- package/dist/cli/commands/run.d.ts +2 -3
- package/dist/cli/commands/run.d.ts.map +1 -1
- package/dist/cli/commands/run.js +44 -237
- package/dist/cli/commands/run.js.map +1 -1
- package/dist/cli/commands/save.d.ts +2 -0
- package/dist/cli/commands/save.d.ts.map +1 -0
- package/dist/cli/commands/save.js +220 -0
- package/dist/cli/commands/save.js.map +1 -0
- package/dist/cli/commands/setup.js +3 -3
- package/dist/cli/progress-display.d.ts +7 -14
- package/dist/cli/progress-display.d.ts.map +1 -1
- package/dist/cli/progress-display.js +94 -102
- package/dist/cli/progress-display.js.map +1 -1
- package/dist/core/orchestrator.d.ts +11 -12
- package/dist/core/orchestrator.d.ts.map +1 -1
- package/dist/core/orchestrator.js +150 -113
- package/dist/core/orchestrator.js.map +1 -1
- package/dist/core/scheduler.d.ts +6 -1
- package/dist/core/scheduler.d.ts.map +1 -1
- package/dist/core/scheduler.js +48 -9
- package/dist/core/scheduler.js.map +1 -1
- package/dist/execution/claude-runner.d.ts +2 -2
- package/dist/execution/claude-runner.d.ts.map +1 -1
- package/dist/execution/claude-runner.js +1 -1
- package/dist/execution/claude-runner.js.map +1 -1
- package/dist/index.js +30 -29
- package/dist/index.js.map +1 -1
- package/dist/storage/json-store.d.ts +1 -0
- package/dist/storage/json-store.d.ts.map +1 -1
- package/dist/storage/json-store.js +36 -0
- package/dist/storage/json-store.js.map +1 -1
- package/dist/storage/worklist-store.d.ts +19 -0
- package/dist/storage/worklist-store.d.ts.map +1 -0
- package/dist/storage/worklist-store.js +131 -0
- package/dist/storage/worklist-store.js.map +1 -0
- package/dist/types.d.ts +38 -70
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +3 -24
- package/dist/types.js.map +1 -1
- package/package.json +3 -5
- package/prompts/issue-analysis.prompt.md +56 -22
- package/prompts/plan-analysis.prompt.md +48 -10
- package/commands/millhouse.md +0 -223
|
@@ -1,28 +1,24 @@
|
|
|
1
1
|
import chalk from 'chalk';
|
|
2
|
-
import ora from 'ora';
|
|
3
2
|
import { query } from '@anthropic-ai/claude-code';
|
|
4
3
|
import { loadTemplate } from '../utils/template-loader.js';
|
|
5
4
|
export class PlanParser {
|
|
6
5
|
/**
|
|
7
6
|
* Parse a plan into discrete work items with dependencies.
|
|
7
|
+
* Claude has access to the codebase to understand existing patterns.
|
|
8
8
|
*/
|
|
9
9
|
async parse(planContent) {
|
|
10
10
|
const template = await loadTemplate('plan-analysis.prompt.md');
|
|
11
11
|
const prompt = template.replace('{{plan}}', planContent);
|
|
12
12
|
const startTime = Date.now();
|
|
13
|
-
|
|
14
|
-
// Update elapsed time every second
|
|
15
|
-
const timerInterval = setInterval(() => {
|
|
16
|
-
const elapsed = Math.floor((Date.now() - startTime) / 1000);
|
|
17
|
-
spinner.text = `Analyzing plan... (${elapsed}s)`;
|
|
18
|
-
}, 1000);
|
|
13
|
+
console.log(chalk.blue('Analyzing plan...\n'));
|
|
19
14
|
try {
|
|
20
15
|
const iterator = query({
|
|
21
16
|
prompt,
|
|
22
17
|
options: {
|
|
23
18
|
cwd: process.cwd(),
|
|
24
|
-
maxTurns:
|
|
25
|
-
|
|
19
|
+
maxTurns: 20, // Allow multiple turns for exploration
|
|
20
|
+
// Allow read-only tools for exploring the codebase
|
|
21
|
+
allowedTools: ['Read', 'Glob', 'Grep', 'Bash(git log*)', 'Bash(git show*)', 'Bash(ls*)'],
|
|
26
22
|
},
|
|
27
23
|
});
|
|
28
24
|
let responseText = '';
|
|
@@ -35,24 +31,63 @@ export class PlanParser {
|
|
|
35
31
|
if (typeof block === 'object' && block && 'type' in block && block.type === 'text' && 'text' in block) {
|
|
36
32
|
responseText += String(block.text);
|
|
37
33
|
}
|
|
34
|
+
else if (typeof block === 'object' && block && 'type' in block && block.type === 'tool_use') {
|
|
35
|
+
// Log tool usage for feedback
|
|
36
|
+
const toolBlock = block;
|
|
37
|
+
const toolName = toolBlock.name || 'unknown';
|
|
38
|
+
if (toolName === 'Read') {
|
|
39
|
+
const filePath = toolBlock.input?.file_path || '';
|
|
40
|
+
const fileName = filePath.split('/').pop() || filePath;
|
|
41
|
+
console.log(chalk.gray(` 📖 Reading: ${fileName}`));
|
|
42
|
+
}
|
|
43
|
+
else if (toolName === 'Glob') {
|
|
44
|
+
const pattern = toolBlock.input?.pattern || '';
|
|
45
|
+
console.log(chalk.gray(` 🔍 Glob: ${pattern}`));
|
|
46
|
+
}
|
|
47
|
+
else if (toolName === 'Grep') {
|
|
48
|
+
const pattern = toolBlock.input?.pattern || '';
|
|
49
|
+
console.log(chalk.gray(` 🔍 Grep: ${pattern}`));
|
|
50
|
+
}
|
|
51
|
+
else if (toolName === 'Bash') {
|
|
52
|
+
const cmd = (toolBlock.input?.command || '').slice(0, 60);
|
|
53
|
+
console.log(chalk.gray(` 💻 ${cmd}${cmd.length >= 60 ? '...' : ''}`));
|
|
54
|
+
}
|
|
55
|
+
else {
|
|
56
|
+
console.log(chalk.gray(` 🔧 ${toolName}`));
|
|
57
|
+
}
|
|
58
|
+
}
|
|
38
59
|
}
|
|
39
60
|
}
|
|
40
61
|
}
|
|
41
62
|
}
|
|
42
|
-
clearInterval(timerInterval);
|
|
43
63
|
const elapsed = Math.floor((Date.now() - startTime) / 1000);
|
|
44
|
-
// Parse JSON
|
|
64
|
+
// Parse JSON object from response
|
|
45
65
|
// Try to extract JSON from code blocks first, then raw
|
|
46
66
|
let jsonText = null;
|
|
47
67
|
// Try markdown code block (```json ... ``` or ``` ... ```)
|
|
48
68
|
const codeBlockMatch = responseText.match(/```(?:json)?\s*([\s\S]*?)```/);
|
|
49
69
|
if (codeBlockMatch) {
|
|
50
70
|
const blockContent = codeBlockMatch[1].trim();
|
|
51
|
-
if (blockContent.startsWith('[')) {
|
|
71
|
+
if (blockContent.startsWith('{') || blockContent.startsWith('[')) {
|
|
52
72
|
jsonText = blockContent;
|
|
53
73
|
}
|
|
54
74
|
}
|
|
55
|
-
// Fall back to finding raw JSON array
|
|
75
|
+
// Fall back to finding raw JSON object or array
|
|
76
|
+
if (!jsonText) {
|
|
77
|
+
// Try to find JSON object first (new format)
|
|
78
|
+
const objMatch = responseText.match(/\{[\s\S]*"items"[\s\S]*\}/);
|
|
79
|
+
if (objMatch) {
|
|
80
|
+
jsonText = objMatch[0];
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
// Fall back to array format (legacy)
|
|
84
|
+
if (!jsonText) {
|
|
85
|
+
const allMatches = responseText.match(/\[[\s\S]*?\](?=\s*$|\s*```)/g);
|
|
86
|
+
if (allMatches && allMatches.length > 0) {
|
|
87
|
+
jsonText = allMatches[allMatches.length - 1];
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
// Last resort: find any JSON array
|
|
56
91
|
if (!jsonText) {
|
|
57
92
|
const jsonMatch = responseText.match(/\[[\s\S]*\]/);
|
|
58
93
|
if (jsonMatch) {
|
|
@@ -60,16 +95,37 @@ export class PlanParser {
|
|
|
60
95
|
}
|
|
61
96
|
}
|
|
62
97
|
if (!jsonText) {
|
|
63
|
-
|
|
64
|
-
// Include first 500 chars of response for debugging
|
|
98
|
+
console.log(chalk.red(`\n✗ Plan analysis failed (${elapsed}s)`));
|
|
65
99
|
const preview = responseText.slice(0, 500);
|
|
66
|
-
throw new Error(`No JSON
|
|
100
|
+
throw new Error(`No JSON found in response. Response preview: ${preview}`);
|
|
101
|
+
}
|
|
102
|
+
// Try to parse, with better error reporting
|
|
103
|
+
let parsedObj;
|
|
104
|
+
try {
|
|
105
|
+
const rawParsed = JSON.parse(jsonText);
|
|
106
|
+
// Handle both new object format and legacy array format
|
|
107
|
+
if (Array.isArray(rawParsed)) {
|
|
108
|
+
parsedObj = {
|
|
109
|
+
title: 'Implementation Plan',
|
|
110
|
+
description: 'Work items parsed from plan.',
|
|
111
|
+
items: rawParsed,
|
|
112
|
+
};
|
|
113
|
+
}
|
|
114
|
+
else {
|
|
115
|
+
parsedObj = rawParsed;
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
catch (parseError) {
|
|
119
|
+
console.log(chalk.red(`\n✗ JSON parse error (${elapsed}s)`));
|
|
120
|
+
console.log(chalk.gray('JSON text (first 500 chars):'));
|
|
121
|
+
console.log(chalk.gray(jsonText.slice(0, 500)));
|
|
122
|
+
throw parseError;
|
|
67
123
|
}
|
|
68
|
-
const parsed =
|
|
69
|
-
|
|
124
|
+
const parsed = parsedObj.items;
|
|
125
|
+
console.log(chalk.green(`\n✓ Plan analyzed (${parsed.length} work items in ${elapsed}s)`));
|
|
70
126
|
const allIds = parsed.map(p => p.id);
|
|
71
127
|
// Convert to AnalyzedIssue format
|
|
72
|
-
const
|
|
128
|
+
const items = parsed.map(item => {
|
|
73
129
|
// Filter dependencies to only include valid IDs
|
|
74
130
|
const validDeps = item.dependencies.filter(d => allIds.includes(d) && d !== item.id);
|
|
75
131
|
const depsStr = validDeps.length > 0
|
|
@@ -89,11 +145,14 @@ export class PlanParser {
|
|
|
89
145
|
analyzedAt: new Date().toISOString(),
|
|
90
146
|
};
|
|
91
147
|
});
|
|
92
|
-
return
|
|
148
|
+
return {
|
|
149
|
+
title: parsedObj.title || 'Implementation Plan',
|
|
150
|
+
description: parsedObj.description || 'Work items parsed from plan.',
|
|
151
|
+
items,
|
|
152
|
+
};
|
|
93
153
|
}
|
|
94
154
|
catch (error) {
|
|
95
|
-
|
|
96
|
-
spinner.fail('Plan analysis failed');
|
|
155
|
+
console.log(chalk.red('\n✗ Plan analysis failed'));
|
|
97
156
|
throw new Error(`Failed to parse plan: ${error instanceof Error ? error.message : error}`);
|
|
98
157
|
}
|
|
99
158
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plan-parser.js","sourceRoot":"","sources":["../../src/analysis/plan-parser.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,
|
|
1
|
+
{"version":3,"file":"plan-parser.js","sourceRoot":"","sources":["../../src/analysis/plan-parser.ts"],"names":[],"mappings":"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"}
|
package/dist/cli/cleanup.d.ts
CHANGED
|
@@ -10,7 +10,7 @@ export interface LeftoverState {
|
|
|
10
10
|
*/
|
|
11
11
|
export declare function detectLeftoverState(basePath?: string): Promise<LeftoverState>;
|
|
12
12
|
/**
|
|
13
|
-
* Clean up all millhouse state - worktrees, branches, run files
|
|
13
|
+
* Clean up all millhouse state - worktrees, branches, and run files.
|
|
14
14
|
*/
|
|
15
15
|
export declare function cleanupAllState(basePath?: string): Promise<void>;
|
|
16
16
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cleanup.d.ts","sourceRoot":"","sources":["../../src/cli/cleanup.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,QAAQ,
|
|
1
|
+
{"version":3,"file":"cleanup.d.ts","sourceRoot":"","sources":["../../src/cli/cleanup.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,QAAQ,EAAY,MAAM,aAAa,CAAC;AAItD,MAAM,WAAW,aAAa;IAC5B,YAAY,EAAE,OAAO,CAAC;IACtB,eAAe,EAAE,QAAQ,EAAE,CAAC;IAC5B,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,iBAAiB,EAAE,MAAM,EAAE,CAAC;CAC7B;AAED;;GAEG;AACH,wBAAsB,mBAAmB,CAAC,QAAQ,GAAE,MAAsB,GAAG,OAAO,CAAC,aAAa,CAAC,CAgElG;AAED;;GAEG;AACH,wBAAsB,eAAe,CAAC,QAAQ,GAAE,MAAsB,GAAG,OAAO,CAAC,IAAI,CAAC,CAmFrF;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,aAAa,GAAG,IAAI,CA2B/D"}
|
package/dist/cli/cleanup.js
CHANGED
|
@@ -2,10 +2,7 @@ import { promises as fs } from 'node:fs';
|
|
|
2
2
|
import path from 'node:path';
|
|
3
3
|
import { execSync } from 'node:child_process';
|
|
4
4
|
import chalk from 'chalk';
|
|
5
|
-
import { MILLHOUSE_LABELS } from '../types.js';
|
|
6
|
-
import { GitHubClient } from '../github/client.js';
|
|
7
5
|
const MILLHOUSE_DIR = '.millhouse';
|
|
8
|
-
const ALL_LABELS = Object.values(MILLHOUSE_LABELS);
|
|
9
6
|
/**
|
|
10
7
|
* Detect leftover state from previous interrupted runs.
|
|
11
8
|
*/
|
|
@@ -72,34 +69,10 @@ export async function detectLeftoverState(basePath = process.cwd()) {
|
|
|
72
69
|
return result;
|
|
73
70
|
}
|
|
74
71
|
/**
|
|
75
|
-
* Clean up all millhouse state - worktrees, branches, run files
|
|
72
|
+
* Clean up all millhouse state - worktrees, branches, and run files.
|
|
76
73
|
*/
|
|
77
74
|
export async function cleanupAllState(basePath = process.cwd()) {
|
|
78
75
|
const millhouseDir = path.join(basePath, MILLHOUSE_DIR);
|
|
79
|
-
// Remove labels from issues in interrupted runs
|
|
80
|
-
try {
|
|
81
|
-
const githubClient = new GitHubClient();
|
|
82
|
-
const runsDir = path.join(millhouseDir, 'runs');
|
|
83
|
-
const runFiles = await fs.readdir(runsDir).catch(() => []);
|
|
84
|
-
const issueNumbers = new Set();
|
|
85
|
-
for (const file of runFiles) {
|
|
86
|
-
if (file.endsWith('.json')) {
|
|
87
|
-
const content = await fs.readFile(path.join(runsDir, file), 'utf-8');
|
|
88
|
-
const run = JSON.parse(content);
|
|
89
|
-
for (const issue of run.issues) {
|
|
90
|
-
issueNumbers.add(issue.number);
|
|
91
|
-
}
|
|
92
|
-
}
|
|
93
|
-
}
|
|
94
|
-
for (const issueNumber of issueNumbers) {
|
|
95
|
-
for (const label of ALL_LABELS) {
|
|
96
|
-
await githubClient.removeLabel(issueNumber, label).catch(() => { });
|
|
97
|
-
}
|
|
98
|
-
}
|
|
99
|
-
}
|
|
100
|
-
catch {
|
|
101
|
-
// GitHub client might fail if not in a repo, continue with local cleanup
|
|
102
|
-
}
|
|
103
76
|
// Remove all worktree directories
|
|
104
77
|
const worktreesDir = path.join(millhouseDir, 'worktrees');
|
|
105
78
|
try {
|
|
@@ -155,6 +128,29 @@ export async function cleanupAllState(basePath = process.cwd()) {
|
|
|
155
128
|
catch {
|
|
156
129
|
// File might not exist
|
|
157
130
|
}
|
|
131
|
+
// Reset worklist items to pending
|
|
132
|
+
const worklistFile = path.join(millhouseDir, 'worklist.json');
|
|
133
|
+
try {
|
|
134
|
+
const content = await fs.readFile(worklistFile, 'utf-8');
|
|
135
|
+
const worklist = JSON.parse(content);
|
|
136
|
+
let changed = false;
|
|
137
|
+
for (const item of worklist.items) {
|
|
138
|
+
if (item.status !== 'pending') {
|
|
139
|
+
item.status = 'pending';
|
|
140
|
+
delete item.startedAt;
|
|
141
|
+
delete item.completedAt;
|
|
142
|
+
delete item.error;
|
|
143
|
+
changed = true;
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
if (changed) {
|
|
147
|
+
worklist.updatedAt = new Date().toISOString();
|
|
148
|
+
await fs.writeFile(worklistFile, JSON.stringify(worklist, null, 2));
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
catch {
|
|
152
|
+
// Worklist might not exist
|
|
153
|
+
}
|
|
158
154
|
}
|
|
159
155
|
/**
|
|
160
156
|
* Display the leftover state to the user.
|
package/dist/cli/cleanup.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cleanup.js","sourceRoot":"","sources":["../../src/cli/cleanup.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,IAAI,EAAE,EAAE,MAAM,SAAS,CAAC;AACzC,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,KAAK,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"cleanup.js","sourceRoot":"","sources":["../../src/cli/cleanup.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/init.ts"],"names":[],"mappings":"AASA,UAAU,WAAW;IACnB,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAsGD,wBAAsB,WAAW,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAyErE"}
|
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
import { promises as fs } from 'node:fs';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
import os from 'node:os';
|
|
4
|
+
import readline from 'node:readline';
|
|
5
|
+
import chalk from 'chalk';
|
|
6
|
+
import { PlanParser } from '../../analysis/plan-parser.js';
|
|
7
|
+
import { WorklistStore } from '../../storage/worklist-store.js';
|
|
8
|
+
async function prompt(question) {
|
|
9
|
+
const rl = readline.createInterface({
|
|
10
|
+
input: process.stdin,
|
|
11
|
+
output: process.stdout,
|
|
12
|
+
});
|
|
13
|
+
return new Promise(resolve => {
|
|
14
|
+
rl.question(question, answer => {
|
|
15
|
+
rl.close();
|
|
16
|
+
resolve(answer.trim().toLowerCase());
|
|
17
|
+
});
|
|
18
|
+
});
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Find plans associated with the current project by searching
|
|
22
|
+
* Claude Code's session transcripts for plan file references.
|
|
23
|
+
*/
|
|
24
|
+
async function findProjectPlans() {
|
|
25
|
+
// Convert cwd to Claude project path format: /Users/dave/src/foo -> -Users-dave-src-foo
|
|
26
|
+
const cwd = process.cwd();
|
|
27
|
+
const projectDirName = cwd.replace(/\//g, '-');
|
|
28
|
+
const projectDir = path.join(os.homedir(), '.claude', 'projects', projectDirName);
|
|
29
|
+
const planRefs = new Set();
|
|
30
|
+
try {
|
|
31
|
+
const files = await fs.readdir(projectDir);
|
|
32
|
+
const jsonlFiles = files.filter(f => f.endsWith('.jsonl'));
|
|
33
|
+
// Search transcript files for plan references
|
|
34
|
+
for (const file of jsonlFiles) {
|
|
35
|
+
try {
|
|
36
|
+
const content = await fs.readFile(path.join(projectDir, file), 'utf-8');
|
|
37
|
+
// Match plan file paths like .claude/plans/name.md or ~/.claude/plans/name.md
|
|
38
|
+
const matches = content.match(/\.claude\/plans\/[a-z-]+\.md/g);
|
|
39
|
+
if (matches) {
|
|
40
|
+
for (const match of matches) {
|
|
41
|
+
// Extract just the filename
|
|
42
|
+
const filename = match.split('/').pop();
|
|
43
|
+
if (filename) {
|
|
44
|
+
planRefs.add(filename);
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
catch {
|
|
50
|
+
// Skip files we can't read
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
catch {
|
|
55
|
+
// Project directory doesn't exist
|
|
56
|
+
}
|
|
57
|
+
return Array.from(planRefs);
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Find the most recent plan file for the current project.
|
|
61
|
+
* Only looks at plans referenced in this project's session transcripts.
|
|
62
|
+
*/
|
|
63
|
+
async function findLatestPlan() {
|
|
64
|
+
const plansDir = path.join(os.homedir(), '.claude', 'plans');
|
|
65
|
+
// Get plans associated with this project
|
|
66
|
+
const projectPlans = await findProjectPlans();
|
|
67
|
+
if (projectPlans.length === 0) {
|
|
68
|
+
return null;
|
|
69
|
+
}
|
|
70
|
+
try {
|
|
71
|
+
const files = await fs.readdir(plansDir);
|
|
72
|
+
const mdFiles = files.filter(f => f.endsWith('.md'));
|
|
73
|
+
// Filter to only project-specific plans
|
|
74
|
+
const relevantFiles = mdFiles.filter(f => projectPlans.includes(f));
|
|
75
|
+
if (relevantFiles.length === 0) {
|
|
76
|
+
return null;
|
|
77
|
+
}
|
|
78
|
+
// Get stats for all files and sort by mtime
|
|
79
|
+
const filesWithStats = await Promise.all(relevantFiles.map(async (file) => {
|
|
80
|
+
const filePath = path.join(plansDir, file);
|
|
81
|
+
const stats = await fs.stat(filePath);
|
|
82
|
+
return { file, filePath, mtime: stats.mtime };
|
|
83
|
+
}));
|
|
84
|
+
filesWithStats.sort((a, b) => b.mtime.getTime() - a.mtime.getTime());
|
|
85
|
+
const latest = filesWithStats[0];
|
|
86
|
+
const content = await fs.readFile(latest.filePath, 'utf-8');
|
|
87
|
+
return { path: latest.filePath, content };
|
|
88
|
+
}
|
|
89
|
+
catch {
|
|
90
|
+
return null;
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
export async function initCommand(options) {
|
|
94
|
+
// Check for CLAUDE.md
|
|
95
|
+
const claudeMdPath = path.join(process.cwd(), 'CLAUDE.md');
|
|
96
|
+
try {
|
|
97
|
+
await fs.access(claudeMdPath);
|
|
98
|
+
}
|
|
99
|
+
catch {
|
|
100
|
+
console.log(chalk.yellow('⚠ No CLAUDE.md found.'));
|
|
101
|
+
console.log(chalk.gray(' CLAUDE.md is highly recommended for best results.'));
|
|
102
|
+
console.log(chalk.gray(' Run /init inside Claude Code to create it.\n'));
|
|
103
|
+
}
|
|
104
|
+
const store = new WorklistStore();
|
|
105
|
+
// Check if worklist already exists
|
|
106
|
+
if (await store.exists()) {
|
|
107
|
+
if (options.force) {
|
|
108
|
+
console.log(chalk.yellow('Overwriting existing worklist...'));
|
|
109
|
+
}
|
|
110
|
+
else {
|
|
111
|
+
console.log(chalk.yellow('\nWorklist already exists.\n'));
|
|
112
|
+
const choice = await prompt(' [d] Delete and create new\n [c] Cancel\n\nChoice: ');
|
|
113
|
+
if (choice !== 'd') {
|
|
114
|
+
console.log('Cancelled.');
|
|
115
|
+
return;
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
// Find latest plan for this project
|
|
120
|
+
const plan = await findLatestPlan();
|
|
121
|
+
if (!plan) {
|
|
122
|
+
console.error(chalk.red('No plan found for this project.'));
|
|
123
|
+
console.log('\nUse Claude Code plan mode to create a plan first.');
|
|
124
|
+
process.exit(1);
|
|
125
|
+
}
|
|
126
|
+
console.log(chalk.gray(`Using plan: ${plan.path}\n`));
|
|
127
|
+
// Parse plan using Claude
|
|
128
|
+
const parser = new PlanParser();
|
|
129
|
+
const parseResult = await parser.parse(plan.content);
|
|
130
|
+
if (parseResult.items.length === 0) {
|
|
131
|
+
console.error(chalk.red('No work items found in plan.'));
|
|
132
|
+
process.exit(1);
|
|
133
|
+
}
|
|
134
|
+
// Convert to WorklistItems
|
|
135
|
+
const items = parseResult.items.map(item => ({
|
|
136
|
+
id: item.number,
|
|
137
|
+
title: item.title,
|
|
138
|
+
body: item.body || '',
|
|
139
|
+
dependencies: item.dependencies,
|
|
140
|
+
status: 'pending',
|
|
141
|
+
}));
|
|
142
|
+
const worklist = {
|
|
143
|
+
version: 1,
|
|
144
|
+
createdAt: new Date().toISOString(),
|
|
145
|
+
updatedAt: new Date().toISOString(),
|
|
146
|
+
source: 'plan',
|
|
147
|
+
title: parseResult.title,
|
|
148
|
+
description: parseResult.description,
|
|
149
|
+
items,
|
|
150
|
+
};
|
|
151
|
+
await store.save(worklist);
|
|
152
|
+
console.log(chalk.green(`\n✓ Created worklist with ${items.length} items`));
|
|
153
|
+
console.log(chalk.gray(' Run "millhouse list" to see items'));
|
|
154
|
+
console.log(chalk.gray(' Run "millhouse run" to execute'));
|
|
155
|
+
}
|
|
156
|
+
//# sourceMappingURL=init.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../../src/cli/commands/init.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"list.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/list.ts"],"names":[],"mappings":"AAIA,UAAU,WAAW;IACnB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,wBAAsB,WAAW,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAkFrE"}
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
import chalk from 'chalk';
|
|
2
|
+
import { WorklistStore } from '../../storage/worklist-store.js';
|
|
3
|
+
export async function listCommand(options) {
|
|
4
|
+
const verbose = options.verbose ?? false;
|
|
5
|
+
const store = new WorklistStore();
|
|
6
|
+
const worklist = await store.load();
|
|
7
|
+
if (!worklist) {
|
|
8
|
+
console.log(chalk.yellow('No worklist found.'));
|
|
9
|
+
console.log('Run "millhouse init" or "millhouse load" first.');
|
|
10
|
+
return;
|
|
11
|
+
}
|
|
12
|
+
if (worklist.items.length === 0) {
|
|
13
|
+
console.log(chalk.yellow('Worklist is empty.'));
|
|
14
|
+
return;
|
|
15
|
+
}
|
|
16
|
+
// Group by status
|
|
17
|
+
const pending = worklist.items.filter(i => i.status === 'pending');
|
|
18
|
+
const completed = worklist.items.filter(i => i.status === 'completed');
|
|
19
|
+
const failed = worklist.items.filter(i => i.status === 'failed');
|
|
20
|
+
// Calculate which pending items are blocked
|
|
21
|
+
const completedIds = new Set(completed.map(i => i.id));
|
|
22
|
+
const isBlocked = (item) => item.dependencies.some(dep => !completedIds.has(dep));
|
|
23
|
+
const ready = pending.filter(i => !isBlocked(i));
|
|
24
|
+
const blocked = pending.filter(i => isBlocked(i));
|
|
25
|
+
console.log(chalk.bold(`\nWorklist: ${worklist.items.length} items\n`));
|
|
26
|
+
// Show source
|
|
27
|
+
if (worklist.source === 'github') {
|
|
28
|
+
console.log(chalk.gray(`Source: GitHub issues\n`));
|
|
29
|
+
}
|
|
30
|
+
else {
|
|
31
|
+
console.log(chalk.gray(`Source: Plan\n`));
|
|
32
|
+
}
|
|
33
|
+
// Ready items
|
|
34
|
+
if (ready.length > 0) {
|
|
35
|
+
console.log(chalk.green.bold(`Ready (${ready.length}):`));
|
|
36
|
+
for (const item of ready) {
|
|
37
|
+
displayItem(item, completedIds, verbose);
|
|
38
|
+
}
|
|
39
|
+
console.log();
|
|
40
|
+
}
|
|
41
|
+
// Blocked items
|
|
42
|
+
if (blocked.length > 0) {
|
|
43
|
+
console.log(chalk.yellow.bold(`Blocked (${blocked.length}):`));
|
|
44
|
+
for (const item of blocked) {
|
|
45
|
+
displayItem(item, completedIds, verbose);
|
|
46
|
+
}
|
|
47
|
+
console.log();
|
|
48
|
+
}
|
|
49
|
+
// Completed items
|
|
50
|
+
if (completed.length > 0) {
|
|
51
|
+
console.log(chalk.blue.bold(`Completed (${completed.length}):`));
|
|
52
|
+
for (const item of completed) {
|
|
53
|
+
displayItem(item, completedIds, verbose);
|
|
54
|
+
}
|
|
55
|
+
console.log();
|
|
56
|
+
}
|
|
57
|
+
// Failed items
|
|
58
|
+
if (failed.length > 0) {
|
|
59
|
+
console.log(chalk.red.bold(`Failed (${failed.length}):`));
|
|
60
|
+
for (const item of failed) {
|
|
61
|
+
displayItem(item, completedIds, verbose, true);
|
|
62
|
+
}
|
|
63
|
+
console.log();
|
|
64
|
+
}
|
|
65
|
+
// Summary
|
|
66
|
+
console.log(chalk.gray('─'.repeat(50)));
|
|
67
|
+
console.log(` ${chalk.green('●')} ${ready.length} ready ` +
|
|
68
|
+
`${chalk.yellow('●')} ${blocked.length} blocked ` +
|
|
69
|
+
`${chalk.blue('●')} ${completed.length} done ` +
|
|
70
|
+
`${chalk.red('●')} ${failed.length} failed`);
|
|
71
|
+
}
|
|
72
|
+
function displayItem(item, completedIds, verbose = false, showError = false) {
|
|
73
|
+
const issueTag = item.githubIssueNumber
|
|
74
|
+
? chalk.cyan(` (#${item.githubIssueNumber})`)
|
|
75
|
+
: '';
|
|
76
|
+
let deps = '';
|
|
77
|
+
if (item.dependencies.length > 0) {
|
|
78
|
+
const depLabels = item.dependencies.map(dep => {
|
|
79
|
+
const isComplete = completedIds.has(dep);
|
|
80
|
+
return isComplete ? chalk.gray(`#${dep}`) : chalk.yellow(`#${dep}`);
|
|
81
|
+
});
|
|
82
|
+
deps = chalk.gray(` ← ${depLabels.join(', ')}`);
|
|
83
|
+
}
|
|
84
|
+
const statusIcon = getStatusIcon(item.status);
|
|
85
|
+
console.log(` ${statusIcon} ${item.id}. ${item.title}${issueTag}${deps}`);
|
|
86
|
+
if (verbose && item.body) {
|
|
87
|
+
// Indent each line of the body
|
|
88
|
+
const indentedBody = item.body
|
|
89
|
+
.split('\n')
|
|
90
|
+
.map(line => ` ${line}`)
|
|
91
|
+
.join('\n');
|
|
92
|
+
console.log(chalk.gray(indentedBody));
|
|
93
|
+
console.log();
|
|
94
|
+
}
|
|
95
|
+
if (showError && item.error) {
|
|
96
|
+
console.log(chalk.red(` Error: ${item.error}`));
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
function getStatusIcon(status) {
|
|
100
|
+
switch (status) {
|
|
101
|
+
case 'pending':
|
|
102
|
+
return chalk.gray('○');
|
|
103
|
+
case 'completed':
|
|
104
|
+
return chalk.green('✓');
|
|
105
|
+
case 'failed':
|
|
106
|
+
return chalk.red('✗');
|
|
107
|
+
default:
|
|
108
|
+
return chalk.gray('○');
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
//# sourceMappingURL=list.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"list.js","sourceRoot":"","sources":["../../../src/cli/commands/list.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"load.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/load.ts"],"names":[],"mappings":"AAsBA,wBAAsB,WAAW,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CA6GhE"}
|