@litmers/cursorflow-orchestrator 0.1.18 → 0.1.26
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 +25 -0
- package/README.md +25 -7
- 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 +178 -6
- package/dist/cli/clean.js.map +1 -1
- package/dist/cli/index.js +12 -1
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/init.js +8 -7
- package/dist/cli/init.js.map +1 -1
- package/dist/cli/logs.js +126 -77
- package/dist/cli/logs.js.map +1 -1
- package/dist/cli/monitor.d.ts +7 -0
- package/dist/cli/monitor.js +1021 -202
- package/dist/cli/monitor.js.map +1 -1
- package/dist/cli/prepare.js +39 -21
- package/dist/cli/prepare.js.map +1 -1
- package/dist/cli/resume.js +268 -163
- package/dist/cli/resume.js.map +1 -1
- package/dist/cli/run.js +11 -5
- 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 +8 -8
- 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 +16 -2
- package/dist/core/orchestrator.js +439 -105
- 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 +374 -164
- 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 +18 -8
- 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 +17 -11
- package/dist/utils/doctor.js.map +1 -1
- package/dist/utils/enhanced-logger.d.ts +10 -33
- package/dist/utils/enhanced-logger.js +108 -20
- package/dist/utils/enhanced-logger.js.map +1 -1
- package/dist/utils/git.d.ts +121 -0
- package/dist/utils/git.js +484 -11
- 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 +25 -0
- package/dist/utils/log-formatter.js +237 -0
- package/dist/utils/log-formatter.js.map +1 -0
- 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/path.d.ts +19 -0
- package/dist/utils/path.js +77 -0
- package/dist/utils/path.js.map +1 -0
- 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 +62 -3
- package/dist/utils/state.js +317 -11
- 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/template.d.ts +14 -0
- package/dist/utils/template.js +122 -0
- package/dist/utils/template.js.map +1 -0
- package/dist/utils/types.d.ts +2 -271
- 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 +187 -6
- package/src/cli/index.ts +12 -1
- package/src/cli/init.ts +8 -7
- package/src/cli/logs.ts +124 -77
- package/src/cli/monitor.ts +1815 -898
- package/src/cli/prepare.ts +41 -21
- package/src/cli/resume.ts +753 -626
- package/src/cli/run.ts +12 -5
- package/src/cli/runs.ts +212 -0
- package/src/cli/setup-commands.ts +0 -0
- package/src/cli/signal.ts +8 -7
- 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 +1131 -704
- package/src/core/reviewer.ts +4 -0
- package/src/core/runner.ts +444 -180
- 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 +18 -8
- package/src/utils/cursor-agent.ts +1 -1
- package/src/utils/dependency.ts +482 -0
- package/src/utils/doctor.ts +18 -11
- package/src/utils/enhanced-logger.ts +122 -60
- package/src/utils/git.ts +517 -11
- 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 +245 -0
- package/src/utils/log-service.ts +49 -0
- package/src/utils/logger.ts +100 -51
- package/src/utils/path.ts +45 -0
- 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 +385 -11
- package/src/utils/task-service.ts +370 -0
- package/src/utils/template.ts +92 -0
- package/src/utils/types.ts +2 -314
- package/templates/basic.json +21 -0
|
@@ -0,0 +1,556 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Health check system for CursorFlow
|
|
4
|
+
*/
|
|
5
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
6
|
+
if (k2 === undefined) k2 = k;
|
|
7
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
8
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
9
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
10
|
+
}
|
|
11
|
+
Object.defineProperty(o, k2, desc);
|
|
12
|
+
}) : (function(o, m, k, k2) {
|
|
13
|
+
if (k2 === undefined) k2 = k;
|
|
14
|
+
o[k2] = m[k];
|
|
15
|
+
}));
|
|
16
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
17
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
18
|
+
}) : function(o, v) {
|
|
19
|
+
o["default"] = v;
|
|
20
|
+
});
|
|
21
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
22
|
+
var ownKeys = function(o) {
|
|
23
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
24
|
+
var ar = [];
|
|
25
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
26
|
+
return ar;
|
|
27
|
+
};
|
|
28
|
+
return ownKeys(o);
|
|
29
|
+
};
|
|
30
|
+
return function (mod) {
|
|
31
|
+
if (mod && mod.__esModule) return mod;
|
|
32
|
+
var result = {};
|
|
33
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
34
|
+
__setModuleDefault(result, mod);
|
|
35
|
+
return result;
|
|
36
|
+
};
|
|
37
|
+
})();
|
|
38
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
+
exports.checkAgentHealth = checkAgentHealth;
|
|
40
|
+
exports.checkAuthHealth = checkAuthHealth;
|
|
41
|
+
exports.checkGitHealth = checkGitHealth;
|
|
42
|
+
exports.checkGitRemoteHealth = checkGitRemoteHealth;
|
|
43
|
+
exports.checkDiskSpace = checkDiskSpace;
|
|
44
|
+
exports.checkLockFiles = checkLockFiles;
|
|
45
|
+
exports.checkSystemResources = checkSystemResources;
|
|
46
|
+
exports.checkWorktrees = checkWorktrees;
|
|
47
|
+
exports.runHealthCheck = runHealthCheck;
|
|
48
|
+
exports.preflightCheck = preflightCheck;
|
|
49
|
+
exports.printHealthReport = printHealthReport;
|
|
50
|
+
exports.printPreflightReport = printPreflightReport;
|
|
51
|
+
exports.autoRepair = autoRepair;
|
|
52
|
+
const fs = __importStar(require("fs"));
|
|
53
|
+
const os = __importStar(require("os"));
|
|
54
|
+
const child_process_1 = require("child_process");
|
|
55
|
+
const git = __importStar(require("./git"));
|
|
56
|
+
const lock_1 = require("./lock");
|
|
57
|
+
const cursor_agent_1 = require("./cursor-agent");
|
|
58
|
+
const logger = __importStar(require("./logger"));
|
|
59
|
+
/**
|
|
60
|
+
* Check if cursor-agent is installed and responsive
|
|
61
|
+
*/
|
|
62
|
+
async function checkAgentHealth() {
|
|
63
|
+
const start = Date.now();
|
|
64
|
+
if (!(0, cursor_agent_1.checkCursorAgentInstalled)()) {
|
|
65
|
+
return {
|
|
66
|
+
name: 'cursor-agent',
|
|
67
|
+
ok: false,
|
|
68
|
+
message: 'cursor-agent CLI is not installed',
|
|
69
|
+
latencyMs: Date.now() - start,
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
try {
|
|
73
|
+
const result = (0, child_process_1.spawnSync)('cursor-agent', ['--version'], {
|
|
74
|
+
encoding: 'utf8',
|
|
75
|
+
stdio: 'pipe',
|
|
76
|
+
timeout: 5000,
|
|
77
|
+
});
|
|
78
|
+
if (result.status === 0) {
|
|
79
|
+
const version = result.stdout.trim();
|
|
80
|
+
return {
|
|
81
|
+
name: 'cursor-agent',
|
|
82
|
+
ok: true,
|
|
83
|
+
message: `cursor-agent installed (${version})`,
|
|
84
|
+
details: { version },
|
|
85
|
+
latencyMs: Date.now() - start,
|
|
86
|
+
};
|
|
87
|
+
}
|
|
88
|
+
else {
|
|
89
|
+
return {
|
|
90
|
+
name: 'cursor-agent',
|
|
91
|
+
ok: false,
|
|
92
|
+
message: `cursor-agent error: ${result.stderr}`,
|
|
93
|
+
latencyMs: Date.now() - start,
|
|
94
|
+
};
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
catch (error) {
|
|
98
|
+
return {
|
|
99
|
+
name: 'cursor-agent',
|
|
100
|
+
ok: false,
|
|
101
|
+
message: `cursor-agent check failed: ${error.message}`,
|
|
102
|
+
latencyMs: Date.now() - start,
|
|
103
|
+
};
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* Check cursor authentication status
|
|
108
|
+
*/
|
|
109
|
+
async function checkAuthHealth() {
|
|
110
|
+
const start = Date.now();
|
|
111
|
+
try {
|
|
112
|
+
const authStatus = (0, cursor_agent_1.checkCursorAuth)();
|
|
113
|
+
return {
|
|
114
|
+
name: 'cursor-auth',
|
|
115
|
+
ok: authStatus.authenticated,
|
|
116
|
+
message: authStatus.message,
|
|
117
|
+
details: authStatus.details ? { details: authStatus.details } : undefined,
|
|
118
|
+
latencyMs: Date.now() - start,
|
|
119
|
+
};
|
|
120
|
+
}
|
|
121
|
+
catch (error) {
|
|
122
|
+
return {
|
|
123
|
+
name: 'cursor-auth',
|
|
124
|
+
ok: false,
|
|
125
|
+
message: `Auth check failed: ${error.message}`,
|
|
126
|
+
latencyMs: Date.now() - start,
|
|
127
|
+
};
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
/**
|
|
131
|
+
* Check Git repository status
|
|
132
|
+
*/
|
|
133
|
+
async function checkGitHealth(cwd) {
|
|
134
|
+
const start = Date.now();
|
|
135
|
+
try {
|
|
136
|
+
if (!git.isGitRepo(cwd)) {
|
|
137
|
+
return {
|
|
138
|
+
name: 'git-repo',
|
|
139
|
+
ok: false,
|
|
140
|
+
message: 'Not a Git repository',
|
|
141
|
+
latencyMs: Date.now() - start,
|
|
142
|
+
};
|
|
143
|
+
}
|
|
144
|
+
const branch = git.getCurrentBranch(cwd);
|
|
145
|
+
const hasRemote = git.remoteExists('origin', { cwd });
|
|
146
|
+
return {
|
|
147
|
+
name: 'git-repo',
|
|
148
|
+
ok: true,
|
|
149
|
+
message: `Git repository OK (branch: ${branch})`,
|
|
150
|
+
details: {
|
|
151
|
+
branch,
|
|
152
|
+
hasRemote,
|
|
153
|
+
},
|
|
154
|
+
latencyMs: Date.now() - start,
|
|
155
|
+
};
|
|
156
|
+
}
|
|
157
|
+
catch (error) {
|
|
158
|
+
return {
|
|
159
|
+
name: 'git-repo',
|
|
160
|
+
ok: false,
|
|
161
|
+
message: `Git check failed: ${error.message}`,
|
|
162
|
+
latencyMs: Date.now() - start,
|
|
163
|
+
};
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
/**
|
|
167
|
+
* Check Git remote connectivity
|
|
168
|
+
*/
|
|
169
|
+
async function checkGitRemoteHealth(cwd) {
|
|
170
|
+
const start = Date.now();
|
|
171
|
+
try {
|
|
172
|
+
if (!git.remoteExists('origin', { cwd })) {
|
|
173
|
+
return {
|
|
174
|
+
name: 'git-remote',
|
|
175
|
+
ok: true, // Not an error, just not configured
|
|
176
|
+
message: 'No remote "origin" configured',
|
|
177
|
+
latencyMs: Date.now() - start,
|
|
178
|
+
};
|
|
179
|
+
}
|
|
180
|
+
// Try to fetch with timeout
|
|
181
|
+
const result = (0, child_process_1.spawnSync)('git', ['ls-remote', '--exit-code', 'origin', 'HEAD'], {
|
|
182
|
+
cwd: cwd || process.cwd(),
|
|
183
|
+
encoding: 'utf8',
|
|
184
|
+
stdio: 'pipe',
|
|
185
|
+
timeout: 10000,
|
|
186
|
+
});
|
|
187
|
+
if (result.status === 0) {
|
|
188
|
+
return {
|
|
189
|
+
name: 'git-remote',
|
|
190
|
+
ok: true,
|
|
191
|
+
message: 'Git remote is reachable',
|
|
192
|
+
latencyMs: Date.now() - start,
|
|
193
|
+
};
|
|
194
|
+
}
|
|
195
|
+
else {
|
|
196
|
+
return {
|
|
197
|
+
name: 'git-remote',
|
|
198
|
+
ok: false,
|
|
199
|
+
message: `Git remote unreachable: ${result.stderr}`,
|
|
200
|
+
latencyMs: Date.now() - start,
|
|
201
|
+
};
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
catch (error) {
|
|
205
|
+
return {
|
|
206
|
+
name: 'git-remote',
|
|
207
|
+
ok: false,
|
|
208
|
+
message: `Git remote check failed: ${error.message}`,
|
|
209
|
+
latencyMs: Date.now() - start,
|
|
210
|
+
};
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
/**
|
|
214
|
+
* Check available disk space
|
|
215
|
+
*/
|
|
216
|
+
async function checkDiskSpace(minMb = 500) {
|
|
217
|
+
const start = Date.now();
|
|
218
|
+
try {
|
|
219
|
+
const cwd = process.cwd();
|
|
220
|
+
// Use df command to check disk space
|
|
221
|
+
const result = (0, child_process_1.spawnSync)('df', ['-m', cwd], {
|
|
222
|
+
encoding: 'utf8',
|
|
223
|
+
stdio: 'pipe',
|
|
224
|
+
});
|
|
225
|
+
if (result.status === 0) {
|
|
226
|
+
const lines = result.stdout.trim().split('\n');
|
|
227
|
+
if (lines.length >= 2) {
|
|
228
|
+
const parts = lines[1].split(/\s+/);
|
|
229
|
+
const availableMb = parseInt(parts[3] || '0');
|
|
230
|
+
return {
|
|
231
|
+
name: 'disk-space',
|
|
232
|
+
ok: availableMb >= minMb,
|
|
233
|
+
message: availableMb >= minMb
|
|
234
|
+
? `${availableMb} MB available`
|
|
235
|
+
: `Low disk space: ${availableMb} MB (minimum: ${minMb} MB)`,
|
|
236
|
+
details: { availableMb, minMb },
|
|
237
|
+
latencyMs: Date.now() - start,
|
|
238
|
+
};
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
// Fallback: assume OK if we can't check
|
|
242
|
+
return {
|
|
243
|
+
name: 'disk-space',
|
|
244
|
+
ok: true,
|
|
245
|
+
message: 'Could not determine disk space (assuming OK)',
|
|
246
|
+
latencyMs: Date.now() - start,
|
|
247
|
+
};
|
|
248
|
+
}
|
|
249
|
+
catch (error) {
|
|
250
|
+
return {
|
|
251
|
+
name: 'disk-space',
|
|
252
|
+
ok: true, // Don't block on disk check failures
|
|
253
|
+
message: `Disk check skipped: ${error.message}`,
|
|
254
|
+
latencyMs: Date.now() - start,
|
|
255
|
+
};
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
/**
|
|
259
|
+
* Check for stale lock files
|
|
260
|
+
*/
|
|
261
|
+
async function checkLockFiles(basePath) {
|
|
262
|
+
const start = Date.now();
|
|
263
|
+
try {
|
|
264
|
+
const lockDir = (0, lock_1.getLockDir)(basePath || process.cwd());
|
|
265
|
+
if (!fs.existsSync(lockDir)) {
|
|
266
|
+
return {
|
|
267
|
+
name: 'lock-files',
|
|
268
|
+
ok: true,
|
|
269
|
+
message: 'No lock directory (OK)',
|
|
270
|
+
latencyMs: Date.now() - start,
|
|
271
|
+
};
|
|
272
|
+
}
|
|
273
|
+
const status = (0, lock_1.getLockStatus)(lockDir);
|
|
274
|
+
const staleCount = status.filter(s => s.stale).length;
|
|
275
|
+
const activeCount = status.filter(s => !s.stale).length;
|
|
276
|
+
if (staleCount > 0) {
|
|
277
|
+
return {
|
|
278
|
+
name: 'lock-files',
|
|
279
|
+
ok: false,
|
|
280
|
+
message: `${staleCount} stale lock(s) found`,
|
|
281
|
+
details: { staleCount, activeCount, locks: status },
|
|
282
|
+
latencyMs: Date.now() - start,
|
|
283
|
+
};
|
|
284
|
+
}
|
|
285
|
+
return {
|
|
286
|
+
name: 'lock-files',
|
|
287
|
+
ok: true,
|
|
288
|
+
message: activeCount > 0 ? `${activeCount} active lock(s)` : 'No locks',
|
|
289
|
+
details: { activeCount },
|
|
290
|
+
latencyMs: Date.now() - start,
|
|
291
|
+
};
|
|
292
|
+
}
|
|
293
|
+
catch (error) {
|
|
294
|
+
return {
|
|
295
|
+
name: 'lock-files',
|
|
296
|
+
ok: true, // Don't block on lock check failures
|
|
297
|
+
message: `Lock check skipped: ${error.message}`,
|
|
298
|
+
latencyMs: Date.now() - start,
|
|
299
|
+
};
|
|
300
|
+
}
|
|
301
|
+
}
|
|
302
|
+
/**
|
|
303
|
+
* Check system resources (CPU, memory)
|
|
304
|
+
*/
|
|
305
|
+
async function checkSystemResources() {
|
|
306
|
+
const start = Date.now();
|
|
307
|
+
try {
|
|
308
|
+
const totalMem = os.totalmem() / (1024 * 1024 * 1024); // GB
|
|
309
|
+
const freeMem = os.freemem() / (1024 * 1024 * 1024); // GB
|
|
310
|
+
const usedPercent = ((totalMem - freeMem) / totalMem) * 100;
|
|
311
|
+
const cpuCount = os.cpus().length;
|
|
312
|
+
const loadAvg = os.loadavg()[0]; // 1-minute average
|
|
313
|
+
const memoryOk = freeMem > 1; // At least 1GB free
|
|
314
|
+
const cpuOk = loadAvg < cpuCount * 2; // Load less than 2x CPU count
|
|
315
|
+
return {
|
|
316
|
+
name: 'system-resources',
|
|
317
|
+
ok: memoryOk && cpuOk,
|
|
318
|
+
message: memoryOk && cpuOk
|
|
319
|
+
? 'System resources OK'
|
|
320
|
+
: `System under load (Memory: ${usedPercent.toFixed(0)}%, Load: ${loadAvg.toFixed(1)})`,
|
|
321
|
+
details: {
|
|
322
|
+
totalMemoryGb: totalMem.toFixed(1),
|
|
323
|
+
freeMemoryGb: freeMem.toFixed(1),
|
|
324
|
+
memoryUsedPercent: usedPercent.toFixed(1),
|
|
325
|
+
cpuCount,
|
|
326
|
+
loadAverage: loadAvg.toFixed(2),
|
|
327
|
+
},
|
|
328
|
+
latencyMs: Date.now() - start,
|
|
329
|
+
};
|
|
330
|
+
}
|
|
331
|
+
catch (error) {
|
|
332
|
+
return {
|
|
333
|
+
name: 'system-resources',
|
|
334
|
+
ok: true, // Don't block on resource check failures
|
|
335
|
+
message: `Resource check skipped: ${error.message}`,
|
|
336
|
+
latencyMs: Date.now() - start,
|
|
337
|
+
};
|
|
338
|
+
}
|
|
339
|
+
}
|
|
340
|
+
/**
|
|
341
|
+
* Check worktrees status
|
|
342
|
+
*/
|
|
343
|
+
async function checkWorktrees(cwd) {
|
|
344
|
+
const start = Date.now();
|
|
345
|
+
try {
|
|
346
|
+
const worktrees = git.listWorktrees(cwd);
|
|
347
|
+
const orphaned = [];
|
|
348
|
+
for (const wt of worktrees) {
|
|
349
|
+
if (wt.path && !fs.existsSync(wt.path)) {
|
|
350
|
+
orphaned.push(wt.path);
|
|
351
|
+
}
|
|
352
|
+
}
|
|
353
|
+
if (orphaned.length > 0) {
|
|
354
|
+
return {
|
|
355
|
+
name: 'worktrees',
|
|
356
|
+
ok: false,
|
|
357
|
+
message: `${orphaned.length} orphaned worktree(s) found`,
|
|
358
|
+
details: { total: worktrees.length, orphaned },
|
|
359
|
+
latencyMs: Date.now() - start,
|
|
360
|
+
};
|
|
361
|
+
}
|
|
362
|
+
return {
|
|
363
|
+
name: 'worktrees',
|
|
364
|
+
ok: true,
|
|
365
|
+
message: `${worktrees.length} worktree(s) OK`,
|
|
366
|
+
details: { count: worktrees.length },
|
|
367
|
+
latencyMs: Date.now() - start,
|
|
368
|
+
};
|
|
369
|
+
}
|
|
370
|
+
catch (error) {
|
|
371
|
+
return {
|
|
372
|
+
name: 'worktrees',
|
|
373
|
+
ok: true, // Don't block on worktree check failures
|
|
374
|
+
message: `Worktree check skipped: ${error.message}`,
|
|
375
|
+
latencyMs: Date.now() - start,
|
|
376
|
+
};
|
|
377
|
+
}
|
|
378
|
+
}
|
|
379
|
+
/**
|
|
380
|
+
* Run all health checks
|
|
381
|
+
*/
|
|
382
|
+
async function runHealthCheck(options = {}) {
|
|
383
|
+
const checks = [];
|
|
384
|
+
// Run checks in parallel where possible
|
|
385
|
+
const [agentHealth, gitHealth, diskSpace, lockFiles, sysResources, worktrees] = await Promise.all([
|
|
386
|
+
checkAgentHealth(),
|
|
387
|
+
checkGitHealth(options.cwd),
|
|
388
|
+
checkDiskSpace(),
|
|
389
|
+
checkLockFiles(options.cwd),
|
|
390
|
+
checkSystemResources(),
|
|
391
|
+
checkWorktrees(options.cwd),
|
|
392
|
+
]);
|
|
393
|
+
checks.push(agentHealth, gitHealth, diskSpace, lockFiles, sysResources, worktrees);
|
|
394
|
+
// Remote checks (might be slow, so optional)
|
|
395
|
+
if (!options.skipRemote) {
|
|
396
|
+
checks.push(await checkGitRemoteHealth(options.cwd));
|
|
397
|
+
}
|
|
398
|
+
// Auth check (requires network, so optional)
|
|
399
|
+
if (!options.skipAuth) {
|
|
400
|
+
checks.push(await checkAuthHealth());
|
|
401
|
+
}
|
|
402
|
+
const passed = checks.filter(c => c.ok).length;
|
|
403
|
+
const failed = checks.filter(c => !c.ok).length;
|
|
404
|
+
return {
|
|
405
|
+
healthy: failed === 0,
|
|
406
|
+
timestamp: Date.now(),
|
|
407
|
+
checks,
|
|
408
|
+
summary: {
|
|
409
|
+
passed,
|
|
410
|
+
failed,
|
|
411
|
+
warnings: 0, // Could be extended to include warnings
|
|
412
|
+
},
|
|
413
|
+
};
|
|
414
|
+
}
|
|
415
|
+
/**
|
|
416
|
+
* Run preflight checks before starting orchestration
|
|
417
|
+
*/
|
|
418
|
+
async function preflightCheck(options = {}) {
|
|
419
|
+
const blockers = [];
|
|
420
|
+
const warnings = [];
|
|
421
|
+
const recommendations = [];
|
|
422
|
+
// Check cursor-agent
|
|
423
|
+
const agentHealth = await checkAgentHealth();
|
|
424
|
+
if (!agentHealth.ok) {
|
|
425
|
+
blockers.push(`cursor-agent: ${agentHealth.message}`);
|
|
426
|
+
}
|
|
427
|
+
// Check Git repository
|
|
428
|
+
const gitHealth = await checkGitHealth(options.cwd);
|
|
429
|
+
if (!gitHealth.ok) {
|
|
430
|
+
blockers.push(`Git: ${gitHealth.message}`);
|
|
431
|
+
}
|
|
432
|
+
// Check authentication
|
|
433
|
+
if (options.requireAuth !== false) {
|
|
434
|
+
const authHealth = await checkAuthHealth();
|
|
435
|
+
if (!authHealth.ok) {
|
|
436
|
+
blockers.push(`Authentication: ${authHealth.message}`);
|
|
437
|
+
}
|
|
438
|
+
}
|
|
439
|
+
// Check Git remote (warning only unless required)
|
|
440
|
+
const remoteHealth = await checkGitRemoteHealth(options.cwd);
|
|
441
|
+
if (!remoteHealth.ok) {
|
|
442
|
+
if (options.requireRemote) {
|
|
443
|
+
blockers.push(`Git remote: ${remoteHealth.message}`);
|
|
444
|
+
}
|
|
445
|
+
else {
|
|
446
|
+
warnings.push(`Git remote: ${remoteHealth.message}`);
|
|
447
|
+
}
|
|
448
|
+
}
|
|
449
|
+
// Check disk space
|
|
450
|
+
const diskHealth = await checkDiskSpace();
|
|
451
|
+
if (!diskHealth.ok) {
|
|
452
|
+
warnings.push(`Disk space: ${diskHealth.message}`);
|
|
453
|
+
}
|
|
454
|
+
// Check for stale locks
|
|
455
|
+
const lockHealth = await checkLockFiles(options.cwd);
|
|
456
|
+
if (!lockHealth.ok) {
|
|
457
|
+
warnings.push(`Locks: ${lockHealth.message}`);
|
|
458
|
+
recommendations.push('Run `cursorflow clean locks` to remove stale locks');
|
|
459
|
+
}
|
|
460
|
+
// Check worktrees
|
|
461
|
+
const worktreeHealth = await checkWorktrees(options.cwd);
|
|
462
|
+
if (!worktreeHealth.ok) {
|
|
463
|
+
warnings.push(`Worktrees: ${worktreeHealth.message}`);
|
|
464
|
+
recommendations.push('Run `cursorflow clean worktrees` to clean up orphaned worktrees');
|
|
465
|
+
}
|
|
466
|
+
// Check system resources
|
|
467
|
+
const resourceHealth = await checkSystemResources();
|
|
468
|
+
if (!resourceHealth.ok) {
|
|
469
|
+
warnings.push(`Resources: ${resourceHealth.message}`);
|
|
470
|
+
}
|
|
471
|
+
return {
|
|
472
|
+
canProceed: blockers.length === 0,
|
|
473
|
+
blockers,
|
|
474
|
+
warnings,
|
|
475
|
+
recommendations,
|
|
476
|
+
};
|
|
477
|
+
}
|
|
478
|
+
/**
|
|
479
|
+
* Print health check results to console
|
|
480
|
+
*/
|
|
481
|
+
function printHealthReport(health) {
|
|
482
|
+
logger.section('🏥 System Health Check');
|
|
483
|
+
for (const check of health.checks) {
|
|
484
|
+
const icon = check.ok ? '✅' : '❌';
|
|
485
|
+
const latency = check.latencyMs ? ` (${check.latencyMs}ms)` : '';
|
|
486
|
+
console.log(`${icon} ${check.name}: ${check.message}${latency}`);
|
|
487
|
+
}
|
|
488
|
+
console.log('');
|
|
489
|
+
console.log(`Summary: ${health.summary.passed} passed, ${health.summary.failed} failed`);
|
|
490
|
+
console.log(`Overall: ${health.healthy ? '✅ Healthy' : '❌ Unhealthy'}`);
|
|
491
|
+
}
|
|
492
|
+
/**
|
|
493
|
+
* Print preflight check results to console
|
|
494
|
+
*/
|
|
495
|
+
function printPreflightReport(result) {
|
|
496
|
+
logger.section('🚀 Preflight Check');
|
|
497
|
+
if (result.blockers.length > 0) {
|
|
498
|
+
console.log('❌ Blockers:');
|
|
499
|
+
for (const blocker of result.blockers) {
|
|
500
|
+
console.log(` • ${blocker}`);
|
|
501
|
+
}
|
|
502
|
+
console.log('');
|
|
503
|
+
}
|
|
504
|
+
if (result.warnings.length > 0) {
|
|
505
|
+
console.log('⚠️ Warnings:');
|
|
506
|
+
for (const warning of result.warnings) {
|
|
507
|
+
console.log(` • ${warning}`);
|
|
508
|
+
}
|
|
509
|
+
console.log('');
|
|
510
|
+
}
|
|
511
|
+
if (result.recommendations.length > 0) {
|
|
512
|
+
console.log('💡 Recommendations:');
|
|
513
|
+
for (const rec of result.recommendations) {
|
|
514
|
+
console.log(` • ${rec}`);
|
|
515
|
+
}
|
|
516
|
+
console.log('');
|
|
517
|
+
}
|
|
518
|
+
if (result.canProceed) {
|
|
519
|
+
logger.success('Preflight check passed!');
|
|
520
|
+
}
|
|
521
|
+
else {
|
|
522
|
+
logger.error('Preflight check failed. Please fix the blockers above.');
|
|
523
|
+
}
|
|
524
|
+
}
|
|
525
|
+
/**
|
|
526
|
+
* Auto-repair common issues found during health check
|
|
527
|
+
*/
|
|
528
|
+
async function autoRepair(options = {}) {
|
|
529
|
+
const repaired = [];
|
|
530
|
+
const failed = [];
|
|
531
|
+
// Clean stale locks
|
|
532
|
+
try {
|
|
533
|
+
const lockDir = (0, lock_1.getLockDir)(options.cwd || process.cwd());
|
|
534
|
+
if (fs.existsSync(lockDir)) {
|
|
535
|
+
const cleaned = (0, lock_1.cleanStaleLocks)(lockDir);
|
|
536
|
+
if (cleaned > 0) {
|
|
537
|
+
repaired.push(`Cleaned ${cleaned} stale lock(s)`);
|
|
538
|
+
}
|
|
539
|
+
}
|
|
540
|
+
}
|
|
541
|
+
catch (e) {
|
|
542
|
+
failed.push(`Lock cleanup failed: ${e.message}`);
|
|
543
|
+
}
|
|
544
|
+
// Prune orphaned worktrees
|
|
545
|
+
try {
|
|
546
|
+
const result = git.runGitResult(['worktree', 'prune'], { cwd: options.cwd });
|
|
547
|
+
if (result.success) {
|
|
548
|
+
repaired.push('Pruned orphaned worktrees');
|
|
549
|
+
}
|
|
550
|
+
}
|
|
551
|
+
catch (e) {
|
|
552
|
+
failed.push(`Worktree prune failed: ${e.message}`);
|
|
553
|
+
}
|
|
554
|
+
return { repaired, failed };
|
|
555
|
+
}
|
|
556
|
+
//# sourceMappingURL=health.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"health.js","sourceRoot":"","sources":["../../src/utils/health.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Enhanced file-based locking with async support and stale lock detection
|
|
3
|
+
*/
|
|
4
|
+
export interface LockInfo {
|
|
5
|
+
pid: number;
|
|
6
|
+
timestamp: number;
|
|
7
|
+
operation: string;
|
|
8
|
+
hostname?: string;
|
|
9
|
+
}
|
|
10
|
+
export interface LockOptions {
|
|
11
|
+
/** Maximum time to wait for lock in milliseconds */
|
|
12
|
+
timeoutMs?: number;
|
|
13
|
+
/** Delay between retry attempts in milliseconds */
|
|
14
|
+
retryDelayMs?: number;
|
|
15
|
+
/** Lock is considered stale after this many milliseconds */
|
|
16
|
+
staleTimeoutMs?: number;
|
|
17
|
+
/** Description of the operation for logging */
|
|
18
|
+
operation?: string;
|
|
19
|
+
}
|
|
20
|
+
export declare const DEFAULT_LOCK_OPTIONS: Required<LockOptions>;
|
|
21
|
+
/**
|
|
22
|
+
* Check if a process is still running
|
|
23
|
+
*/
|
|
24
|
+
export declare function isProcessRunning(pid: number): boolean;
|
|
25
|
+
/**
|
|
26
|
+
* Get the lock directory for a given base path
|
|
27
|
+
*/
|
|
28
|
+
export declare function getLockDir(basePath: string): string;
|
|
29
|
+
/**
|
|
30
|
+
* Ensure lock directory exists
|
|
31
|
+
*/
|
|
32
|
+
export declare function ensureLockDir(basePath: string): string;
|
|
33
|
+
/**
|
|
34
|
+
* Read lock file info
|
|
35
|
+
*/
|
|
36
|
+
export declare function readLockInfo(lockFile: string): LockInfo | null;
|
|
37
|
+
/**
|
|
38
|
+
* Check if a lock is stale
|
|
39
|
+
*/
|
|
40
|
+
export declare function isLockStale(lockInfo: LockInfo, staleTimeoutMs: number): boolean;
|
|
41
|
+
/**
|
|
42
|
+
* Try to acquire a lock synchronously (for backward compatibility)
|
|
43
|
+
*/
|
|
44
|
+
export declare function tryAcquireLockSync(lockFile: string, options?: LockOptions): boolean;
|
|
45
|
+
/**
|
|
46
|
+
* Release a lock synchronously
|
|
47
|
+
*/
|
|
48
|
+
export declare function releaseLockSync(lockFile: string): void;
|
|
49
|
+
/**
|
|
50
|
+
* Acquire a lock with async waiting
|
|
51
|
+
*/
|
|
52
|
+
export declare function acquireLock(lockFile: string, options?: LockOptions): Promise<boolean>;
|
|
53
|
+
/**
|
|
54
|
+
* Release a lock
|
|
55
|
+
*/
|
|
56
|
+
export declare function releaseLock(lockFile: string): Promise<void>;
|
|
57
|
+
/**
|
|
58
|
+
* Execute a function while holding a lock
|
|
59
|
+
*/
|
|
60
|
+
export declare function withLock<T>(lockFile: string, fn: () => Promise<T>, options?: LockOptions): Promise<T>;
|
|
61
|
+
/**
|
|
62
|
+
* Execute a synchronous function while holding a lock
|
|
63
|
+
*/
|
|
64
|
+
export declare function withLockSync<T>(lockFile: string, fn: () => T, options?: LockOptions): T;
|
|
65
|
+
/**
|
|
66
|
+
* Clean up stale locks in a directory
|
|
67
|
+
*/
|
|
68
|
+
export declare function cleanStaleLocks(lockDir: string, staleTimeoutMs?: number): number;
|
|
69
|
+
/**
|
|
70
|
+
* Get status of all locks in a directory
|
|
71
|
+
*/
|
|
72
|
+
export declare function getLockStatus(lockDir: string): Array<{
|
|
73
|
+
file: string;
|
|
74
|
+
info: LockInfo;
|
|
75
|
+
stale: boolean;
|
|
76
|
+
}>;
|
|
77
|
+
/**
|
|
78
|
+
* Named lock manager for managing multiple locks
|
|
79
|
+
*/
|
|
80
|
+
export declare class LockManager {
|
|
81
|
+
private readonly basePath;
|
|
82
|
+
private readonly heldLocks;
|
|
83
|
+
constructor(basePath: string);
|
|
84
|
+
private getLockPath;
|
|
85
|
+
acquire(name: string, options?: LockOptions): Promise<boolean>;
|
|
86
|
+
release(name: string): Promise<void>;
|
|
87
|
+
releaseAll(): void;
|
|
88
|
+
withLock<T>(name: string, fn: () => Promise<T>, options?: LockOptions): Promise<T>;
|
|
89
|
+
cleanStale(staleTimeoutMs?: number): number;
|
|
90
|
+
getStatus(): Array<{
|
|
91
|
+
file: string;
|
|
92
|
+
info: LockInfo;
|
|
93
|
+
stale: boolean;
|
|
94
|
+
}>;
|
|
95
|
+
}
|