@litmers/cursorflow-orchestrator 0.1.31 → 0.1.34
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 +144 -52
- package/commands/cursorflow-add.md +159 -0
- package/commands/cursorflow-monitor.md +23 -2
- package/commands/cursorflow-new.md +87 -0
- package/dist/cli/add.d.ts +7 -0
- package/dist/cli/add.js +377 -0
- package/dist/cli/add.js.map +1 -0
- package/dist/cli/clean.js +1 -0
- package/dist/cli/clean.js.map +1 -1
- package/dist/cli/config.d.ts +7 -0
- package/dist/cli/config.js +181 -0
- package/dist/cli/config.js.map +1 -0
- package/dist/cli/index.js +34 -30
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/logs.js +7 -33
- package/dist/cli/logs.js.map +1 -1
- package/dist/cli/monitor.js +51 -62
- package/dist/cli/monitor.js.map +1 -1
- package/dist/cli/new.d.ts +7 -0
- package/dist/cli/new.js +232 -0
- package/dist/cli/new.js.map +1 -0
- package/dist/cli/prepare.js +95 -193
- package/dist/cli/prepare.js.map +1 -1
- package/dist/cli/resume.js +11 -47
- package/dist/cli/resume.js.map +1 -1
- package/dist/cli/run.js +27 -22
- package/dist/cli/run.js.map +1 -1
- package/dist/cli/tasks.js +1 -2
- package/dist/cli/tasks.js.map +1 -1
- package/dist/core/failure-policy.d.ts +9 -0
- package/dist/core/failure-policy.js +9 -0
- package/dist/core/failure-policy.js.map +1 -1
- package/dist/core/orchestrator.d.ts +20 -6
- package/dist/core/orchestrator.js +213 -333
- package/dist/core/orchestrator.js.map +1 -1
- package/dist/core/runner/agent.d.ts +27 -0
- package/dist/core/runner/agent.js +294 -0
- package/dist/core/runner/agent.js.map +1 -0
- package/dist/core/runner/index.d.ts +5 -0
- package/dist/core/runner/index.js +22 -0
- package/dist/core/runner/index.js.map +1 -0
- package/dist/core/runner/pipeline.d.ts +9 -0
- package/dist/core/runner/pipeline.js +539 -0
- package/dist/core/runner/pipeline.js.map +1 -0
- package/dist/core/runner/prompt.d.ts +25 -0
- package/dist/core/runner/prompt.js +175 -0
- package/dist/core/runner/prompt.js.map +1 -0
- package/dist/core/runner/task.d.ts +26 -0
- package/dist/core/runner/task.js +283 -0
- package/dist/core/runner/task.js.map +1 -0
- package/dist/core/runner/utils.d.ts +37 -0
- package/dist/core/runner/utils.js +161 -0
- package/dist/core/runner/utils.js.map +1 -0
- package/dist/core/runner.d.ts +2 -96
- package/dist/core/runner.js +11 -1136
- package/dist/core/runner.js.map +1 -1
- package/dist/core/stall-detection.d.ts +326 -0
- package/dist/core/stall-detection.js +781 -0
- package/dist/core/stall-detection.js.map +1 -0
- package/dist/types/config.d.ts +6 -6
- package/dist/types/flow.d.ts +84 -0
- package/dist/types/flow.js +10 -0
- package/dist/types/flow.js.map +1 -0
- package/dist/types/index.d.ts +1 -0
- package/dist/types/index.js +3 -3
- package/dist/types/index.js.map +1 -1
- package/dist/types/lane.d.ts +0 -2
- package/dist/types/logging.d.ts +5 -1
- package/dist/types/task.d.ts +7 -11
- package/dist/utils/config.js +7 -15
- package/dist/utils/config.js.map +1 -1
- package/dist/utils/dependency.d.ts +36 -1
- package/dist/utils/dependency.js +256 -1
- package/dist/utils/dependency.js.map +1 -1
- package/dist/utils/enhanced-logger.d.ts +45 -82
- package/dist/utils/enhanced-logger.js +238 -844
- package/dist/utils/enhanced-logger.js.map +1 -1
- package/dist/utils/git.d.ts +29 -0
- package/dist/utils/git.js +115 -5
- package/dist/utils/git.js.map +1 -1
- package/dist/utils/state.js +0 -2
- package/dist/utils/state.js.map +1 -1
- package/dist/utils/task-service.d.ts +2 -2
- package/dist/utils/task-service.js +40 -31
- package/dist/utils/task-service.js.map +1 -1
- package/package.json +4 -3
- package/src/cli/add.ts +397 -0
- package/src/cli/clean.ts +1 -0
- package/src/cli/config.ts +177 -0
- package/src/cli/index.ts +36 -32
- package/src/cli/logs.ts +7 -31
- package/src/cli/monitor.ts +55 -71
- package/src/cli/new.ts +235 -0
- package/src/cli/prepare.ts +98 -205
- package/src/cli/resume.ts +13 -56
- package/src/cli/run.ts +311 -306
- package/src/cli/tasks.ts +1 -2
- package/src/core/failure-policy.ts +9 -0
- package/src/core/orchestrator.ts +277 -378
- package/src/core/runner/agent.ts +314 -0
- package/src/core/runner/index.ts +6 -0
- package/src/core/runner/pipeline.ts +567 -0
- package/src/core/runner/prompt.ts +174 -0
- package/src/core/runner/task.ts +320 -0
- package/src/core/runner/utils.ts +142 -0
- package/src/core/runner.ts +8 -1347
- package/src/core/stall-detection.ts +936 -0
- package/src/types/config.ts +6 -6
- package/src/types/flow.ts +91 -0
- package/src/types/index.ts +15 -3
- package/src/types/lane.ts +0 -2
- package/src/types/logging.ts +5 -1
- package/src/types/task.ts +7 -11
- package/src/utils/config.ts +8 -16
- package/src/utils/dependency.ts +311 -2
- package/src/utils/enhanced-logger.ts +263 -927
- package/src/utils/git.ts +145 -5
- package/src/utils/state.ts +0 -2
- package/src/utils/task-service.ts +48 -40
- package/commands/cursorflow-review.md +0 -56
- package/commands/cursorflow-runs.md +0 -59
- package/dist/cli/runs.d.ts +0 -5
- package/dist/cli/runs.js +0 -214
- package/dist/cli/runs.js.map +0 -1
- package/dist/core/reviewer.d.ts +0 -66
- package/dist/core/reviewer.js +0 -265
- package/dist/core/reviewer.js.map +0 -1
- package/src/cli/runs.ts +0 -212
- package/src/core/reviewer.ts +0 -285
|
@@ -0,0 +1,175 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.DEPENDENCY_REQUEST_FILE = void 0;
|
|
37
|
+
exports.wrapPromptForDependencyPolicy = wrapPromptForDependencyPolicy;
|
|
38
|
+
exports.wrapPrompt = wrapPrompt;
|
|
39
|
+
exports.applyDependencyFilePermissions = applyDependencyFilePermissions;
|
|
40
|
+
const fs = __importStar(require("fs"));
|
|
41
|
+
const path_1 = require("../../utils/path");
|
|
42
|
+
/**
|
|
43
|
+
* Dependency request file name - agent writes here when dependency changes are needed
|
|
44
|
+
*/
|
|
45
|
+
exports.DEPENDENCY_REQUEST_FILE = '_cursorflow/dependency-request.json';
|
|
46
|
+
/**
|
|
47
|
+
* Wrap prompt with dependency policy instructions (legacy, used by tests)
|
|
48
|
+
*/
|
|
49
|
+
function wrapPromptForDependencyPolicy(prompt, policy) {
|
|
50
|
+
if (policy.allowDependencyChange && !policy.lockfileReadOnly) {
|
|
51
|
+
return prompt;
|
|
52
|
+
}
|
|
53
|
+
let wrapped = `### 📦 Dependency Policy\n`;
|
|
54
|
+
wrapped += `- allowDependencyChange: ${policy.allowDependencyChange}\n`;
|
|
55
|
+
wrapped += `- lockfileReadOnly: ${policy.lockfileReadOnly}\n\n`;
|
|
56
|
+
wrapped += prompt;
|
|
57
|
+
return wrapped;
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Wrap prompt with global context, dependency policy, and worktree instructions
|
|
61
|
+
*/
|
|
62
|
+
function wrapPrompt(prompt, config, options = {}) {
|
|
63
|
+
const { noGit = false, isWorktree = true, dependencyResults = [], worktreePath, taskBranch, pipelineBranch } = options;
|
|
64
|
+
// 1. PREFIX: Environment & Worktree context
|
|
65
|
+
let wrapped = `### 🛠 Environment & Context\n`;
|
|
66
|
+
wrapped += `- **Workspace**: 당신은 독립된 **Git 워크트리** (프로젝트 루트)에서 작업 중입니다.\n`;
|
|
67
|
+
wrapped += `- **CWD**: 현재 터미널과 작업 경로는 이미 워크트리 루트(\`${worktreePath || 'current'}\`)로 설정되어 있습니다.\n`;
|
|
68
|
+
if (taskBranch && !noGit) {
|
|
69
|
+
wrapped += `- **Current Branch**: \`${taskBranch}\` (현재 작업 중인 브랜치)\n`;
|
|
70
|
+
wrapped += `- **Branch Check**: 만약 브랜치가 다르다면 \`git checkout ${taskBranch}\`를 실행하세요.\n`;
|
|
71
|
+
}
|
|
72
|
+
if (pipelineBranch && !noGit) {
|
|
73
|
+
wrapped += `- **Base Branch**: \`${pipelineBranch}\` (이 작업의 기준이 되는 상위 브랜치)\n`;
|
|
74
|
+
}
|
|
75
|
+
if (worktreePath) {
|
|
76
|
+
wrapped += `- **Worktree Path**: \`${worktreePath}\`\n`;
|
|
77
|
+
wrapped += `- **CRITICAL**: 터미널 명령어 실행 시 반드시 워크트리 루트 내에서 실행되고 있는지 확인하세요.\n`;
|
|
78
|
+
}
|
|
79
|
+
wrapped += `- **Path Rule**: 모든 파일 참조는 워크트리 루트 기준입니다.\n`;
|
|
80
|
+
if (isWorktree) {
|
|
81
|
+
wrapped += `- **File Availability**: Git 추적 파일만 존재합니다. (node_modules, .env 등은 기본적으로 없음)\n`;
|
|
82
|
+
// Add environment file copy instructions
|
|
83
|
+
if (worktreePath) {
|
|
84
|
+
// Extract main repo path from worktree path (remove _cursorflow/worktrees/xxx part)
|
|
85
|
+
const mainRepoPath = worktreePath.replace(/\/_cursorflow\/worktrees\/[^/]+$/, '');
|
|
86
|
+
wrapped += `\n### 🔐 Environment Files Setup\n`;
|
|
87
|
+
wrapped += `워크트리에 환경변수 파일이 없다면, 메인 레포에서 복사하세요:\n`;
|
|
88
|
+
wrapped += `\`\`\`bash\n`;
|
|
89
|
+
wrapped += `# 메인 레포 경로: ${mainRepoPath}\n`;
|
|
90
|
+
wrapped += `예시 커맨드: [ ! -f .env ] && [ -f "${mainRepoPath}/.env" ] && cp "${mainRepoPath}/.env" .env\n`;
|
|
91
|
+
wrapped += `예시 커맨드: [ ! -f .env.local ] && [ -f "${mainRepoPath}/.env.local" ] && cp "${mainRepoPath}/.env.local" .env.local\n`;
|
|
92
|
+
wrapped += `\`\`\`\n`;
|
|
93
|
+
wrapped += `⚠️ 이 작업은 **터미널 명령어 실행 전** 반드시 확인하세요!\n`;
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
// 2. Dependency Task Results (if available)
|
|
97
|
+
if (dependencyResults.length > 0) {
|
|
98
|
+
wrapped += `\n### 📋 의존 태스크 결과\n`;
|
|
99
|
+
wrapped += `이 태스크가 의존하는 이전 태스크들의 작업 결과입니다.\n\n`;
|
|
100
|
+
for (const dep of dependencyResults) {
|
|
101
|
+
wrapped += `#### ${dep.taskId}\n`;
|
|
102
|
+
wrapped += `${dep.resultText}\n\n`;
|
|
103
|
+
}
|
|
104
|
+
wrapped += `---\n`;
|
|
105
|
+
}
|
|
106
|
+
// 3. Dependency Policy (Integrated)
|
|
107
|
+
const policy = config.dependencyPolicy;
|
|
108
|
+
wrapped += `\n### 📦 Dependency Policy\n`;
|
|
109
|
+
wrapped += `- allowDependencyChange: ${policy.allowDependencyChange}\n`;
|
|
110
|
+
wrapped += `- lockfileReadOnly: ${policy.lockfileReadOnly}\n`;
|
|
111
|
+
if (noGit) {
|
|
112
|
+
wrapped += `- NO_GIT_MODE: Git 명령어를 사용하지 마세요. 파일 수정만 가능합니다.\n`;
|
|
113
|
+
}
|
|
114
|
+
wrapped += `\n**📦 Dependency Change Rules:**\n`;
|
|
115
|
+
wrapped += `1. 코드를 수정하기 전, 의존성 변경이 필요한지 **먼저** 판단하세요.\n`;
|
|
116
|
+
wrapped += `2. 의존성 변경이 필요하다면:\n`;
|
|
117
|
+
wrapped += ` - **다른 파일을 절대 수정하지 마세요.**\n`;
|
|
118
|
+
wrapped += ` - 아래 JSON을 \`./${exports.DEPENDENCY_REQUEST_FILE}\` 파일에 저장하세요:\n`;
|
|
119
|
+
wrapped += ` \`\`\`json\n`;
|
|
120
|
+
wrapped += ` {\n`;
|
|
121
|
+
wrapped += ` "reason": "왜 이 의존성이 필요한지 설명",\n`;
|
|
122
|
+
wrapped += ` "changes": ["add lodash@^4.17.21", "remove unused-pkg"],\n`;
|
|
123
|
+
wrapped += ` "commands": ["pnpm add lodash@^4.17.21", "pnpm remove unused-pkg"],\n`;
|
|
124
|
+
wrapped += ` "notes": "추가 참고사항 (선택)" \n`;
|
|
125
|
+
wrapped += ` }\n`;
|
|
126
|
+
wrapped += ` \`\`\`\n`;
|
|
127
|
+
wrapped += ` - 파일 저장 후 **즉시 작업을 종료**하세요. 오케스트레이터가 처리합니다.\n`;
|
|
128
|
+
wrapped += `3. 의존성 변경이 불필요하면 바로 본 작업을 진행하세요.\n`;
|
|
129
|
+
wrapped += `\n---\n\n${prompt}\n\n---\n`;
|
|
130
|
+
// 4. SUFFIX: Task Completion & Git Requirements
|
|
131
|
+
wrapped += `\n### 📝 Task Completion Requirements\n`;
|
|
132
|
+
wrapped += `**반드시 다음 순서로 작업을 마무리하세요 (매우 중요):**\n\n`;
|
|
133
|
+
if (!noGit) {
|
|
134
|
+
wrapped += `1. **변경 사항 확인**: \`git status\`와 \`git diff\`로 수정된 내용을 최종 확인하세요.\n`;
|
|
135
|
+
wrapped += `2. **Git Commit & Push** (필수!):\n`;
|
|
136
|
+
wrapped += ` \`\`\`bash\n`;
|
|
137
|
+
wrapped += ` git add -A\n`;
|
|
138
|
+
wrapped += ` git commit -m "feat: <작업 내용 요약>"\n`;
|
|
139
|
+
wrapped += ` git push origin HEAD\n`;
|
|
140
|
+
wrapped += ` \`\`\`\n`;
|
|
141
|
+
wrapped += ` ⚠️ **주의**: 커밋과 푸시를 생략하면 오케스트레이터가 변경 사항을 인식하지 못하며 작업이 손실됩니다.\n\n`;
|
|
142
|
+
}
|
|
143
|
+
wrapped += `3. **최종 요약**: 작업 완료 후 아래 형식을 포함하여 요약해 주세요:\n`;
|
|
144
|
+
wrapped += ` - **수정된 파일**: [파일명1, 파일명2, ...]\n`;
|
|
145
|
+
wrapped += ` - **작업 결과**: [핵심 변경 사항 요약]\n`;
|
|
146
|
+
wrapped += ` - **커밋 정보**: [git log --oneline -1 결과]\n\n`;
|
|
147
|
+
wrapped += `4. 지시된 문서(docs/...)를 찾을 수 없거나 예기치 못한 오류가 발생하면 즉시 보고하세요.\n`;
|
|
148
|
+
return wrapped;
|
|
149
|
+
}
|
|
150
|
+
/**
|
|
151
|
+
* Apply file permissions based on dependency policy
|
|
152
|
+
*/
|
|
153
|
+
function applyDependencyFilePermissions(worktreeDir, policy) {
|
|
154
|
+
const targets = [];
|
|
155
|
+
if (!policy.allowDependencyChange) {
|
|
156
|
+
targets.push('package.json');
|
|
157
|
+
}
|
|
158
|
+
if (policy.lockfileReadOnly) {
|
|
159
|
+
targets.push('pnpm-lock.yaml', 'package-lock.json', 'yarn.lock');
|
|
160
|
+
}
|
|
161
|
+
for (const file of targets) {
|
|
162
|
+
const filePath = (0, path_1.safeJoin)(worktreeDir, file);
|
|
163
|
+
if (!fs.existsSync(filePath))
|
|
164
|
+
continue;
|
|
165
|
+
try {
|
|
166
|
+
const stats = fs.statSync(filePath);
|
|
167
|
+
const mode = stats.mode & 0o777;
|
|
168
|
+
fs.chmodSync(filePath, mode & ~0o222); // Remove write bits
|
|
169
|
+
}
|
|
170
|
+
catch {
|
|
171
|
+
// Best effort
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
//# sourceMappingURL=prompt.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prompt.js","sourceRoot":"","sources":["../../../src/core/runner/prompt.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { Task, RunnerConfig, TaskExecutionResult } from '../../types';
|
|
2
|
+
import { DependencyWaitOptions } from '../../utils/dependency';
|
|
3
|
+
/**
|
|
4
|
+
* Wait for task-level dependencies to be completed by other lanes
|
|
5
|
+
* Now uses the enhanced dependency module with timeout support
|
|
6
|
+
*/
|
|
7
|
+
export declare function waitForTaskDependencies(deps: string[], runDir: string, options?: DependencyWaitOptions): Promise<void>;
|
|
8
|
+
/**
|
|
9
|
+
* Merge branches from dependency lanes with safe merge and conflict pre-check
|
|
10
|
+
*/
|
|
11
|
+
export declare function mergeDependencyBranches(deps: string[], runDir: string, worktreeDir: string, pipelineBranch: string): Promise<void>;
|
|
12
|
+
/**
|
|
13
|
+
* Run a single task
|
|
14
|
+
*/
|
|
15
|
+
export declare function runTask({ task, config, index, worktreeDir, pipelineBranch, taskBranch, chatId, runDir, runRoot, noGit, }: {
|
|
16
|
+
task: Task;
|
|
17
|
+
config: RunnerConfig;
|
|
18
|
+
index: number;
|
|
19
|
+
worktreeDir: string;
|
|
20
|
+
pipelineBranch: string;
|
|
21
|
+
taskBranch: string;
|
|
22
|
+
chatId: string;
|
|
23
|
+
runDir: string;
|
|
24
|
+
runRoot?: string;
|
|
25
|
+
noGit?: boolean;
|
|
26
|
+
}): Promise<TaskExecutionResult>;
|
|
@@ -0,0 +1,283 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.waitForTaskDependencies = waitForTaskDependencies;
|
|
37
|
+
exports.mergeDependencyBranches = mergeDependencyBranches;
|
|
38
|
+
exports.runTask = runTask;
|
|
39
|
+
const fs = __importStar(require("fs"));
|
|
40
|
+
const path = __importStar(require("path"));
|
|
41
|
+
const git = __importStar(require("../../utils/git"));
|
|
42
|
+
const logger = __importStar(require("../../utils/logger"));
|
|
43
|
+
const events_1 = require("../../utils/events");
|
|
44
|
+
const path_1 = require("../../utils/path");
|
|
45
|
+
const state_1 = require("../../utils/state");
|
|
46
|
+
const state_2 = require("../../utils/state");
|
|
47
|
+
const dependency_1 = require("../../utils/dependency");
|
|
48
|
+
const agent_1 = require("./agent");
|
|
49
|
+
const prompt_1 = require("./prompt");
|
|
50
|
+
const utils_1 = require("./utils");
|
|
51
|
+
/**
|
|
52
|
+
* Wait for task-level dependencies to be completed by other lanes
|
|
53
|
+
* Now uses the enhanced dependency module with timeout support
|
|
54
|
+
*/
|
|
55
|
+
async function waitForTaskDependencies(deps, runDir, options = {}) {
|
|
56
|
+
if (!deps || deps.length === 0)
|
|
57
|
+
return;
|
|
58
|
+
const lanesRoot = path.dirname(runDir);
|
|
59
|
+
const result = await (0, dependency_1.waitForTaskDependencies)(deps, lanesRoot, {
|
|
60
|
+
timeoutMs: options.timeoutMs || 30 * 60 * 1000, // 30 minutes default
|
|
61
|
+
pollIntervalMs: options.pollIntervalMs || 5000,
|
|
62
|
+
onTimeout: options.onTimeout || 'fail',
|
|
63
|
+
onProgress: (pending, completed) => {
|
|
64
|
+
if (completed.length > 0) {
|
|
65
|
+
logger.info(`Dependencies progress: ${completed.length}/${deps.length} completed`);
|
|
66
|
+
}
|
|
67
|
+
},
|
|
68
|
+
});
|
|
69
|
+
if (!result.success) {
|
|
70
|
+
if (result.timedOut) {
|
|
71
|
+
throw new Error(`Dependency wait timed out after ${Math.round(result.elapsedMs / 1000)}s. Pending: ${result.failedDependencies.join(', ')}`);
|
|
72
|
+
}
|
|
73
|
+
throw new Error(`Dependencies failed: ${result.failedDependencies.join(', ')}`);
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Merge branches from dependency lanes with safe merge and conflict pre-check
|
|
78
|
+
*/
|
|
79
|
+
async function mergeDependencyBranches(deps, runDir, worktreeDir, pipelineBranch) {
|
|
80
|
+
if (!deps || deps.length === 0)
|
|
81
|
+
return;
|
|
82
|
+
const lanesRoot = path.dirname(runDir);
|
|
83
|
+
const lanesToMerge = new Set(deps.map(d => d.split(':')[0]));
|
|
84
|
+
// Ensure we are on the pipeline branch before merging dependencies
|
|
85
|
+
logger.info(`🔄 Syncing with ${pipelineBranch} before merging dependencies`);
|
|
86
|
+
git.runGit(['checkout', pipelineBranch], { cwd: worktreeDir });
|
|
87
|
+
for (const laneName of lanesToMerge) {
|
|
88
|
+
const depStatePath = (0, path_1.safeJoin)(lanesRoot, laneName, 'state.json');
|
|
89
|
+
if (!fs.existsSync(depStatePath))
|
|
90
|
+
continue;
|
|
91
|
+
try {
|
|
92
|
+
const state = (0, state_2.loadState)(depStatePath);
|
|
93
|
+
if (!state?.pipelineBranch)
|
|
94
|
+
continue;
|
|
95
|
+
logger.info(`Merging branch from ${laneName}: ${state.pipelineBranch}`);
|
|
96
|
+
// Ensure we have the latest
|
|
97
|
+
git.runGit(['fetch', 'origin', state.pipelineBranch], { cwd: worktreeDir, silent: true });
|
|
98
|
+
// Pre-check for conflicts before attempting merge
|
|
99
|
+
const conflictCheck = git.checkMergeConflict(state.pipelineBranch, { cwd: worktreeDir });
|
|
100
|
+
if (conflictCheck.willConflict) {
|
|
101
|
+
logger.warn(`⚠️ Pre-check: Merge conflict detected with ${laneName}`);
|
|
102
|
+
logger.warn(` Conflicting files: ${conflictCheck.conflictingFiles.join(', ')}`);
|
|
103
|
+
// Emit event for potential auto-recovery or notification
|
|
104
|
+
events_1.events.emit('merge.conflict_detected', {
|
|
105
|
+
laneName,
|
|
106
|
+
targetBranch: state.pipelineBranch,
|
|
107
|
+
conflictingFiles: conflictCheck.conflictingFiles,
|
|
108
|
+
preCheck: true,
|
|
109
|
+
});
|
|
110
|
+
throw new Error(`Pre-merge conflict check failed: ${conflictCheck.conflictingFiles.join(', ')}. Consider rebasing or resolving conflicts manually.`);
|
|
111
|
+
}
|
|
112
|
+
// Use safe merge with conflict detection
|
|
113
|
+
const mergeResult = git.safeMerge(state.pipelineBranch, {
|
|
114
|
+
cwd: worktreeDir,
|
|
115
|
+
noFf: true,
|
|
116
|
+
message: `chore: merge task dependency from ${laneName}`,
|
|
117
|
+
abortOnConflict: true,
|
|
118
|
+
});
|
|
119
|
+
if (!mergeResult.success) {
|
|
120
|
+
if (mergeResult.conflict) {
|
|
121
|
+
logger.error(`Merge conflict with ${laneName}: ${mergeResult.conflictingFiles.join(', ')}`);
|
|
122
|
+
throw new Error(`Merge conflict: ${mergeResult.conflictingFiles.join(', ')}`);
|
|
123
|
+
}
|
|
124
|
+
throw new Error(mergeResult.error || 'Merge failed');
|
|
125
|
+
}
|
|
126
|
+
logger.success(`✓ Merged ${laneName}`);
|
|
127
|
+
}
|
|
128
|
+
catch (e) {
|
|
129
|
+
logger.error(`Failed to merge branch from ${laneName}: ${e}`);
|
|
130
|
+
throw e;
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
/**
|
|
135
|
+
* Run a single task
|
|
136
|
+
*/
|
|
137
|
+
async function runTask({ task, config, index, worktreeDir, pipelineBranch, taskBranch, chatId, runDir, runRoot, noGit = false, }) {
|
|
138
|
+
// Calculate runRoot if not provided (runDir is lanes/{laneName}/, runRoot is parent of lanes/)
|
|
139
|
+
const calculatedRunRoot = runRoot || path.dirname(path.dirname(runDir));
|
|
140
|
+
const model = task.model || config.model || 'sonnet-4.5';
|
|
141
|
+
const timeout = task.timeout || config.timeout;
|
|
142
|
+
const convoPath = (0, path_1.safeJoin)(runDir, 'conversation.jsonl');
|
|
143
|
+
logger.section(`[${index + 1}/${config.tasks.length}] ${task.name}`);
|
|
144
|
+
logger.info(`Model: ${model}`);
|
|
145
|
+
if (noGit) {
|
|
146
|
+
logger.info('🚫 noGit mode: skipping branch operations');
|
|
147
|
+
}
|
|
148
|
+
else {
|
|
149
|
+
logger.info(`Branch: ${taskBranch}`);
|
|
150
|
+
}
|
|
151
|
+
events_1.events.emit('task.started', {
|
|
152
|
+
taskName: task.name,
|
|
153
|
+
taskBranch,
|
|
154
|
+
index,
|
|
155
|
+
});
|
|
156
|
+
// Sync pipelineBranch with remote before starting (skip in noGit mode)
|
|
157
|
+
if (!noGit) {
|
|
158
|
+
logger.info(`🔄 Syncing ${pipelineBranch} with remote...`);
|
|
159
|
+
// Fetch latest from remote
|
|
160
|
+
try {
|
|
161
|
+
git.runGit(['fetch', 'origin', pipelineBranch], { cwd: worktreeDir, silent: true });
|
|
162
|
+
}
|
|
163
|
+
catch {
|
|
164
|
+
// Branch might not exist on remote yet - that's OK
|
|
165
|
+
logger.info(` Branch ${pipelineBranch} not yet on remote, skipping sync`);
|
|
166
|
+
}
|
|
167
|
+
// Try to fast-forward if behind
|
|
168
|
+
const syncResult = git.syncBranchWithRemote(pipelineBranch, { cwd: worktreeDir, createIfMissing: true });
|
|
169
|
+
if (syncResult.updated) {
|
|
170
|
+
logger.info(` ✓ Updated ${pipelineBranch} with ${syncResult.behind || 0} new commits from remote`);
|
|
171
|
+
}
|
|
172
|
+
else if (syncResult.error) {
|
|
173
|
+
logger.warn(` ⚠️ Could not sync: ${syncResult.error}`);
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
// Checkout task branch from pipeline branch (skip in noGit mode)
|
|
177
|
+
if (!noGit) {
|
|
178
|
+
logger.info(`🌿 Forking task branch: ${taskBranch} from ${pipelineBranch}`);
|
|
179
|
+
git.runGit(['checkout', '-B', taskBranch, pipelineBranch], { cwd: worktreeDir });
|
|
180
|
+
}
|
|
181
|
+
// Apply dependency permissions
|
|
182
|
+
(0, prompt_1.applyDependencyFilePermissions)(worktreeDir, config.dependencyPolicy);
|
|
183
|
+
// Load dependency results if this task has dependsOn
|
|
184
|
+
let dependencyResults = [];
|
|
185
|
+
if (task.dependsOn && task.dependsOn.length > 0) {
|
|
186
|
+
dependencyResults = (0, utils_1.loadDependencyResults)(task.dependsOn, calculatedRunRoot);
|
|
187
|
+
}
|
|
188
|
+
// Wrap prompt with context, dependency results, and completion instructions
|
|
189
|
+
const wrappedPrompt = (0, prompt_1.wrapPrompt)(task.prompt, config, {
|
|
190
|
+
noGit,
|
|
191
|
+
isWorktree: !noGit,
|
|
192
|
+
dependencyResults,
|
|
193
|
+
worktreePath: worktreeDir,
|
|
194
|
+
taskBranch,
|
|
195
|
+
pipelineBranch,
|
|
196
|
+
});
|
|
197
|
+
// Log ONLY the original prompt to keep logs clean
|
|
198
|
+
(0, state_1.appendLog)(convoPath, (0, state_1.createConversationEntry)('user', task.prompt, {
|
|
199
|
+
task: task.name,
|
|
200
|
+
model,
|
|
201
|
+
}));
|
|
202
|
+
logger.info('Sending prompt to agent...');
|
|
203
|
+
const startTime = Date.now();
|
|
204
|
+
events_1.events.emit('agent.prompt_sent', {
|
|
205
|
+
taskName: task.name,
|
|
206
|
+
model,
|
|
207
|
+
promptLength: wrappedPrompt.length,
|
|
208
|
+
});
|
|
209
|
+
const r1 = await (0, agent_1.cursorAgentSend)({
|
|
210
|
+
workspaceDir: worktreeDir,
|
|
211
|
+
chatId,
|
|
212
|
+
prompt: wrappedPrompt,
|
|
213
|
+
model,
|
|
214
|
+
signalDir: runDir,
|
|
215
|
+
timeout,
|
|
216
|
+
enableIntervention: config.enableIntervention,
|
|
217
|
+
outputFormat: config.agentOutputFormat,
|
|
218
|
+
taskName: task.name,
|
|
219
|
+
});
|
|
220
|
+
const duration = Date.now() - startTime;
|
|
221
|
+
events_1.events.emit('agent.response_received', {
|
|
222
|
+
taskName: task.name,
|
|
223
|
+
ok: r1.ok,
|
|
224
|
+
duration,
|
|
225
|
+
responseLength: r1.resultText?.length || 0,
|
|
226
|
+
error: r1.error,
|
|
227
|
+
});
|
|
228
|
+
(0, state_1.appendLog)(convoPath, (0, state_1.createConversationEntry)('assistant', r1.resultText || r1.error || 'No response', {
|
|
229
|
+
task: task.name,
|
|
230
|
+
model,
|
|
231
|
+
}));
|
|
232
|
+
if (!r1.ok) {
|
|
233
|
+
events_1.events.emit('task.failed', {
|
|
234
|
+
taskName: task.name,
|
|
235
|
+
taskBranch,
|
|
236
|
+
error: r1.error,
|
|
237
|
+
});
|
|
238
|
+
return {
|
|
239
|
+
taskName: task.name,
|
|
240
|
+
taskBranch,
|
|
241
|
+
status: 'ERROR',
|
|
242
|
+
error: r1.error,
|
|
243
|
+
};
|
|
244
|
+
}
|
|
245
|
+
// Check for dependency request (file-based takes priority, then text-based)
|
|
246
|
+
const fileDepReq = (0, utils_1.readDependencyRequestFile)(worktreeDir);
|
|
247
|
+
const textDepReq = (0, agent_1.extractDependencyRequest)(r1.resultText || '');
|
|
248
|
+
// Determine which request to use (file-based is preferred as it's more structured)
|
|
249
|
+
const depReq = fileDepReq.required ? fileDepReq : textDepReq;
|
|
250
|
+
if (depReq.required) {
|
|
251
|
+
logger.info(`📦 Dependency change requested: ${depReq.plan?.reason || 'No reason provided'}`);
|
|
252
|
+
if (depReq.plan) {
|
|
253
|
+
logger.info(` Commands: ${depReq.plan.commands.join(', ')}`);
|
|
254
|
+
}
|
|
255
|
+
if (!config.dependencyPolicy.allowDependencyChange) {
|
|
256
|
+
// Clear the file so it doesn't persist after resolution
|
|
257
|
+
(0, utils_1.clearDependencyRequestFile)(worktreeDir);
|
|
258
|
+
return {
|
|
259
|
+
taskName: task.name,
|
|
260
|
+
taskBranch,
|
|
261
|
+
status: 'BLOCKED_DEPENDENCY',
|
|
262
|
+
dependencyRequest: depReq.plan || null,
|
|
263
|
+
};
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
// Push task branch (skip in noGit mode)
|
|
267
|
+
if (!noGit) {
|
|
268
|
+
git.push(taskBranch, { cwd: worktreeDir, setUpstream: true });
|
|
269
|
+
}
|
|
270
|
+
// Save task result for dependency handoff
|
|
271
|
+
(0, utils_1.saveTaskResult)(runDir, index, task.name, r1.resultText || '');
|
|
272
|
+
events_1.events.emit('task.completed', {
|
|
273
|
+
taskName: task.name,
|
|
274
|
+
taskBranch,
|
|
275
|
+
status: 'FINISHED',
|
|
276
|
+
});
|
|
277
|
+
return {
|
|
278
|
+
taskName: task.name,
|
|
279
|
+
taskBranch,
|
|
280
|
+
status: 'FINISHED',
|
|
281
|
+
};
|
|
282
|
+
}
|
|
283
|
+
//# sourceMappingURL=task.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"task.js","sourceRoot":"","sources":["../../../src/core/runner/task.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { DependencyRequestPlan } from '../../types';
|
|
2
|
+
/**
|
|
3
|
+
* Task result directory name - stores task completion results
|
|
4
|
+
*/
|
|
5
|
+
export declare const TASK_RESULTS_DIR = "task-results";
|
|
6
|
+
/**
|
|
7
|
+
* Dependency result interface
|
|
8
|
+
*/
|
|
9
|
+
export interface DependencyResult {
|
|
10
|
+
taskId: string;
|
|
11
|
+
resultText: string;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Save task result (last response text) to file
|
|
15
|
+
* Stored in runDir/task-results/{NN}-{taskName}.txt
|
|
16
|
+
*/
|
|
17
|
+
export declare function saveTaskResult(runDir: string, taskIndex: number, taskName: string, resultText: string): void;
|
|
18
|
+
/**
|
|
19
|
+
* Find task result file by task name (handles NN-taskName.txt format)
|
|
20
|
+
*/
|
|
21
|
+
export declare function findTaskResultFile(resultsDir: string, taskName: string): string | null;
|
|
22
|
+
/**
|
|
23
|
+
* Load dependency results based on dependsOn list
|
|
24
|
+
* Reads from runRoot/lanes/{laneName}/task-results/{NN}-{taskName}.txt
|
|
25
|
+
*/
|
|
26
|
+
export declare function loadDependencyResults(dependsOn: string[], runRoot: string): DependencyResult[];
|
|
27
|
+
/**
|
|
28
|
+
* Read dependency request from file if it exists
|
|
29
|
+
*/
|
|
30
|
+
export declare function readDependencyRequestFile(worktreeDir: string): {
|
|
31
|
+
required: boolean;
|
|
32
|
+
plan?: DependencyRequestPlan;
|
|
33
|
+
};
|
|
34
|
+
/**
|
|
35
|
+
* Clear dependency request file after processing
|
|
36
|
+
*/
|
|
37
|
+
export declare function clearDependencyRequestFile(worktreeDir: string): void;
|