@virtengine/openfleet 0.25.0
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/.env.example +914 -0
- package/LICENSE +190 -0
- package/README.md +500 -0
- package/agent-endpoint.mjs +918 -0
- package/agent-hook-bridge.mjs +230 -0
- package/agent-hooks.mjs +1188 -0
- package/agent-pool.mjs +2403 -0
- package/agent-prompts.mjs +689 -0
- package/agent-sdk.mjs +141 -0
- package/anomaly-detector.mjs +1195 -0
- package/autofix.mjs +1294 -0
- package/claude-shell.mjs +708 -0
- package/cli.mjs +906 -0
- package/codex-config.mjs +1274 -0
- package/codex-model-profiles.mjs +135 -0
- package/codex-shell.mjs +762 -0
- package/config-doctor.mjs +613 -0
- package/config.mjs +1720 -0
- package/conflict-resolver.mjs +248 -0
- package/container-runner.mjs +450 -0
- package/copilot-shell.mjs +827 -0
- package/daemon-restart-policy.mjs +56 -0
- package/diff-stats.mjs +282 -0
- package/error-detector.mjs +829 -0
- package/fetch-runtime.mjs +34 -0
- package/fleet-coordinator.mjs +838 -0
- package/get-telegram-chat-id.mjs +71 -0
- package/git-safety.mjs +170 -0
- package/github-reconciler.mjs +403 -0
- package/hook-profiles.mjs +651 -0
- package/kanban-adapter.mjs +4491 -0
- package/lib/logger.mjs +645 -0
- package/maintenance.mjs +828 -0
- package/merge-strategy.mjs +1171 -0
- package/monitor.mjs +12207 -0
- package/openfleet.config.example.json +115 -0
- package/openfleet.schema.json +465 -0
- package/package.json +203 -0
- package/postinstall.mjs +187 -0
- package/pr-cleanup-daemon.mjs +978 -0
- package/preflight.mjs +408 -0
- package/prepublish-check.mjs +90 -0
- package/presence.mjs +328 -0
- package/primary-agent.mjs +282 -0
- package/publish.mjs +151 -0
- package/repo-root.mjs +29 -0
- package/restart-controller.mjs +100 -0
- package/review-agent.mjs +557 -0
- package/rotate-agent-logs.sh +133 -0
- package/sdk-conflict-resolver.mjs +973 -0
- package/session-tracker.mjs +880 -0
- package/setup.mjs +3937 -0
- package/shared-knowledge.mjs +410 -0
- package/shared-state-manager.mjs +841 -0
- package/shared-workspace-cli.mjs +199 -0
- package/shared-workspace-registry.mjs +537 -0
- package/shared-workspaces.json +18 -0
- package/startup-service.mjs +1070 -0
- package/sync-engine.mjs +1063 -0
- package/task-archiver.mjs +801 -0
- package/task-assessment.mjs +550 -0
- package/task-claims.mjs +924 -0
- package/task-complexity.mjs +581 -0
- package/task-executor.mjs +5111 -0
- package/task-store.mjs +753 -0
- package/telegram-bot.mjs +9281 -0
- package/telegram-sentinel.mjs +2010 -0
- package/ui/app.js +867 -0
- package/ui/app.legacy.js +1464 -0
- package/ui/app.monolith.js +2488 -0
- package/ui/components/charts.js +226 -0
- package/ui/components/chat-view.js +567 -0
- package/ui/components/command-palette.js +587 -0
- package/ui/components/diff-viewer.js +190 -0
- package/ui/components/forms.js +327 -0
- package/ui/components/kanban-board.js +451 -0
- package/ui/components/session-list.js +305 -0
- package/ui/components/shared.js +473 -0
- package/ui/index.html +70 -0
- package/ui/modules/api.js +297 -0
- package/ui/modules/icons.js +461 -0
- package/ui/modules/router.js +81 -0
- package/ui/modules/settings-schema.js +261 -0
- package/ui/modules/state.js +679 -0
- package/ui/modules/telegram.js +331 -0
- package/ui/modules/utils.js +270 -0
- package/ui/styles/animations.css +140 -0
- package/ui/styles/base.css +98 -0
- package/ui/styles/components.css +1915 -0
- package/ui/styles/kanban.css +286 -0
- package/ui/styles/layout.css +809 -0
- package/ui/styles/sessions.css +827 -0
- package/ui/styles/variables.css +188 -0
- package/ui/styles.css +141 -0
- package/ui/styles.monolith.css +1046 -0
- package/ui/tabs/agents.js +1417 -0
- package/ui/tabs/chat.js +74 -0
- package/ui/tabs/control.js +887 -0
- package/ui/tabs/dashboard.js +515 -0
- package/ui/tabs/infra.js +537 -0
- package/ui/tabs/logs.js +783 -0
- package/ui/tabs/settings.js +1487 -0
- package/ui/tabs/tasks.js +1385 -0
- package/ui-server.mjs +4073 -0
- package/update-check.mjs +465 -0
- package/utils.mjs +172 -0
- package/ve-kanban.mjs +654 -0
- package/ve-kanban.ps1 +1365 -0
- package/ve-kanban.sh +18 -0
- package/ve-orchestrator.mjs +340 -0
- package/ve-orchestrator.ps1 +6546 -0
- package/ve-orchestrator.sh +18 -0
- package/vibe-kanban-wrapper.mjs +41 -0
- package/vk-error-resolver.mjs +470 -0
- package/vk-log-stream.mjs +914 -0
- package/whatsapp-channel.mjs +520 -0
- package/workspace-monitor.mjs +581 -0
- package/workspace-reaper.mjs +405 -0
- package/workspace-registry.mjs +238 -0
- package/worktree-manager.mjs +1266 -0
package/package.json
ADDED
|
@@ -0,0 +1,203 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@virtengine/openfleet",
|
|
3
|
+
"version": "0.25.0",
|
|
4
|
+
"description": "AI-powered orchestrator supervisor — manages AI agent executors with failover, auto-restarts on failure, analyzes crashes with Codex SDK, creates PRs via Vibe-Kanban API, and sends Telegram notifications. Supports N executors with weighted distribution, multi-repo projects, and auto-setup.",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"license": "Apache 2.0",
|
|
7
|
+
"author": "VirtEngine <dev@virtengine.com>",
|
|
8
|
+
"homepage": "https://github.com/virtengine/virtengine/tree/main/scripts/openfleet",
|
|
9
|
+
"repository": {
|
|
10
|
+
"type": "git",
|
|
11
|
+
"url": "git+https://github.com/virtengine/virtengine.git",
|
|
12
|
+
"directory": "scripts/openfleet"
|
|
13
|
+
},
|
|
14
|
+
"bugs": {
|
|
15
|
+
"url": "https://github.com/virtengine/virtengine/issues"
|
|
16
|
+
},
|
|
17
|
+
"keywords": [
|
|
18
|
+
"codex",
|
|
19
|
+
"orchestrator",
|
|
20
|
+
"monitor",
|
|
21
|
+
"ai",
|
|
22
|
+
"automation",
|
|
23
|
+
"vibe-kanban",
|
|
24
|
+
"telegram",
|
|
25
|
+
"devops",
|
|
26
|
+
"executor",
|
|
27
|
+
"failover",
|
|
28
|
+
"copilot",
|
|
29
|
+
"agent",
|
|
30
|
+
"openai",
|
|
31
|
+
"cli"
|
|
32
|
+
],
|
|
33
|
+
"exports": {
|
|
34
|
+
".": "./monitor.mjs",
|
|
35
|
+
"./config": "./config.mjs",
|
|
36
|
+
"./config-doctor": "./config-doctor.mjs",
|
|
37
|
+
"./codex-config": "./codex-config.mjs",
|
|
38
|
+
"./setup": "./setup.mjs",
|
|
39
|
+
"./autofix": "./autofix.mjs",
|
|
40
|
+
"./codex-shell": "./codex-shell.mjs",
|
|
41
|
+
"./copilot-shell": "./copilot-shell.mjs",
|
|
42
|
+
"./claude-shell": "./claude-shell.mjs",
|
|
43
|
+
"./primary-agent": "./primary-agent.mjs",
|
|
44
|
+
"./maintenance": "./maintenance.mjs",
|
|
45
|
+
"./telegram-bot": "./telegram-bot.mjs",
|
|
46
|
+
"./ui-server": "./ui-server.mjs",
|
|
47
|
+
"./workspace-registry": "./workspace-registry.mjs",
|
|
48
|
+
"./shared-workspace-registry": "./shared-workspace-registry.mjs",
|
|
49
|
+
"./workspace-reaper": "./workspace-reaper.mjs",
|
|
50
|
+
"./merge-strategy": "./merge-strategy.mjs",
|
|
51
|
+
"./restart-controller": "./restart-controller.mjs",
|
|
52
|
+
"./fleet-coordinator": "./fleet-coordinator.mjs",
|
|
53
|
+
"./shared-knowledge": "./shared-knowledge.mjs",
|
|
54
|
+
"./presence": "./presence.mjs",
|
|
55
|
+
"./vk-log-stream": "./vk-log-stream.mjs",
|
|
56
|
+
"./session-tracker": "./session-tracker.mjs",
|
|
57
|
+
"./diff-stats": "./diff-stats.mjs",
|
|
58
|
+
"./review-agent": "./review-agent.mjs",
|
|
59
|
+
"./agent-hooks": "./agent-hooks.mjs",
|
|
60
|
+
"./hook-profiles": "./hook-profiles.mjs",
|
|
61
|
+
"./agent-hook-bridge": "./agent-hook-bridge.mjs",
|
|
62
|
+
"./startup-service": "./startup-service.mjs",
|
|
63
|
+
"./telegram-sentinel": "./telegram-sentinel.mjs",
|
|
64
|
+
"./whatsapp-channel": "./whatsapp-channel.mjs",
|
|
65
|
+
"./container-runner": "./container-runner.mjs"
|
|
66
|
+
},
|
|
67
|
+
"bin": {
|
|
68
|
+
"openfleet": "cli.mjs",
|
|
69
|
+
"openfleet-setup": "setup.mjs",
|
|
70
|
+
"openfleet-chat-id": "get-telegram-chat-id.mjs",
|
|
71
|
+
"openfleet-shared-workspaces": "shared-workspace-cli.mjs",
|
|
72
|
+
"codex-monitor": "cli.mjs",
|
|
73
|
+
"codex-monitor-setup": "setup.mjs",
|
|
74
|
+
"codex-monitor-chat-id": "get-telegram-chat-id.mjs",
|
|
75
|
+
"codex-monitor-shared-workspaces": "shared-workspace-cli.mjs",
|
|
76
|
+
"vibe-kanban": "vibe-kanban-wrapper.mjs",
|
|
77
|
+
"telegram-sentinel": "telegram-sentinel.mjs"
|
|
78
|
+
},
|
|
79
|
+
"scripts": {
|
|
80
|
+
"start": "node cli.mjs",
|
|
81
|
+
"setup": "node setup.mjs",
|
|
82
|
+
"monitor": "node monitor.mjs",
|
|
83
|
+
"shared-workspaces": "node shared-workspace-cli.mjs",
|
|
84
|
+
"syntax:check": "node -e \"const fs=require('fs'),path=require('path');const files=fs.readdirSync('.').filter(f=>f.endsWith('.mjs'));let fail=0;for(const f of files){try{require('child_process').execSync('node --check '+f,{stdio:'pipe'});}catch(e){console.error('Syntax error: '+f);console.error(e.stderr.toString());fail=1;}}if(fail)process.exit(1);console.log('Syntax OK: '+files.length+' files checked');\"",
|
|
85
|
+
"pretest": "npm run syntax:check",
|
|
86
|
+
"test": "vitest run --config vitest.config.mjs",
|
|
87
|
+
"test:watch": "vitest",
|
|
88
|
+
"postinstall": "node postinstall.mjs",
|
|
89
|
+
"sentinel": "node telegram-sentinel.mjs",
|
|
90
|
+
"sentinel:stop": "node -e \"import('./telegram-sentinel.mjs').then(m => m.stopSentinel())\"",
|
|
91
|
+
"sentinel:status": "node -e \"import('./telegram-sentinel.mjs').then(m => console.log(JSON.stringify(m.getSentinelStatus(), null, 2)))\"",
|
|
92
|
+
"prepush:check": "npm run syntax:check && npm test",
|
|
93
|
+
"prepublishOnly": "node prepublish-check.mjs",
|
|
94
|
+
"publish:env": "node publish.mjs",
|
|
95
|
+
"publish:dry-run": "node publish.mjs --dry-run"
|
|
96
|
+
},
|
|
97
|
+
"files": [
|
|
98
|
+
".env.example",
|
|
99
|
+
"LICENSE",
|
|
100
|
+
"README.md",
|
|
101
|
+
"agent-endpoint.mjs",
|
|
102
|
+
"agent-pool.mjs",
|
|
103
|
+
"agent-prompts.mjs",
|
|
104
|
+
"agent-sdk.mjs",
|
|
105
|
+
"anomaly-detector.mjs",
|
|
106
|
+
"autofix.mjs",
|
|
107
|
+
"claude-shell.mjs",
|
|
108
|
+
"cli.mjs",
|
|
109
|
+
"codex-config.mjs",
|
|
110
|
+
"openfleet.config.example.json",
|
|
111
|
+
"openfleet.schema.json",
|
|
112
|
+
"codex-model-profiles.mjs",
|
|
113
|
+
"codex-shell.mjs",
|
|
114
|
+
"config.mjs",
|
|
115
|
+
"config-doctor.mjs",
|
|
116
|
+
"conflict-resolver.mjs",
|
|
117
|
+
"copilot-shell.mjs",
|
|
118
|
+
"diff-stats.mjs",
|
|
119
|
+
"error-detector.mjs",
|
|
120
|
+
"fetch-runtime.mjs",
|
|
121
|
+
"fleet-coordinator.mjs",
|
|
122
|
+
"github-reconciler.mjs",
|
|
123
|
+
"get-telegram-chat-id.mjs",
|
|
124
|
+
"git-safety.mjs",
|
|
125
|
+
"kanban-adapter.mjs",
|
|
126
|
+
"lib/logger.mjs",
|
|
127
|
+
"maintenance.mjs",
|
|
128
|
+
"merge-strategy.mjs",
|
|
129
|
+
"monitor.mjs",
|
|
130
|
+
"postinstall.mjs",
|
|
131
|
+
"pr-cleanup-daemon.mjs",
|
|
132
|
+
"preflight.mjs",
|
|
133
|
+
"prepublish-check.mjs",
|
|
134
|
+
"presence.mjs",
|
|
135
|
+
"primary-agent.mjs",
|
|
136
|
+
"repo-root.mjs",
|
|
137
|
+
"restart-controller.mjs",
|
|
138
|
+
"review-agent.mjs",
|
|
139
|
+
"sdk-conflict-resolver.mjs",
|
|
140
|
+
"session-tracker.mjs",
|
|
141
|
+
"setup.mjs",
|
|
142
|
+
"shared-knowledge.mjs",
|
|
143
|
+
"shared-state-manager.mjs",
|
|
144
|
+
"shared-workspace-cli.mjs",
|
|
145
|
+
"shared-workspace-registry.mjs",
|
|
146
|
+
"shared-workspaces.json",
|
|
147
|
+
"sync-engine.mjs",
|
|
148
|
+
"task-archiver.mjs",
|
|
149
|
+
"task-assessment.mjs",
|
|
150
|
+
"task-complexity.mjs",
|
|
151
|
+
"task-claims.mjs",
|
|
152
|
+
"task-executor.mjs",
|
|
153
|
+
"task-store.mjs",
|
|
154
|
+
"telegram-bot.mjs",
|
|
155
|
+
"ui-server.mjs",
|
|
156
|
+
"ui/modules/settings-schema.js",
|
|
157
|
+
"ui/",
|
|
158
|
+
"update-check.mjs",
|
|
159
|
+
"utils.mjs",
|
|
160
|
+
"ve-kanban.mjs",
|
|
161
|
+
"ve-kanban.ps1",
|
|
162
|
+
"ve-kanban.sh",
|
|
163
|
+
"ve-orchestrator.mjs",
|
|
164
|
+
"ve-orchestrator.ps1",
|
|
165
|
+
"ve-orchestrator.sh",
|
|
166
|
+
"rotate-agent-logs.sh",
|
|
167
|
+
"vibe-kanban-wrapper.mjs",
|
|
168
|
+
"vk-error-resolver.mjs",
|
|
169
|
+
"vk-log-stream.mjs",
|
|
170
|
+
"workspace-monitor.mjs",
|
|
171
|
+
"workspace-reaper.mjs",
|
|
172
|
+
"workspace-registry.mjs",
|
|
173
|
+
"worktree-manager.mjs",
|
|
174
|
+
"agent-hooks.mjs",
|
|
175
|
+
"hook-profiles.mjs",
|
|
176
|
+
"agent-hook-bridge.mjs",
|
|
177
|
+
"startup-service.mjs",
|
|
178
|
+
"telegram-sentinel.mjs",
|
|
179
|
+
"whatsapp-channel.mjs",
|
|
180
|
+
"container-runner.mjs",
|
|
181
|
+
"daemon-restart-policy.mjs",
|
|
182
|
+
"publish.mjs"
|
|
183
|
+
],
|
|
184
|
+
"dependencies": {
|
|
185
|
+
"@anthropic-ai/claude-agent-sdk": "latest",
|
|
186
|
+
"@github/copilot-sdk": "latest",
|
|
187
|
+
"@openai/codex-sdk": "latest",
|
|
188
|
+
"@whiskeysockets/baileys": "^7.0.0-rc.9",
|
|
189
|
+
"ajv": "^8.18.0",
|
|
190
|
+
"qrcode-terminal": "^0.12.0",
|
|
191
|
+
"vibe-kanban": "latest",
|
|
192
|
+
"ws": "^8.19.0"
|
|
193
|
+
},
|
|
194
|
+
"devDependencies": {
|
|
195
|
+
"vitest": "^4.0.18"
|
|
196
|
+
},
|
|
197
|
+
"engines": {
|
|
198
|
+
"node": ">=18"
|
|
199
|
+
},
|
|
200
|
+
"publishConfig": {
|
|
201
|
+
"access": "public"
|
|
202
|
+
}
|
|
203
|
+
}
|
package/postinstall.mjs
ADDED
|
@@ -0,0 +1,187 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* openfleet — Post-Install Environment Validator
|
|
5
|
+
*
|
|
6
|
+
* Runs after `npm install` to check for required system dependencies
|
|
7
|
+
* that can't be installed via npm (git, gh, pwsh) and prints
|
|
8
|
+
* actionable install instructions for anything missing.
|
|
9
|
+
*
|
|
10
|
+
* This is non-blocking — missing optional tools produce warnings,
|
|
11
|
+
* not errors, so CI installs won't fail.
|
|
12
|
+
*/
|
|
13
|
+
|
|
14
|
+
import { execSync } from "node:child_process";
|
|
15
|
+
|
|
16
|
+
const isWin = process.platform === "win32";
|
|
17
|
+
|
|
18
|
+
// ── Helpers ──────────────────────────────────────────────────────────────────
|
|
19
|
+
|
|
20
|
+
function commandExists(cmd) {
|
|
21
|
+
try {
|
|
22
|
+
execSync(`${isWin ? "where" : "which"} ${cmd}`, { stdio: "ignore" });
|
|
23
|
+
return true;
|
|
24
|
+
} catch {
|
|
25
|
+
return false;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
function getVersion(cmd, flag = "--version") {
|
|
30
|
+
try {
|
|
31
|
+
return execSync(`${cmd} ${flag}`, {
|
|
32
|
+
encoding: "utf8",
|
|
33
|
+
timeout: 10000,
|
|
34
|
+
stdio: ["pipe", "pipe", "ignore"],
|
|
35
|
+
})
|
|
36
|
+
.trim()
|
|
37
|
+
.split("\n")[0];
|
|
38
|
+
} catch {
|
|
39
|
+
return null;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
// ── Dependency checks ────────────────────────────────────────────────────────
|
|
44
|
+
|
|
45
|
+
const REQUIRED = [
|
|
46
|
+
{
|
|
47
|
+
name: "git",
|
|
48
|
+
cmd: "git",
|
|
49
|
+
required: true,
|
|
50
|
+
install: {
|
|
51
|
+
win32: "winget install --id Git.Git -e --source winget",
|
|
52
|
+
darwin: "brew install git",
|
|
53
|
+
linux: "sudo apt install git # or: sudo dnf install git",
|
|
54
|
+
},
|
|
55
|
+
url: "https://git-scm.com/downloads",
|
|
56
|
+
},
|
|
57
|
+
];
|
|
58
|
+
|
|
59
|
+
const RECOMMENDED = [
|
|
60
|
+
{
|
|
61
|
+
name: "GitHub CLI (gh)",
|
|
62
|
+
cmd: "gh",
|
|
63
|
+
required: false,
|
|
64
|
+
install: {
|
|
65
|
+
win32: "winget install --id GitHub.cli -e --source winget",
|
|
66
|
+
darwin: "brew install gh",
|
|
67
|
+
linux:
|
|
68
|
+
"sudo apt install gh # or: https://github.com/cli/cli/blob/trunk/docs/install_linux.md",
|
|
69
|
+
},
|
|
70
|
+
url: "https://cli.github.com/",
|
|
71
|
+
why: "Required for PR creation, branch management, and GitHub operations",
|
|
72
|
+
},
|
|
73
|
+
{
|
|
74
|
+
name: "GitHub Copilot CLI (copilot)",
|
|
75
|
+
cmd: "copilot",
|
|
76
|
+
required: false,
|
|
77
|
+
install: {
|
|
78
|
+
win32: "npm install -g @github/copilot",
|
|
79
|
+
darwin: "npm install -g @github/copilot",
|
|
80
|
+
linux: "npm install -g @github/copilot",
|
|
81
|
+
},
|
|
82
|
+
url: "https://github.com/github/copilot-cli",
|
|
83
|
+
why: "Required for Copilot SDK primary agent sessions",
|
|
84
|
+
},
|
|
85
|
+
{
|
|
86
|
+
name: "PowerShell (pwsh)",
|
|
87
|
+
cmd: "pwsh",
|
|
88
|
+
required: false,
|
|
89
|
+
install: {
|
|
90
|
+
win32: "winget install --id Microsoft.PowerShell -e --source winget",
|
|
91
|
+
darwin: "brew install powershell/tap/powershell",
|
|
92
|
+
linux:
|
|
93
|
+
"sudo apt install powershell # or: https://learn.microsoft.com/en-us/powershell/scripting/install/installing-powershell-on-linux",
|
|
94
|
+
},
|
|
95
|
+
url: "https://github.com/PowerShell/PowerShell",
|
|
96
|
+
why: isWin
|
|
97
|
+
? "Required on Windows for PowerShell orchestrator scripts"
|
|
98
|
+
: "Optional on macOS/Linux (only needed when using .ps1 orchestrator scripts)",
|
|
99
|
+
},
|
|
100
|
+
];
|
|
101
|
+
|
|
102
|
+
// ── Main ─────────────────────────────────────────────────────────────────────
|
|
103
|
+
|
|
104
|
+
function main() {
|
|
105
|
+
// Skip in CI environments
|
|
106
|
+
if (process.env.CI || process.env.CODEX_MONITOR_SKIP_POSTINSTALL) {
|
|
107
|
+
return;
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
console.log("");
|
|
111
|
+
console.log(" ┌──────────────────────────────────────────────┐");
|
|
112
|
+
console.log(" │ openfleet — environment check │");
|
|
113
|
+
console.log(" └──────────────────────────────────────────────┘");
|
|
114
|
+
console.log("");
|
|
115
|
+
|
|
116
|
+
const platform = process.platform;
|
|
117
|
+
let hasErrors = false;
|
|
118
|
+
let hasWarnings = false;
|
|
119
|
+
|
|
120
|
+
// Node.js version check
|
|
121
|
+
const nodeMajor = Number(process.versions.node.split(".")[0]);
|
|
122
|
+
if (nodeMajor >= 18) {
|
|
123
|
+
console.log(` ✅ Node.js ${process.versions.node}`);
|
|
124
|
+
} else {
|
|
125
|
+
console.log(` ❌ Node.js ${process.versions.node} — requires ≥ 18`);
|
|
126
|
+
hasErrors = true;
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
// Required tools
|
|
130
|
+
for (const dep of REQUIRED) {
|
|
131
|
+
if (commandExists(dep.cmd)) {
|
|
132
|
+
const ver = getVersion(dep.cmd);
|
|
133
|
+
console.log(` ✅ ${dep.name}${ver ? ` (${ver})` : ""}`);
|
|
134
|
+
} else {
|
|
135
|
+
console.log(` ❌ ${dep.name} — REQUIRED`);
|
|
136
|
+
const hint = dep.install[platform] || dep.install.linux;
|
|
137
|
+
console.log(` Install: ${hint}`);
|
|
138
|
+
console.log(` Docs: ${dep.url}`);
|
|
139
|
+
hasErrors = true;
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
// Recommended tools
|
|
144
|
+
for (const dep of RECOMMENDED) {
|
|
145
|
+
if (commandExists(dep.cmd)) {
|
|
146
|
+
const ver = getVersion(dep.cmd);
|
|
147
|
+
console.log(` ✅ ${dep.name}${ver ? ` (${ver})` : ""}`);
|
|
148
|
+
} else {
|
|
149
|
+
console.log(` ⚠️ ${dep.name} — not found`);
|
|
150
|
+
console.log(` ${dep.why}`);
|
|
151
|
+
const hint = dep.install[platform] || dep.install.linux;
|
|
152
|
+
console.log(` Install: ${hint}`);
|
|
153
|
+
hasWarnings = true;
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
// npm-installed tools (bundled with this package)
|
|
158
|
+
console.log(` ✅ vibe-kanban (bundled)`);
|
|
159
|
+
console.log(` ✅ @openai/codex-sdk (bundled)`);
|
|
160
|
+
console.log(` ✅ @github/copilot-sdk (bundled)`);
|
|
161
|
+
console.log(` ✅ @anthropic-ai/claude-agent-sdk (bundled)`);
|
|
162
|
+
console.log(` ✅ @github/copilot-sdk (bundled)`);
|
|
163
|
+
console.log(` ✅ @anthropic-ai/claude-agent-sdk (bundled)`);
|
|
164
|
+
|
|
165
|
+
// Summary
|
|
166
|
+
console.log("");
|
|
167
|
+
if (hasErrors) {
|
|
168
|
+
console.log(
|
|
169
|
+
" ⛔ Missing required dependencies. Install them before running openfleet.",
|
|
170
|
+
);
|
|
171
|
+
} else if (hasWarnings) {
|
|
172
|
+
console.log(
|
|
173
|
+
" \u2705 Core dependencies satisfied. Optional tools above unlock full functionality.",
|
|
174
|
+
);
|
|
175
|
+
} else {
|
|
176
|
+
console.log(" \u2705 All dependencies satisfied!");
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
console.log("");
|
|
180
|
+
console.log(" Get started:");
|
|
181
|
+
console.log(" openfleet --setup Interactive setup wizard");
|
|
182
|
+
console.log(" openfleet Start with existing config");
|
|
183
|
+
console.log(" openfleet --help See all options");
|
|
184
|
+
console.log("");
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
main();
|