@litmers/cursorflow-orchestrator 0.1.20 → 0.1.28
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 +20 -0
- package/commands/cursorflow-clean.md +19 -0
- package/commands/cursorflow-runs.md +59 -0
- package/commands/cursorflow-stop.md +55 -0
- package/dist/cli/clean.js +171 -0
- package/dist/cli/clean.js.map +1 -1
- package/dist/cli/index.js +7 -0
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/init.js +1 -1
- package/dist/cli/init.js.map +1 -1
- package/dist/cli/logs.js +83 -42
- package/dist/cli/logs.js.map +1 -1
- package/dist/cli/monitor.d.ts +7 -0
- package/dist/cli/monitor.js +1007 -189
- package/dist/cli/monitor.js.map +1 -1
- package/dist/cli/prepare.js +87 -3
- package/dist/cli/prepare.js.map +1 -1
- package/dist/cli/resume.js +188 -236
- package/dist/cli/resume.js.map +1 -1
- package/dist/cli/run.js +125 -3
- package/dist/cli/run.js.map +1 -1
- package/dist/cli/runs.d.ts +5 -0
- package/dist/cli/runs.js +214 -0
- package/dist/cli/runs.js.map +1 -0
- package/dist/cli/setup-commands.js +0 -0
- package/dist/cli/signal.js +1 -1
- package/dist/cli/signal.js.map +1 -1
- package/dist/cli/stop.d.ts +5 -0
- package/dist/cli/stop.js +215 -0
- package/dist/cli/stop.js.map +1 -0
- package/dist/cli/tasks.d.ts +10 -0
- package/dist/cli/tasks.js +165 -0
- package/dist/cli/tasks.js.map +1 -0
- package/dist/core/auto-recovery.d.ts +212 -0
- package/dist/core/auto-recovery.js +737 -0
- package/dist/core/auto-recovery.js.map +1 -0
- package/dist/core/failure-policy.d.ts +156 -0
- package/dist/core/failure-policy.js +488 -0
- package/dist/core/failure-policy.js.map +1 -0
- package/dist/core/orchestrator.d.ts +15 -2
- package/dist/core/orchestrator.js +397 -15
- package/dist/core/orchestrator.js.map +1 -1
- package/dist/core/reviewer.d.ts +2 -0
- package/dist/core/reviewer.js +2 -0
- package/dist/core/reviewer.js.map +1 -1
- package/dist/core/runner.d.ts +33 -10
- package/dist/core/runner.js +321 -146
- package/dist/core/runner.js.map +1 -1
- package/dist/services/logging/buffer.d.ts +67 -0
- package/dist/services/logging/buffer.js +309 -0
- package/dist/services/logging/buffer.js.map +1 -0
- package/dist/services/logging/console.d.ts +89 -0
- package/dist/services/logging/console.js +169 -0
- package/dist/services/logging/console.js.map +1 -0
- package/dist/services/logging/file-writer.d.ts +71 -0
- package/dist/services/logging/file-writer.js +516 -0
- package/dist/services/logging/file-writer.js.map +1 -0
- package/dist/services/logging/formatter.d.ts +39 -0
- package/dist/services/logging/formatter.js +227 -0
- package/dist/services/logging/formatter.js.map +1 -0
- package/dist/services/logging/index.d.ts +11 -0
- package/dist/services/logging/index.js +30 -0
- package/dist/services/logging/index.js.map +1 -0
- package/dist/services/logging/parser.d.ts +31 -0
- package/dist/services/logging/parser.js +222 -0
- package/dist/services/logging/parser.js.map +1 -0
- package/dist/services/process/index.d.ts +59 -0
- package/dist/services/process/index.js +257 -0
- package/dist/services/process/index.js.map +1 -0
- package/dist/types/agent.d.ts +20 -0
- package/dist/types/agent.js +6 -0
- package/dist/types/agent.js.map +1 -0
- package/dist/types/config.d.ts +65 -0
- package/dist/types/config.js +6 -0
- package/dist/types/config.js.map +1 -0
- package/dist/types/events.d.ts +125 -0
- package/dist/types/events.js +6 -0
- package/dist/types/events.js.map +1 -0
- package/dist/types/index.d.ts +12 -0
- package/dist/types/index.js +37 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/lane.d.ts +43 -0
- package/dist/types/lane.js +6 -0
- package/dist/types/lane.js.map +1 -0
- package/dist/types/logging.d.ts +71 -0
- package/dist/types/logging.js +16 -0
- package/dist/types/logging.js.map +1 -0
- package/dist/types/review.d.ts +17 -0
- package/dist/types/review.js +6 -0
- package/dist/types/review.js.map +1 -0
- package/dist/types/run.d.ts +32 -0
- package/dist/types/run.js +6 -0
- package/dist/types/run.js.map +1 -0
- package/dist/types/task.d.ts +71 -0
- package/dist/types/task.js +6 -0
- package/dist/types/task.js.map +1 -0
- package/dist/ui/components.d.ts +134 -0
- package/dist/ui/components.js +389 -0
- package/dist/ui/components.js.map +1 -0
- package/dist/ui/log-viewer.d.ts +49 -0
- package/dist/ui/log-viewer.js +449 -0
- package/dist/ui/log-viewer.js.map +1 -0
- package/dist/utils/checkpoint.d.ts +87 -0
- package/dist/utils/checkpoint.js +317 -0
- package/dist/utils/checkpoint.js.map +1 -0
- package/dist/utils/config.d.ts +4 -0
- package/dist/utils/config.js +11 -2
- package/dist/utils/config.js.map +1 -1
- package/dist/utils/cursor-agent.js.map +1 -1
- package/dist/utils/dependency.d.ts +74 -0
- package/dist/utils/dependency.js +420 -0
- package/dist/utils/dependency.js.map +1 -0
- package/dist/utils/doctor.js +10 -5
- package/dist/utils/doctor.js.map +1 -1
- package/dist/utils/enhanced-logger.d.ts +10 -33
- package/dist/utils/enhanced-logger.js +94 -9
- package/dist/utils/enhanced-logger.js.map +1 -1
- package/dist/utils/git.d.ts +121 -0
- package/dist/utils/git.js +322 -2
- package/dist/utils/git.js.map +1 -1
- package/dist/utils/health.d.ts +91 -0
- package/dist/utils/health.js +556 -0
- package/dist/utils/health.js.map +1 -0
- package/dist/utils/lock.d.ts +95 -0
- package/dist/utils/lock.js +332 -0
- package/dist/utils/lock.js.map +1 -0
- package/dist/utils/log-buffer.d.ts +17 -0
- package/dist/utils/log-buffer.js +14 -0
- package/dist/utils/log-buffer.js.map +1 -0
- package/dist/utils/log-constants.d.ts +23 -0
- package/dist/utils/log-constants.js +28 -0
- package/dist/utils/log-constants.js.map +1 -0
- package/dist/utils/log-formatter.d.ts +9 -0
- package/dist/utils/log-formatter.js +113 -70
- package/dist/utils/log-formatter.js.map +1 -1
- package/dist/utils/log-service.d.ts +19 -0
- package/dist/utils/log-service.js +47 -0
- package/dist/utils/log-service.js.map +1 -0
- package/dist/utils/logger.d.ts +46 -27
- package/dist/utils/logger.js +82 -60
- package/dist/utils/logger.js.map +1 -1
- package/dist/utils/process-manager.d.ts +21 -0
- package/dist/utils/process-manager.js +138 -0
- package/dist/utils/process-manager.js.map +1 -0
- package/dist/utils/retry.d.ts +121 -0
- package/dist/utils/retry.js +374 -0
- package/dist/utils/retry.js.map +1 -0
- package/dist/utils/run-service.d.ts +88 -0
- package/dist/utils/run-service.js +412 -0
- package/dist/utils/run-service.js.map +1 -0
- package/dist/utils/state.d.ts +58 -2
- package/dist/utils/state.js +306 -3
- package/dist/utils/state.js.map +1 -1
- package/dist/utils/task-service.d.ts +82 -0
- package/dist/utils/task-service.js +348 -0
- package/dist/utils/task-service.js.map +1 -0
- package/dist/utils/types.d.ts +2 -272
- package/dist/utils/types.js +16 -0
- package/dist/utils/types.js.map +1 -1
- package/package.json +38 -23
- package/scripts/ai-security-check.js +0 -1
- package/scripts/local-security-gate.sh +0 -0
- package/scripts/monitor-lanes.sh +94 -0
- package/scripts/patches/test-cursor-agent.js +0 -1
- package/scripts/release.sh +0 -0
- package/scripts/setup-security.sh +0 -0
- package/scripts/stream-logs.sh +72 -0
- package/scripts/verify-and-fix.sh +0 -0
- package/src/cli/clean.ts +180 -0
- package/src/cli/index.ts +7 -0
- package/src/cli/init.ts +1 -1
- package/src/cli/logs.ts +79 -42
- package/src/cli/monitor.ts +1815 -899
- package/src/cli/prepare.ts +97 -3
- package/src/cli/resume.ts +220 -277
- package/src/cli/run.ts +154 -3
- package/src/cli/runs.ts +212 -0
- package/src/cli/setup-commands.ts +0 -0
- package/src/cli/signal.ts +1 -1
- package/src/cli/stop.ts +209 -0
- package/src/cli/tasks.ts +154 -0
- package/src/core/auto-recovery.ts +909 -0
- package/src/core/failure-policy.ts +592 -0
- package/src/core/orchestrator.ts +1136 -675
- package/src/core/reviewer.ts +4 -0
- package/src/core/runner.ts +1443 -1217
- package/src/services/logging/buffer.ts +326 -0
- package/src/services/logging/console.ts +193 -0
- package/src/services/logging/file-writer.ts +526 -0
- package/src/services/logging/formatter.ts +268 -0
- package/src/services/logging/index.ts +16 -0
- package/src/services/logging/parser.ts +232 -0
- package/src/services/process/index.ts +261 -0
- package/src/types/agent.ts +24 -0
- package/src/types/config.ts +79 -0
- package/src/types/events.ts +156 -0
- package/src/types/index.ts +29 -0
- package/src/types/lane.ts +56 -0
- package/src/types/logging.ts +96 -0
- package/src/types/review.ts +20 -0
- package/src/types/run.ts +37 -0
- package/src/types/task.ts +79 -0
- package/src/ui/components.ts +430 -0
- package/src/ui/log-viewer.ts +485 -0
- package/src/utils/checkpoint.ts +374 -0
- package/src/utils/config.ts +11 -2
- package/src/utils/cursor-agent.ts +1 -1
- package/src/utils/dependency.ts +482 -0
- package/src/utils/doctor.ts +11 -5
- package/src/utils/enhanced-logger.ts +108 -49
- package/src/utils/git.ts +871 -499
- package/src/utils/health.ts +596 -0
- package/src/utils/lock.ts +346 -0
- package/src/utils/log-buffer.ts +28 -0
- package/src/utils/log-constants.ts +26 -0
- package/src/utils/log-formatter.ts +120 -37
- package/src/utils/log-service.ts +49 -0
- package/src/utils/logger.ts +100 -51
- package/src/utils/process-manager.ts +100 -0
- package/src/utils/retry.ts +413 -0
- package/src/utils/run-service.ts +433 -0
- package/src/utils/state.ts +369 -3
- package/src/utils/task-service.ts +370 -0
- package/src/utils/types.ts +2 -315
package/src/utils/logger.ts
CHANGED
|
@@ -1,25 +1,14 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Logging utilities for CursorFlow
|
|
3
|
+
*
|
|
4
|
+
* 통일된 로그 형식: [HH:MM:SS] emoji TYPE message
|
|
5
|
+
* 컨텍스트 포함 시: [HH:MM:SS] [context] emoji TYPE message
|
|
3
6
|
*/
|
|
4
7
|
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
warn = 1,
|
|
8
|
-
info = 2,
|
|
9
|
-
debug = 3,
|
|
10
|
-
}
|
|
8
|
+
import { COLORS, LogLevel } from './log-constants';
|
|
9
|
+
import { formatMessageForConsole } from './log-formatter';
|
|
11
10
|
|
|
12
|
-
export
|
|
13
|
-
reset: '\x1b[0m',
|
|
14
|
-
red: '\x1b[31m',
|
|
15
|
-
yellow: '\x1b[33m',
|
|
16
|
-
green: '\x1b[32m',
|
|
17
|
-
blue: '\x1b[34m',
|
|
18
|
-
cyan: '\x1b[36m',
|
|
19
|
-
magenta: '\x1b[35m',
|
|
20
|
-
gray: '\x1b[90m',
|
|
21
|
-
bold: '\x1b[1m',
|
|
22
|
-
};
|
|
11
|
+
export { COLORS, LogLevel };
|
|
23
12
|
|
|
24
13
|
let currentLogLevel: number = LogLevel.info;
|
|
25
14
|
|
|
@@ -35,67 +24,119 @@ export function setLogLevel(level: string | number): void {
|
|
|
35
24
|
}
|
|
36
25
|
|
|
37
26
|
/**
|
|
38
|
-
*
|
|
27
|
+
* Get current log level
|
|
28
|
+
*/
|
|
29
|
+
export function getLogLevel(): number {
|
|
30
|
+
return currentLogLevel;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
* Log options interface for contextual logging
|
|
39
35
|
*/
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
36
|
+
export interface LogOptions {
|
|
37
|
+
/** Context label (e.g., lane name) */
|
|
38
|
+
context?: string;
|
|
39
|
+
/** Custom emoji override */
|
|
40
|
+
emoji?: string;
|
|
41
|
+
/** Skip timestamp */
|
|
42
|
+
noTimestamp?: boolean;
|
|
43
|
+
/** Custom color */
|
|
44
|
+
color?: string;
|
|
45
|
+
/** Use box format */
|
|
46
|
+
box?: boolean;
|
|
45
47
|
}
|
|
46
48
|
|
|
47
49
|
/**
|
|
48
|
-
*
|
|
50
|
+
* Internal log function that uses formatMessageForConsole
|
|
49
51
|
*/
|
|
50
|
-
function
|
|
51
|
-
|
|
52
|
+
function logInternal(
|
|
53
|
+
type: string,
|
|
54
|
+
message: string,
|
|
55
|
+
options: LogOptions = {}
|
|
56
|
+
): void {
|
|
57
|
+
const level = (LogLevel as any)[type] ?? LogLevel.info;
|
|
58
|
+
if (level > currentLogLevel) {
|
|
52
59
|
return;
|
|
53
60
|
}
|
|
54
|
-
|
|
55
|
-
const formatted =
|
|
56
|
-
|
|
61
|
+
|
|
62
|
+
const formatted = formatMessageForConsole({
|
|
63
|
+
type: type as any,
|
|
64
|
+
role: 'system',
|
|
65
|
+
content: message,
|
|
66
|
+
timestamp: Date.now(),
|
|
67
|
+
}, {
|
|
68
|
+
includeTimestamp: !options.noTimestamp,
|
|
69
|
+
context: options.context,
|
|
70
|
+
compact: !options.box
|
|
71
|
+
});
|
|
72
|
+
|
|
73
|
+
console.log(formatted);
|
|
57
74
|
}
|
|
58
75
|
|
|
76
|
+
// ============================================================================
|
|
77
|
+
// Primary Logging Functions
|
|
78
|
+
// ============================================================================
|
|
79
|
+
|
|
59
80
|
/**
|
|
60
81
|
* Error log
|
|
61
82
|
*/
|
|
62
|
-
export function error(message: string,
|
|
63
|
-
|
|
83
|
+
export function error(message: string, options: LogOptions | string = {}): void {
|
|
84
|
+
const opts = typeof options === 'string' ? { emoji: options } : options;
|
|
85
|
+
logInternal('error', message, opts);
|
|
64
86
|
}
|
|
65
87
|
|
|
66
88
|
/**
|
|
67
89
|
* Warning log
|
|
68
90
|
*/
|
|
69
|
-
export function warn(message: string,
|
|
70
|
-
|
|
91
|
+
export function warn(message: string, options: LogOptions | string = {}): void {
|
|
92
|
+
const opts = typeof options === 'string' ? { emoji: options } : options;
|
|
93
|
+
logInternal('warn', message, opts);
|
|
71
94
|
}
|
|
72
95
|
|
|
73
96
|
/**
|
|
74
97
|
* Info log
|
|
75
98
|
*/
|
|
76
|
-
export function info(message: string,
|
|
77
|
-
|
|
99
|
+
export function info(message: string, options: LogOptions | string = {}): void {
|
|
100
|
+
const opts = typeof options === 'string' ? { emoji: options } : options;
|
|
101
|
+
logInternal('info', message, opts);
|
|
78
102
|
}
|
|
79
103
|
|
|
80
104
|
/**
|
|
81
105
|
* Success log
|
|
82
106
|
*/
|
|
83
|
-
export function success(message: string,
|
|
84
|
-
|
|
107
|
+
export function success(message: string, options: LogOptions | string = {}): void {
|
|
108
|
+
const opts = typeof options === 'string' ? { emoji: options } : options;
|
|
109
|
+
logInternal('success', message, opts);
|
|
85
110
|
}
|
|
86
111
|
|
|
87
112
|
/**
|
|
88
113
|
* Debug log
|
|
89
114
|
*/
|
|
90
|
-
export function debug(message: string,
|
|
91
|
-
|
|
115
|
+
export function debug(message: string, options: LogOptions | string = {}): void {
|
|
116
|
+
const opts = typeof options === 'string' ? { emoji: options } : options;
|
|
117
|
+
logInternal('debug', message, opts);
|
|
92
118
|
}
|
|
93
119
|
|
|
94
120
|
/**
|
|
95
121
|
* Progress log
|
|
96
122
|
*/
|
|
97
|
-
export function progress(message: string,
|
|
98
|
-
|
|
123
|
+
export function progress(message: string, options: LogOptions | string = {}): void {
|
|
124
|
+
const opts = typeof options === 'string' ? { emoji: options } : options;
|
|
125
|
+
logInternal('progress', message, opts);
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
/**
|
|
129
|
+
* Create a context-bound logger
|
|
130
|
+
*/
|
|
131
|
+
export function withContext(context: string) {
|
|
132
|
+
return {
|
|
133
|
+
error: (message: string, options?: Omit<LogOptions, 'context'>) => error(message, { ...options, context }),
|
|
134
|
+
warn: (message: string, options?: Omit<LogOptions, 'context'>) => warn(message, { ...options, context }),
|
|
135
|
+
info: (message: string, options?: Omit<LogOptions, 'context'>) => info(message, { ...options, context }),
|
|
136
|
+
success: (message: string, options?: Omit<LogOptions, 'context'>) => success(message, { ...options, context }),
|
|
137
|
+
debug: (message: string, options?: Omit<LogOptions, 'context'>) => debug(message, { ...options, context }),
|
|
138
|
+
progress: (message: string, options?: Omit<LogOptions, 'context'>) => progress(message, { ...options, context }),
|
|
139
|
+
};
|
|
99
140
|
}
|
|
100
141
|
|
|
101
142
|
/**
|
|
@@ -110,26 +151,29 @@ export function section(message: string): void {
|
|
|
110
151
|
}
|
|
111
152
|
|
|
112
153
|
/**
|
|
113
|
-
*
|
|
154
|
+
* Raw output (direct to stdout)
|
|
114
155
|
*/
|
|
115
|
-
export function
|
|
116
|
-
|
|
156
|
+
export function raw(message: string): void {
|
|
157
|
+
process.stdout.write(message);
|
|
117
158
|
}
|
|
118
159
|
|
|
119
160
|
/**
|
|
120
|
-
*
|
|
161
|
+
* Simple log without formatting
|
|
121
162
|
*/
|
|
122
|
-
export function
|
|
123
|
-
|
|
124
|
-
console.log(JSON.stringify(data, null, 2));
|
|
125
|
-
}
|
|
163
|
+
export function log(message: string): void {
|
|
164
|
+
console.log(message);
|
|
126
165
|
}
|
|
127
166
|
|
|
167
|
+
// ============================================================================
|
|
168
|
+
// Spinner
|
|
169
|
+
// ============================================================================
|
|
170
|
+
|
|
128
171
|
export interface Spinner {
|
|
129
172
|
start(): void;
|
|
130
173
|
stop(finalMessage?: string | null): void;
|
|
131
174
|
succeed(message: string): void;
|
|
132
175
|
fail(message: string): void;
|
|
176
|
+
update(message: string): void;
|
|
133
177
|
}
|
|
134
178
|
|
|
135
179
|
/**
|
|
@@ -139,13 +183,14 @@ export function createSpinner(message: string): Spinner {
|
|
|
139
183
|
const frames = ['⠋', '⠙', '⠹', '⠸', '⠼', '⠴', '⠦', '⠧', '⠇', '⠏'];
|
|
140
184
|
let i = 0;
|
|
141
185
|
let interval: NodeJS.Timeout | null = null;
|
|
186
|
+
let currentMessage = message;
|
|
142
187
|
|
|
143
188
|
const spinner: Spinner = {
|
|
144
189
|
start() {
|
|
145
|
-
process.stdout.write(`${
|
|
190
|
+
process.stdout.write(`${currentMessage} ${frames[0]}`);
|
|
146
191
|
interval = setInterval(() => {
|
|
147
192
|
i = (i + 1) % frames.length;
|
|
148
|
-
process.stdout.write(`\r${
|
|
193
|
+
process.stdout.write(`\r${currentMessage} ${frames[i]}`);
|
|
149
194
|
}, 80);
|
|
150
195
|
},
|
|
151
196
|
|
|
@@ -167,6 +212,10 @@ export function createSpinner(message: string): Spinner {
|
|
|
167
212
|
fail(message: string) {
|
|
168
213
|
this.stop(`${COLORS.red}✗${COLORS.reset} ${message}`);
|
|
169
214
|
},
|
|
215
|
+
|
|
216
|
+
update(message: string) {
|
|
217
|
+
currentMessage = message;
|
|
218
|
+
},
|
|
170
219
|
};
|
|
171
220
|
|
|
172
221
|
return spinner;
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
import { spawnSync } from 'child_process';
|
|
2
|
+
import * as os from 'os';
|
|
3
|
+
|
|
4
|
+
export class ProcessManager {
|
|
5
|
+
/**
|
|
6
|
+
* Check if a process is running by its PID
|
|
7
|
+
*/
|
|
8
|
+
static isProcessRunning(pid: number): boolean {
|
|
9
|
+
try {
|
|
10
|
+
// Signal 0 checks for process existence without killing it
|
|
11
|
+
process.kill(pid, 0);
|
|
12
|
+
return true;
|
|
13
|
+
} catch (e) {
|
|
14
|
+
return false;
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* Kill a process by its PID
|
|
20
|
+
* @param pid Process ID
|
|
21
|
+
* @param signal Signal to send (default: SIGTERM)
|
|
22
|
+
*/
|
|
23
|
+
static killProcess(pid: number, signal: string = 'SIGTERM'): boolean {
|
|
24
|
+
try {
|
|
25
|
+
if (os.platform() === 'win32') {
|
|
26
|
+
// Windows doesn't support signals in the same way, use taskkill
|
|
27
|
+
const result = spawnSync('taskkill', ['/F', '/PID', String(pid)]);
|
|
28
|
+
return result.status === 0;
|
|
29
|
+
} else {
|
|
30
|
+
process.kill(pid, signal as NodeJS.Signals);
|
|
31
|
+
return true;
|
|
32
|
+
}
|
|
33
|
+
} catch (e) {
|
|
34
|
+
return false;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* Kill a process and all its child processes
|
|
40
|
+
* Cross-platform implementation
|
|
41
|
+
*/
|
|
42
|
+
static killProcessTree(pid: number): boolean {
|
|
43
|
+
try {
|
|
44
|
+
if (os.platform() === 'win32') {
|
|
45
|
+
// Windows: /T flag kills child processes too
|
|
46
|
+
const result = spawnSync('taskkill', ['/F', '/T', '/PID', String(pid)]);
|
|
47
|
+
return result.status === 0;
|
|
48
|
+
} else {
|
|
49
|
+
// Linux/macOS: Find and kill children recursively or use pkill
|
|
50
|
+
// A simple approach is to use pgrep to find children
|
|
51
|
+
const result = spawnSync('pgrep', ['-P', String(pid)], { encoding: 'utf8' });
|
|
52
|
+
if (result.status === 0 && result.stdout) {
|
|
53
|
+
const children = result.stdout.split('\n').map(s => parseInt(s.trim())).filter(n => !isNaN(n));
|
|
54
|
+
for (const child of children) {
|
|
55
|
+
this.killProcessTree(child);
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
// Kill the process itself
|
|
60
|
+
return this.killProcess(pid);
|
|
61
|
+
}
|
|
62
|
+
} catch (e) {
|
|
63
|
+
// Fallback to simple kill
|
|
64
|
+
return this.killProcess(pid);
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
/**
|
|
69
|
+
* Find cursorflow related processes using pgrep (Linux/macOS only)
|
|
70
|
+
*/
|
|
71
|
+
static findCursorFlowProcesses(): number[] {
|
|
72
|
+
if (os.platform() === 'win32') {
|
|
73
|
+
// Basic Windows implementation using tasklist if needed,
|
|
74
|
+
// but for now focusing on core requirements
|
|
75
|
+
return [];
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
try {
|
|
79
|
+
// Find processes with 'cursorflow' in their command line,
|
|
80
|
+
// avoiding unrelated matches by looking for specific execution patterns
|
|
81
|
+
const result = spawnSync('pgrep', ['-f', 'cursorflow.*(index|runner|orchestrator)'], { encoding: 'utf8' });
|
|
82
|
+
if (result.status !== 0) {
|
|
83
|
+
// Fallback to simpler pattern
|
|
84
|
+
const fallback = spawnSync('pgrep', ['-f', 'cursorflow'], { encoding: 'utf8' });
|
|
85
|
+
if (fallback.status !== 0) return [];
|
|
86
|
+
return fallback.stdout
|
|
87
|
+
.split('\n')
|
|
88
|
+
.map(s => parseInt(s.trim()))
|
|
89
|
+
.filter(n => !isNaN(n) && n !== process.pid);
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
return result.stdout
|
|
93
|
+
.split('\n')
|
|
94
|
+
.map(s => parseInt(s.trim()))
|
|
95
|
+
.filter(n => !isNaN(n) && n !== process.pid);
|
|
96
|
+
} catch (e) {
|
|
97
|
+
return [];
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
}
|