@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.
Files changed (129) hide show
  1. package/README.md +144 -52
  2. package/commands/cursorflow-add.md +159 -0
  3. package/commands/cursorflow-monitor.md +23 -2
  4. package/commands/cursorflow-new.md +87 -0
  5. package/dist/cli/add.d.ts +7 -0
  6. package/dist/cli/add.js +377 -0
  7. package/dist/cli/add.js.map +1 -0
  8. package/dist/cli/clean.js +1 -0
  9. package/dist/cli/clean.js.map +1 -1
  10. package/dist/cli/config.d.ts +7 -0
  11. package/dist/cli/config.js +181 -0
  12. package/dist/cli/config.js.map +1 -0
  13. package/dist/cli/index.js +34 -30
  14. package/dist/cli/index.js.map +1 -1
  15. package/dist/cli/logs.js +7 -33
  16. package/dist/cli/logs.js.map +1 -1
  17. package/dist/cli/monitor.js +51 -62
  18. package/dist/cli/monitor.js.map +1 -1
  19. package/dist/cli/new.d.ts +7 -0
  20. package/dist/cli/new.js +232 -0
  21. package/dist/cli/new.js.map +1 -0
  22. package/dist/cli/prepare.js +95 -193
  23. package/dist/cli/prepare.js.map +1 -1
  24. package/dist/cli/resume.js +11 -47
  25. package/dist/cli/resume.js.map +1 -1
  26. package/dist/cli/run.js +27 -22
  27. package/dist/cli/run.js.map +1 -1
  28. package/dist/cli/tasks.js +1 -2
  29. package/dist/cli/tasks.js.map +1 -1
  30. package/dist/core/failure-policy.d.ts +9 -0
  31. package/dist/core/failure-policy.js +9 -0
  32. package/dist/core/failure-policy.js.map +1 -1
  33. package/dist/core/orchestrator.d.ts +20 -6
  34. package/dist/core/orchestrator.js +213 -333
  35. package/dist/core/orchestrator.js.map +1 -1
  36. package/dist/core/runner/agent.d.ts +27 -0
  37. package/dist/core/runner/agent.js +294 -0
  38. package/dist/core/runner/agent.js.map +1 -0
  39. package/dist/core/runner/index.d.ts +5 -0
  40. package/dist/core/runner/index.js +22 -0
  41. package/dist/core/runner/index.js.map +1 -0
  42. package/dist/core/runner/pipeline.d.ts +9 -0
  43. package/dist/core/runner/pipeline.js +539 -0
  44. package/dist/core/runner/pipeline.js.map +1 -0
  45. package/dist/core/runner/prompt.d.ts +25 -0
  46. package/dist/core/runner/prompt.js +175 -0
  47. package/dist/core/runner/prompt.js.map +1 -0
  48. package/dist/core/runner/task.d.ts +26 -0
  49. package/dist/core/runner/task.js +283 -0
  50. package/dist/core/runner/task.js.map +1 -0
  51. package/dist/core/runner/utils.d.ts +37 -0
  52. package/dist/core/runner/utils.js +161 -0
  53. package/dist/core/runner/utils.js.map +1 -0
  54. package/dist/core/runner.d.ts +2 -96
  55. package/dist/core/runner.js +11 -1136
  56. package/dist/core/runner.js.map +1 -1
  57. package/dist/core/stall-detection.d.ts +326 -0
  58. package/dist/core/stall-detection.js +781 -0
  59. package/dist/core/stall-detection.js.map +1 -0
  60. package/dist/types/config.d.ts +6 -6
  61. package/dist/types/flow.d.ts +84 -0
  62. package/dist/types/flow.js +10 -0
  63. package/dist/types/flow.js.map +1 -0
  64. package/dist/types/index.d.ts +1 -0
  65. package/dist/types/index.js +3 -3
  66. package/dist/types/index.js.map +1 -1
  67. package/dist/types/lane.d.ts +0 -2
  68. package/dist/types/logging.d.ts +5 -1
  69. package/dist/types/task.d.ts +7 -11
  70. package/dist/utils/config.js +7 -15
  71. package/dist/utils/config.js.map +1 -1
  72. package/dist/utils/dependency.d.ts +36 -1
  73. package/dist/utils/dependency.js +256 -1
  74. package/dist/utils/dependency.js.map +1 -1
  75. package/dist/utils/enhanced-logger.d.ts +45 -82
  76. package/dist/utils/enhanced-logger.js +238 -844
  77. package/dist/utils/enhanced-logger.js.map +1 -1
  78. package/dist/utils/git.d.ts +29 -0
  79. package/dist/utils/git.js +115 -5
  80. package/dist/utils/git.js.map +1 -1
  81. package/dist/utils/state.js +0 -2
  82. package/dist/utils/state.js.map +1 -1
  83. package/dist/utils/task-service.d.ts +2 -2
  84. package/dist/utils/task-service.js +40 -31
  85. package/dist/utils/task-service.js.map +1 -1
  86. package/package.json +4 -3
  87. package/src/cli/add.ts +397 -0
  88. package/src/cli/clean.ts +1 -0
  89. package/src/cli/config.ts +177 -0
  90. package/src/cli/index.ts +36 -32
  91. package/src/cli/logs.ts +7 -31
  92. package/src/cli/monitor.ts +55 -71
  93. package/src/cli/new.ts +235 -0
  94. package/src/cli/prepare.ts +98 -205
  95. package/src/cli/resume.ts +13 -56
  96. package/src/cli/run.ts +311 -306
  97. package/src/cli/tasks.ts +1 -2
  98. package/src/core/failure-policy.ts +9 -0
  99. package/src/core/orchestrator.ts +277 -378
  100. package/src/core/runner/agent.ts +314 -0
  101. package/src/core/runner/index.ts +6 -0
  102. package/src/core/runner/pipeline.ts +567 -0
  103. package/src/core/runner/prompt.ts +174 -0
  104. package/src/core/runner/task.ts +320 -0
  105. package/src/core/runner/utils.ts +142 -0
  106. package/src/core/runner.ts +8 -1347
  107. package/src/core/stall-detection.ts +936 -0
  108. package/src/types/config.ts +6 -6
  109. package/src/types/flow.ts +91 -0
  110. package/src/types/index.ts +15 -3
  111. package/src/types/lane.ts +0 -2
  112. package/src/types/logging.ts +5 -1
  113. package/src/types/task.ts +7 -11
  114. package/src/utils/config.ts +8 -16
  115. package/src/utils/dependency.ts +311 -2
  116. package/src/utils/enhanced-logger.ts +263 -927
  117. package/src/utils/git.ts +145 -5
  118. package/src/utils/state.ts +0 -2
  119. package/src/utils/task-service.ts +48 -40
  120. package/commands/cursorflow-review.md +0 -56
  121. package/commands/cursorflow-runs.md +0 -59
  122. package/dist/cli/runs.d.ts +0 -5
  123. package/dist/cli/runs.js +0 -214
  124. package/dist/cli/runs.js.map +0 -1
  125. package/dist/core/reviewer.d.ts +0 -66
  126. package/dist/core/reviewer.js +0 -265
  127. package/dist/core/reviewer.js.map +0 -1
  128. package/src/cli/runs.ts +0 -212
  129. package/src/core/reviewer.ts +0 -285
