@litmers/cursorflow-orchestrator 0.1.31 → 0.1.36

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.
Files changed (150) hide show
  1. package/CHANGELOG.md +27 -0
  2. package/README.md +182 -59
  3. package/commands/cursorflow-add.md +159 -0
  4. package/commands/cursorflow-doctor.md +45 -23
  5. package/commands/cursorflow-monitor.md +23 -2
  6. package/commands/cursorflow-new.md +87 -0
  7. package/commands/cursorflow-run.md +60 -111
  8. package/dist/cli/add.d.ts +7 -0
  9. package/dist/cli/add.js +377 -0
  10. package/dist/cli/add.js.map +1 -0
  11. package/dist/cli/clean.js +1 -0
  12. package/dist/cli/clean.js.map +1 -1
  13. package/dist/cli/config.d.ts +7 -0
  14. package/dist/cli/config.js +181 -0
  15. package/dist/cli/config.js.map +1 -0
  16. package/dist/cli/doctor.js +47 -4
  17. package/dist/cli/doctor.js.map +1 -1
  18. package/dist/cli/index.js +34 -30
  19. package/dist/cli/index.js.map +1 -1
  20. package/dist/cli/logs.js +17 -34
  21. package/dist/cli/logs.js.map +1 -1
  22. package/dist/cli/monitor.js +62 -65
  23. package/dist/cli/monitor.js.map +1 -1
  24. package/dist/cli/new.d.ts +7 -0
  25. package/dist/cli/new.js +232 -0
  26. package/dist/cli/new.js.map +1 -0
  27. package/dist/cli/prepare.js +95 -193
  28. package/dist/cli/prepare.js.map +1 -1
  29. package/dist/cli/resume.js +57 -68
  30. package/dist/cli/resume.js.map +1 -1
  31. package/dist/cli/run.js +60 -30
  32. package/dist/cli/run.js.map +1 -1
  33. package/dist/cli/stop.js +6 -0
  34. package/dist/cli/stop.js.map +1 -1
  35. package/dist/cli/tasks.d.ts +5 -3
  36. package/dist/cli/tasks.js +181 -29
  37. package/dist/cli/tasks.js.map +1 -1
  38. package/dist/core/failure-policy.d.ts +9 -0
  39. package/dist/core/failure-policy.js +9 -0
  40. package/dist/core/failure-policy.js.map +1 -1
  41. package/dist/core/orchestrator.d.ts +20 -6
  42. package/dist/core/orchestrator.js +215 -334
  43. package/dist/core/orchestrator.js.map +1 -1
  44. package/dist/core/runner/agent.d.ts +27 -0
  45. package/dist/core/runner/agent.js +294 -0
  46. package/dist/core/runner/agent.js.map +1 -0
  47. package/dist/core/runner/index.d.ts +5 -0
  48. package/dist/core/runner/index.js +22 -0
  49. package/dist/core/runner/index.js.map +1 -0
  50. package/dist/core/runner/pipeline.d.ts +9 -0
  51. package/dist/core/runner/pipeline.js +539 -0
  52. package/dist/core/runner/pipeline.js.map +1 -0
  53. package/dist/core/runner/prompt.d.ts +25 -0
  54. package/dist/core/runner/prompt.js +175 -0
  55. package/dist/core/runner/prompt.js.map +1 -0
  56. package/dist/core/runner/task.d.ts +26 -0
  57. package/dist/core/runner/task.js +283 -0
  58. package/dist/core/runner/task.js.map +1 -0
  59. package/dist/core/runner/utils.d.ts +37 -0
  60. package/dist/core/runner/utils.js +161 -0
  61. package/dist/core/runner/utils.js.map +1 -0
  62. package/dist/core/runner.d.ts +2 -96
  63. package/dist/core/runner.js +11 -1136
  64. package/dist/core/runner.js.map +1 -1
  65. package/dist/core/stall-detection.d.ts +326 -0
  66. package/dist/core/stall-detection.js +781 -0
  67. package/dist/core/stall-detection.js.map +1 -0
  68. package/dist/services/logging/console.js +2 -1
  69. package/dist/services/logging/console.js.map +1 -1
  70. package/dist/types/config.d.ts +6 -6
  71. package/dist/types/flow.d.ts +84 -0
  72. package/dist/types/flow.js +10 -0
  73. package/dist/types/flow.js.map +1 -0
  74. package/dist/types/index.d.ts +1 -0
  75. package/dist/types/index.js +3 -3
  76. package/dist/types/index.js.map +1 -1
  77. package/dist/types/lane.d.ts +0 -2
  78. package/dist/types/logging.d.ts +5 -1
  79. package/dist/types/task.d.ts +7 -11
  80. package/dist/utils/config.d.ts +5 -1
  81. package/dist/utils/config.js +15 -16
  82. package/dist/utils/config.js.map +1 -1
  83. package/dist/utils/dependency.d.ts +36 -1
  84. package/dist/utils/dependency.js +256 -1
  85. package/dist/utils/dependency.js.map +1 -1
  86. package/dist/utils/doctor.js +40 -8
  87. package/dist/utils/doctor.js.map +1 -1
  88. package/dist/utils/enhanced-logger.d.ts +45 -82
  89. package/dist/utils/enhanced-logger.js +239 -844
  90. package/dist/utils/enhanced-logger.js.map +1 -1
  91. package/dist/utils/flow.d.ts +9 -0
  92. package/dist/utils/flow.js +73 -0
  93. package/dist/utils/flow.js.map +1 -0
  94. package/dist/utils/git.d.ts +29 -0
  95. package/dist/utils/git.js +115 -5
  96. package/dist/utils/git.js.map +1 -1
  97. package/dist/utils/state.js +0 -2
  98. package/dist/utils/state.js.map +1 -1
  99. package/dist/utils/task-service.d.ts +2 -2
  100. package/dist/utils/task-service.js +40 -31
  101. package/dist/utils/task-service.js.map +1 -1
  102. package/package.json +4 -3
  103. package/src/cli/add.ts +397 -0
  104. package/src/cli/clean.ts +1 -0
  105. package/src/cli/config.ts +177 -0
  106. package/src/cli/doctor.ts +48 -4
  107. package/src/cli/index.ts +36 -32
  108. package/src/cli/logs.ts +20 -33
  109. package/src/cli/monitor.ts +70 -75
  110. package/src/cli/new.ts +235 -0
  111. package/src/cli/prepare.ts +98 -205
  112. package/src/cli/resume.ts +61 -76
  113. package/src/cli/run.ts +333 -306
  114. package/src/cli/stop.ts +8 -0
  115. package/src/cli/tasks.ts +200 -21
  116. package/src/core/failure-policy.ts +9 -0
  117. package/src/core/orchestrator.ts +279 -379
  118. package/src/core/runner/agent.ts +314 -0
  119. package/src/core/runner/index.ts +6 -0
  120. package/src/core/runner/pipeline.ts +567 -0
  121. package/src/core/runner/prompt.ts +174 -0
  122. package/src/core/runner/task.ts +320 -0
  123. package/src/core/runner/utils.ts +142 -0
  124. package/src/core/runner.ts +8 -1347
  125. package/src/core/stall-detection.ts +936 -0
  126. package/src/services/logging/console.ts +2 -1
  127. package/src/types/config.ts +6 -6
  128. package/src/types/flow.ts +91 -0
  129. package/src/types/index.ts +15 -3
  130. package/src/types/lane.ts +0 -2
  131. package/src/types/logging.ts +5 -1
  132. package/src/types/task.ts +7 -11
  133. package/src/utils/config.ts +16 -17
  134. package/src/utils/dependency.ts +311 -2
  135. package/src/utils/doctor.ts +36 -8
  136. package/src/utils/enhanced-logger.ts +264 -927
  137. package/src/utils/flow.ts +42 -0
  138. package/src/utils/git.ts +145 -5
  139. package/src/utils/state.ts +0 -2
  140. package/src/utils/task-service.ts +48 -40
  141. package/commands/cursorflow-review.md +0 -56
  142. package/commands/cursorflow-runs.md +0 -59
  143. package/dist/cli/runs.d.ts +0 -5
  144. package/dist/cli/runs.js +0 -214
  145. package/dist/cli/runs.js.map +0 -1
  146. package/dist/core/reviewer.d.ts +0 -66
  147. package/dist/core/reviewer.js +0 -265
  148. package/dist/core/reviewer.js.map +0 -1
  149. package/src/cli/runs.ts +0 -212
  150. 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;