@litmers/cursorflow-orchestrator 0.1.2 → 0.1.5
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 +7 -6
- package/dist/cli/clean.d.ts +5 -0
- package/dist/cli/clean.js +57 -0
- package/dist/cli/clean.js.map +1 -0
- package/dist/cli/index.d.ts +6 -0
- package/dist/cli/index.js +120 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/init.d.ts +7 -0
- package/dist/cli/init.js +302 -0
- package/dist/cli/init.js.map +1 -0
- package/dist/cli/monitor.d.ts +8 -0
- package/dist/cli/monitor.js +210 -0
- package/dist/cli/monitor.js.map +1 -0
- package/dist/cli/resume.d.ts +5 -0
- package/dist/cli/resume.js +58 -0
- package/dist/cli/resume.js.map +1 -0
- package/dist/cli/run.d.ts +5 -0
- package/dist/cli/run.js +74 -0
- package/dist/cli/run.js.map +1 -0
- package/dist/cli/setup-commands.d.ts +19 -0
- package/dist/cli/setup-commands.js +218 -0
- package/dist/cli/setup-commands.js.map +1 -0
- package/dist/core/orchestrator.d.ts +47 -0
- package/dist/core/orchestrator.js +192 -0
- package/dist/core/orchestrator.js.map +1 -0
- package/dist/core/reviewer.d.ts +60 -0
- package/dist/core/reviewer.js +239 -0
- package/dist/core/reviewer.js.map +1 -0
- package/dist/core/runner.d.ts +49 -0
- package/dist/core/runner.js +475 -0
- package/dist/core/runner.js.map +1 -0
- package/dist/utils/config.d.ts +31 -0
- package/dist/utils/config.js +198 -0
- package/dist/utils/config.js.map +1 -0
- package/dist/utils/cursor-agent.d.ts +61 -0
- package/dist/utils/cursor-agent.js +263 -0
- package/dist/utils/cursor-agent.js.map +1 -0
- package/dist/utils/git.d.ts +131 -0
- package/dist/utils/git.js +272 -0
- package/dist/utils/git.js.map +1 -0
- package/dist/utils/logger.d.ts +68 -0
- package/dist/utils/logger.js +158 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/state.d.ts +65 -0
- package/dist/utils/state.js +216 -0
- package/dist/utils/state.js.map +1 -0
- package/dist/utils/types.d.ts +117 -0
- package/dist/utils/types.js +6 -0
- package/dist/utils/types.js.map +1 -0
- package/examples/README.md +155 -0
- package/examples/demo-project/README.md +262 -0
- package/examples/demo-project/_cursorflow/tasks/demo-test/01-create-utils.json +18 -0
- package/examples/demo-project/_cursorflow/tasks/demo-test/02-add-tests.json +18 -0
- package/examples/demo-project/_cursorflow/tasks/demo-test/README.md +109 -0
- package/package.json +71 -61
- package/scripts/ai-security-check.js +11 -4
- package/scripts/local-security-gate.sh +76 -0
- package/src/cli/{clean.js → clean.ts} +11 -5
- package/src/cli/{index.js → index.ts} +22 -16
- package/src/cli/{init.js → init.ts} +26 -18
- package/src/cli/{monitor.js → monitor.ts} +57 -44
- package/src/cli/{resume.js → resume.ts} +11 -5
- package/src/cli/run.ts +54 -0
- package/src/cli/{setup-commands.js → setup-commands.ts} +19 -18
- package/src/core/{orchestrator.js → orchestrator.ts} +44 -26
- package/src/core/{reviewer.js → reviewer.ts} +36 -29
- package/src/core/{runner.js → runner.ts} +78 -56
- package/src/utils/{config.js → config.ts} +17 -25
- package/src/utils/{cursor-agent.js → cursor-agent.ts} +38 -47
- package/src/utils/{git.js → git.ts} +70 -56
- package/src/utils/{logger.js → logger.ts} +170 -178
- package/src/utils/{state.js → state.ts} +30 -38
- package/src/utils/types.ts +133 -0
- package/src/cli/run.js +0 -51
|
@@ -0,0 +1,216 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* State management utilities for CursorFlow
|
|
4
|
+
*/
|
|
5
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
6
|
+
if (k2 === undefined) k2 = k;
|
|
7
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
8
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
9
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
10
|
+
}
|
|
11
|
+
Object.defineProperty(o, k2, desc);
|
|
12
|
+
}) : (function(o, m, k, k2) {
|
|
13
|
+
if (k2 === undefined) k2 = k;
|
|
14
|
+
o[k2] = m[k];
|
|
15
|
+
}));
|
|
16
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
17
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
18
|
+
}) : function(o, v) {
|
|
19
|
+
o["default"] = v;
|
|
20
|
+
});
|
|
21
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
22
|
+
var ownKeys = function(o) {
|
|
23
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
24
|
+
var ar = [];
|
|
25
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
26
|
+
return ar;
|
|
27
|
+
};
|
|
28
|
+
return ownKeys(o);
|
|
29
|
+
};
|
|
30
|
+
return function (mod) {
|
|
31
|
+
if (mod && mod.__esModule) return mod;
|
|
32
|
+
var result = {};
|
|
33
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
34
|
+
__setModuleDefault(result, mod);
|
|
35
|
+
return result;
|
|
36
|
+
};
|
|
37
|
+
})();
|
|
38
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
+
exports.saveState = saveState;
|
|
40
|
+
exports.loadState = loadState;
|
|
41
|
+
exports.appendLog = appendLog;
|
|
42
|
+
exports.readLog = readLog;
|
|
43
|
+
exports.createLaneState = createLaneState;
|
|
44
|
+
exports.updateLaneState = updateLaneState;
|
|
45
|
+
exports.createConversationEntry = createConversationEntry;
|
|
46
|
+
exports.createGitLogEntry = createGitLogEntry;
|
|
47
|
+
exports.createEventEntry = createEventEntry;
|
|
48
|
+
exports.getLatestRunDir = getLatestRunDir;
|
|
49
|
+
exports.listLanesInRun = listLanesInRun;
|
|
50
|
+
exports.getLaneStateSummary = getLaneStateSummary;
|
|
51
|
+
const fs = __importStar(require("fs"));
|
|
52
|
+
const path = __importStar(require("path"));
|
|
53
|
+
/**
|
|
54
|
+
* Save state to JSON file
|
|
55
|
+
*/
|
|
56
|
+
function saveState(statePath, state) {
|
|
57
|
+
const stateDir = path.dirname(statePath);
|
|
58
|
+
if (!fs.existsSync(stateDir)) {
|
|
59
|
+
fs.mkdirSync(stateDir, { recursive: true });
|
|
60
|
+
}
|
|
61
|
+
fs.writeFileSync(statePath, JSON.stringify(state, null, 2), 'utf8');
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Load state from JSON file
|
|
65
|
+
*/
|
|
66
|
+
function loadState(statePath) {
|
|
67
|
+
if (!fs.existsSync(statePath)) {
|
|
68
|
+
return null;
|
|
69
|
+
}
|
|
70
|
+
try {
|
|
71
|
+
const content = fs.readFileSync(statePath, 'utf8');
|
|
72
|
+
return JSON.parse(content);
|
|
73
|
+
}
|
|
74
|
+
catch (error) {
|
|
75
|
+
console.warn(`Warning: Failed to parse state file ${statePath}: ${error.message}`);
|
|
76
|
+
return null;
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Append to JSONL log file
|
|
81
|
+
*/
|
|
82
|
+
function appendLog(logPath, entry) {
|
|
83
|
+
const logDir = path.dirname(logPath);
|
|
84
|
+
if (!fs.existsSync(logDir)) {
|
|
85
|
+
fs.mkdirSync(logDir, { recursive: true });
|
|
86
|
+
}
|
|
87
|
+
const line = JSON.stringify(entry) + '\n';
|
|
88
|
+
fs.appendFileSync(logPath, line, 'utf8');
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Read JSONL log file
|
|
92
|
+
*/
|
|
93
|
+
function readLog(logPath) {
|
|
94
|
+
if (!fs.existsSync(logPath)) {
|
|
95
|
+
return [];
|
|
96
|
+
}
|
|
97
|
+
try {
|
|
98
|
+
const content = fs.readFileSync(logPath, 'utf8');
|
|
99
|
+
return content
|
|
100
|
+
.split('\n')
|
|
101
|
+
.filter(line => line.trim())
|
|
102
|
+
.map(line => JSON.parse(line));
|
|
103
|
+
}
|
|
104
|
+
catch (error) {
|
|
105
|
+
console.warn(`Warning: Failed to parse log file ${logPath}: ${error.message}`);
|
|
106
|
+
return [];
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Create initial lane state
|
|
111
|
+
*/
|
|
112
|
+
function createLaneState(laneName, config) {
|
|
113
|
+
return {
|
|
114
|
+
label: laneName,
|
|
115
|
+
status: 'pending',
|
|
116
|
+
currentTaskIndex: 0,
|
|
117
|
+
totalTasks: config.tasks ? config.tasks.length : 0,
|
|
118
|
+
worktreeDir: null,
|
|
119
|
+
pipelineBranch: null,
|
|
120
|
+
startTime: Date.now(),
|
|
121
|
+
endTime: null,
|
|
122
|
+
error: null,
|
|
123
|
+
dependencyRequest: null,
|
|
124
|
+
};
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* Update lane state
|
|
128
|
+
*/
|
|
129
|
+
function updateLaneState(state, updates) {
|
|
130
|
+
return {
|
|
131
|
+
...state,
|
|
132
|
+
...updates,
|
|
133
|
+
updatedAt: Date.now(),
|
|
134
|
+
};
|
|
135
|
+
}
|
|
136
|
+
/**
|
|
137
|
+
* Create conversation log entry
|
|
138
|
+
*/
|
|
139
|
+
function createConversationEntry(role, text, options = {}) {
|
|
140
|
+
return {
|
|
141
|
+
timestamp: new Date().toISOString(),
|
|
142
|
+
role,
|
|
143
|
+
task: options.task || null,
|
|
144
|
+
fullText: text,
|
|
145
|
+
textLength: text.length,
|
|
146
|
+
model: options.model || null,
|
|
147
|
+
};
|
|
148
|
+
}
|
|
149
|
+
/**
|
|
150
|
+
* Create git operation log entry
|
|
151
|
+
*/
|
|
152
|
+
function createGitLogEntry(operation, details = {}) {
|
|
153
|
+
return {
|
|
154
|
+
timestamp: new Date().toISOString(),
|
|
155
|
+
operation,
|
|
156
|
+
...details,
|
|
157
|
+
};
|
|
158
|
+
}
|
|
159
|
+
/**
|
|
160
|
+
* Create event log entry
|
|
161
|
+
*/
|
|
162
|
+
function createEventEntry(event, data = {}) {
|
|
163
|
+
return {
|
|
164
|
+
timestamp: new Date().toISOString(),
|
|
165
|
+
event,
|
|
166
|
+
...data,
|
|
167
|
+
};
|
|
168
|
+
}
|
|
169
|
+
/**
|
|
170
|
+
* Get latest run directory
|
|
171
|
+
*/
|
|
172
|
+
function getLatestRunDir(logsDir) {
|
|
173
|
+
if (!fs.existsSync(logsDir)) {
|
|
174
|
+
return null;
|
|
175
|
+
}
|
|
176
|
+
const runs = fs.readdirSync(logsDir)
|
|
177
|
+
.filter(f => fs.statSync(path.join(logsDir, f)).isDirectory())
|
|
178
|
+
.sort()
|
|
179
|
+
.reverse();
|
|
180
|
+
if (runs.length === 0) {
|
|
181
|
+
return null;
|
|
182
|
+
}
|
|
183
|
+
return path.join(logsDir, runs[0]);
|
|
184
|
+
}
|
|
185
|
+
/**
|
|
186
|
+
* List all lanes in a run directory
|
|
187
|
+
*/
|
|
188
|
+
function listLanesInRun(runDir) {
|
|
189
|
+
if (!fs.existsSync(runDir)) {
|
|
190
|
+
return [];
|
|
191
|
+
}
|
|
192
|
+
return fs.readdirSync(runDir)
|
|
193
|
+
.filter(f => fs.statSync(path.join(runDir, f)).isDirectory())
|
|
194
|
+
.map(laneName => ({
|
|
195
|
+
name: laneName,
|
|
196
|
+
dir: path.join(runDir, laneName),
|
|
197
|
+
statePath: path.join(runDir, laneName, 'state.json'),
|
|
198
|
+
}));
|
|
199
|
+
}
|
|
200
|
+
/**
|
|
201
|
+
* Get lane state summary
|
|
202
|
+
*/
|
|
203
|
+
function getLaneStateSummary(statePath) {
|
|
204
|
+
const state = loadState(statePath);
|
|
205
|
+
if (!state) {
|
|
206
|
+
return { status: 'unknown', progress: '-' };
|
|
207
|
+
}
|
|
208
|
+
const progress = `${(state.currentTaskIndex || 0) + 1}/${state.totalTasks || '?'}`;
|
|
209
|
+
return {
|
|
210
|
+
status: state.status || 'unknown',
|
|
211
|
+
progress,
|
|
212
|
+
label: state.label,
|
|
213
|
+
error: state.error,
|
|
214
|
+
};
|
|
215
|
+
}
|
|
216
|
+
//# sourceMappingURL=state.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"state.js","sourceRoot":"","sources":["../../src/utils/state.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared type definitions for CursorFlow
|
|
3
|
+
*/
|
|
4
|
+
export interface LaneConfig {
|
|
5
|
+
devPort: number;
|
|
6
|
+
autoCreatePr: boolean;
|
|
7
|
+
}
|
|
8
|
+
export interface CursorFlowConfig {
|
|
9
|
+
tasksDir: string;
|
|
10
|
+
logsDir: string;
|
|
11
|
+
baseBranch: string;
|
|
12
|
+
branchPrefix: string;
|
|
13
|
+
executor: 'cursor-agent' | 'cloud';
|
|
14
|
+
pollInterval: number;
|
|
15
|
+
allowDependencyChange: boolean;
|
|
16
|
+
lockfileReadOnly: boolean;
|
|
17
|
+
enableReview: boolean;
|
|
18
|
+
reviewModel: string;
|
|
19
|
+
maxReviewIterations: number;
|
|
20
|
+
defaultLaneConfig: LaneConfig;
|
|
21
|
+
logLevel: string;
|
|
22
|
+
verboseGit: boolean;
|
|
23
|
+
worktreePrefix: string;
|
|
24
|
+
maxConcurrentLanes: number;
|
|
25
|
+
projectRoot: string;
|
|
26
|
+
}
|
|
27
|
+
export interface DependencyPolicy {
|
|
28
|
+
allowDependencyChange: boolean;
|
|
29
|
+
lockfileReadOnly: boolean;
|
|
30
|
+
}
|
|
31
|
+
export interface Task {
|
|
32
|
+
name: string;
|
|
33
|
+
prompt: string;
|
|
34
|
+
model?: string;
|
|
35
|
+
}
|
|
36
|
+
export interface RunnerConfig {
|
|
37
|
+
tasks: Task[];
|
|
38
|
+
pipelineBranch?: string;
|
|
39
|
+
branchPrefix?: string;
|
|
40
|
+
worktreeRoot?: string;
|
|
41
|
+
baseBranch?: string;
|
|
42
|
+
model?: string;
|
|
43
|
+
dependencyPolicy: DependencyPolicy;
|
|
44
|
+
reviewModel?: string;
|
|
45
|
+
maxReviewIterations?: number;
|
|
46
|
+
acceptanceCriteria?: string[];
|
|
47
|
+
}
|
|
48
|
+
export interface DependencyRequestPlan {
|
|
49
|
+
reason: string;
|
|
50
|
+
changes: string[];
|
|
51
|
+
commands: string[];
|
|
52
|
+
notes?: string;
|
|
53
|
+
}
|
|
54
|
+
export interface TaskExecutionResult {
|
|
55
|
+
taskName: string;
|
|
56
|
+
taskBranch: string;
|
|
57
|
+
status: 'FINISHED' | 'ERROR' | 'BLOCKED_DEPENDENCY';
|
|
58
|
+
error?: string;
|
|
59
|
+
dependencyRequest?: DependencyRequestPlan | null;
|
|
60
|
+
}
|
|
61
|
+
export interface AgentSendResult {
|
|
62
|
+
ok: boolean;
|
|
63
|
+
exitCode: number;
|
|
64
|
+
error?: string;
|
|
65
|
+
sessionId?: string;
|
|
66
|
+
resultText?: string;
|
|
67
|
+
}
|
|
68
|
+
export interface ReviewIssue {
|
|
69
|
+
severity: 'critical' | 'major' | 'minor';
|
|
70
|
+
description: string;
|
|
71
|
+
file?: string;
|
|
72
|
+
suggestion?: string;
|
|
73
|
+
}
|
|
74
|
+
export interface ReviewResult {
|
|
75
|
+
status: 'approved' | 'needs_changes';
|
|
76
|
+
buildSuccess: boolean;
|
|
77
|
+
issues: ReviewIssue[];
|
|
78
|
+
suggestions: string[];
|
|
79
|
+
summary: string;
|
|
80
|
+
raw: string;
|
|
81
|
+
}
|
|
82
|
+
export interface TaskResult {
|
|
83
|
+
taskName: string;
|
|
84
|
+
taskBranch: string;
|
|
85
|
+
[key: string]: any;
|
|
86
|
+
}
|
|
87
|
+
export interface LaneState {
|
|
88
|
+
label: string;
|
|
89
|
+
status: 'pending' | 'running' | 'completed' | 'failed' | 'paused' | 'waiting' | 'reviewing';
|
|
90
|
+
currentTaskIndex: number;
|
|
91
|
+
totalTasks: number;
|
|
92
|
+
worktreeDir: string | null;
|
|
93
|
+
pipelineBranch: string | null;
|
|
94
|
+
startTime: number;
|
|
95
|
+
endTime: number | null;
|
|
96
|
+
error: string | null;
|
|
97
|
+
dependencyRequest: DependencyRequestPlan | null;
|
|
98
|
+
updatedAt?: number;
|
|
99
|
+
}
|
|
100
|
+
export interface ConversationEntry {
|
|
101
|
+
timestamp: string;
|
|
102
|
+
role: 'user' | 'assistant' | 'reviewer' | 'system';
|
|
103
|
+
task: string | null;
|
|
104
|
+
fullText: string;
|
|
105
|
+
textLength: number;
|
|
106
|
+
model: string | null;
|
|
107
|
+
}
|
|
108
|
+
export interface GitLogEntry {
|
|
109
|
+
timestamp: string;
|
|
110
|
+
operation: string;
|
|
111
|
+
[key: string]: any;
|
|
112
|
+
}
|
|
113
|
+
export interface EventEntry {
|
|
114
|
+
timestamp: string;
|
|
115
|
+
event: string;
|
|
116
|
+
[key: string]: any;
|
|
117
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/utils/types.ts"],"names":[],"mappings":";AAAA;;GAEG"}
|
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
# CursorFlow Examples
|
|
2
|
+
|
|
3
|
+
This directory contains example projects and configurations to help you get started with CursorFlow.
|
|
4
|
+
|
|
5
|
+
## 📁 Available Examples
|
|
6
|
+
|
|
7
|
+
### 1. Demo Project (`demo-project/`)
|
|
8
|
+
|
|
9
|
+
A complete demonstration of CursorFlow's core features.
|
|
10
|
+
|
|
11
|
+
**What it includes:**
|
|
12
|
+
- 2 parallel tasks (create utils + add tests)
|
|
13
|
+
- Real LLM execution with Claude 3.5 Sonnet
|
|
14
|
+
- Complete documentation
|
|
15
|
+
- Expected time: ~2-4 minutes
|
|
16
|
+
|
|
17
|
+
**Best for:**
|
|
18
|
+
- First-time users
|
|
19
|
+
- Understanding the basics
|
|
20
|
+
- Testing your setup
|
|
21
|
+
|
|
22
|
+
**Quick start:**
|
|
23
|
+
```bash
|
|
24
|
+
# See demo-project/README.md for detailed instructions
|
|
25
|
+
cd your-project
|
|
26
|
+
cursorflow init
|
|
27
|
+
cp -r path/to/cursorflow/examples/demo-project/_cursorflow/tasks/demo-test _cursorflow/tasks/
|
|
28
|
+
cursorflow run _cursorflow/tasks/demo-test/
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
## 🎯 How to Use Examples
|
|
32
|
+
|
|
33
|
+
### Option 1: Copy to Your Project
|
|
34
|
+
|
|
35
|
+
1. Initialize CursorFlow in your project:
|
|
36
|
+
```bash
|
|
37
|
+
cd your-project
|
|
38
|
+
cursorflow init
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
2. Copy example tasks:
|
|
42
|
+
```bash
|
|
43
|
+
cp -r examples/demo-project/_cursorflow/tasks/demo-test _cursorflow/tasks/
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
3. Run the example:
|
|
47
|
+
```bash
|
|
48
|
+
cursorflow run _cursorflow/tasks/demo-test/
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
### Option 2: Use as Reference
|
|
52
|
+
|
|
53
|
+
Browse the example files to understand:
|
|
54
|
+
- Task JSON structure
|
|
55
|
+
- Prompt engineering best practices
|
|
56
|
+
- Configuration options
|
|
57
|
+
- Expected outcomes
|
|
58
|
+
|
|
59
|
+
## 📚 Example Structure
|
|
60
|
+
|
|
61
|
+
Each example includes:
|
|
62
|
+
|
|
63
|
+
- **Task configurations** (`*.json`) - Defines what the AI will do
|
|
64
|
+
- **README.md** - Detailed instructions and explanations
|
|
65
|
+
- **Expected results** - What you should see after running
|
|
66
|
+
|
|
67
|
+
## 🔍 What's in a Task File?
|
|
68
|
+
|
|
69
|
+
```json
|
|
70
|
+
{
|
|
71
|
+
"baseBranch": "main",
|
|
72
|
+
"branchPrefix": "cursorflow/demo-",
|
|
73
|
+
"executor": "cursor-agent",
|
|
74
|
+
"dependencyPolicy": {
|
|
75
|
+
"allowDependencyChange": false,
|
|
76
|
+
"lockfileReadOnly": true
|
|
77
|
+
},
|
|
78
|
+
"tasks": [
|
|
79
|
+
{
|
|
80
|
+
"name": "task-name",
|
|
81
|
+
"model": "claude-3.5-sonnet",
|
|
82
|
+
"prompt": "Detailed instructions for the AI..."
|
|
83
|
+
}
|
|
84
|
+
]
|
|
85
|
+
}
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
## 🚀 Prerequisites
|
|
89
|
+
|
|
90
|
+
Before running examples:
|
|
91
|
+
|
|
92
|
+
1. **Install CursorFlow**
|
|
93
|
+
```bash
|
|
94
|
+
npm install -g @litmers/cursorflow-orchestrator
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
2. **Install cursor-agent**
|
|
98
|
+
```bash
|
|
99
|
+
npm install -g @cursor/agent
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
3. **Authenticate Cursor**
|
|
103
|
+
- Open Cursor IDE
|
|
104
|
+
- Sign in to your account
|
|
105
|
+
- Verify AI features work
|
|
106
|
+
|
|
107
|
+
4. **Check authentication** (optional)
|
|
108
|
+
```bash
|
|
109
|
+
node test-auth.js
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
## 💡 Tips
|
|
113
|
+
|
|
114
|
+
- **Start with demo-project** - It's the simplest example
|
|
115
|
+
- **Monitor execution** - Use `cursorflow monitor --watch` to see real-time progress
|
|
116
|
+
- **Check logs** - Inspect `_cursorflow/logs/` after execution
|
|
117
|
+
- **Experiment** - Modify prompts to test different scenarios
|
|
118
|
+
- **Clean up** - Remove worktrees and branches after testing
|
|
119
|
+
|
|
120
|
+
## 📖 Learn More
|
|
121
|
+
|
|
122
|
+
- **Main Documentation**: [README.md](../README.md)
|
|
123
|
+
- **Configuration Guide**: Check `cursorflow.config.js` in your project
|
|
124
|
+
- **Task Format**: See individual example task files
|
|
125
|
+
- **Monitoring**: [Monitor Command](../commands/cursorflow-monitor.md)
|
|
126
|
+
|
|
127
|
+
## 🐛 Troubleshooting
|
|
128
|
+
|
|
129
|
+
If you encounter issues:
|
|
130
|
+
|
|
131
|
+
1. Check prerequisites are installed
|
|
132
|
+
2. Verify Cursor authentication
|
|
133
|
+
3. Ensure you're in a Git repository
|
|
134
|
+
4. Check you have at least one commit
|
|
135
|
+
5. See example README for specific troubleshooting
|
|
136
|
+
|
|
137
|
+
## 🤝 Contributing Examples
|
|
138
|
+
|
|
139
|
+
Have a useful example? Contributions are welcome!
|
|
140
|
+
|
|
141
|
+
Please include:
|
|
142
|
+
- Complete task configurations
|
|
143
|
+
- Detailed README
|
|
144
|
+
- Expected results documentation
|
|
145
|
+
- Troubleshooting tips
|
|
146
|
+
|
|
147
|
+
## 📝 Notes
|
|
148
|
+
|
|
149
|
+
- Examples use real LLM API calls
|
|
150
|
+
- Small API usage will occur
|
|
151
|
+
- Internet connection required
|
|
152
|
+
- Make sure you have Cursor subscription active
|
|
153
|
+
|
|
154
|
+
Happy learning! 🎉
|
|
155
|
+
|