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/README.md
CHANGED
|
@@ -5,97 +5,108 @@
|
|
|
5
5
|
<p align="right"><sub><a href="https://www.reddit.com/r/simpsonsshitposting/s/ZB5cDcwnqU">Unedited artwork</a> by <a href="https://www.shlives.net/">shlives</a></sub></p>
|
|
6
6
|
</div>
|
|
7
7
|
|
|
8
|
-
Millhouse orchestrates
|
|
8
|
+
Millhouse orchestrates Claude instances to implement large plans with hundreds of
|
|
9
|
+
separate work items.
|
|
9
10
|
|
|
10
|
-
|
|
11
|
-
|
|
11
|
+
It analyzes your plan, automatically works out the dependencies, and runs as much
|
|
12
|
+
as possible in parallel. Each item runs in an isolated git worktree, and in a fresh
|
|
13
|
+
Claude context.
|
|
12
14
|
|
|
13
|
-
|
|
15
|
+
This is intended for unattended operation - leave Millhouse running overnight!
|
|
14
16
|
|
|
15
17
|
## Quick Start
|
|
16
18
|
|
|
17
|
-
|
|
19
|
+
**1. Create a worklist**:
|
|
18
20
|
|
|
19
|
-
In Claude Code:
|
|
20
|
-
```
|
|
21
|
-
/millhouse plan # Refine your plan for millhouse
|
|
22
|
-
```
|
|
23
|
-
... then exit Claude Code and run at the command line:
|
|
24
21
|
```bash
|
|
25
|
-
millhouse
|
|
22
|
+
millhouse init
|
|
26
23
|
```
|
|
27
24
|
|
|
28
|
-
|
|
25
|
+
Analyzes the latest Claude plan and creates a worklist (`.millhouse/worklist.json`)
|
|
26
|
+
|
|
27
|
+
**2. Run it:**
|
|
29
28
|
|
|
30
|
-
In Claude Code:
|
|
31
|
-
```
|
|
32
|
-
/millhouse plan # Refine your plan for millhouse
|
|
33
|
-
/millhouse issues # Create GitHub issues from your plan
|
|
34
|
-
```
|
|
35
|
-
... then exit Claude Code and run at the command line:
|
|
36
29
|
```bash
|
|
37
|
-
millhouse run
|
|
38
|
-
millhouse run issues 5 # Run issue #5 and linked issues
|
|
30
|
+
millhouse run [--dangerously-skip-permissions]
|
|
39
31
|
```
|
|
40
32
|
|
|
33
|
+
That's it. Millhouse builds a dependency graph, runs items in parallel where possible,
|
|
34
|
+
and merges everything back when done.
|
|
35
|
+
|
|
41
36
|
## Installation
|
|
42
37
|
|
|
43
38
|
```bash
|
|
44
39
|
npm install -g millhouse
|
|
45
40
|
```
|
|
46
41
|
|
|
47
|
-
|
|
42
|
+
## Commands
|
|
43
|
+
|
|
44
|
+
### millhouse init
|
|
45
|
+
|
|
46
|
+
Create a worklist from a Claude Code plan - Millhouse finds the most recent plan
|
|
47
|
+
for the current project.
|
|
48
48
|
|
|
49
49
|
```bash
|
|
50
|
-
millhouse
|
|
50
|
+
millhouse init
|
|
51
51
|
```
|
|
52
52
|
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
### /millhouse plan
|
|
53
|
+
### millhouse list
|
|
56
54
|
|
|
57
|
-
|
|
55
|
+
Show items in the current worklist.
|
|
58
56
|
|
|
57
|
+
```bash
|
|
58
|
+
millhouse list [--verbose]
|
|
59
59
|
```
|
|
60
|
-
|
|
61
|
-
|
|
60
|
+
|
|
61
|
+
Displays items grouped by status (ready, blocked, completed, failed) with dependency information.
|
|
62
|
+
|
|
63
|
+
### millhouse run
|
|
64
|
+
|
|
65
|
+
Execute pending worklist items with parallel workers.
|
|
66
|
+
|
|
67
|
+
```bash
|
|
68
|
+
millhouse run # Run all pending items
|
|
69
|
+
-n 16 # Use 16 parallel workers (default: 8)
|
|
70
|
+
--dry-run # Preview without executing
|
|
71
|
+
--dangerously-skip-permissions # Pass to claude tool for reliable unattended execution
|
|
62
72
|
```
|
|
63
73
|
|
|
64
|
-
|
|
65
|
-
- **Clearly separated work items** - each runs in a separate context
|
|
66
|
-
- **Appropriately-sized tasks** - small enough to complete unattended
|
|
67
|
-
- **Self-contained descriptions** - all context included, nothing assumed
|
|
68
|
-
- **Acceptance criteria** - how to verify each task is complete
|
|
69
|
-
- **Testing instructions** - specific commands and expected results
|
|
70
|
-
- **Explicit dependencies** - what must complete before each task
|
|
74
|
+
Note: Use `--dangerously-skip-permissions` with care!
|
|
71
75
|
|
|
72
|
-
###
|
|
76
|
+
### millhouse save
|
|
73
77
|
|
|
74
|
-
|
|
78
|
+
Create GitHub issues from the worklist.
|
|
75
79
|
|
|
80
|
+
```bash
|
|
81
|
+
millhouse save
|
|
76
82
|
```
|
|
77
|
-
|
|
78
|
-
|
|
83
|
+
|
|
84
|
+
Creates issues in dependency order, updates the worklist with issue numbers, and creates an index issue linking all items.
|
|
85
|
+
|
|
86
|
+
### millhouse load
|
|
87
|
+
|
|
88
|
+
Load GitHub issues into the worklist.
|
|
89
|
+
|
|
90
|
+
```bash
|
|
91
|
+
millhouse load # Load all open issues
|
|
92
|
+
millhouse load 5 # Load issue #5 and linked issues
|
|
93
|
+
millhouse load 5,6,7 # Load issues 5, 6, 7 and all linked issues
|
|
79
94
|
```
|
|
80
95
|
|
|
81
|
-
|
|
96
|
+
Uses Claude to analyze dependencies and expand sparse issues with testing instructions and acceptance criteria.
|
|
82
97
|
|
|
83
|
-
###
|
|
98
|
+
### Other Commands
|
|
84
99
|
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
- Build system and dependencies
|
|
100
|
+
```bash
|
|
101
|
+
millhouse status # Show all runs
|
|
102
|
+
millhouse clean # Clean up leftover state
|
|
103
|
+
```
|
|
90
104
|
|
|
91
|
-
|
|
105
|
+
## How It Works
|
|
92
106
|
|
|
93
107
|
### Dependency Analysis
|
|
94
108
|
|
|
95
|
-
|
|
96
|
-
- Explicit markers: "Depends on #1", "Blocked by #2", "After #3"
|
|
97
|
-
- Logical dependencies: If task B imports from a file that task A creates
|
|
98
|
-
- Semantic relationships: Claude infers dependencies automatically
|
|
109
|
+
Claude analyzes semantic relationships between plan items to determine dependencies.
|
|
99
110
|
|
|
100
111
|
### Parallel Execution
|
|
101
112
|
|
|
@@ -108,91 +119,38 @@ Work items are organized into a dependency graph. The scheduler:
|
|
|
108
119
|
|
|
109
120
|
Each work item runs in complete isolation:
|
|
110
121
|
- Creates a branch: `millhouse/run-{runId}-issue-{N}`
|
|
111
|
-
- Creates a git worktree in `.millhouse/worktrees
|
|
122
|
+
- Creates a git worktree in `.millhouse/worktrees/`
|
|
112
123
|
- Claude Code runs in that worktree with full autonomy
|
|
113
|
-
- Changes are committed to the item's branch
|
|
114
124
|
- On completion, branches are merged back to the run branch
|
|
125
|
+
- Run branch is merged into your current branch when done
|
|
115
126
|
|
|
116
|
-
###
|
|
127
|
+
### Working Directory Requirements
|
|
117
128
|
|
|
118
|
-
|
|
119
|
-
|---|--------------------------------------------|---------------------------------|
|
|
120
|
-
| Input | GitHub issues | Any text/markdown file |
|
|
121
|
-
| Setup | `/millhouse plan` then `/millhouse issues` | `/millhouse plan` |
|
|
122
|
-
| Run | `millhouse run issues [id]` | `millhouse run [file.md]` |
|
|
123
|
-
| Output | Pull request | Changes on local branch |
|
|
124
|
-
| Labels | Auto-managed | N/A |
|
|
129
|
+
Before starting a run, Millhouse checks that your working directory is clean to prevent merge conflicts:
|
|
125
130
|
|
|
126
|
-
|
|
131
|
+
- **Gitignored files are allowed** - `.millhouse/` is automatically added to `.gitignore` on first use
|
|
132
|
+
- **CLAUDE.md auto-commit** - If `CLAUDE.md` is the only untracked file, it's automatically committed
|
|
133
|
+
- **Other changes must be committed** - Any other uncommitted changes or untracked files will block the run
|
|
127
134
|
|
|
128
|
-
|
|
135
|
+
This ensures the final merge back to your branch won't fail due to conflicts with local changes.
|
|
129
136
|
|
|
130
|
-
|
|
131
|
-
# Plan mode (default)
|
|
132
|
-
millhouse run # Run most recent plan from ~/.claude/plans/
|
|
133
|
-
millhouse run plan.md # Run a specific plan file
|
|
134
|
-
|
|
135
|
-
# GitHub issues mode (always discovers linked issues)
|
|
136
|
-
millhouse run issues # Run all open issues
|
|
137
|
-
millhouse run issues 5 # Run issue #5 and linked issues
|
|
138
|
-
millhouse run issues 1,2,3 # Run these issues and linked issues
|
|
139
|
-
|
|
140
|
-
# Options (work with both modes)
|
|
141
|
-
--dry-run # Preview without executing
|
|
142
|
-
--no-scan # Skip project scanning (see below)
|
|
143
|
-
-n 16 # Set parallel workers (default: 8)
|
|
144
|
-
-d detailed # Start in detailed view (default: compact)
|
|
145
|
-
--dangerously-skip-permissions # Unattended execution
|
|
146
|
-
```
|
|
137
|
+
## Creating Plans
|
|
147
138
|
|
|
148
|
-
|
|
139
|
+
Plans are created interactively using Claude Code's plan mode:
|
|
149
140
|
|
|
150
141
|
```bash
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
millhouse resume <run-id> # Resume interrupted run
|
|
154
|
-
millhouse clean # Clean up leftover state
|
|
155
|
-
```
|
|
156
|
-
|
|
157
|
-
## Writing Good Plans
|
|
158
|
-
|
|
159
|
-
For best results, use `/millhouse plan` to refine your plan. Or write plans that include:
|
|
160
|
-
|
|
161
|
-
**Clear task separation:**
|
|
162
|
-
```markdown
|
|
163
|
-
## 1. Create Math Utilities
|
|
164
|
-
Create `src/math.ts` with add, subtract, multiply, divide functions.
|
|
165
|
-
|
|
166
|
-
## 2. Create Calculator Class
|
|
167
|
-
Create `src/calculator.ts` that uses the math utilities.
|
|
168
|
-
**Depends on task 1.**
|
|
169
|
-
```
|
|
170
|
-
|
|
171
|
-
**Specific implementation details:**
|
|
172
|
-
```markdown
|
|
173
|
-
Create `src/math.ts` with:
|
|
174
|
-
- `add(a: number, b: number): number`
|
|
175
|
-
- `subtract(a: number, b: number): number`
|
|
142
|
+
claude
|
|
143
|
+
> /plan Add user authentication with JWT
|
|
176
144
|
```
|
|
177
145
|
|
|
178
|
-
|
|
179
|
-
```markdown
|
|
180
|
-
## Testing
|
|
181
|
-
Run `npm test` - all tests should pass.
|
|
182
|
-
Run `npm run build` - should compile without errors.
|
|
183
|
-
```
|
|
184
|
-
|
|
185
|
-
**Acceptance criteria:**
|
|
186
|
-
```markdown
|
|
187
|
-
## Acceptance Criteria
|
|
188
|
-
- [ ] All four math functions exported
|
|
189
|
-
- [ ] Tests cover edge cases (division by zero)
|
|
190
|
-
- [ ] TypeScript compiles with strict mode
|
|
191
|
-
```
|
|
146
|
+
Claude will create a structured plan with numbered tasks and dependencies. The plan is saved to `~/.claude/plans/` and can then be loaded with `millhouse init`.
|
|
192
147
|
|
|
193
|
-
|
|
148
|
+
For best results, when discussing your plan with Claude:
|
|
149
|
+
- Be specific about implementation details
|
|
150
|
+
- Mention testing requirements
|
|
151
|
+
- Clarify dependencies between tasks
|
|
194
152
|
|
|
195
|
-
|
|
153
|
+
## Development Install
|
|
196
154
|
|
|
197
155
|
```bash
|
|
198
156
|
git clone https://github.com/dave/millhouse.git
|
|
@@ -206,47 +164,16 @@ npm link
|
|
|
206
164
|
|
|
207
165
|
- Node.js 20+
|
|
208
166
|
- Claude Code installed and authenticated
|
|
209
|
-
- GitHub CLI (`gh`) authenticated (GitHub
|
|
210
|
-
|
|
211
|
-
## Configuration
|
|
212
|
-
|
|
213
|
-
Create `.millhouserc.json` in your project root:
|
|
214
|
-
|
|
215
|
-
```json
|
|
216
|
-
{
|
|
217
|
-
"execution": {
|
|
218
|
-
"concurrency": 8,
|
|
219
|
-
"baseBranch": "main",
|
|
220
|
-
"continueOnError": true
|
|
221
|
-
},
|
|
222
|
-
"pullRequests": {
|
|
223
|
-
"createAsDraft": true,
|
|
224
|
-
"mergeStrategy": "squash"
|
|
225
|
-
}
|
|
226
|
-
}
|
|
227
|
-
```
|
|
228
|
-
|
|
229
|
-
| Option | Description | Default |
|
|
230
|
-
|---|---|---|
|
|
231
|
-
| `concurrency` | Max parallel Claude instances | 8 |
|
|
232
|
-
| `baseBranch` | Branch to base work on | main |
|
|
233
|
-
| `continueOnError` | Keep going if one item fails | true |
|
|
234
|
-
| `createAsDraft` | Create PR as draft | true |
|
|
235
|
-
| `mergeStrategy` | PR merge strategy | squash |
|
|
236
|
-
|
|
237
|
-
## GitHub Labels (GitHub Mode Only)
|
|
167
|
+
- GitHub CLI (`gh`) authenticated (for GitHub commands)
|
|
238
168
|
|
|
239
|
-
|
|
169
|
+
## Troubleshooting
|
|
240
170
|
|
|
241
|
-
|
|
242
|
-
|---|---|
|
|
243
|
-
| `millhouse:queued` | Waiting in queue |
|
|
244
|
-
| `millhouse:in-progress` | Claude is actively working |
|
|
245
|
-
| `millhouse:blocked` | Waiting for dependency |
|
|
246
|
-
| `millhouse:failed` | Execution failed |
|
|
247
|
-
| `millhouse:done` | Completed successfully |
|
|
171
|
+
**"Working directory is not clean" error?**
|
|
248
172
|
|
|
249
|
-
|
|
173
|
+
Millhouse requires a clean git state before runs. Options:
|
|
174
|
+
- Commit your changes: `git add -A && git commit -m "WIP"`
|
|
175
|
+
- Stash your changes: `git stash`
|
|
176
|
+
- If only `CLAUDE.md` is untracked, it will be auto-committed
|
|
250
177
|
|
|
251
178
|
**Worktree errors after interrupted run?**
|
|
252
179
|
```bash
|
|
@@ -254,7 +181,7 @@ millhouse clean
|
|
|
254
181
|
```
|
|
255
182
|
|
|
256
183
|
**To see what Claude is doing:**
|
|
257
|
-
|
|
184
|
+
Use `-d detailed` to start in detailed view, or press `v` to toggle during execution.
|
|
258
185
|
|
|
259
186
|
## License
|
|
260
187
|
|
|
@@ -1,9 +1,14 @@
|
|
|
1
1
|
import type { GitHubIssue, AnalyzedIssue } from '../types.js';
|
|
2
|
+
export interface IssueAnalysisResult {
|
|
3
|
+
title: string;
|
|
4
|
+
description: string;
|
|
5
|
+
issues: AnalyzedIssue[];
|
|
6
|
+
}
|
|
2
7
|
export declare class IssueAnalyzer {
|
|
3
8
|
/**
|
|
4
9
|
* Analyze all issues in a single Claude call to determine dependencies.
|
|
5
10
|
*/
|
|
6
|
-
analyzeIssues(issues: GitHubIssue[]): Promise<
|
|
11
|
+
analyzeIssues(issues: GitHubIssue[]): Promise<IssueAnalysisResult>;
|
|
7
12
|
/**
|
|
8
13
|
* Fallback to pattern matching if Claude analysis fails.
|
|
9
14
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"issue-analyzer.d.ts","sourceRoot":"","sources":["../../src/analysis/issue-analyzer.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAG9D,qBAAa,aAAa;IACxB;;OAEG;IACG,aAAa,CAAC,MAAM,EAAE,WAAW,EAAE,GAAG,OAAO,CAAC,
|
|
1
|
+
{"version":3,"file":"issue-analyzer.d.ts","sourceRoot":"","sources":["../../src/analysis/issue-analyzer.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAG9D,MAAM,WAAW,mBAAmB;IAClC,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,aAAa,EAAE,CAAC;CACzB;AAED,qBAAa,aAAa;IACxB;;OAEG;IACG,aAAa,CAAC,MAAM,EAAE,WAAW,EAAE,GAAG,OAAO,CAAC,mBAAmB,CAAC;IAyIxE;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAyBxB;;OAEG;IACH,OAAO,CAAC,mBAAmB;IA8B3B;;OAEG;IACH,OAAO,CAAC,oBAAoB;CAa7B"}
|
|
@@ -6,19 +6,24 @@ export class IssueAnalyzer {
|
|
|
6
6
|
* Analyze all issues in a single Claude call to determine dependencies.
|
|
7
7
|
*/
|
|
8
8
|
async analyzeIssues(issues) {
|
|
9
|
-
if (issues.length === 0)
|
|
10
|
-
return [];
|
|
9
|
+
if (issues.length === 0) {
|
|
10
|
+
return { title: 'No Issues', description: 'No issues to analyze.', issues: [] };
|
|
11
|
+
}
|
|
11
12
|
const allIssueNumbers = issues.map(i => i.number);
|
|
12
13
|
// Build the issues list for the prompt
|
|
13
14
|
const issuesList = issues.map(issue => `### Issue #${issue.number}: ${issue.title}\n${issue.body || '(No description)'}`).join('\n\n');
|
|
14
15
|
const template = await loadTemplate('issue-analysis.prompt.md');
|
|
15
16
|
const prompt = template.replace('{{issuesList}}', issuesList);
|
|
16
|
-
|
|
17
|
+
const startTime = Date.now();
|
|
18
|
+
console.log(chalk.blue('\nAnalyzing issues with Claude...\n'));
|
|
17
19
|
try {
|
|
18
20
|
const iterator = query({
|
|
19
21
|
prompt,
|
|
20
22
|
options: {
|
|
21
|
-
|
|
23
|
+
cwd: process.cwd(),
|
|
24
|
+
maxTurns: 20,
|
|
25
|
+
// Allow read-only tools for exploring the codebase
|
|
26
|
+
allowedTools: ['Read', 'Glob', 'Grep', 'Bash(git log*)', 'Bash(git show*)', 'Bash(ls*)'],
|
|
22
27
|
},
|
|
23
28
|
});
|
|
24
29
|
let responseText = '';
|
|
@@ -55,33 +60,55 @@ export class IssueAnalyzer {
|
|
|
55
60
|
}
|
|
56
61
|
}
|
|
57
62
|
}
|
|
58
|
-
// Parse JSON
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
63
|
+
// Parse JSON from response - try object format first, then array
|
|
64
|
+
let parsedObj;
|
|
65
|
+
// Try to find JSON object first (new format)
|
|
66
|
+
const objMatch = responseText.match(/\{[\s\S]*"issues"[\s\S]*\}/);
|
|
67
|
+
if (objMatch) {
|
|
68
|
+
parsedObj = JSON.parse(objMatch[0]);
|
|
62
69
|
}
|
|
63
|
-
|
|
70
|
+
else {
|
|
71
|
+
// Fall back to array format (legacy)
|
|
72
|
+
const jsonMatch = responseText.match(/\[[\s\S]*\]/);
|
|
73
|
+
if (!jsonMatch) {
|
|
74
|
+
throw new Error('No JSON found in response');
|
|
75
|
+
}
|
|
76
|
+
parsedObj = {
|
|
77
|
+
title: 'GitHub Issues',
|
|
78
|
+
description: 'Issues loaded from GitHub.',
|
|
79
|
+
issues: JSON.parse(jsonMatch[0]),
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
const elapsed = Math.floor((Date.now() - startTime) / 1000);
|
|
83
|
+
console.log(chalk.green(`\n✓ Issues analyzed (${elapsed}s)\n`));
|
|
64
84
|
// Create a map for quick lookup
|
|
65
|
-
const analysisMap = new Map(
|
|
85
|
+
const analysisMap = new Map(parsedObj.issues.map(p => [p.issueNumber, p]));
|
|
66
86
|
// Build analyzed issues
|
|
67
87
|
const results = issues.map(issue => {
|
|
68
88
|
const analysis = analysisMap.get(issue.number);
|
|
69
89
|
// Filter dependencies to only include valid issues
|
|
70
90
|
const validDeps = (analysis?.dependencies || []).filter(d => allIssueNumbers.includes(d) && d !== issue.number);
|
|
91
|
+
const noWorkNeeded = analysis?.noWorkNeeded || false;
|
|
71
92
|
const analyzed = {
|
|
72
93
|
...issue,
|
|
73
94
|
affectedPaths: analysis?.affectedPaths || [],
|
|
74
95
|
dependencies: validDeps,
|
|
75
96
|
analyzedAt: new Date().toISOString(),
|
|
97
|
+
noWorkNeeded,
|
|
76
98
|
};
|
|
77
99
|
// Log each issue's analysis
|
|
78
100
|
const depsStr = validDeps.length > 0
|
|
79
101
|
? `depends on ${validDeps.map(d => `#${d}`).join(', ')}`
|
|
80
102
|
: 'no dependencies';
|
|
81
|
-
|
|
103
|
+
const noWorkStr = noWorkNeeded ? ' (no work needed)' : '';
|
|
104
|
+
console.log(chalk.gray(` #${issue.number}: ${depsStr}${noWorkStr}`));
|
|
82
105
|
return analyzed;
|
|
83
106
|
});
|
|
84
|
-
return
|
|
107
|
+
return {
|
|
108
|
+
title: parsedObj.title || 'GitHub Issues',
|
|
109
|
+
description: parsedObj.description || 'Issues loaded from GitHub.',
|
|
110
|
+
issues: results,
|
|
111
|
+
};
|
|
85
112
|
}
|
|
86
113
|
catch (error) {
|
|
87
114
|
console.log(chalk.yellow(` Claude analysis failed, falling back to pattern matching: ${error}`));
|
|
@@ -92,7 +119,7 @@ export class IssueAnalyzer {
|
|
|
92
119
|
* Fallback to pattern matching if Claude analysis fails.
|
|
93
120
|
*/
|
|
94
121
|
fallbackAnalysis(issues, allIssueNumbers) {
|
|
95
|
-
|
|
122
|
+
const analyzedIssues = issues.map(issue => {
|
|
96
123
|
const deps = this.extractDependencies(issue, allIssueNumbers);
|
|
97
124
|
const paths = this.extractAffectedPaths(issue);
|
|
98
125
|
const depsStr = deps.length > 0
|
|
@@ -106,6 +133,11 @@ export class IssueAnalyzer {
|
|
|
106
133
|
analyzedAt: new Date().toISOString(),
|
|
107
134
|
};
|
|
108
135
|
});
|
|
136
|
+
return {
|
|
137
|
+
title: 'GitHub Issues',
|
|
138
|
+
description: 'Issues loaded from GitHub.',
|
|
139
|
+
issues: analyzedIssues,
|
|
140
|
+
};
|
|
109
141
|
}
|
|
110
142
|
/**
|
|
111
143
|
* Extract dependencies using pattern matching.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"issue-analyzer.js","sourceRoot":"","sources":["../../src/analysis/issue-analyzer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,KAAK,EAAE,MAAM,2BAA2B,CAAC;AAElD,OAAO,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;
|
|
1
|
+
{"version":3,"file":"issue-analyzer.js","sourceRoot":"","sources":["../../src/analysis/issue-analyzer.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,8 +1,14 @@
|
|
|
1
1
|
import type { AnalyzedIssue } from '../types.js';
|
|
2
|
+
export interface PlanParseResult {
|
|
3
|
+
title: string;
|
|
4
|
+
description: string;
|
|
5
|
+
items: AnalyzedIssue[];
|
|
6
|
+
}
|
|
2
7
|
export declare class PlanParser {
|
|
3
8
|
/**
|
|
4
9
|
* Parse a plan into discrete work items with dependencies.
|
|
10
|
+
* Claude has access to the codebase to understand existing patterns.
|
|
5
11
|
*/
|
|
6
|
-
parse(planContent: string): Promise<
|
|
12
|
+
parse(planContent: string): Promise<PlanParseResult>;
|
|
7
13
|
}
|
|
8
14
|
//# sourceMappingURL=plan-parser.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plan-parser.d.ts","sourceRoot":"","sources":["../../src/analysis/plan-parser.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"plan-parser.d.ts","sourceRoot":"","sources":["../../src/analysis/plan-parser.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAGjD,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,aAAa,EAAE,CAAC;CACxB;AAED,qBAAa,UAAU;IACrB;;;OAGG;IACG,KAAK,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC;CA8K3D"}
|