@litmers/cursorflow-orchestrator 0.1.9 → 0.1.12
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/CHANGELOG.md +24 -0
- package/README.md +90 -72
- package/commands/cursorflow-clean.md +24 -135
- package/commands/cursorflow-doctor.md +66 -38
- package/commands/cursorflow-init.md +33 -50
- package/commands/cursorflow-models.md +51 -0
- package/commands/cursorflow-monitor.md +52 -72
- package/commands/cursorflow-prepare.md +426 -147
- package/commands/cursorflow-resume.md +51 -159
- package/commands/cursorflow-review.md +38 -202
- package/commands/cursorflow-run.md +197 -84
- package/commands/cursorflow-signal.md +27 -72
- package/dist/cli/clean.js +23 -0
- package/dist/cli/clean.js.map +1 -1
- package/dist/cli/doctor.js +14 -1
- package/dist/cli/doctor.js.map +1 -1
- package/dist/cli/index.js +14 -3
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/init.js +5 -4
- package/dist/cli/init.js.map +1 -1
- package/dist/cli/models.d.ts +7 -0
- package/dist/cli/models.js +104 -0
- package/dist/cli/models.js.map +1 -0
- package/dist/cli/monitor.js +17 -0
- package/dist/cli/monitor.js.map +1 -1
- package/dist/cli/prepare.d.ts +7 -0
- package/dist/cli/prepare.js +748 -0
- package/dist/cli/prepare.js.map +1 -0
- package/dist/cli/resume.js +56 -0
- package/dist/cli/resume.js.map +1 -1
- package/dist/cli/run.js +30 -1
- package/dist/cli/run.js.map +1 -1
- package/dist/cli/signal.js +18 -0
- package/dist/cli/signal.js.map +1 -1
- package/dist/utils/cursor-agent.d.ts +4 -0
- package/dist/utils/cursor-agent.js +58 -10
- package/dist/utils/cursor-agent.js.map +1 -1
- package/dist/utils/doctor.d.ts +10 -0
- package/dist/utils/doctor.js +581 -1
- package/dist/utils/doctor.js.map +1 -1
- package/dist/utils/types.d.ts +2 -0
- package/examples/README.md +114 -59
- package/examples/demo-project/README.md +61 -79
- package/examples/demo-project/_cursorflow/tasks/demo-test/01-create-utils.json +17 -6
- package/examples/demo-project/_cursorflow/tasks/demo-test/02-add-tests.json +17 -6
- package/examples/demo-project/_cursorflow/tasks/demo-test/README.md +66 -25
- package/package.json +1 -1
- package/src/cli/clean.ts +27 -0
- package/src/cli/doctor.ts +18 -2
- package/src/cli/index.ts +15 -3
- package/src/cli/init.ts +6 -4
- package/src/cli/models.ts +83 -0
- package/src/cli/monitor.ts +20 -0
- package/src/cli/prepare.ts +844 -0
- package/src/cli/resume.ts +66 -0
- package/src/cli/run.ts +36 -2
- package/src/cli/signal.ts +22 -0
- package/src/utils/cursor-agent.ts +62 -10
- package/src/utils/doctor.ts +633 -5
- package/src/utils/types.ts +2 -0
|
@@ -1,7 +1,17 @@
|
|
|
1
1
|
# CursorFlow Run
|
|
2
2
|
|
|
3
3
|
## Overview
|
|
4
|
-
|
|
4
|
+
|
|
5
|
+
Execute AI agent orchestration using task configurations generated by `prepare`. CursorFlow uses a DAG (Directed Acyclic Graph) scheduler to handle lane dependencies and automatic branch merging.
|
|
6
|
+
|
|
7
|
+
## Workflow
|
|
8
|
+
|
|
9
|
+
```
|
|
10
|
+
┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐
|
|
11
|
+
│ 1. Create Lanes │ ──▶ │ 2. Add Tasks │ ──▶ │ 3. Validate │ ──▶ │ 4. Run │
|
|
12
|
+
│ (prepare) │ │ (prepare) │ │ (doctor) │ │ (run) │
|
|
13
|
+
└─────────────────┘ └─────────────────┘ └─────────────────┘ └─────────────────┘
|
|
14
|
+
```
|
|
5
15
|
|
|
6
16
|
## Usage
|
|
7
17
|
|
|
@@ -9,130 +19,233 @@ Execute the AI agent orchestration for a set of tasks. CursorFlow uses a sophist
|
|
|
9
19
|
cursorflow run <tasks-dir> [options]
|
|
10
20
|
```
|
|
11
21
|
|
|
12
|
-
|
|
22
|
+
### Quick Start
|
|
23
|
+
|
|
24
|
+
```bash
|
|
25
|
+
# Step 1: Create lanes
|
|
26
|
+
cursorflow prepare AddAPI --prompt "Create REST API for users" --criteria "CRUD works,Tests pass"
|
|
27
|
+
|
|
28
|
+
# Step 2: (Optional) Add more lanes or tasks
|
|
29
|
+
cursorflow prepare --add-lane _cursorflow/tasks/2412211530_AddAPI \
|
|
30
|
+
--prompt "Add authentication" --depends-on "01-lane-1"
|
|
31
|
+
|
|
32
|
+
# Step 3: Validate configuration
|
|
33
|
+
cursorflow doctor --tasks-dir _cursorflow/tasks/2412211530_AddAPI
|
|
13
34
|
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
35
|
+
# Step 4: Run
|
|
36
|
+
cursorflow run _cursorflow/tasks/2412211530_AddAPI
|
|
37
|
+
|
|
38
|
+
# Or run the latest prepared task
|
|
39
|
+
cursorflow run latest
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
## How It Works
|
|
43
|
+
|
|
44
|
+
1. **Load**: Read all JSON files from the tasks directory
|
|
45
|
+
2. **Validate**: Check `tasks` array, required fields (`name`, `prompt`)
|
|
46
|
+
3. **Resolve**: Build execution order from `dependsOn` dependencies
|
|
47
|
+
4. **Execute**:
|
|
48
|
+
- Start lanes with no dependencies in parallel
|
|
49
|
+
- When a lane completes, unlock dependent lanes
|
|
50
|
+
- **Dependent lanes auto-merge predecessor branches before starting**
|
|
51
|
+
5. **Monitor**: Heartbeat logs every 30 seconds
|
|
23
52
|
|
|
24
53
|
## Options
|
|
25
54
|
|
|
26
55
|
| Option | Description |
|
|
27
|
-
|
|
28
|
-
| `<tasks-dir>` | Directory containing task
|
|
29
|
-
| `--max-concurrent <num>` | Limit
|
|
30
|
-
| `--
|
|
56
|
+
|--------|-------------|
|
|
57
|
+
| `<tasks-dir>` | Directory containing JSON task files |
|
|
58
|
+
| `--max-concurrent <num>` | Limit concurrent lane execution |
|
|
59
|
+
| `--executor <type>` | `cursor-agent` (default) or `cloud` |
|
|
60
|
+
| `--skip-doctor` | Skip environment checks (not recommended) |
|
|
61
|
+
| `--dry-run` | Show execution plan without running |
|
|
31
62
|
|
|
32
|
-
##
|
|
63
|
+
## Execution Flow
|
|
64
|
+
|
|
65
|
+
### Single Lane
|
|
66
|
+
|
|
67
|
+
```bash
|
|
68
|
+
cursorflow prepare SimpleFix --prompt "Fix the bug"
|
|
69
|
+
cursorflow run _cursorflow/tasks/2412211530_SimpleFix
|
|
70
|
+
```
|
|
33
71
|
|
|
34
|
-
|
|
72
|
+
```
|
|
73
|
+
┌─────────────────────────────────────────────────────────┐
|
|
74
|
+
│ 01-lane-1 │
|
|
75
|
+
│ ┌─────────┐ │
|
|
76
|
+
│ │implement│ → AI executes → Review → Complete │
|
|
77
|
+
│ └─────────┘ │
|
|
78
|
+
└─────────────────────────────────────────────────────────┘
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
### Multiple Tasks in Lane
|
|
82
|
+
|
|
83
|
+
```bash
|
|
84
|
+
cursorflow prepare Feature \
|
|
85
|
+
--task "plan|sonnet-4.5-thinking|Create plan|Plan ready" \
|
|
86
|
+
--task "implement|sonnet-4.5|Build feature|Code done"
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
```
|
|
90
|
+
┌─────────────────────────────────────────────────────────┐
|
|
91
|
+
│ 01-lane-1 │
|
|
92
|
+
│ ┌────┐ ┌─────────┐ │
|
|
93
|
+
│ │plan│ ──▶ │implement│ → Review → Complete │
|
|
94
|
+
│ └────┘ └─────────┘ │
|
|
95
|
+
└─────────────────────────────────────────────────────────┘
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
### Sequential Lanes (with `--sequential`)
|
|
99
|
+
|
|
100
|
+
```bash
|
|
101
|
+
cursorflow prepare FullStack --lanes 3 --sequential \
|
|
102
|
+
--prompt "Implement your layer"
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
```
|
|
106
|
+
┌───────────┐ ┌───────────┐ ┌───────────┐
|
|
107
|
+
│ 01-lane-1 │ ──▶ │ 02-lane-2 │ ──▶ │ 03-lane-3 │
|
|
108
|
+
│ (DB) │ │ (API) │ │ (UI) │
|
|
109
|
+
└───────────┘ └───────────┘ └───────────┘
|
|
110
|
+
│ │
|
|
111
|
+
merges 01 merges 01,02
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
### Parallel Lanes
|
|
115
|
+
|
|
116
|
+
```bash
|
|
117
|
+
cursorflow prepare FrontBack --lanes 2 \
|
|
118
|
+
--prompt "Implement your layer"
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
```
|
|
122
|
+
┌───────────┐
|
|
123
|
+
│ 01-lane-1 │ (Frontend)
|
|
124
|
+
└───────────┘
|
|
125
|
+
─── both run in parallel
|
|
126
|
+
┌───────────┐
|
|
127
|
+
│ 02-lane-2 │ (Backend)
|
|
128
|
+
└───────────┘
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
## JSON Schema (RunnerConfig)
|
|
132
|
+
|
|
133
|
+
Each JSON file in the tasks directory follows this schema:
|
|
35
134
|
|
|
36
135
|
```json
|
|
37
136
|
{
|
|
38
137
|
"baseBranch": "main",
|
|
39
|
-
"branchPrefix": "
|
|
40
|
-
"model": "sonnet-4.5",
|
|
138
|
+
"branchPrefix": "feature/lane-1-",
|
|
41
139
|
"timeout": 300000,
|
|
42
140
|
"enableIntervention": false,
|
|
43
|
-
"dependsOn": ["
|
|
141
|
+
"dependsOn": ["01-lane-1"],
|
|
44
142
|
"dependencyPolicy": {
|
|
45
143
|
"allowDependencyChange": false,
|
|
46
144
|
"lockfileReadOnly": true
|
|
47
145
|
},
|
|
146
|
+
"enableReview": true,
|
|
147
|
+
"reviewModel": "sonnet-4.5-thinking",
|
|
148
|
+
"maxReviewIterations": 3,
|
|
48
149
|
"tasks": [
|
|
49
150
|
{
|
|
50
|
-
"name": "implement
|
|
51
|
-
"
|
|
52
|
-
"
|
|
151
|
+
"name": "implement",
|
|
152
|
+
"prompt": "Create a reusable button component...",
|
|
153
|
+
"model": "sonnet-4.5",
|
|
154
|
+
"acceptanceCriteria": ["Build passes", "Tests pass"]
|
|
53
155
|
}
|
|
54
156
|
]
|
|
55
157
|
}
|
|
56
158
|
```
|
|
57
159
|
|
|
58
|
-
### Configuration
|
|
59
|
-
|
|
60
|
-
|
|
|
61
|
-
|
|
62
|
-
| `
|
|
63
|
-
| `
|
|
64
|
-
| `
|
|
65
|
-
| `dependsOn` | string[] |
|
|
66
|
-
| `
|
|
67
|
-
| `
|
|
160
|
+
### Configuration Reference
|
|
161
|
+
|
|
162
|
+
| Field | Type | Required | Description |
|
|
163
|
+
|-------|------|----------|-------------|
|
|
164
|
+
| `baseBranch` | string | Yes | Branch to create worktree from |
|
|
165
|
+
| `branchPrefix` | string | Yes | Prefix for feature branch naming |
|
|
166
|
+
| `tasks` | Task[] | Yes | Array of task objects to execute |
|
|
167
|
+
| `dependsOn` | string[] | No | Lane names to wait for and merge |
|
|
168
|
+
| `timeout` | number | No | Task timeout in ms (default: 300000) |
|
|
169
|
+
| `enableIntervention` | boolean | No | Allow stdin injection during execution |
|
|
170
|
+
| `dependencyPolicy.allowDependencyChange` | boolean | No | Allow package.json modifications |
|
|
171
|
+
| `dependencyPolicy.lockfileReadOnly` | boolean | No | Keep lockfile read-only |
|
|
172
|
+
| `enableReview` | boolean | No | Enable AI code review (default: true) |
|
|
173
|
+
| `reviewModel` | string | No | Model for code review |
|
|
174
|
+
| `maxReviewIterations` | number | No | Max review cycles (default: 3) |
|
|
175
|
+
|
|
176
|
+
### Task Object
|
|
177
|
+
|
|
178
|
+
| Field | Type | Required | Description |
|
|
179
|
+
|-------|------|----------|-------------|
|
|
180
|
+
| `name` | string | Yes | Task identifier (alphanumeric, `-`, `_`) |
|
|
181
|
+
| `prompt` | string | Yes | Instructions for the AI agent |
|
|
182
|
+
| `model` | string | No | Model override for this task |
|
|
183
|
+
| `acceptanceCriteria` | string[] | No | Criteria for AI reviewer validation |
|
|
184
|
+
|
|
185
|
+
## Monitoring During Execution
|
|
68
186
|
|
|
69
|
-
|
|
187
|
+
```bash
|
|
188
|
+
# In another terminal
|
|
189
|
+
cursorflow monitor latest
|
|
70
190
|
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
| `prompt` | string | ✅ | Task prompt for the AI agent |
|
|
75
|
-
| `model` | string | ❌ | Override model for this specific task |
|
|
191
|
+
# Or specify the task directory
|
|
192
|
+
cursorflow monitor _cursorflow/tasks/2412211530_AddAPI
|
|
193
|
+
```
|
|
76
194
|
|
|
77
|
-
|
|
195
|
+
The monitor shows:
|
|
196
|
+
- Lane status (pending, running, completed, failed)
|
|
197
|
+
- Current task within each lane
|
|
198
|
+
- Dependency graph and progress
|
|
199
|
+
- Real-time log streaming
|
|
78
200
|
|
|
79
|
-
|
|
80
|
-
{
|
|
81
|
-
"name": "ui-components",
|
|
82
|
-
"dependsOn": ["theme-engine", "common-utils"],
|
|
83
|
-
"timeout": 600000,
|
|
84
|
-
"tasks": [
|
|
85
|
-
{
|
|
86
|
-
"name": "implement-button",
|
|
87
|
-
"prompt": "Create a reusable button component using the theme engine..."
|
|
88
|
-
}
|
|
89
|
-
]
|
|
90
|
-
}
|
|
91
|
-
```
|
|
201
|
+
## Troubleshooting
|
|
92
202
|
|
|
93
|
-
|
|
203
|
+
### Validation Errors
|
|
94
204
|
|
|
95
|
-
|
|
205
|
+
```
|
|
206
|
+
Task N missing required "name" field
|
|
207
|
+
```
|
|
208
|
+
→ Ensure every task has both `name` and `prompt` fields
|
|
96
209
|
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
| `"timeout" must be a positive number` | Provide timeout as milliseconds (e.g., `60000`) |
|
|
210
|
+
```
|
|
211
|
+
Invalid task name: "my task"
|
|
212
|
+
```
|
|
213
|
+
→ Task names can only contain alphanumeric characters, `-`, and `_`
|
|
102
214
|
|
|
103
|
-
|
|
215
|
+
### Dependency Issues
|
|
104
216
|
|
|
105
|
-
|
|
217
|
+
```
|
|
218
|
+
Circular dependency detected
|
|
219
|
+
```
|
|
220
|
+
→ Check your `dependsOn` fields for cycles (A→B, B→A)
|
|
106
221
|
|
|
107
222
|
```
|
|
108
|
-
|
|
109
|
-
⏱ Heartbeat: 60s elapsed, 5678 bytes received
|
|
223
|
+
Unknown dependency: 01-lane-99
|
|
110
224
|
```
|
|
225
|
+
→ Verify the lane name in `dependsOn` matches an actual JSON filename
|
|
111
226
|
|
|
112
|
-
|
|
113
|
-
- Long-running tasks
|
|
114
|
-
- Stalled or hanging processes
|
|
115
|
-
- Network issues (0 bytes received)
|
|
227
|
+
### Merge Conflicts
|
|
116
228
|
|
|
117
|
-
|
|
229
|
+
When a dependent lane's auto-merge fails:
|
|
118
230
|
|
|
119
|
-
|
|
120
|
-
|
|
231
|
+
1. Find the worktree path in `cursorflow monitor`
|
|
232
|
+
2. Navigate to the worktree directory
|
|
233
|
+
3. Resolve conflicts manually and commit
|
|
234
|
+
4. Resume with `cursorflow resume <lane-name>`
|
|
121
235
|
|
|
122
|
-
###
|
|
123
|
-
Tasks that don't depend on each other will run in parallel up to the `maxConcurrentLanes` limit.
|
|
236
|
+
### Lane Stuck
|
|
124
237
|
|
|
125
|
-
|
|
126
|
-
Always use `cursorflow monitor latest` in a separate terminal to keep track of the run.
|
|
238
|
+
If a lane stops responding:
|
|
127
239
|
|
|
128
|
-
|
|
240
|
+
1. Check the agent window in Cursor IDE
|
|
241
|
+
2. Use `cursorflow signal <lane-name> --message "continue"` to nudge
|
|
242
|
+
3. Or terminate and restart with `cursorflow run --resume`
|
|
129
243
|
|
|
130
|
-
|
|
131
|
-
If you create circular dependencies (e.g., A depends on B, and B depends on A), CursorFlow will detect the deadlock at startup and refuse to run.
|
|
244
|
+
## Best Practices
|
|
132
245
|
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
246
|
+
1. **Always Validate First**: Run `cursorflow doctor --tasks-dir <dir>` before `run`
|
|
247
|
+
2. **Start Small**: Test with a single lane before scaling up
|
|
248
|
+
3. **Use `--dry-run`**: Preview execution plan before committing
|
|
249
|
+
4. **Monitor Actively**: Keep `cursorflow monitor` running in a separate terminal
|
|
250
|
+
5. **Plan Dependencies**: Draw out the DAG before running complex workflows
|
|
251
|
+
6. **Include Verification**: Add verify tasks to catch edge cases
|
|
@@ -1,90 +1,45 @@
|
|
|
1
|
-
# CursorFlow Signal
|
|
1
|
+
# CursorFlow Signal
|
|
2
2
|
|
|
3
3
|
## Overview
|
|
4
|
-
Directly intervene in a running lane
|
|
4
|
+
Directly intervene in a running lane by sending a message to the agent. This is useful for providing immediate feedback or corrections during long-running tasks.
|
|
5
5
|
|
|
6
|
-
##
|
|
6
|
+
## Usage
|
|
7
7
|
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
```json
|
|
11
|
-
{
|
|
12
|
-
"enableIntervention": true,
|
|
13
|
-
"tasks": [...]
|
|
14
|
-
}
|
|
8
|
+
```bash
|
|
9
|
+
cursorflow signal <lane-name> "<message>" [options]
|
|
15
10
|
```
|
|
16
11
|
|
|
17
|
-
|
|
12
|
+
## Options
|
|
18
13
|
|
|
19
|
-
|
|
14
|
+
| Option | Description |
|
|
15
|
+
|------|------|
|
|
16
|
+
| `<lane-name>` | The name of the lane to signal |
|
|
17
|
+
| `"<message>"` | The text message to send to the agent |
|
|
18
|
+
| `--run-dir <path>` | Use a specific run directory (default: latest) |
|
|
20
19
|
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
4. Type your message and press **Enter**.
|
|
20
|
+
## How it works
|
|
21
|
+
1. **Logging**: The message is recorded in the lane's conversation history as a system/commander message.
|
|
22
|
+
2. **Injection**: If the lane's task configuration has `enableIntervention: true`, the message is injected into the agent's input stream.
|
|
23
|
+
|
|
24
|
+
## Example
|
|
27
25
|
|
|
28
|
-
### 2. via CLI / Cursor Command
|
|
29
|
-
You can also send a signal from any terminal or via the Cursor chat:
|
|
30
26
|
```bash
|
|
31
|
-
|
|
27
|
+
# Provide a hint to a running agent
|
|
28
|
+
cursorflow signal 01-lane-1 "Make sure to export the new function from index.ts"
|
|
32
29
|
```
|
|
33
30
|
|
|
34
|
-
##
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
## How it works
|
|
41
|
-
1. Your message is written to an `intervention.txt` file in the lane's log directory.
|
|
42
|
-
2. The CursorFlow runner, which is watching this file, detects the change.
|
|
43
|
-
3. **If `enableIntervention: true`**: It immediately injects your message into the `cursor-agent`'s standard input (stdin).
|
|
44
|
-
4. **If `enableIntervention: false`**: The message is logged but cannot be injected (warning displayed).
|
|
45
|
-
|
|
46
|
-
## Configuration
|
|
47
|
-
|
|
48
|
-
### Enable Intervention
|
|
31
|
+
## Dashboard Alternative
|
|
32
|
+
You can also use the interactive monitor to send signals:
|
|
33
|
+
1. Run `cursorflow monitor latest`.
|
|
34
|
+
2. Select a lane and enter details (`→`).
|
|
35
|
+
3. Press `I` to type and send an intervention message.
|
|
49
36
|
|
|
37
|
+
## Note on Intervention
|
|
38
|
+
For the agent to receive the signal immediately, the task must be configured with:
|
|
50
39
|
```json
|
|
51
40
|
{
|
|
52
41
|
"enableIntervention": true,
|
|
53
|
-
"
|
|
54
|
-
"tasks": [
|
|
55
|
-
{
|
|
56
|
-
"name": "my-task",
|
|
57
|
-
"prompt": "..."
|
|
58
|
-
}
|
|
59
|
-
]
|
|
42
|
+
"tasks": [...]
|
|
60
43
|
}
|
|
61
44
|
```
|
|
62
|
-
|
|
63
|
-
### Default Behavior (Intervention Disabled)
|
|
64
|
-
|
|
65
|
-
By default, `enableIntervention` is `false` to avoid potential buffering issues. When disabled:
|
|
66
|
-
- Signal commands will still work but messages are **logged only**
|
|
67
|
-
- The agent will **not receive** the injected message
|
|
68
|
-
- A warning will be shown: `Intervention requested but stdin not available`
|
|
69
|
-
|
|
70
|
-
## PID Control (Emergency Stop)
|
|
71
|
-
If an intervention isn't enough and the agent is "looping" or stuck:
|
|
72
|
-
- In the monitor, press **`K`** to kill the process via its PID.
|
|
73
|
-
- This is a hard stop and will immediately terminate the `cursor-agent` for that lane.
|
|
74
|
-
|
|
75
|
-
## Troubleshooting
|
|
76
|
-
|
|
77
|
-
### "Intervention requested but stdin not available"
|
|
78
|
-
|
|
79
|
-
This means `enableIntervention` is not set to `true` in your task JSON.
|
|
80
|
-
|
|
81
|
-
**Solution**: Add `"enableIntervention": true` to your task configuration.
|
|
82
|
-
|
|
83
|
-
### Intervention causes timeout
|
|
84
|
-
|
|
85
|
-
On some systems, enabling stdin piping can cause stdout buffering issues.
|
|
86
|
-
|
|
87
|
-
**Solution**:
|
|
88
|
-
1. Disable intervention: `"enableIntervention": false`
|
|
89
|
-
2. Increase timeout: `"timeout": 600000`
|
|
90
|
-
3. Use `K` (Kill) in monitor for emergency stops instead
|
|
45
|
+
If disabled, the signal will be logged but the agent will not be interrupted.
|
package/dist/cli/clean.js
CHANGED
|
@@ -42,6 +42,24 @@ const path = __importStar(require("path"));
|
|
|
42
42
|
const logger = __importStar(require("../utils/logger"));
|
|
43
43
|
const git = __importStar(require("../utils/git"));
|
|
44
44
|
const config_1 = require("../utils/config");
|
|
45
|
+
function printHelp() {
|
|
46
|
+
console.log(`
|
|
47
|
+
Usage: cursorflow clean <type> [options]
|
|
48
|
+
|
|
49
|
+
Clean up resources created by CursorFlow.
|
|
50
|
+
|
|
51
|
+
Types:
|
|
52
|
+
branches Remove local feature branches
|
|
53
|
+
worktrees Remove temporary Git worktrees
|
|
54
|
+
logs Clear log directories
|
|
55
|
+
all Remove all of the above (default)
|
|
56
|
+
|
|
57
|
+
Options:
|
|
58
|
+
--dry-run Show what would be removed without deleting
|
|
59
|
+
--force Force removal (ignore uncommitted changes)
|
|
60
|
+
--help, -h Show help
|
|
61
|
+
`);
|
|
62
|
+
}
|
|
45
63
|
function parseArgs(args) {
|
|
46
64
|
return {
|
|
47
65
|
type: args.find(a => ['branches', 'worktrees', 'logs', 'all'].includes(a)),
|
|
@@ -49,10 +67,15 @@ function parseArgs(args) {
|
|
|
49
67
|
dryRun: args.includes('--dry-run'),
|
|
50
68
|
force: args.includes('--force'),
|
|
51
69
|
all: args.includes('--all'),
|
|
70
|
+
help: args.includes('--help') || args.includes('-h'),
|
|
52
71
|
};
|
|
53
72
|
}
|
|
54
73
|
async function clean(args) {
|
|
55
74
|
const options = parseArgs(args);
|
|
75
|
+
if (options.help) {
|
|
76
|
+
printHelp();
|
|
77
|
+
return;
|
|
78
|
+
}
|
|
56
79
|
const config = (0, config_1.loadConfig)();
|
|
57
80
|
const repoRoot = git.getRepoRoot();
|
|
58
81
|
logger.section('🧹 Cleaning CursorFlow Resources');
|
package/dist/cli/clean.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"clean.js","sourceRoot":"","sources":["../../src/cli/clean.ts"],"names":[],"mappings":";AAAA;;;;GAIG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEH,uCAAyB;AACzB,2CAA6B;AAC7B,wDAA0C;AAC1C,kDAAoC;AACpC,4CAAyD;
|
|
1
|
+
{"version":3,"file":"clean.js","sourceRoot":"","sources":["../../src/cli/clean.ts"],"names":[],"mappings":"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"}
|
package/dist/cli/doctor.js
CHANGED
|
@@ -47,6 +47,7 @@ var __importStar = (this && this.__importStar) || (function () {
|
|
|
47
47
|
})();
|
|
48
48
|
const logger = __importStar(require("../utils/logger"));
|
|
49
49
|
const doctor_1 = require("../utils/doctor");
|
|
50
|
+
const cursor_agent_1 = require("../utils/cursor-agent");
|
|
50
51
|
function printHelp() {
|
|
51
52
|
console.log(`
|
|
52
53
|
Usage: cursorflow doctor [options]
|
|
@@ -58,12 +59,13 @@ Options:
|
|
|
58
59
|
--tasks-dir <path> Also validate lane files (run preflight)
|
|
59
60
|
--executor <type> cursor-agent | cloud
|
|
60
61
|
--no-cursor Skip Cursor Agent install/auth checks
|
|
62
|
+
--test-agent Run interactive agent test (to approve MCP/permissions)
|
|
61
63
|
--help, -h Show help
|
|
62
64
|
|
|
63
65
|
Examples:
|
|
64
66
|
cursorflow doctor
|
|
67
|
+
cursorflow doctor --test-agent
|
|
65
68
|
cursorflow doctor --tasks-dir _cursorflow/tasks/demo-test/
|
|
66
|
-
cursorflow doctor --json
|
|
67
69
|
`);
|
|
68
70
|
}
|
|
69
71
|
function parseArgs(args) {
|
|
@@ -74,6 +76,7 @@ function parseArgs(args) {
|
|
|
74
76
|
tasksDir: tasksDirIdx >= 0 ? (args[tasksDirIdx + 1] || null) : null,
|
|
75
77
|
executor: executorIdx >= 0 ? (args[executorIdx + 1] || null) : null,
|
|
76
78
|
includeCursorAgentChecks: !args.includes('--no-cursor'),
|
|
79
|
+
testAgent: args.includes('--test-agent'),
|
|
77
80
|
};
|
|
78
81
|
if (args.includes('--help') || args.includes('-h')) {
|
|
79
82
|
printHelp();
|
|
@@ -90,6 +93,8 @@ function printHumanReport(report) {
|
|
|
90
93
|
logger.info(`tasks: ${report.context.tasksDir}`);
|
|
91
94
|
if (report.issues.length === 0) {
|
|
92
95
|
logger.success('All checks passed');
|
|
96
|
+
console.log('\n💡 Tip: If this is your first run, we recommend running:');
|
|
97
|
+
console.log(' cursorflow doctor --test-agent\n');
|
|
93
98
|
return;
|
|
94
99
|
}
|
|
95
100
|
for (const issue of report.issues) {
|
|
@@ -121,6 +126,10 @@ function printHumanReport(report) {
|
|
|
121
126
|
}
|
|
122
127
|
async function doctor(args) {
|
|
123
128
|
const options = parseArgs(args);
|
|
129
|
+
if (options.testAgent) {
|
|
130
|
+
const success = (0, cursor_agent_1.runInteractiveAgentTest)();
|
|
131
|
+
process.exit(success ? 0 : 1);
|
|
132
|
+
}
|
|
124
133
|
const report = (0, doctor_1.runDoctor)({
|
|
125
134
|
cwd: process.cwd(),
|
|
126
135
|
tasksDir: options.tasksDir || undefined,
|
|
@@ -133,6 +142,10 @@ async function doctor(args) {
|
|
|
133
142
|
else {
|
|
134
143
|
printHumanReport(report);
|
|
135
144
|
}
|
|
145
|
+
// Save successful doctor run status
|
|
146
|
+
if (report.ok && report.context.repoRoot) {
|
|
147
|
+
(0, doctor_1.saveDoctorStatus)(report.context.repoRoot, report);
|
|
148
|
+
}
|
|
136
149
|
process.exit(report.ok ? 0 : 1);
|
|
137
150
|
}
|
|
138
151
|
module.exports = doctor;
|
package/dist/cli/doctor.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../src/cli/doctor.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;GAYG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEH,wDAA0C;AAC1C,
|
|
1
|
+
{"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../src/cli/doctor.ts"],"names":[],"mappings":"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"}
|