@@ -0,0 +1,232 @@
1
+ "use strict";
2
+ /**
3
+ * CursorFlow 'new' command
4
+ *
5
+ * Creates a new Flow with empty Lane files
6
+ */
7
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
8
+ if (k2 === undefined) k2 = k;
9
+ var desc = Object.getOwnPropertyDescriptor(m, k);
10
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
11
+ desc = { enumerable: true, get: function() { return m[k]; } };
12
+ }
13
+ Object.defineProperty(o, k2, desc);
14
+ }) : (function(o, m, k, k2) {
15
+ if (k2 === undefined) k2 = k;
16
+ o[k2] = m[k];
17
+ }));
18
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
19
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
20
+ }) : function(o, v) {
21
+ o["default"] = v;
22
+ });
23
+ var __importStar = (this && this.__importStar) || (function () {
24
+ var ownKeys = function(o) {
25
+ ownKeys = Object.getOwnPropertyNames || function (o) {
26
+ var ar = [];
27
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
28
+ return ar;
29
+ };
30
+ return ownKeys(o);
31
+ };
32
+ return function (mod) {
33
+ if (mod && mod.__esModule) return mod;
34
+ var result = {};
35
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
36
+ __setModuleDefault(result, mod);
37
+ return result;
38
+ };
39
+ })();
40
+ const fs = __importStar(require("fs"));
41
+ const logger = __importStar(require("../utils/logger"));
42
+ const config_1 = require("../utils/config");
43
+ const path_1 = require("../utils/path");
44
+ const git = __importStar(require("../utils/git"));
45
+ function printHelp() {
46
+ console.log(`
47
+ \x1b[1mcursorflow new\x1b[0m - Flow와 Lane 생성
48
+
49
+ \x1b[1m사용법:\x1b[0m
50
+ cursorflow new <FlowName> --lanes "lane1,lane2,..."
51
+
52
+ \x1b[1m설명:\x1b[0m
53
+ 새로운 Flow 디렉토리를 생성하고, 지정된 Lane 파일들의 뼈대를 만듭니다.
54
+ 각 Lane에 실제 Task를 추가하려면 'cursorflow add' 명령을 사용하세요.
55
+
56
+ \x1b[1m옵션:\x1b[0m
57
+ --lanes <names> 콤마로 구분된 레인 이름 목록 (필수)
58
+ 예: --lanes "backend,frontend,mobile"
59
+
60
+ \x1b[1m예시:\x1b[0m
61
+ # 백엔드와 프론트엔드 2개 레인 생성
62
+ cursorflow new ShopFeature --lanes "backend,frontend"
63
+
64
+ # API, Web, Mobile 3개 레인 생성
65
+ cursorflow new SearchFeature --lanes "api,web,mobile"
66
+
67
+ \x1b[1m생성 결과:\x1b[0m
68
+ _cursorflow/flows/001_ShopFeature/
69
+ ├── flow.meta.json # Flow 메타데이터
70
+ ├── 01-backend.json # Lane 1 (빈 상태)
71
+ └── 02-frontend.json # Lane 2 (빈 상태)
72
+ `);
73
+ }
74
+ function parseArgs(args) {
75
+ const result = {
76
+ flowName: '',
77
+ lanes: [],
78
+ help: false,
79
+ };
80
+ let i = 0;
81
+ while (i < args.length) {
82
+ const arg = args[i];
83
+ if (arg === '--help' || arg === '-h') {
84
+ result.help = true;
85
+ }
86
+ else if (arg === '--lanes' && args[i + 1]) {
87
+ result.lanes = args[++i].split(',').map(l => l.trim()).filter(l => l);
88
+ }
89
+ else if (!arg.startsWith('--') && !result.flowName) {
90
+ result.flowName = arg;
91
+ }
92
+ i++;
93
+ }
94
+ return result;
95
+ }
96
+ /**
97
+ * Get next flow ID by scanning existing flows
98
+ */
99
+ function getNextFlowId(flowsDir) {
100
+ if (!fs.existsSync(flowsDir)) {
101
+ return '001';
102
+ }
103
+ const dirs = fs.readdirSync(flowsDir)
104
+ .filter(name => {
105
+ const dirPath = (0, path_1.safeJoin)(flowsDir, name);
106
+ return fs.statSync(dirPath).isDirectory();
107
+ })
108
+ .filter(name => /^\d+_/.test(name));
109
+ if (dirs.length === 0) {
110
+ return '001';
111
+ }
112
+ const maxId = Math.max(...dirs.map(name => {
113
+ const match = name.match(/^(\d+)_/);
114
+ return match ? parseInt(match[1], 10) : 0;
115
+ }));
116
+ return String(maxId + 1).padStart(3, '0');
117
+ }
118
+ /**
119
+ * Create flow.meta.json
120
+ */
121
+ function createFlowMeta(flowId, flowName, lanes, baseBranch) {
122
+ return {
123
+ id: flowId,
124
+ name: flowName,
125
+ createdAt: new Date().toISOString(),
126
+ createdBy: 'user',
127
+ baseBranch,
128
+ status: 'pending',
129
+ lanes,
130
+ };
131
+ }
132
+ /**
133
+ * Create empty lane config
134
+ */
135
+ function createEmptyLaneConfig(laneName) {
136
+ return {
137
+ laneName,
138
+ tasks: [],
139
+ };
140
+ }
141
+ async function newFlow(args) {
142
+ const options = parseArgs(args);
143
+ if (options.help) {
144
+ printHelp();
145
+ return;
146
+ }
147
+ // Validate inputs
148
+ if (!options.flowName) {
149
+ logger.error('Flow 이름이 필요합니다.');
150
+ console.log('\n사용법: cursorflow new <FlowName> --lanes "lane1,lane2"');
151
+ console.log('도움말: cursorflow new --help');
152
+ process.exit(1);
153
+ }
154
+ if (options.lanes.length === 0) {
155
+ logger.error('최소 하나의 레인이 필요합니다.');
156
+ console.log('\n예: cursorflow new ' + options.flowName + ' --lanes "backend,frontend"');
157
+ process.exit(1);
158
+ }
159
+ // Validate lane names (alphanumeric, dash, underscore only)
160
+ const invalidLanes = options.lanes.filter(l => !/^[a-zA-Z0-9_-]+$/.test(l));
161
+ if (invalidLanes.length > 0) {
162
+ logger.error(`잘못된 레인 이름: ${invalidLanes.join(', ')}`);
163
+ console.log('레인 이름은 영문, 숫자, 대시(-), 언더스코어(_)만 사용 가능합니다.');
164
+ process.exit(1);
165
+ }
166
+ // Check for duplicate lane names
167
+ const uniqueLanes = new Set(options.lanes);
168
+ if (uniqueLanes.size !== options.lanes.length) {
169
+ logger.error('중복된 레인 이름이 있습니다.');
170
+ process.exit(1);
171
+ }
172
+ // Load config and determine paths
173
+ const projectRoot = (0, config_1.findProjectRoot)();
174
+ const config = (0, config_1.loadConfig)(projectRoot);
175
+ const flowsDir = (0, path_1.safeJoin)(projectRoot, config.flowsDir);
176
+ // Ensure flows directory exists
177
+ if (!fs.existsSync(flowsDir)) {
178
+ fs.mkdirSync(flowsDir, { recursive: true });
179
+ }
180
+ // Get next flow ID
181
+ const flowId = getNextFlowId(flowsDir);
182
+ const flowDirName = `${flowId}_${options.flowName}`;
183
+ const flowDir = (0, path_1.safeJoin)(flowsDir, flowDirName);
184
+ // Check if flow already exists
185
+ if (fs.existsSync(flowDir)) {
186
+ logger.error(`Flow 디렉토리가 이미 존재합니다: ${flowDirName}`);
187
+ process.exit(1);
188
+ }
189
+ // Get current branch as base branch
190
+ let baseBranch = 'main';
191
+ try {
192
+ baseBranch = git.getCurrentBranch(projectRoot);
193
+ }
194
+ catch {
195
+ logger.warn('현재 브랜치를 가져올 수 없어 main을 기본값으로 사용합니다.');
196
+ }
197
+ // Create flow directory
198
+ fs.mkdirSync(flowDir, { recursive: true });
199
+ // Create flow.meta.json
200
+ const flowMeta = createFlowMeta(flowId, options.flowName, options.lanes, baseBranch);
201
+ const metaPath = (0, path_1.safeJoin)(flowDir, 'flow.meta.json');
202
+ fs.writeFileSync(metaPath, JSON.stringify(flowMeta, null, 2));
203
+ // Create lane files
204
+ options.lanes.forEach((laneName, index) => {
205
+ const laneNumber = String(index + 1).padStart(2, '0');
206
+ const laneFileName = `${laneNumber}-${laneName}.json`;
207
+ const lanePath = (0, path_1.safeJoin)(flowDir, laneFileName);
208
+ const laneConfig = createEmptyLaneConfig(laneName);
209
+ fs.writeFileSync(lanePath, JSON.stringify(laneConfig, null, 2));
210
+ });
211
+ // Print success message
212
+ logger.section(`✅ Flow 생성 완료: ${flowDirName}`);
213
+ console.log('');
214
+ console.log(` 📁 ${flowDir}`);
215
+ console.log(` ├── flow.meta.json`);
216
+ options.lanes.forEach((laneName, index) => {
217
+ const laneNumber = String(index + 1).padStart(2, '0');
218
+ const isLast = index === options.lanes.length - 1;
219
+ const prefix = isLast ? '└──' : '├──';
220
+ console.log(` ${prefix} ${laneNumber}-${laneName}.json (빈 상태)`);
221
+ });
222
+ console.log('');
223
+ logger.info('다음 단계: 각 레인에 태스크를 추가하세요.');
224
+ console.log('');
225
+ options.lanes.forEach((laneName) => {
226
+ console.log(` cursorflow add ${options.flowName} ${laneName} \\`);
227
+ console.log(` --task "name=implement|model=sonnet-4.5|prompt=..."`);
228
+ console.log('');
229
+ });
230
+ }
231
+ module.exports = newFlow;
232
+ //# sourceMappingURL=new.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"new.js","sourceRoot":"","sources":["../../src/cli/new.ts"],"names":[],"mappings":"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"}