@exla/rudder 0.0.0-stage → 3.4.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/LICENSE +100 -0
- package/README.md +733 -2
- package/assets/rudder.icns +0 -0
- package/assets/sounds/NOTICE.md +8 -0
- package/assets/sounds/ping.mp3 +0 -0
- package/dist/agent-attention.d.ts +5 -0
- package/dist/agent-attention.js +54 -0
- package/dist/agent-attention.js.map +1 -0
- package/dist/analytics.d.ts +36 -0
- package/dist/analytics.js +178 -0
- package/dist/analytics.js.map +1 -0
- package/dist/attach-session.d.ts +91 -0
- package/dist/attach-session.js +290 -0
- package/dist/attach-session.js.map +1 -0
- package/dist/auth.d.ts +36 -0
- package/dist/auth.js +392 -0
- package/dist/auth.js.map +1 -0
- package/dist/backends.d.ts +3 -0
- package/dist/backends.js +638 -0
- package/dist/backends.js.map +1 -0
- package/dist/board/board.css +1 -0
- package/dist/board/board.js +2 -0
- package/dist/board/daemon.d.ts +39 -0
- package/dist/board/daemon.js +1510 -0
- package/dist/board/daemon.js.map +1 -0
- package/dist/brain.d.ts +24 -0
- package/dist/brain.js +244 -0
- package/dist/brain.js.map +1 -0
- package/dist/bus.d.ts +9 -0
- package/dist/bus.js +23 -0
- package/dist/bus.js.map +1 -0
- package/dist/checkout-sync.d.ts +35 -0
- package/dist/checkout-sync.js +247 -0
- package/dist/checkout-sync.js.map +1 -0
- package/dist/cloud.d.ts +48 -0
- package/dist/cloud.js +4596 -0
- package/dist/cloud.js.map +1 -0
- package/dist/codex-binary.d.ts +12 -0
- package/dist/codex-binary.js +184 -0
- package/dist/codex-binary.js.map +1 -0
- package/dist/context-audit.d.ts +21 -0
- package/dist/context-audit.js +109 -0
- package/dist/context-audit.js.map +1 -0
- package/dist/daemon.d.ts +27 -0
- package/dist/daemon.js +203 -0
- package/dist/daemon.js.map +1 -0
- package/dist/effort.d.ts +9 -0
- package/dist/effort.js +72 -0
- package/dist/effort.js.map +1 -0
- package/dist/feedback.d.ts +46 -0
- package/dist/feedback.js +173 -0
- package/dist/feedback.js.map +1 -0
- package/dist/gc.d.ts +3 -0
- package/dist/gc.js +262 -0
- package/dist/gc.js.map +1 -0
- package/dist/git.d.ts +31 -0
- package/dist/git.js +455 -0
- package/dist/git.js.map +1 -0
- package/dist/goal.d.ts +33 -0
- package/dist/goal.js +95 -0
- package/dist/goal.js.map +1 -0
- package/dist/graph.d.ts +93 -0
- package/dist/graph.js +372 -0
- package/dist/graph.js.map +1 -0
- package/dist/handoff.d.ts +110 -0
- package/dist/handoff.js +565 -0
- package/dist/handoff.js.map +1 -0
- package/dist/improve/advisor.d.ts +10 -0
- package/dist/improve/advisor.js +115 -0
- package/dist/improve/advisor.js.map +1 -0
- package/dist/improve/collect.d.ts +49 -0
- package/dist/improve/collect.js +274 -0
- package/dist/improve/collect.js.map +1 -0
- package/dist/improve/gate.d.ts +17 -0
- package/dist/improve/gate.js +60 -0
- package/dist/improve/gate.js.map +1 -0
- package/dist/improve/index.d.ts +9 -0
- package/dist/improve/index.js +376 -0
- package/dist/improve/index.js.map +1 -0
- package/dist/improve/judge.d.ts +32 -0
- package/dist/improve/judge.js +114 -0
- package/dist/improve/judge.js.map +1 -0
- package/dist/improve/mine.d.ts +31 -0
- package/dist/improve/mine.js +192 -0
- package/dist/improve/mine.js.map +1 -0
- package/dist/improve/propose.d.ts +51 -0
- package/dist/improve/propose.js +150 -0
- package/dist/improve/propose.js.map +1 -0
- package/dist/improve/rank.d.ts +16 -0
- package/dist/improve/rank.js +49 -0
- package/dist/improve/rank.js.map +1 -0
- package/dist/improve/schedule.d.ts +1 -0
- package/dist/improve/schedule.js +95 -0
- package/dist/improve/schedule.js.map +1 -0
- package/dist/improve/ship.d.ts +25 -0
- package/dist/improve/ship.js +82 -0
- package/dist/improve/ship.js.map +1 -0
- package/dist/improve/state.d.ts +157 -0
- package/dist/improve/state.js +264 -0
- package/dist/improve/state.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +88 -0
- package/dist/index.js.map +1 -0
- package/dist/jj-binary.d.ts +36 -0
- package/dist/jj-binary.js +143 -0
- package/dist/jj-binary.js.map +1 -0
- package/dist/jj.d.ts +163 -0
- package/dist/jj.js +926 -0
- package/dist/jj.js.map +1 -0
- package/dist/logger.d.ts +22 -0
- package/dist/logger.js +110 -0
- package/dist/logger.js.map +1 -0
- package/dist/main.d.ts +3 -0
- package/dist/main.js +1366 -0
- package/dist/main.js.map +1 -0
- package/dist/migration.d.ts +82 -0
- package/dist/migration.js +198 -0
- package/dist/migration.js.map +1 -0
- package/dist/models.d.ts +9 -0
- package/dist/models.js +623 -0
- package/dist/models.js.map +1 -0
- package/dist/move-home.d.ts +82 -0
- package/dist/move-home.js +472 -0
- package/dist/move-home.js.map +1 -0
- package/dist/native/darwin-arm64/rudder-native +0 -0
- package/dist/native/darwin-x64/rudder-native +0 -0
- package/dist/native/linux-x64/rudder-native +0 -0
- package/dist/native-agents.d.ts +8 -0
- package/dist/native-agents.js +178 -0
- package/dist/native-agents.js.map +1 -0
- package/dist/native-binary.d.ts +4 -0
- package/dist/native-binary.js +140 -0
- package/dist/native-binary.js.map +1 -0
- package/dist/paste-bridge.d.ts +36 -0
- package/dist/paste-bridge.js +279 -0
- package/dist/paste-bridge.js.map +1 -0
- package/dist/plan-mode.d.ts +2 -0
- package/dist/plan-mode.js +22 -0
- package/dist/plan-mode.js.map +1 -0
- package/dist/planner.d.ts +27 -0
- package/dist/planner.js +587 -0
- package/dist/planner.js.map +1 -0
- package/dist/predict.d.ts +67 -0
- package/dist/predict.js +369 -0
- package/dist/predict.js.map +1 -0
- package/dist/report.d.ts +74 -0
- package/dist/report.js +412 -0
- package/dist/report.js.map +1 -0
- package/dist/rudder-md.d.ts +33 -0
- package/dist/rudder-md.js +142 -0
- package/dist/rudder-md.js.map +1 -0
- package/dist/run-manager.d.ts +62 -0
- package/dist/run-manager.js +1400 -0
- package/dist/run-manager.js.map +1 -0
- package/dist/scheduler.d.ts +128 -0
- package/dist/scheduler.js +955 -0
- package/dist/scheduler.js.map +1 -0
- package/dist/state.d.ts +127 -0
- package/dist/state.js +704 -0
- package/dist/state.js.map +1 -0
- package/dist/surfaces.d.ts +91 -0
- package/dist/surfaces.js +460 -0
- package/dist/surfaces.js.map +1 -0
- package/dist/task-summary.d.ts +30 -0
- package/dist/task-summary.js +472 -0
- package/dist/task-summary.js.map +1 -0
- package/dist/types.d.ts +492 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/dist/usage.d.ts +198 -0
- package/dist/usage.js +830 -0
- package/dist/usage.js.map +1 -0
- package/dist/util.d.ts +73 -0
- package/dist/util.js +399 -0
- package/dist/util.js.map +1 -0
- package/dist/version-check.d.ts +16 -0
- package/dist/version-check.js +269 -0
- package/dist/version-check.js.map +1 -0
- package/package.json +68 -4
- package/scripts/copy-native.mjs +89 -0
- package/scripts/postinstall.mjs +34 -0
|
@@ -0,0 +1,269 @@
|
|
|
1
|
+
import { spawn } from "node:child_process";
|
|
2
|
+
import fs from "node:fs";
|
|
3
|
+
import fsp from "node:fs/promises";
|
|
4
|
+
import os from "node:os";
|
|
5
|
+
import path from "node:path";
|
|
6
|
+
import { fileURLToPath } from "node:url";
|
|
7
|
+
const CACHE_TTL_MS = 6 * 60 * 60 * 1000; // 6 hours
|
|
8
|
+
const AUTO_UPDATE_TIMEOUT_MS = 1000;
|
|
9
|
+
const moduleDir = path.dirname(fileURLToPath(import.meta.url));
|
|
10
|
+
export const PACKAGE_NAME = "@exla/rudder";
|
|
11
|
+
// Rudder was published as @viraatdas/rudder until the move to the exla-ai org
|
|
12
|
+
// (3.4.0). Releases still publish that name too, so an old install updates to a
|
|
13
|
+
// build that knows the new one and then moves itself across.
|
|
14
|
+
export const LEGACY_PACKAGE_NAME = "@viraatdas/rudder";
|
|
15
|
+
function cachePath() {
|
|
16
|
+
const base = process.env.XDG_CACHE_HOME?.trim() || path.join(os.homedir(), ".cache");
|
|
17
|
+
return path.join(base, "rudder", "update-check.json");
|
|
18
|
+
}
|
|
19
|
+
export function compareSemver(a, b) {
|
|
20
|
+
const split = (v) => v
|
|
21
|
+
.split("-")[0]
|
|
22
|
+
.split(".")
|
|
23
|
+
.map((part) => Number.parseInt(part, 10) || 0);
|
|
24
|
+
const aa = split(a);
|
|
25
|
+
const bb = split(b);
|
|
26
|
+
for (let i = 0; i < 3; i++) {
|
|
27
|
+
const x = aa[i] ?? 0;
|
|
28
|
+
const y = bb[i] ?? 0;
|
|
29
|
+
if (x !== y)
|
|
30
|
+
return x < y ? -1 : 1;
|
|
31
|
+
}
|
|
32
|
+
return 0;
|
|
33
|
+
}
|
|
34
|
+
async function readPackageInfo() {
|
|
35
|
+
// Try package.json relative to compiled dist/, then to source src/.
|
|
36
|
+
const candidates = [
|
|
37
|
+
path.join(moduleDir, "..", "package.json"),
|
|
38
|
+
path.join(moduleDir, "..", "..", "package.json"),
|
|
39
|
+
];
|
|
40
|
+
for (const candidate of candidates) {
|
|
41
|
+
try {
|
|
42
|
+
const raw = await fsp.readFile(candidate, "utf8");
|
|
43
|
+
const parsed = JSON.parse(raw);
|
|
44
|
+
if ((parsed?.name === PACKAGE_NAME || parsed?.name === LEGACY_PACKAGE_NAME) && typeof parsed.version === "string") {
|
|
45
|
+
return { root: path.dirname(candidate), version: parsed.version, name: parsed.name };
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
catch {
|
|
49
|
+
// ignore
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
return null;
|
|
53
|
+
}
|
|
54
|
+
async function readPackageVersion() {
|
|
55
|
+
return (await readPackageInfo())?.version ?? null;
|
|
56
|
+
}
|
|
57
|
+
async function readCache() {
|
|
58
|
+
try {
|
|
59
|
+
const raw = await fsp.readFile(cachePath(), "utf8");
|
|
60
|
+
const parsed = JSON.parse(raw);
|
|
61
|
+
if (typeof parsed.latest === "string" && typeof parsed.checkedAt === "number") {
|
|
62
|
+
return { latest: parsed.latest, checkedAt: parsed.checkedAt };
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
catch {
|
|
66
|
+
// ignore
|
|
67
|
+
}
|
|
68
|
+
return null;
|
|
69
|
+
}
|
|
70
|
+
async function writeCache(latest) {
|
|
71
|
+
const file = cachePath();
|
|
72
|
+
try {
|
|
73
|
+
await fsp.mkdir(path.dirname(file), { recursive: true });
|
|
74
|
+
await fsp.writeFile(file, JSON.stringify({ latest, checkedAt: Date.now() }));
|
|
75
|
+
}
|
|
76
|
+
catch {
|
|
77
|
+
// ignore
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
async function fetchLatest(timeoutMs = 1500) {
|
|
81
|
+
const controller = new AbortController();
|
|
82
|
+
const timer = setTimeout(() => controller.abort(), timeoutMs);
|
|
83
|
+
try {
|
|
84
|
+
const res = await fetch(`https://registry.npmjs.org/${PACKAGE_NAME}/latest`, {
|
|
85
|
+
signal: controller.signal,
|
|
86
|
+
headers: { accept: "application/json" },
|
|
87
|
+
});
|
|
88
|
+
if (!res.ok)
|
|
89
|
+
return null;
|
|
90
|
+
const data = (await res.json());
|
|
91
|
+
return typeof data?.version === "string" ? data.version : null;
|
|
92
|
+
}
|
|
93
|
+
catch {
|
|
94
|
+
return null;
|
|
95
|
+
}
|
|
96
|
+
finally {
|
|
97
|
+
clearTimeout(timer);
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* Returns the latest published version if our local version is older, otherwise null.
|
|
102
|
+
* Cached for 6h on disk so startup doesn't hit the network every launch. Never throws.
|
|
103
|
+
* Disabled when RUDDER_DISABLE_UPDATE_CHECK is set.
|
|
104
|
+
*/
|
|
105
|
+
export async function getUpdateAvailable() {
|
|
106
|
+
if (process.env.RUDDER_DISABLE_UPDATE_CHECK)
|
|
107
|
+
return null;
|
|
108
|
+
const current = await readPackageVersion();
|
|
109
|
+
if (!current)
|
|
110
|
+
return null;
|
|
111
|
+
const cached = await readCache();
|
|
112
|
+
let latest = null;
|
|
113
|
+
if (cached && Date.now() - cached.checkedAt < CACHE_TTL_MS) {
|
|
114
|
+
latest = cached.latest;
|
|
115
|
+
}
|
|
116
|
+
else {
|
|
117
|
+
latest = await fetchLatest();
|
|
118
|
+
if (latest) {
|
|
119
|
+
await writeCache(latest);
|
|
120
|
+
}
|
|
121
|
+
else if (cached) {
|
|
122
|
+
latest = cached.latest;
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
if (!latest)
|
|
126
|
+
return null;
|
|
127
|
+
return compareSemver(current, latest) < 0 ? { current, latest } : null;
|
|
128
|
+
}
|
|
129
|
+
export function shouldAutoUpdateFromPackageRoot(packageRoot) {
|
|
130
|
+
const root = path.resolve(packageRoot);
|
|
131
|
+
if (process.env.RUDDER_DISABLE_UPDATE_CHECK || process.env.RUDDER_DISABLE_AUTO_UPDATE || process.env.RUDDER_SKIP_AUTO_UPDATE) {
|
|
132
|
+
return false;
|
|
133
|
+
}
|
|
134
|
+
if (process.env.CI) {
|
|
135
|
+
return false;
|
|
136
|
+
}
|
|
137
|
+
// Do not mutate a source checkout while developing Rudder locally.
|
|
138
|
+
if (fs.existsSync(path.join(root, ".git")) || fs.existsSync(path.join(root, "src", "main.ts"))) {
|
|
139
|
+
return false;
|
|
140
|
+
}
|
|
141
|
+
// `npx @exla/rudder@...` is already an ephemeral install; turning that into
|
|
142
|
+
// a global install is surprising and can fail under temp-directory permissions.
|
|
143
|
+
const normalized = root.split(path.sep).join("/");
|
|
144
|
+
if (normalized.includes("/_npx/") || normalized.includes("/.npm/_npx/")) {
|
|
145
|
+
return false;
|
|
146
|
+
}
|
|
147
|
+
return true;
|
|
148
|
+
}
|
|
149
|
+
export async function autoUpdateAndRerunIfNeeded(argv) {
|
|
150
|
+
const info = await readPackageInfo();
|
|
151
|
+
if (!info || !shouldAutoUpdateFromPackageRoot(info.root)) {
|
|
152
|
+
return false;
|
|
153
|
+
}
|
|
154
|
+
const latest = await fetchLatest(AUTO_UPDATE_TIMEOUT_MS);
|
|
155
|
+
if (latest && info.name === LEGACY_PACKAGE_NAME) {
|
|
156
|
+
return await moveToRenamedPackage(info.version, latest, argv);
|
|
157
|
+
}
|
|
158
|
+
if (!latest || compareSemver(info.version, latest) >= 0) {
|
|
159
|
+
if (latest) {
|
|
160
|
+
await writeCache(latest);
|
|
161
|
+
}
|
|
162
|
+
return false;
|
|
163
|
+
}
|
|
164
|
+
console.error(`rudder: updating ${info.version} -> ${latest}...`);
|
|
165
|
+
const installed = await installLatest(latest);
|
|
166
|
+
if (!installed.ok) {
|
|
167
|
+
// A version can be readable in the registry's packument seconds before every
|
|
168
|
+
// replica can resolve it for install. The updater sees the new number, npm
|
|
169
|
+
// says ETARGET, and the user gets a five-line npm error block for what is a
|
|
170
|
+
// publish that has not finished propagating. Name it and move on; nothing is
|
|
171
|
+
// cached on failure, so the next launch retries.
|
|
172
|
+
if (isUnpublishedYet(installed.output)) {
|
|
173
|
+
console.error(`rudder: ${latest} is not resolvable from the registry yet; staying on ${info.version}`);
|
|
174
|
+
}
|
|
175
|
+
else {
|
|
176
|
+
console.error(`rudder: auto-update failed; continuing with ${info.version}`);
|
|
177
|
+
const detail = installed.output.trim();
|
|
178
|
+
if (detail) {
|
|
179
|
+
console.error(detail);
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
return false;
|
|
183
|
+
}
|
|
184
|
+
await writeCache(latest);
|
|
185
|
+
console.error(`rudder: updated to ${latest}; restarting command...`);
|
|
186
|
+
process.exitCode = await rerunCurrentCommand(argv);
|
|
187
|
+
return true;
|
|
188
|
+
}
|
|
189
|
+
// Both packages install the same `rudder` bin, so the old one has to go first
|
|
190
|
+
// or npm refuses with EEXIST. When the new one will not install, the old
|
|
191
|
+
// version goes back so nobody is left without a `rudder`.
|
|
192
|
+
async function moveToRenamedPackage(current, latest, argv) {
|
|
193
|
+
console.error(`rudder: the package moved to ${PACKAGE_NAME}; switching this install over (${current} -> ${latest})...`);
|
|
194
|
+
await spawnCaptured("npm", ["uninstall", "-g", LEGACY_PACKAGE_NAME], { RUDDER_SKIP_AUTO_UPDATE: "1" });
|
|
195
|
+
const installed = await installLatest(latest);
|
|
196
|
+
if (!installed.ok) {
|
|
197
|
+
await spawnCaptured("npm", ["install", "-g", `${LEGACY_PACKAGE_NAME}@${current}`], { RUDDER_SKIP_AUTO_UPDATE: "1" });
|
|
198
|
+
console.error(`rudder: could not install ${PACKAGE_NAME}; staying on ${LEGACY_PACKAGE_NAME}@${current}`);
|
|
199
|
+
const detail = installed.output.trim();
|
|
200
|
+
if (detail) {
|
|
201
|
+
console.error(detail);
|
|
202
|
+
}
|
|
203
|
+
return false;
|
|
204
|
+
}
|
|
205
|
+
await writeCache(latest);
|
|
206
|
+
console.error(`rudder: now on ${PACKAGE_NAME}@${latest}; restarting command...`);
|
|
207
|
+
process.exitCode = await spawnExitCode("rudder", argv, { RUDDER_SKIP_AUTO_UPDATE: "1" });
|
|
208
|
+
return true;
|
|
209
|
+
}
|
|
210
|
+
async function installLatest(version) {
|
|
211
|
+
const result = await spawnCaptured("npm", ["install", "-g", `${PACKAGE_NAME}@${version}`], {
|
|
212
|
+
RUDDER_SKIP_AUTO_UPDATE: "1",
|
|
213
|
+
});
|
|
214
|
+
return { ok: result.code === 0, output: result.output };
|
|
215
|
+
}
|
|
216
|
+
/** npm's shape for "that version exists in the index but I cannot resolve it". */
|
|
217
|
+
export function isUnpublishedYet(npmOutput) {
|
|
218
|
+
return /\bETARGET\b/.test(npmOutput) || /\bnotarget\b/.test(npmOutput);
|
|
219
|
+
}
|
|
220
|
+
async function rerunCurrentCommand(argv) {
|
|
221
|
+
const entry = process.argv[1];
|
|
222
|
+
if (entry) {
|
|
223
|
+
const code = await spawnExitCode(process.execPath, [entry, ...argv], {
|
|
224
|
+
RUDDER_SKIP_AUTO_UPDATE: "1",
|
|
225
|
+
});
|
|
226
|
+
if (code !== 127) {
|
|
227
|
+
return code;
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
return await spawnExitCode("rudder", argv, { RUDDER_SKIP_AUTO_UPDATE: "1" });
|
|
231
|
+
}
|
|
232
|
+
/**
|
|
233
|
+
* Inherited stdio. The re-run path hands the terminal to the real dashboard,
|
|
234
|
+
* so this MUST NOT be swapped for the capturing variant: a captured TUI has no
|
|
235
|
+
* terminal to draw on.
|
|
236
|
+
*/
|
|
237
|
+
async function spawnExitCode(command, args, envPatch) {
|
|
238
|
+
return await new Promise((resolve) => {
|
|
239
|
+
const child = spawn(command, args, {
|
|
240
|
+
stdio: "inherit",
|
|
241
|
+
env: { ...process.env, ...envPatch },
|
|
242
|
+
});
|
|
243
|
+
child.on("error", () => resolve(127));
|
|
244
|
+
child.on("close", (code) => resolve(code ?? 1));
|
|
245
|
+
});
|
|
246
|
+
}
|
|
247
|
+
/**
|
|
248
|
+
* Run a command with its output CAPTURED rather than inherited, so the caller
|
|
249
|
+
* decides what the user sees. The updater runs before the TUI paints, and an
|
|
250
|
+
* inherited npm error block is indistinguishable from rudder itself failing.
|
|
251
|
+
*/
|
|
252
|
+
async function spawnCaptured(command, args, envPatch) {
|
|
253
|
+
return await new Promise((resolve) => {
|
|
254
|
+
let output = "";
|
|
255
|
+
const child = spawn(command, args, {
|
|
256
|
+
stdio: ["ignore", "pipe", "pipe"],
|
|
257
|
+
env: { ...process.env, ...envPatch },
|
|
258
|
+
});
|
|
259
|
+
child.stdout?.on("data", (chunk) => {
|
|
260
|
+
output += String(chunk);
|
|
261
|
+
});
|
|
262
|
+
child.stderr?.on("data", (chunk) => {
|
|
263
|
+
output += String(chunk);
|
|
264
|
+
});
|
|
265
|
+
child.on("error", () => resolve({ code: 127, output }));
|
|
266
|
+
child.on("close", (code) => resolve({ code: code ?? 1, output }));
|
|
267
|
+
});
|
|
268
|
+
}
|
|
269
|
+
//# sourceMappingURL=version-check.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"version-check.js","sourceRoot":"","sources":["../src/version-check.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,70 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@exla/rudder",
|
|
3
|
-
"version": "
|
|
4
|
-
"
|
|
5
|
-
"
|
|
6
|
-
|
|
3
|
+
"version": "3.4.0",
|
|
4
|
+
"description": "A TUI for managing coding agents: run Claude Code, Codex and opencode side by side, each in its own isolated jj workspace.",
|
|
5
|
+
"keywords": [
|
|
6
|
+
"tui",
|
|
7
|
+
"coding-agents",
|
|
8
|
+
"claude-code",
|
|
9
|
+
"codex",
|
|
10
|
+
"opencode",
|
|
11
|
+
"ai-agents",
|
|
12
|
+
"jujutsu",
|
|
13
|
+
"terminal",
|
|
14
|
+
"cli"
|
|
15
|
+
],
|
|
16
|
+
"license": "Elastic-2.0",
|
|
17
|
+
"homepage": "https://rudder.exla.ai",
|
|
18
|
+
"repository": {
|
|
19
|
+
"type": "git",
|
|
20
|
+
"url": "git+https://github.com/exla-ai/rudder.git"
|
|
21
|
+
},
|
|
22
|
+
"type": "module",
|
|
23
|
+
"bin": {
|
|
24
|
+
"rudder": "dist/index.js"
|
|
25
|
+
},
|
|
26
|
+
"scripts": {
|
|
27
|
+
"clean": "node -e \"require('fs').rmSync('dist',{recursive:true,force:true})\"",
|
|
28
|
+
"build": "npm run clean && tsc -p tsconfig.json && npm run build-board && npm run build-native && npm run copy-native && npm run chmod-cli",
|
|
29
|
+
"build-board": "esbuild src/board/ui/index.tsx --bundle --minify --format=esm --jsx=automatic --jsx-import-source=preact --outfile=dist/board/board.js && esbuild src/board/ui/board.css --bundle --minify --outfile=dist/board/board.css",
|
|
30
|
+
"build-native": "cargo build --release --manifest-path native/Cargo.toml",
|
|
31
|
+
"check": "tsc -p tsconfig.json --noEmit",
|
|
32
|
+
"test": "tsc -p tsconfig.json && npm run chmod-cli && node --test tests/*.test.mjs",
|
|
33
|
+
"test:tui": "node --test tests/tui/*.test.mjs",
|
|
34
|
+
"test:worker-scroll": "cargo test --manifest-path native/Cargo.toml top_origin_scroll_region_history_scrolls_like_terminal_scrollback && cargo test --manifest-path native/Cargo.toml worker_wheel && cargo test --manifest-path native/Cargo.toml wheel_scroll && cargo test --manifest-path native/Cargo.toml worker_page && cargo test --manifest-path native/Cargo.toml codex_alternate_screen_page_key",
|
|
35
|
+
"copy-native": "node scripts/copy-native.mjs",
|
|
36
|
+
"chmod-cli": "node -e \"require('fs').chmodSync('dist/index.js',0o755)\"",
|
|
37
|
+
"prepack": "npm run build",
|
|
38
|
+
"postinstall": "node scripts/postinstall.mjs",
|
|
39
|
+
"start": "node dist/index.js",
|
|
40
|
+
"test:tui:report": "rm -rf .tui-report tui-report.html && node --test --test-reporter=spec --test-reporter-destination=stdout --test-reporter=tui-integration-tests/reporter --test-reporter-destination=tui-report.html tests/tui/*.test.mjs",
|
|
41
|
+
"mutate:tui": "node tests/tui/mutate.mjs"
|
|
42
|
+
},
|
|
43
|
+
"files": [
|
|
44
|
+
"dist/",
|
|
45
|
+
"assets/",
|
|
46
|
+
"scripts/copy-native.mjs",
|
|
47
|
+
"scripts/postinstall.mjs",
|
|
48
|
+
"README.md",
|
|
49
|
+
"package.json"
|
|
50
|
+
],
|
|
51
|
+
"publishConfig": {
|
|
52
|
+
"access": "public"
|
|
53
|
+
},
|
|
54
|
+
"engines": {
|
|
55
|
+
"node": ">=22"
|
|
56
|
+
},
|
|
57
|
+
"devDependencies": {
|
|
58
|
+
"@types/node": "^22.15.3",
|
|
59
|
+
"@types/ws": "^8.5.13",
|
|
60
|
+
"esbuild": "^0.24.0",
|
|
61
|
+
"preact": "^10.25.0",
|
|
62
|
+
"preact-render-to-string": "^6.7.0",
|
|
63
|
+
"tui-integration-tests": "^0.6.1",
|
|
64
|
+
"typescript": "^5.8.3"
|
|
65
|
+
},
|
|
66
|
+
"dependencies": {
|
|
67
|
+
"@xterm/headless": "^6.0.0",
|
|
68
|
+
"ws": "^8.18.0"
|
|
69
|
+
}
|
|
70
|
+
}
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import fs from "node:fs";
|
|
3
|
+
import path from "node:path";
|
|
4
|
+
|
|
5
|
+
const nativeBinaryBase = "rudder-native";
|
|
6
|
+
const nativeBinaryName = process.platform === "win32" ? `${nativeBinaryBase}.exe` : nativeBinaryBase;
|
|
7
|
+
const platformKey = `${process.platform}-${process.arch}`;
|
|
8
|
+
const distNativeDir = path.join("dist", "native");
|
|
9
|
+
|
|
10
|
+
function copyExecutable(src, dest) {
|
|
11
|
+
fs.mkdirSync(path.dirname(dest), { recursive: true });
|
|
12
|
+
fs.copyFileSync(src, dest);
|
|
13
|
+
if (process.platform !== "win32") {
|
|
14
|
+
fs.chmodSync(dest, 0o755);
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
function copyCurrentBuild() {
|
|
19
|
+
const sources = [
|
|
20
|
+
path.join("target", "release", nativeBinaryName),
|
|
21
|
+
path.join("native", "target", "release", nativeBinaryName),
|
|
22
|
+
];
|
|
23
|
+
const src = sources.find((candidate) => fs.existsSync(candidate));
|
|
24
|
+
if (!src) {
|
|
25
|
+
return false;
|
|
26
|
+
}
|
|
27
|
+
copyExecutable(src, path.join(distNativeDir, platformKey, nativeBinaryName));
|
|
28
|
+
return true;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
function copyPrebuiltArtifacts() {
|
|
32
|
+
const root = process.env.RUDDER_NATIVE_PREBUILTS;
|
|
33
|
+
if (!root || !fs.existsSync(root)) {
|
|
34
|
+
return 0;
|
|
35
|
+
}
|
|
36
|
+
let copied = 0;
|
|
37
|
+
for (const entry of fs.readdirSync(root, { withFileTypes: true })) {
|
|
38
|
+
if (!entry.isDirectory()) {
|
|
39
|
+
continue;
|
|
40
|
+
}
|
|
41
|
+
const key = entry.name.replace(/^rudder-native-/, "");
|
|
42
|
+
const dir = path.join(root, entry.name);
|
|
43
|
+
const candidates = [
|
|
44
|
+
path.join(dir, "rudder-native"),
|
|
45
|
+
path.join(dir, "rudder-native.exe"),
|
|
46
|
+
path.join(dir, key, "rudder-native"),
|
|
47
|
+
path.join(dir, key, "rudder-native.exe"),
|
|
48
|
+
path.join(dir, "native-dist", key, "rudder-native"),
|
|
49
|
+
path.join(dir, "native-dist", key, "rudder-native.exe"),
|
|
50
|
+
];
|
|
51
|
+
const src = candidates.find((candidate) => fs.existsSync(candidate)) ?? findNestedNativeBinary(dir);
|
|
52
|
+
if (!src) {
|
|
53
|
+
continue;
|
|
54
|
+
}
|
|
55
|
+
const name = src.endsWith(".exe") ? "rudder-native.exe" : "rudder-native";
|
|
56
|
+
copyExecutable(src, path.join(distNativeDir, key, name));
|
|
57
|
+
copied += 1;
|
|
58
|
+
}
|
|
59
|
+
return copied;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
function findNestedNativeBinary(dir) {
|
|
63
|
+
const pending = [{ dir, depth: 0 }];
|
|
64
|
+
while (pending.length > 0) {
|
|
65
|
+
const current = pending.pop();
|
|
66
|
+
if (!current || current.depth > 4) {
|
|
67
|
+
continue;
|
|
68
|
+
}
|
|
69
|
+
for (const entry of fs.readdirSync(current.dir, { withFileTypes: true })) {
|
|
70
|
+
const full = path.join(current.dir, entry.name);
|
|
71
|
+
if (entry.isFile() && (entry.name === "rudder-native" || entry.name === "rudder-native.exe")) {
|
|
72
|
+
return full;
|
|
73
|
+
}
|
|
74
|
+
if (entry.isDirectory()) {
|
|
75
|
+
pending.push({ dir: full, depth: current.depth + 1 });
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
return undefined;
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
function removeLegacyFlatBinary() {
|
|
83
|
+
fs.rmSync(path.join(distNativeDir, "rudder-native"), { force: true });
|
|
84
|
+
fs.rmSync(path.join(distNativeDir, "rudder-native.exe"), { force: true });
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
copyCurrentBuild();
|
|
88
|
+
copyPrebuiltArtifacts();
|
|
89
|
+
removeLegacyFlatBinary();
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
// Sets jj (Jujutsu), Rudder's workspace engine, up at install time so
|
|
3
|
+
// `npm install -g @exla/rudder` is the only step. When jj is not on PATH it
|
|
4
|
+
// fetches jj's own prebuilt release (checksum-pinned in dist/jj-binary.js) into
|
|
5
|
+
// ~/.rudder/bin; Rudder puts that on PATH itself. The first `rudder` run does
|
|
6
|
+
// the same thing, so anything skipped here (no network, --ignore-scripts, npx)
|
|
7
|
+
// costs a few seconds later, never a failed install. Always exits 0.
|
|
8
|
+
|
|
9
|
+
const TAG = "[rudder postinstall]";
|
|
10
|
+
|
|
11
|
+
async function main() {
|
|
12
|
+
if (process.env.RUDDER_SKIP_POSTINSTALL) return;
|
|
13
|
+
// `sudo npm install -g` runs this as root, often with the user's HOME: a
|
|
14
|
+
// root-owned ~/.rudder would lock the user's own runs out of it. The first
|
|
15
|
+
// `rudder` run sets jj up as the user instead.
|
|
16
|
+
if (process.getuid?.() === 0) return;
|
|
17
|
+
let jj;
|
|
18
|
+
try {
|
|
19
|
+
jj = await import("../dist/jj-binary.js");
|
|
20
|
+
} catch {
|
|
21
|
+
return; // a source checkout before its first build
|
|
22
|
+
}
|
|
23
|
+
const source = await jj.ensureJjAvailable({ onInstall: (message) => console.log(`${TAG} ${message}`) });
|
|
24
|
+
if (!source) {
|
|
25
|
+
console.warn(`${TAG} jj was not set up now (${jj.managedJjInstallError()}); rudder will retry on its first run.`);
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
try {
|
|
30
|
+
await main();
|
|
31
|
+
} catch (err) {
|
|
32
|
+
console.warn(`${TAG} jj setup skipped: ${err && err.message ? err.message : err}`);
|
|
33
|
+
}
|
|
34
|
+
process.exit(0);
|