millhouse 0.3.9 → 1.0.2
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 +153 -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 +12 -5
- 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/implementation.prompt.md +3 -3
- package/prompts/issue-analysis.prompt.md +56 -22
- package/prompts/plan-analysis.prompt.md +48 -10
- package/commands/millhouse.md +0 -223
package/dist/types.d.ts
CHANGED
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import { z } from 'zod';
|
|
2
1
|
export interface WorkItem {
|
|
3
2
|
id: number;
|
|
4
3
|
title: string;
|
|
@@ -22,6 +21,8 @@ export interface AnalyzedIssue extends GitHubIssue {
|
|
|
22
21
|
affectedPaths: string[];
|
|
23
22
|
dependencies: number[];
|
|
24
23
|
analyzedAt: string;
|
|
24
|
+
githubIssueNumber?: number;
|
|
25
|
+
noWorkNeeded?: boolean;
|
|
25
26
|
}
|
|
26
27
|
export declare function issueToWorkItem(issue: AnalyzedIssue): AnalyzedWorkItem;
|
|
27
28
|
export type TaskStatus = 'queued' | 'blocked' | 'ready' | 'in-progress' | 'completed' | 'failed';
|
|
@@ -57,75 +58,29 @@ export interface WorktreeInfo {
|
|
|
57
58
|
branch: string;
|
|
58
59
|
createdAt: string;
|
|
59
60
|
}
|
|
60
|
-
export
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
branchPrefix: z.ZodDefault<z.ZodString>;
|
|
84
|
-
}, "strip", z.ZodTypeAny, {
|
|
85
|
-
createAsDraft: boolean;
|
|
86
|
-
mergeStrategy: "merge" | "squash" | "rebase";
|
|
87
|
-
branchPrefix: string;
|
|
88
|
-
}, {
|
|
89
|
-
createAsDraft?: boolean | undefined;
|
|
90
|
-
mergeStrategy?: "merge" | "squash" | "rebase" | undefined;
|
|
91
|
-
branchPrefix?: string | undefined;
|
|
92
|
-
}>>;
|
|
93
|
-
}, "strip", z.ZodTypeAny, {
|
|
94
|
-
execution: {
|
|
95
|
-
concurrency: number;
|
|
96
|
-
baseBranch: string;
|
|
97
|
-
maxBudgetPerIssue: number;
|
|
98
|
-
maxTotalBudget: number;
|
|
99
|
-
continueOnError: boolean;
|
|
100
|
-
};
|
|
101
|
-
pullRequests: {
|
|
102
|
-
createAsDraft: boolean;
|
|
103
|
-
mergeStrategy: "merge" | "squash" | "rebase";
|
|
104
|
-
branchPrefix: string;
|
|
105
|
-
};
|
|
106
|
-
}, {
|
|
107
|
-
execution?: {
|
|
108
|
-
concurrency?: number | undefined;
|
|
109
|
-
baseBranch?: string | undefined;
|
|
110
|
-
maxBudgetPerIssue?: number | undefined;
|
|
111
|
-
maxTotalBudget?: number | undefined;
|
|
112
|
-
continueOnError?: boolean | undefined;
|
|
113
|
-
} | undefined;
|
|
114
|
-
pullRequests?: {
|
|
115
|
-
createAsDraft?: boolean | undefined;
|
|
116
|
-
mergeStrategy?: "merge" | "squash" | "rebase" | undefined;
|
|
117
|
-
branchPrefix?: string | undefined;
|
|
118
|
-
} | undefined;
|
|
119
|
-
}>;
|
|
120
|
-
export type Config = z.infer<typeof ConfigSchema>;
|
|
121
|
-
export declare const MILLHOUSE_LABELS: {
|
|
122
|
-
readonly QUEUED: "millhouse:queued";
|
|
123
|
-
readonly IN_PROGRESS: "millhouse:in-progress";
|
|
124
|
-
readonly BLOCKED: "millhouse:blocked";
|
|
125
|
-
readonly FAILED: "millhouse:failed";
|
|
126
|
-
readonly DONE: "millhouse:done";
|
|
127
|
-
};
|
|
128
|
-
export type MillhouseLabel = typeof MILLHOUSE_LABELS[keyof typeof MILLHOUSE_LABELS];
|
|
61
|
+
export type WorklistItemStatus = 'pending' | 'completed' | 'failed';
|
|
62
|
+
export interface WorklistItem {
|
|
63
|
+
id: number;
|
|
64
|
+
title: string;
|
|
65
|
+
body: string;
|
|
66
|
+
dependencies: number[];
|
|
67
|
+
status: WorklistItemStatus;
|
|
68
|
+
githubIssueNumber?: number;
|
|
69
|
+
noWorkNeeded?: boolean;
|
|
70
|
+
startedAt?: string;
|
|
71
|
+
completedAt?: string;
|
|
72
|
+
error?: string;
|
|
73
|
+
}
|
|
74
|
+
export interface Worklist {
|
|
75
|
+
version: 1;
|
|
76
|
+
createdAt: string;
|
|
77
|
+
updatedAt: string;
|
|
78
|
+
source: 'plan' | 'github';
|
|
79
|
+
title?: string;
|
|
80
|
+
description?: string;
|
|
81
|
+
indexIssueNumber?: number;
|
|
82
|
+
items: WorklistItem[];
|
|
83
|
+
}
|
|
129
84
|
export type SchedulerEvent = {
|
|
130
85
|
type: 'task-started';
|
|
131
86
|
issueNumber: number;
|
|
@@ -141,4 +96,17 @@ export type SchedulerEvent = {
|
|
|
141
96
|
type: 'tasks-unblocked';
|
|
142
97
|
issueNumbers: number[];
|
|
143
98
|
};
|
|
99
|
+
export interface JsonPlanItem {
|
|
100
|
+
id: number;
|
|
101
|
+
title: string;
|
|
102
|
+
body: string;
|
|
103
|
+
dependencies: number[];
|
|
104
|
+
}
|
|
105
|
+
export interface JsonPlan {
|
|
106
|
+
version: 1;
|
|
107
|
+
name?: string;
|
|
108
|
+
createdAt: string;
|
|
109
|
+
sourcePlan?: string;
|
|
110
|
+
items: JsonPlanItem[];
|
|
111
|
+
}
|
|
144
112
|
//# sourceMappingURL=types.d.ts.map
|
package/dist/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,QAAQ;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,aAAa,EAAE,MAAM,EAAE,CAAC;CACzB;AAGD,MAAM,WAAW,gBAAiB,SAAQ,QAAQ;IAChD,UAAU,EAAE,MAAM,CAAC;CACpB;AAOD,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,KAAK,EAAE,MAAM,GAAG,QAAQ,CAAC;IACzB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,MAAM,CAAC;CACjB;AAGD,MAAM,WAAW,aAAc,SAAQ,WAAW;IAChD,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,UAAU,EAAE,MAAM,CAAC;IACnB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB;AAGD,wBAAgB,eAAe,CAAC,KAAK,EAAE,aAAa,GAAG,gBAAgB,CAStE;AAGD,MAAM,MAAM,UAAU,GAClB,QAAQ,GACR,SAAS,GACT,OAAO,GACP,aAAa,GACb,WAAW,GACX,QAAQ,CAAC;AAGb,MAAM,WAAW,IAAI;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,UAAU,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAGD,MAAM,WAAW,QAAQ;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,SAAS,GAAG,WAAW,GAAG,QAAQ,GAAG,aAAa,CAAC;IAC3D,IAAI,CAAC,EAAE,MAAM,GAAG,QAAQ,CAAC;IACzB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,aAAa,EAAE,CAAC;IACxB,KAAK,EAAE,IAAI,EAAE,CAAC;IACd,eAAe,EAAE,MAAM,EAAE,CAAC;IAC1B,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAGD,MAAM,WAAW,YAAY;IAC3B,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;CACnB;AAOD,MAAM,MAAM,kBAAkB,GAAG,SAAS,GAAG,WAAW,GAAG,QAAQ,CAAC;AAEpE,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,MAAM,EAAE,kBAAkB,CAAC;IAC3B,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,QAAQ;IACvB,OAAO,EAAE,CAAC,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,GAAG,QAAQ,CAAC;IAC1B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,KAAK,EAAE,YAAY,EAAE,CAAC;CACvB;AAGD,MAAM,MAAM,cAAc,GACtB;IAAE,IAAI,EAAE,cAAc,CAAC;IAAC,WAAW,EAAE,MAAM,CAAA;CAAE,GAC7C;IAAE,IAAI,EAAE,gBAAgB,CAAC;IAAC,WAAW,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,EAAE,CAAA;CAAE,GAClE;IAAE,IAAI,EAAE,aAAa,CAAC;IAAC,WAAW,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GAC3D;IAAE,IAAI,EAAE,iBAAiB,CAAC;IAAC,YAAY,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC;AAMxD,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,EAAE,MAAM,EAAE,CAAC;CACxB;AAED,MAAM,WAAW,QAAQ;IACvB,OAAO,EAAE,CAAC,CAAC;IACX,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,YAAY,EAAE,CAAC;CACvB"}
|
package/dist/types.js
CHANGED
|
@@ -1,4 +1,6 @@
|
|
|
1
|
-
|
|
1
|
+
// =============================================================================
|
|
2
|
+
// Work Items (abstraction for both GitHub issues and local items)
|
|
3
|
+
// =============================================================================
|
|
2
4
|
// Convert AnalyzedIssue to AnalyzedWorkItem
|
|
3
5
|
export function issueToWorkItem(issue) {
|
|
4
6
|
return {
|
|
@@ -10,27 +12,4 @@ export function issueToWorkItem(issue) {
|
|
|
10
12
|
analyzedAt: issue.analyzedAt,
|
|
11
13
|
};
|
|
12
14
|
}
|
|
13
|
-
// Configuration schema
|
|
14
|
-
export const ConfigSchema = z.object({
|
|
15
|
-
execution: z.object({
|
|
16
|
-
concurrency: z.number().min(1).max(16).default(8),
|
|
17
|
-
baseBranch: z.string().default('main'),
|
|
18
|
-
maxBudgetPerIssue: z.number().positive().default(5.0),
|
|
19
|
-
maxTotalBudget: z.number().positive().default(100.0),
|
|
20
|
-
continueOnError: z.boolean().default(true),
|
|
21
|
-
}).default({}),
|
|
22
|
-
pullRequests: z.object({
|
|
23
|
-
createAsDraft: z.boolean().default(true),
|
|
24
|
-
mergeStrategy: z.enum(['merge', 'squash', 'rebase']).default('squash'),
|
|
25
|
-
branchPrefix: z.string().default('millhouse/issue-'),
|
|
26
|
-
}).default({}),
|
|
27
|
-
});
|
|
28
|
-
// Millhouse labels
|
|
29
|
-
export const MILLHOUSE_LABELS = {
|
|
30
|
-
QUEUED: 'millhouse:queued',
|
|
31
|
-
IN_PROGRESS: 'millhouse:in-progress',
|
|
32
|
-
BLOCKED: 'millhouse:blocked',
|
|
33
|
-
FAILED: 'millhouse:failed',
|
|
34
|
-
DONE: 'millhouse:done',
|
|
35
|
-
};
|
|
36
15
|
//# sourceMappingURL=types.js.map
|
package/dist/types.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,gFAAgF;AAChF,kEAAkE;AAClE,gFAAgF;AAwChF,4CAA4C;AAC5C,MAAM,UAAU,eAAe,CAAC,KAAoB;IAClD,OAAO;QACL,EAAE,EAAE,KAAK,CAAC,MAAM;QAChB,KAAK,EAAE,KAAK,CAAC,KAAK;QAClB,IAAI,EAAE,KAAK,CAAC,IAAI;QAChB,YAAY,EAAE,KAAK,CAAC,YAAY;QAChC,aAAa,EAAE,KAAK,CAAC,aAAa;QAClC,UAAU,EAAE,KAAK,CAAC,UAAU;KAC7B,CAAC;AACJ,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "millhouse",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"description": "Orchestrate parallel Claude Code instances to implement
|
|
3
|
+
"version": "1.0.2",
|
|
4
|
+
"description": "Orchestrate parallel Claude Code instances to implement work items",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|
|
7
7
|
"bin": {
|
|
@@ -9,7 +9,6 @@
|
|
|
9
9
|
},
|
|
10
10
|
"files": [
|
|
11
11
|
"dist",
|
|
12
|
-
"commands",
|
|
13
12
|
"prompts"
|
|
14
13
|
],
|
|
15
14
|
"scripts": {
|
|
@@ -36,8 +35,7 @@
|
|
|
36
35
|
"commander": "^12.1.0",
|
|
37
36
|
"graphlib": "^2.1.8",
|
|
38
37
|
"ora": "^8.0.1",
|
|
39
|
-
"string-width": "^8.1.0"
|
|
40
|
-
"zod": "^3.23.0"
|
|
38
|
+
"string-width": "^8.1.0"
|
|
41
39
|
},
|
|
42
40
|
"devDependencies": {
|
|
43
41
|
"@types/graphlib": "^2.1.12",
|
|
@@ -70,7 +70,7 @@ Stage and commit your changes on your issue branch:
|
|
|
70
70
|
- Create a single commit with a comprehensive message that includes:
|
|
71
71
|
- A clear summary line describing the change
|
|
72
72
|
- A detailed body explaining what was implemented
|
|
73
|
-
- End with "Fixes #{{
|
|
73
|
+
{{#if githubIssueNumber}} - End with "Fixes #{{githubIssueNumber}}"{{/if}}
|
|
74
74
|
|
|
75
75
|
### 6. CRITICAL: Merge Into Run Branch
|
|
76
76
|
|
|
@@ -149,9 +149,9 @@ Changes:
|
|
|
149
149
|
|
|
150
150
|
Acceptance criteria satisfied:
|
|
151
151
|
- [x] Functions exported correctly
|
|
152
|
-
- [x] No type errors
|
|
152
|
+
- [x] No type errors{{#if githubIssueNumber}}
|
|
153
153
|
|
|
154
|
-
Fixes #{{
|
|
154
|
+
Fixes #{{githubIssueNumber}}{{/if}}"
|
|
155
155
|
|
|
156
156
|
# Check status
|
|
157
157
|
git status
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
Analyze these GitHub issues
|
|
1
|
+
Analyze these GitHub issues to determine their dependencies and optimal execution order.
|
|
2
2
|
|
|
3
3
|
## Issues to Analyze
|
|
4
4
|
|
|
@@ -8,27 +8,61 @@ Analyze these GitHub issues and determine their dependencies and execution order
|
|
|
8
8
|
|
|
9
9
|
## Your Task
|
|
10
10
|
|
|
11
|
-
|
|
11
|
+
**DO NOT use TodoWrite, TaskCreate, or any task/todo tools. Only use Read, Glob, Grep, and Bash.**
|
|
12
|
+
|
|
13
|
+
1. First, use Read, Glob, and Grep to explore the codebase structure
|
|
14
|
+
2. Then analyze each issue semantically to determine dependencies
|
|
15
|
+
|
|
16
|
+
For each issue determine:
|
|
12
17
|
1. **dependencies**: Which issues MUST be completed BEFORE this issue can start
|
|
13
18
|
2. **affectedPaths**: File paths this issue will likely create or modify
|
|
19
|
+
3. **noWorkNeeded**: True if this is a meta/index issue that requires no actual code changes (e.g., tracking issues, index issues that just link to other issues, documentation-only issues)
|
|
20
|
+
|
|
21
|
+
Also provide a summary title and description for this entire set of issues.
|
|
22
|
+
|
|
23
|
+
## Dependency Analysis Guidelines
|
|
24
|
+
|
|
25
|
+
Analyze the **semantic meaning** of each issue, not just explicit keywords. Consider:
|
|
26
|
+
|
|
27
|
+
- **Explicit mentions**: "depends on #X", "after #X", "blocked by #X", "requires #X"
|
|
28
|
+
- **Logical ordering**: If issue A creates something that issue B uses, B depends on A
|
|
29
|
+
- **Feature flow**: Setup/infrastructure issues before features that use them
|
|
30
|
+
- **Data dependencies**: Schema/model changes before code that uses those models
|
|
31
|
+
- **API dependencies**: API endpoints before UI that calls them
|
|
32
|
+
|
|
33
|
+
Issues written by humans may not have explicit dependency markers - use your understanding of software development to infer the correct order.
|
|
34
|
+
|
|
35
|
+
---
|
|
36
|
+
|
|
37
|
+
## Required Output Format
|
|
38
|
+
|
|
39
|
+
After exploring the codebase, output ONLY a JSON object. No other text after the JSON.
|
|
40
|
+
|
|
41
|
+
```json
|
|
42
|
+
{
|
|
43
|
+
"title": "Short summary title for all issues (e.g. 'Add user authentication')",
|
|
44
|
+
"description": "A 1-2 sentence summary of what these issues accomplish together.",
|
|
45
|
+
"issues": [
|
|
46
|
+
{
|
|
47
|
+
"issueNumber": 1,
|
|
48
|
+
"dependencies": [],
|
|
49
|
+
"affectedPaths": ["src/path/to/file.ts"],
|
|
50
|
+
"noWorkNeeded": false
|
|
51
|
+
},
|
|
52
|
+
{
|
|
53
|
+
"issueNumber": 2,
|
|
54
|
+
"dependencies": [1],
|
|
55
|
+
"affectedPaths": ["src/other/file.ts"],
|
|
56
|
+
"noWorkNeeded": false
|
|
57
|
+
},
|
|
58
|
+
{
|
|
59
|
+
"issueNumber": 3,
|
|
60
|
+
"dependencies": [1, 2],
|
|
61
|
+
"affectedPaths": [],
|
|
62
|
+
"noWorkNeeded": true
|
|
63
|
+
}
|
|
64
|
+
]
|
|
65
|
+
}
|
|
66
|
+
```
|
|
14
67
|
|
|
15
|
-
|
|
16
|
-
[
|
|
17
|
-
{
|
|
18
|
-
"issueNumber": 1,
|
|
19
|
-
"dependencies": [],
|
|
20
|
-
"affectedPaths": ["src/path/to/file.ts"]
|
|
21
|
-
},
|
|
22
|
-
{
|
|
23
|
-
"issueNumber": 2,
|
|
24
|
-
"dependencies": [1],
|
|
25
|
-
"affectedPaths": ["src/other/file.ts"]
|
|
26
|
-
}
|
|
27
|
-
]
|
|
28
|
-
|
|
29
|
-
Rules:
|
|
30
|
-
- Look for explicit dependency mentions: "depends on #X", "after #X", "blocked by #X", "requires #X"
|
|
31
|
-
- Also infer logical dependencies (e.g., if issue B imports from a file that issue A creates)
|
|
32
|
-
- Only include dependencies between issues in this list
|
|
33
|
-
- affectedPaths should be specific file paths mentioned or implied
|
|
34
|
-
- Respond with ONLY valid JSON, nothing else
|
|
68
|
+
The JSON must be valid. Only include dependencies between issues in this list.
|
|
@@ -1,18 +1,56 @@
|
|
|
1
|
-
|
|
1
|
+
Break this plan into discrete work items for parallel execution.
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
## Plan
|
|
4
4
|
|
|
5
5
|
{{plan}}
|
|
6
6
|
|
|
7
7
|
---
|
|
8
8
|
|
|
9
|
-
|
|
10
|
-
- "id": number (starting from 1)
|
|
11
|
-
- "title": string (short title)
|
|
12
|
-
- "body": string (full implementation details, file paths, acceptance criteria)
|
|
13
|
-
- "dependencies": number[] (IDs of prerequisite work items)
|
|
9
|
+
## Your Task
|
|
14
10
|
|
|
15
|
-
|
|
16
|
-
|
|
11
|
+
1. Use Read, Glob, and Grep tools to explore the codebase
|
|
12
|
+
2. Output a JSON object with summary and work items
|
|
17
13
|
|
|
18
|
-
DO NOT
|
|
14
|
+
**DO NOT use TodoWrite, TaskCreate, or any task/todo tools. Only use Read, Glob, Grep, and Bash.**
|
|
15
|
+
|
|
16
|
+
## Context
|
|
17
|
+
|
|
18
|
+
Work items will be executed by parallel Claude instances in isolated contexts. Each item must be completely self-contained with all information needed.
|
|
19
|
+
|
|
20
|
+
## Work Item Guidelines
|
|
21
|
+
|
|
22
|
+
- Each item should be completable in one session
|
|
23
|
+
- Include exact file paths, function signatures, patterns to follow
|
|
24
|
+
- Use `"dependencies": [1, 2]` for prerequisite items
|
|
25
|
+
- Only add dependencies that are truly required
|
|
26
|
+
|
|
27
|
+
---
|
|
28
|
+
|
|
29
|
+
## Required Output Format
|
|
30
|
+
|
|
31
|
+
After exploring the codebase, output ONLY a JSON object. No other text after the JSON.
|
|
32
|
+
|
|
33
|
+
Use \n for newlines in body text. Keep body content concise.
|
|
34
|
+
|
|
35
|
+
```json
|
|
36
|
+
{
|
|
37
|
+
"title": "Short summary title for the whole plan (e.g. 'Add user authentication')",
|
|
38
|
+
"description": "A 1-2 sentence summary of what this plan accomplishes overall.",
|
|
39
|
+
"items": [
|
|
40
|
+
{
|
|
41
|
+
"id": 1,
|
|
42
|
+
"title": "Short title",
|
|
43
|
+
"body": "Implementation details. File: src/foo.ts. Pattern: follow existing style.",
|
|
44
|
+
"dependencies": []
|
|
45
|
+
},
|
|
46
|
+
{
|
|
47
|
+
"id": 2,
|
|
48
|
+
"title": "Another task",
|
|
49
|
+
"body": "More details here.",
|
|
50
|
+
"dependencies": [1]
|
|
51
|
+
}
|
|
52
|
+
]
|
|
53
|
+
}
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
The JSON must be valid. Use \n for newlines, escape quotes with backslash.
|
package/commands/millhouse.md
DELETED
|
@@ -1,223 +0,0 @@
|
|
|
1
|
-
# Millhouse
|
|
2
|
-
|
|
3
|
-
Orchestrate parallel Claude Code instances to implement work items.
|
|
4
|
-
|
|
5
|
-
## Usage
|
|
6
|
-
|
|
7
|
-
Parse $ARGUMENTS to determine the subcommand:
|
|
8
|
-
|
|
9
|
-
- `/millhouse plan [plan-file]` - Refine a plan for millhouse execution
|
|
10
|
-
- `/millhouse issues [plan-file]` - Create GitHub issues from a plan
|
|
11
|
-
|
|
12
|
-
---
|
|
13
|
-
|
|
14
|
-
## /millhouse plan
|
|
15
|
-
|
|
16
|
-
Refine and improve a plan to make it suitable for millhouse execution. This should be fast and unattended - don't ask clarifying questions, just improve the plan.
|
|
17
|
-
|
|
18
|
-
### Context
|
|
19
|
-
|
|
20
|
-
Millhouse executes work items in **parallel using separate Claude Code instances**, each running **unattended in its own context window**. This means:
|
|
21
|
-
|
|
22
|
-
- Each work item is a fresh start with no memory of previous work
|
|
23
|
-
- Work items must be completely self-contained
|
|
24
|
-
- Nothing can be assumed or left implicit
|
|
25
|
-
|
|
26
|
-
### Instructions
|
|
27
|
-
|
|
28
|
-
1. Read the plan from the file path argument. If no file given, look for plan.md or ask for the filename only.
|
|
29
|
-
2. Analyze the plan and rewrite it following the guidelines below
|
|
30
|
-
3. Save the improved plan to the same file (overwrite), or `plan.md` if it was a new plan
|
|
31
|
-
4. **Do not ask questions about features, scope, or implementation details** - work with what's given
|
|
32
|
-
5. **Do not suggest additions** - only restructure and clarify what's already in the plan
|
|
33
|
-
|
|
34
|
-
### Plan Improvement Guidelines
|
|
35
|
-
|
|
36
|
-
Transform the plan to be millhouse-ready:
|
|
37
|
-
|
|
38
|
-
**1. Separate work items clearly**
|
|
39
|
-
- Each work item should be a distinct section
|
|
40
|
-
- Work items will run in separate contexts, stage by stage
|
|
41
|
-
- Make boundaries between items obvious
|
|
42
|
-
|
|
43
|
-
**2. Split into appropriately-sized tasks**
|
|
44
|
-
- Break large tasks into smaller sub-tasks where necessary
|
|
45
|
-
- Each task should be small enough to complete in one go, unattended
|
|
46
|
-
- A task that's "create an entire application" is too big
|
|
47
|
-
- A task that's "create a function that adds two numbers" might be too small (unless it's a dependency)
|
|
48
|
-
|
|
49
|
-
**3. Make each task self-contained**
|
|
50
|
-
- Include ALL context needed to implement the task
|
|
51
|
-
- Specify exact file paths to create or modify
|
|
52
|
-
- Include function signatures, types, interfaces
|
|
53
|
-
- Don't assume knowledge from other tasks
|
|
54
|
-
|
|
55
|
-
**4. Add thorough acceptance criteria**
|
|
56
|
-
- How do we know this task is done?
|
|
57
|
-
- What commands verify it works? (e.g., `npm test`, `go build`)
|
|
58
|
-
- What should the output look like?
|
|
59
|
-
- What edge cases should be handled?
|
|
60
|
-
|
|
61
|
-
**5. Add testing instructions**
|
|
62
|
-
- Specific test commands to run
|
|
63
|
-
- Expected results
|
|
64
|
-
- How to verify integration with other components
|
|
65
|
-
|
|
66
|
-
**6. Make dependencies explicit**
|
|
67
|
-
- Which tasks must complete before this one can start?
|
|
68
|
-
- What does this task need from its dependencies? (files, exports, etc.)
|
|
69
|
-
- Use clear language like "This requires the math utilities from task 1"
|
|
70
|
-
|
|
71
|
-
### Important: Be Non-Interactive
|
|
72
|
-
|
|
73
|
-
- **Don't ask** if the user wants to add features, tests, or documentation
|
|
74
|
-
- **Don't suggest** expanding scope or adding "nice to haves"
|
|
75
|
-
- **Just restructure** the existing plan into millhouse-ready format
|
|
76
|
-
- If something is ambiguous, make a reasonable assumption and note it in the task
|
|
77
|
-
|
|
78
|
-
### Example Transformation
|
|
79
|
-
|
|
80
|
-
**Before (too vague):**
|
|
81
|
-
```markdown
|
|
82
|
-
# My App
|
|
83
|
-
- Build a calculator
|
|
84
|
-
- Add tests
|
|
85
|
-
```
|
|
86
|
-
|
|
87
|
-
**After (millhouse-ready):**
|
|
88
|
-
```markdown
|
|
89
|
-
# Calculator App
|
|
90
|
-
|
|
91
|
-
## 1. Initialize TypeScript Project
|
|
92
|
-
Create the project structure with TypeScript configuration.
|
|
93
|
-
|
|
94
|
-
### Implementation
|
|
95
|
-
- Create `package.json` with name "calculator", typescript and vitest as dev dependencies
|
|
96
|
-
- Create `tsconfig.json` with strict mode, ES2020 target, NodeNext module resolution
|
|
97
|
-
- Create `src/` directory
|
|
98
|
-
|
|
99
|
-
### Testing
|
|
100
|
-
Run `npm install` and `npx tsc --noEmit` - should complete without errors.
|
|
101
|
-
|
|
102
|
-
### Acceptance Criteria
|
|
103
|
-
- [ ] `package.json` exists with correct dependencies
|
|
104
|
-
- [ ] `tsconfig.json` exists with strict mode enabled
|
|
105
|
-
- [ ] `src/` directory exists
|
|
106
|
-
- [ ] `npm install && npx tsc --noEmit` succeeds
|
|
107
|
-
|
|
108
|
-
## 2. Create Math Utilities
|
|
109
|
-
Create basic arithmetic functions used by the calculator.
|
|
110
|
-
|
|
111
|
-
**Depends on task 1** - needs the TypeScript project structure.
|
|
112
|
-
|
|
113
|
-
### Implementation
|
|
114
|
-
Create `src/math.ts` with:
|
|
115
|
-
- `add(a: number, b: number): number` - returns sum
|
|
116
|
-
- `subtract(a: number, b: number): number` - returns difference
|
|
117
|
-
- `multiply(a: number, b: number): number` - returns product
|
|
118
|
-
- `divide(a: number, b: number): number` - returns quotient, throws on division by zero
|
|
119
|
-
|
|
120
|
-
### Testing
|
|
121
|
-
Create `src/math.test.ts` with vitest tests for all functions including edge cases.
|
|
122
|
-
Run `npx vitest run` - all tests should pass.
|
|
123
|
-
|
|
124
|
-
### Acceptance Criteria
|
|
125
|
-
- [ ] `src/math.ts` exports all four functions
|
|
126
|
-
- [ ] `src/math.test.ts` has tests for each function
|
|
127
|
-
- [ ] Tests cover division by zero error case
|
|
128
|
-
- [ ] `npx vitest run` passes all tests
|
|
129
|
-
```
|
|
130
|
-
|
|
131
|
-
---
|
|
132
|
-
|
|
133
|
-
## /millhouse issues
|
|
134
|
-
|
|
135
|
-
Convert a plan into GitHub issues formatted for Millhouse.
|
|
136
|
-
|
|
137
|
-
### Critical Context
|
|
138
|
-
|
|
139
|
-
These issues will be implemented by Claude Code instances running **unattended in separate context windows**. Each issue is a fresh start with no memory of previous conversations. This means:
|
|
140
|
-
|
|
141
|
-
- Every issue must be completely self-contained
|
|
142
|
-
- All relevant context, requirements, and constraints must be explicitly stated
|
|
143
|
-
- Nothing can be assumed or left implicit
|
|
144
|
-
|
|
145
|
-
### Instructions
|
|
146
|
-
|
|
147
|
-
1. Read the plan from the file path argument, or ask the user to describe it
|
|
148
|
-
2. Break it into discrete, implementable issues
|
|
149
|
-
3. For each issue, identify dependencies on other issues
|
|
150
|
-
4. Create issues in order using `gh issue create`, starting with issues that have no dependencies
|
|
151
|
-
5. Use the actual issue numbers returned by GitHub for dependency references
|
|
152
|
-
6. After creating all issues, create an **index issue** that lists them all (see below)
|
|
153
|
-
|
|
154
|
-
### Issue Content Requirements
|
|
155
|
-
|
|
156
|
-
Each issue MUST include:
|
|
157
|
-
|
|
158
|
-
**Implementation Details**
|
|
159
|
-
- Specific file paths to create or modify
|
|
160
|
-
- Function signatures, types, or interfaces expected
|
|
161
|
-
- Any specific libraries or patterns to use
|
|
162
|
-
|
|
163
|
-
**Testing & Verification**
|
|
164
|
-
- How to verify the implementation works
|
|
165
|
-
- Specific test commands to run (e.g., `npm test`, `npm run build`)
|
|
166
|
-
- Expected output or behavior
|
|
167
|
-
|
|
168
|
-
**Acceptance Criteria**
|
|
169
|
-
- Clear, checkable criteria for when the issue is "done"
|
|
170
|
-
- Edge cases to handle
|
|
171
|
-
- Error conditions to consider
|
|
172
|
-
|
|
173
|
-
**Dependencies**
|
|
174
|
-
- `**Depends on #N**` if it depends on another issue
|
|
175
|
-
- What specifically it needs from that dependency (files, exports, etc.)
|
|
176
|
-
|
|
177
|
-
### Example Issue Body
|
|
178
|
-
|
|
179
|
-
```markdown
|
|
180
|
-
Create `src/utils/math.ts` with basic arithmetic functions.
|
|
181
|
-
|
|
182
|
-
## Implementation
|
|
183
|
-
- Export functions: `add(a: number, b: number): number` and `multiply(a: number, b: number): number`
|
|
184
|
-
- Use ES module syntax (export, not module.exports)
|
|
185
|
-
- No external dependencies
|
|
186
|
-
|
|
187
|
-
## Testing
|
|
188
|
-
Run `npx tsc --noEmit` to verify no type errors.
|
|
189
|
-
|
|
190
|
-
## Acceptance Criteria
|
|
191
|
-
- [ ] File exists at `src/utils/math.ts`
|
|
192
|
-
- [ ] Both functions are exported
|
|
193
|
-
- [ ] TypeScript compiles without errors
|
|
194
|
-
```
|
|
195
|
-
|
|
196
|
-
### Index Issue
|
|
197
|
-
|
|
198
|
-
After creating all implementation issues, create a final **index issue** that serves as an overview. Title it something like "Implement [feature name]" and include:
|
|
199
|
-
|
|
200
|
-
- A one-line summary of the overall goal
|
|
201
|
-
- A list of all created issues with their numbers and a brief description
|
|
202
|
-
- The command to run: `millhouse run issues <index-number>`
|
|
203
|
-
|
|
204
|
-
Example:
|
|
205
|
-
|
|
206
|
-
```markdown
|
|
207
|
-
Implement a calculator library with math utilities.
|
|
208
|
-
|
|
209
|
-
## Issues
|
|
210
|
-
|
|
211
|
-
- #1 Create math utilities (`src/utils/math.ts`)
|
|
212
|
-
- #2 Create string helpers (`src/utils/string.ts`)
|
|
213
|
-
- #3 Create calculator class (`src/calculator.ts`)
|
|
214
|
-
- #4 Create main entry point (`src/index.ts`)
|
|
215
|
-
|
|
216
|
-
## Run
|
|
217
|
-
|
|
218
|
-
\`\`\`bash
|
|
219
|
-
millhouse run issues <this-issue-number>
|
|
220
|
-
\`\`\`
|
|
221
|
-
```
|
|
222
|
-
|
|
223
|
-
The index issue should **not** include detailed dependency information—Millhouse will discover dependencies from the individual issues.
|