@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,82 @@
|
|
|
1
|
+
import { runCommand } from "../util.js";
|
|
2
|
+
import { execStep, tail } from "./state.js";
|
|
3
|
+
const MINUTE = 60 * 1000;
|
|
4
|
+
/**
|
|
5
|
+
* Ship a judged proposal. In `ship` autonomy this follows the repo release
|
|
6
|
+
* rule end to end: rebase onto the latest origin/main, re-typecheck, `npm
|
|
7
|
+
* version patch` (commit + tag vX.Y.Z), and push commit + tag together so the
|
|
8
|
+
* tag-driven release workflow publishes to npm. Non-force push: if main moved
|
|
9
|
+
* between the rebase and the push, this fails cleanly and is recorded as a
|
|
10
|
+
* push-conflict for the next cycle. In `propose` autonomy only the branch is
|
|
11
|
+
* pushed for human review.
|
|
12
|
+
*/
|
|
13
|
+
export async function shipProposal(params) {
|
|
14
|
+
const { settings, proposal } = params;
|
|
15
|
+
const cwd = proposal.worktree;
|
|
16
|
+
await assertAllowedRemote(settings);
|
|
17
|
+
if (settings.autonomy === "propose") {
|
|
18
|
+
const push = await runCommand("git", ["push", "-u", "origin", proposal.branch], {
|
|
19
|
+
cwd,
|
|
20
|
+
allowFailure: true,
|
|
21
|
+
});
|
|
22
|
+
if (push.code !== 0) {
|
|
23
|
+
return { status: "push-conflict", detail: tail(push.stderr || push.stdout, 800) };
|
|
24
|
+
}
|
|
25
|
+
return { status: "branch-pushed", branch: proposal.branch };
|
|
26
|
+
}
|
|
27
|
+
// Rebase onto the freshest main so the version bump reads the latest
|
|
28
|
+
// package.json (two winners in one cycle ship sequentially through here).
|
|
29
|
+
const fetch = await runCommand("git", ["fetch", "origin", "main"], { cwd, allowFailure: true });
|
|
30
|
+
if (fetch.code !== 0) {
|
|
31
|
+
return { status: "push-conflict", detail: `fetch failed: ${tail(fetch.stderr, 400)}` };
|
|
32
|
+
}
|
|
33
|
+
const rebase = await runCommand("git", ["rebase", "origin/main"], { cwd, allowFailure: true });
|
|
34
|
+
if (rebase.code !== 0) {
|
|
35
|
+
await runCommand("git", ["rebase", "--abort"], { cwd, allowFailure: true });
|
|
36
|
+
return { status: "push-conflict", detail: `rebase onto origin/main failed: ${tail(rebase.stderr, 800)}` };
|
|
37
|
+
}
|
|
38
|
+
// Cheap re-gate after the rebase; the full suites already passed pre-judge.
|
|
39
|
+
const recheck = await execStep({
|
|
40
|
+
command: "npm",
|
|
41
|
+
args: ["run", "check"],
|
|
42
|
+
cwd,
|
|
43
|
+
timeoutMs: 10 * MINUTE,
|
|
44
|
+
});
|
|
45
|
+
if (recheck.code !== 0) {
|
|
46
|
+
return { status: "push-conflict", detail: `post-rebase typecheck failed: ${tail(recheck.output, 800)}` };
|
|
47
|
+
}
|
|
48
|
+
const version = await runCommand("npm", ["version", "patch", "-m", `improve: ${proposal.finding.title} (v%s)`], { cwd, allowFailure: true });
|
|
49
|
+
if (version.code !== 0) {
|
|
50
|
+
return { status: "push-conflict", detail: `npm version patch failed: ${tail(version.stderr || version.stdout, 800)}` };
|
|
51
|
+
}
|
|
52
|
+
const tag = version.stdout.trim().split("\n").at(-1)?.trim() ?? "";
|
|
53
|
+
if (!/^v\d+\.\d+\.\d+$/.test(tag)) {
|
|
54
|
+
return { status: "push-conflict", detail: `unexpected npm version output: ${tail(version.stdout, 200)}` };
|
|
55
|
+
}
|
|
56
|
+
const push = await runCommand("git", ["push", "origin", `HEAD:main`, `refs/tags/${tag}`], {
|
|
57
|
+
cwd,
|
|
58
|
+
allowFailure: true,
|
|
59
|
+
});
|
|
60
|
+
if (push.code !== 0) {
|
|
61
|
+
// Undo the local tag so a retry next cycle does not collide with it.
|
|
62
|
+
await runCommand("git", ["tag", "-d", tag], { cwd, allowFailure: true });
|
|
63
|
+
return { status: "push-conflict", detail: `push failed: ${tail(push.stderr || push.stdout, 800)}` };
|
|
64
|
+
}
|
|
65
|
+
return { status: "shipped", version: tag };
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* The ship stage refuses to push anywhere but the configured rudder remote.
|
|
69
|
+
* This is the guard that keeps an unattended loop from ever pushing another
|
|
70
|
+
* project.
|
|
71
|
+
*/
|
|
72
|
+
async function assertAllowedRemote(settings) {
|
|
73
|
+
const remote = await runCommand("git", ["remote", "get-url", "origin"], {
|
|
74
|
+
cwd: settings.repoPath,
|
|
75
|
+
allowFailure: true,
|
|
76
|
+
});
|
|
77
|
+
const url = remote.stdout.trim();
|
|
78
|
+
if (remote.code !== 0 || !url.includes(settings.allowedRemote)) {
|
|
79
|
+
throw new Error(`refusing to ship: origin (${url || "missing"}) does not match improve.allowedRemote (${settings.allowedRemote})`);
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
//# sourceMappingURL=ship.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ship.js","sourceRoot":"","sources":["../../src/improve/ship.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
import type { RudderConfig } from "../types.js";
|
|
2
|
+
export declare function improveHome(): string;
|
|
3
|
+
export declare function watermarkPath(): string;
|
|
4
|
+
export declare function metricsPath(): string;
|
|
5
|
+
export declare function ledgerPath(): string;
|
|
6
|
+
export declare function reportsDir(): string;
|
|
7
|
+
export declare function logsDir(): string;
|
|
8
|
+
export declare function worktreesDir(): string;
|
|
9
|
+
export declare function cycleLockDir(): string;
|
|
10
|
+
export type ImproveAutonomy = "observe" | "propose" | "ship";
|
|
11
|
+
export type ImproveSettings = {
|
|
12
|
+
enabled: boolean;
|
|
13
|
+
autonomy: ImproveAutonomy;
|
|
14
|
+
budgetUsd: number;
|
|
15
|
+
maxFindings: number;
|
|
16
|
+
/** The rudder checkout the loop improves. */
|
|
17
|
+
repoPath: string;
|
|
18
|
+
/** Remote slug guard: ship only when `origin` matches. */
|
|
19
|
+
allowedRemote: string;
|
|
20
|
+
excludeProjects: string[];
|
|
21
|
+
minerModel: string;
|
|
22
|
+
judgeModel: string;
|
|
23
|
+
/**
|
|
24
|
+
* Advisor tool model for mining/judging calls (Anthropic advisor pattern:
|
|
25
|
+
* cheap executor + high-intelligence advisor). Empty string disables.
|
|
26
|
+
*/
|
|
27
|
+
advisorModel: string;
|
|
28
|
+
/** Model passed to the improvement agent CLI; empty = CLI default. */
|
|
29
|
+
workerModel: string;
|
|
30
|
+
agentTimeoutMs: number;
|
|
31
|
+
};
|
|
32
|
+
export declare const IMPROVE_DEFAULTS: {
|
|
33
|
+
autonomy: ImproveAutonomy;
|
|
34
|
+
budgetUsd: number;
|
|
35
|
+
maxFindings: number;
|
|
36
|
+
allowedRemote: string;
|
|
37
|
+
minerModel: string;
|
|
38
|
+
judgeModel: string;
|
|
39
|
+
advisorModel: string;
|
|
40
|
+
agentTimeoutMs: number;
|
|
41
|
+
};
|
|
42
|
+
export declare function resolveImproveSettings(config: RudderConfig, repoFallback: string): ImproveSettings;
|
|
43
|
+
export type SessionRecord = {
|
|
44
|
+
project: string;
|
|
45
|
+
repoRoot: string;
|
|
46
|
+
runId: string;
|
|
47
|
+
task: string;
|
|
48
|
+
backend: string;
|
|
49
|
+
model?: string;
|
|
50
|
+
effort?: string;
|
|
51
|
+
status: string;
|
|
52
|
+
createdAt: string;
|
|
53
|
+
updatedAt: string;
|
|
54
|
+
durationMs?: number;
|
|
55
|
+
steerCount: number;
|
|
56
|
+
autoSteerCount: number;
|
|
57
|
+
tokensIn: number;
|
|
58
|
+
tokensOut: number;
|
|
59
|
+
verifierSatisfied?: boolean;
|
|
60
|
+
verifierMissing?: string[];
|
|
61
|
+
mergeStatus?: string;
|
|
62
|
+
/** True when the run hit an integration conflict at ANY point, even one a
|
|
63
|
+
* resolver already fixed by collect time (see collect.ts runHadMergeConflict). */
|
|
64
|
+
hadMergeConflict?: boolean;
|
|
65
|
+
errorExcerpts: string[];
|
|
66
|
+
};
|
|
67
|
+
export type MetricsSnapshot = {
|
|
68
|
+
ts: string;
|
|
69
|
+
cycleId: string;
|
|
70
|
+
runsSeen: number;
|
|
71
|
+
failedRate: number;
|
|
72
|
+
cancelledRate: number;
|
|
73
|
+
steerRate: number;
|
|
74
|
+
mergeConflictRate: number;
|
|
75
|
+
verifierMissRate: number;
|
|
76
|
+
medianDurationMs: number;
|
|
77
|
+
totalTokensIn: number;
|
|
78
|
+
totalTokensOut: number;
|
|
79
|
+
};
|
|
80
|
+
export type FindingClass = "prompt" | "orchestration" | "ux" | "perf" | "crash" | "other";
|
|
81
|
+
export type Finding = {
|
|
82
|
+
id: string;
|
|
83
|
+
class: FindingClass;
|
|
84
|
+
title: string;
|
|
85
|
+
detail: string;
|
|
86
|
+
evidence: Array<{
|
|
87
|
+
project: string;
|
|
88
|
+
runId: string;
|
|
89
|
+
excerpt: string;
|
|
90
|
+
}>;
|
|
91
|
+
severity: number;
|
|
92
|
+
frequency: number;
|
|
93
|
+
suspectedSurfaces: string[];
|
|
94
|
+
score?: number;
|
|
95
|
+
};
|
|
96
|
+
export type LedgerStatus = "reported" | "banked" | "agent-failed" | "gated-out" | "judge-rejected" | "branch-pushed" | "push-conflict" | "shipped" | "outcome";
|
|
97
|
+
export type LedgerEntry = {
|
|
98
|
+
ts: string;
|
|
99
|
+
cycleId: string;
|
|
100
|
+
findingId: string;
|
|
101
|
+
titleKey: string;
|
|
102
|
+
title: string;
|
|
103
|
+
class: string;
|
|
104
|
+
status: LedgerStatus;
|
|
105
|
+
detail?: string;
|
|
106
|
+
version?: string;
|
|
107
|
+
branch?: string;
|
|
108
|
+
targetMetric?: string;
|
|
109
|
+
metricAtShip?: number;
|
|
110
|
+
outcome?: "confirmed" | "no-effect" | "regressed";
|
|
111
|
+
};
|
|
112
|
+
export declare function titleKey(title: string): string;
|
|
113
|
+
export declare function appendJsonl(filePath: string, value: unknown): Promise<void>;
|
|
114
|
+
export declare function readJsonl<T>(filePath: string): Promise<T[]>;
|
|
115
|
+
/**
|
|
116
|
+
* Values are epoch millis going forward; string entries (ISO or millis
|
|
117
|
+
* strings) are legacy formats from before the watermark was normalized, read
|
|
118
|
+
* through collect.ts watermarkValueMs.
|
|
119
|
+
*/
|
|
120
|
+
export type Watermark = {
|
|
121
|
+
version: 1;
|
|
122
|
+
projects: Record<string, string | number>;
|
|
123
|
+
};
|
|
124
|
+
export declare function loadWatermark(): Promise<Watermark>;
|
|
125
|
+
export declare function saveWatermark(mark: Watermark): Promise<void>;
|
|
126
|
+
export declare function acquireCycleLock(): Promise<boolean>;
|
|
127
|
+
export declare function releaseCycleLock(): Promise<void>;
|
|
128
|
+
export declare const AGENT_RUN_FLAT_USD = 0.75;
|
|
129
|
+
export declare class SpendMeter {
|
|
130
|
+
private readonly budgetUsd;
|
|
131
|
+
private spent;
|
|
132
|
+
constructor(budgetUsd: number);
|
|
133
|
+
addModelCall(model: string, inChars: number, outChars: number): void;
|
|
134
|
+
/** Exact token accounting (used when the API reports usage.iterations). */
|
|
135
|
+
addModelTokens(model: string, inputTokens: number, outputTokens: number): void;
|
|
136
|
+
addFlat(usd: number): void;
|
|
137
|
+
spentUsd(): number;
|
|
138
|
+
remainingUsd(): number;
|
|
139
|
+
/** True when there is room for at least `usd` more estimated spend. */
|
|
140
|
+
canAfford(usd: number): boolean;
|
|
141
|
+
}
|
|
142
|
+
export type StepResult = {
|
|
143
|
+
code: number;
|
|
144
|
+
timedOut: boolean;
|
|
145
|
+
output: string;
|
|
146
|
+
};
|
|
147
|
+
export declare function execStep(params: {
|
|
148
|
+
command: string;
|
|
149
|
+
args: string[];
|
|
150
|
+
cwd: string;
|
|
151
|
+
timeoutMs: number;
|
|
152
|
+
stdin?: string;
|
|
153
|
+
env?: NodeJS.ProcessEnv;
|
|
154
|
+
logFile?: string;
|
|
155
|
+
}): Promise<StepResult>;
|
|
156
|
+
export declare function tail(text: string, maxChars: number): string;
|
|
157
|
+
export declare function fileExists(filePath: string): Promise<boolean>;
|
|
@@ -0,0 +1,264 @@
|
|
|
1
|
+
import path from "node:path";
|
|
2
|
+
import { promises as fs } from "node:fs";
|
|
3
|
+
import { spawn } from "node:child_process";
|
|
4
|
+
import { commandEnv, ensureDir, pathExists, readJson, rudderHome, writeJson } from "../util.js";
|
|
5
|
+
// ---------------------------------------------------------------------------
|
|
6
|
+
// The continual improvement loop's on-disk state lives under ~/.rudder/improve.
|
|
7
|
+
// Everything here is append-only JSONL or atomic JSON via writeJson, matching
|
|
8
|
+
// the repo persistence conventions. See docs/continual-improvement.md.
|
|
9
|
+
// ---------------------------------------------------------------------------
|
|
10
|
+
export function improveHome() {
|
|
11
|
+
return path.join(rudderHome(), "improve");
|
|
12
|
+
}
|
|
13
|
+
export function watermarkPath() {
|
|
14
|
+
return path.join(improveHome(), "watermark.json");
|
|
15
|
+
}
|
|
16
|
+
export function metricsPath() {
|
|
17
|
+
return path.join(improveHome(), "metrics.jsonl");
|
|
18
|
+
}
|
|
19
|
+
export function ledgerPath() {
|
|
20
|
+
return path.join(improveHome(), "ledger.jsonl");
|
|
21
|
+
}
|
|
22
|
+
export function reportsDir() {
|
|
23
|
+
return path.join(improveHome(), "reports");
|
|
24
|
+
}
|
|
25
|
+
export function logsDir() {
|
|
26
|
+
return path.join(improveHome(), "logs");
|
|
27
|
+
}
|
|
28
|
+
export function worktreesDir() {
|
|
29
|
+
return path.join(improveHome(), "worktrees");
|
|
30
|
+
}
|
|
31
|
+
export function cycleLockDir() {
|
|
32
|
+
return path.join(improveHome(), "cycle.lock");
|
|
33
|
+
}
|
|
34
|
+
export const IMPROVE_DEFAULTS = {
|
|
35
|
+
// The loop may prepare a complete, reviewed branch by default, but publishing
|
|
36
|
+
// a globally installed CLI is an explicit trust decision. Users who want the
|
|
37
|
+
// old unattended behavior can opt in with `improve.autonomy: "ship"`.
|
|
38
|
+
autonomy: "propose",
|
|
39
|
+
budgetUsd: 5,
|
|
40
|
+
maxFindings: 3,
|
|
41
|
+
allowedRemote: "exla-ai/rudder",
|
|
42
|
+
minerModel: "claude-sonnet-4-6",
|
|
43
|
+
judgeModel: "claude-sonnet-4-6",
|
|
44
|
+
advisorModel: "claude-fable-5",
|
|
45
|
+
agentTimeoutMs: 25 * 60 * 1000,
|
|
46
|
+
};
|
|
47
|
+
export function resolveImproveSettings(config, repoFallback) {
|
|
48
|
+
const raw = config.improve ?? {};
|
|
49
|
+
const envDisabled = process.env.RUDDER_IMPROVE === "0";
|
|
50
|
+
return {
|
|
51
|
+
enabled: !envDisabled && raw.enabled !== false,
|
|
52
|
+
autonomy: raw.autonomy ?? IMPROVE_DEFAULTS.autonomy,
|
|
53
|
+
budgetUsd: raw.budgetUsd ?? IMPROVE_DEFAULTS.budgetUsd,
|
|
54
|
+
maxFindings: raw.maxFindings ?? IMPROVE_DEFAULTS.maxFindings,
|
|
55
|
+
repoPath: raw.repoPath ?? repoFallback,
|
|
56
|
+
allowedRemote: raw.allowedRemote ?? IMPROVE_DEFAULTS.allowedRemote,
|
|
57
|
+
excludeProjects: raw.excludeProjects ?? [],
|
|
58
|
+
minerModel: raw.minerModel ?? IMPROVE_DEFAULTS.minerModel,
|
|
59
|
+
judgeModel: raw.judgeModel ?? IMPROVE_DEFAULTS.judgeModel,
|
|
60
|
+
advisorModel: raw.advisorModel ?? IMPROVE_DEFAULTS.advisorModel,
|
|
61
|
+
workerModel: raw.workerModel ?? "",
|
|
62
|
+
agentTimeoutMs: raw.agentTimeoutMs ?? IMPROVE_DEFAULTS.agentTimeoutMs,
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
export function titleKey(title) {
|
|
66
|
+
return title
|
|
67
|
+
.toLowerCase()
|
|
68
|
+
.replace(/[^a-z0-9 ]+/g, "")
|
|
69
|
+
.split(/\s+/)
|
|
70
|
+
.filter(Boolean)
|
|
71
|
+
.slice(0, 8)
|
|
72
|
+
.join("-");
|
|
73
|
+
}
|
|
74
|
+
// ---------------------------------------------------------------------------
|
|
75
|
+
// JSONL helpers
|
|
76
|
+
// ---------------------------------------------------------------------------
|
|
77
|
+
export async function appendJsonl(filePath, value) {
|
|
78
|
+
await ensureDir(path.dirname(filePath));
|
|
79
|
+
await fs.appendFile(filePath, `${JSON.stringify(value)}\n`, "utf8");
|
|
80
|
+
}
|
|
81
|
+
export async function readJsonl(filePath) {
|
|
82
|
+
try {
|
|
83
|
+
const raw = await fs.readFile(filePath, "utf8");
|
|
84
|
+
const out = [];
|
|
85
|
+
for (const line of raw.split("\n")) {
|
|
86
|
+
const trimmed = line.trim();
|
|
87
|
+
if (!trimmed)
|
|
88
|
+
continue;
|
|
89
|
+
try {
|
|
90
|
+
out.push(JSON.parse(trimmed));
|
|
91
|
+
}
|
|
92
|
+
catch {
|
|
93
|
+
// skip torn/corrupt lines; the files are append-only diagnostics
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
return out;
|
|
97
|
+
}
|
|
98
|
+
catch {
|
|
99
|
+
return [];
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
export async function loadWatermark() {
|
|
103
|
+
const existing = await readJson(watermarkPath());
|
|
104
|
+
if (existing?.version === 1 && existing.projects) {
|
|
105
|
+
return existing;
|
|
106
|
+
}
|
|
107
|
+
return { version: 1, projects: {} };
|
|
108
|
+
}
|
|
109
|
+
export async function saveWatermark(mark) {
|
|
110
|
+
await ensureDir(improveHome());
|
|
111
|
+
await writeJson(watermarkPath(), mark);
|
|
112
|
+
}
|
|
113
|
+
// ---------------------------------------------------------------------------
|
|
114
|
+
// Single-instance cycle lock (mkdir lock, stale takeover), the same shape as
|
|
115
|
+
// .rudder/integrate.lock. Not reentrant.
|
|
116
|
+
// ---------------------------------------------------------------------------
|
|
117
|
+
const LOCK_STALE_MS = 6 * 60 * 60 * 1000;
|
|
118
|
+
export async function acquireCycleLock() {
|
|
119
|
+
await ensureDir(improveHome());
|
|
120
|
+
const lock = cycleLockDir();
|
|
121
|
+
try {
|
|
122
|
+
await fs.mkdir(lock);
|
|
123
|
+
await fs.writeFile(path.join(lock, "pid"), String(process.pid), "utf8");
|
|
124
|
+
return true;
|
|
125
|
+
}
|
|
126
|
+
catch {
|
|
127
|
+
try {
|
|
128
|
+
const stat = await fs.stat(lock);
|
|
129
|
+
if (Date.now() - stat.mtimeMs > LOCK_STALE_MS) {
|
|
130
|
+
await fs.rm(lock, { recursive: true, force: true });
|
|
131
|
+
await fs.mkdir(lock);
|
|
132
|
+
await fs.writeFile(path.join(lock, "pid"), String(process.pid), "utf8");
|
|
133
|
+
return true;
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
catch {
|
|
137
|
+
// fall through: someone else holds it
|
|
138
|
+
}
|
|
139
|
+
return false;
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
export async function releaseCycleLock() {
|
|
143
|
+
await fs.rm(cycleLockDir(), { recursive: true, force: true });
|
|
144
|
+
}
|
|
145
|
+
// ---------------------------------------------------------------------------
|
|
146
|
+
// Spend meter: a coarse budget guardrail, not accounting. Model calls are
|
|
147
|
+
// estimated at chars/4 tokens against a small price table; agent runs are a
|
|
148
|
+
// flat estimate because the CLI's own auth (subscription) hides real cost.
|
|
149
|
+
// ---------------------------------------------------------------------------
|
|
150
|
+
const PRICE_PER_MTOK = [
|
|
151
|
+
{ match: /haiku/i, inUsd: 1, outUsd: 5 },
|
|
152
|
+
{ match: /sonnet/i, inUsd: 3, outUsd: 15 },
|
|
153
|
+
{ match: /opus|fable/i, inUsd: 5, outUsd: 25 },
|
|
154
|
+
];
|
|
155
|
+
export const AGENT_RUN_FLAT_USD = 0.75;
|
|
156
|
+
export class SpendMeter {
|
|
157
|
+
budgetUsd;
|
|
158
|
+
spent = 0;
|
|
159
|
+
constructor(budgetUsd) {
|
|
160
|
+
this.budgetUsd = budgetUsd;
|
|
161
|
+
}
|
|
162
|
+
addModelCall(model, inChars, outChars) {
|
|
163
|
+
this.addModelTokens(model, inChars / 4, outChars / 4);
|
|
164
|
+
}
|
|
165
|
+
/** Exact token accounting (used when the API reports usage.iterations). */
|
|
166
|
+
addModelTokens(model, inputTokens, outputTokens) {
|
|
167
|
+
const price = PRICE_PER_MTOK.find((p) => p.match.test(model)) ?? PRICE_PER_MTOK[1];
|
|
168
|
+
this.spent += (inputTokens / 1_000_000) * price.inUsd + (outputTokens / 1_000_000) * price.outUsd;
|
|
169
|
+
}
|
|
170
|
+
addFlat(usd) {
|
|
171
|
+
this.spent += usd;
|
|
172
|
+
}
|
|
173
|
+
spentUsd() {
|
|
174
|
+
return this.spent;
|
|
175
|
+
}
|
|
176
|
+
remainingUsd() {
|
|
177
|
+
return Math.max(0, this.budgetUsd - this.spent);
|
|
178
|
+
}
|
|
179
|
+
/** True when there is room for at least `usd` more estimated spend. */
|
|
180
|
+
canAfford(usd) {
|
|
181
|
+
return this.spent + usd <= this.budgetUsd;
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
export async function execStep(params) {
|
|
185
|
+
return await new Promise((resolve) => {
|
|
186
|
+
let settled = false;
|
|
187
|
+
let timedOut = false;
|
|
188
|
+
let output = "";
|
|
189
|
+
const finish = (code) => {
|
|
190
|
+
if (settled)
|
|
191
|
+
return;
|
|
192
|
+
settled = true;
|
|
193
|
+
if (params.logFile) {
|
|
194
|
+
void ensureDir(path.dirname(params.logFile)).then(() => fs.appendFile(params.logFile, `\n===== ${params.command} ${params.args.join(" ")} (exit ${code}${timedOut ? ", timed out" : ""}) =====\n${output}`, "utf8"));
|
|
195
|
+
}
|
|
196
|
+
resolve({ code, timedOut, output });
|
|
197
|
+
};
|
|
198
|
+
let child;
|
|
199
|
+
try {
|
|
200
|
+
child = spawn(params.command, params.args, {
|
|
201
|
+
cwd: params.cwd,
|
|
202
|
+
env: commandEnv(params.env),
|
|
203
|
+
stdio: [params.stdin === undefined ? "ignore" : "pipe", "pipe", "pipe"],
|
|
204
|
+
});
|
|
205
|
+
}
|
|
206
|
+
catch (error) {
|
|
207
|
+
output = String(error);
|
|
208
|
+
finish(127);
|
|
209
|
+
return;
|
|
210
|
+
}
|
|
211
|
+
const timer = setTimeout(() => {
|
|
212
|
+
timedOut = true;
|
|
213
|
+
try {
|
|
214
|
+
child.kill("SIGTERM");
|
|
215
|
+
setTimeout(() => {
|
|
216
|
+
try {
|
|
217
|
+
child.kill("SIGKILL");
|
|
218
|
+
}
|
|
219
|
+
catch {
|
|
220
|
+
// already gone
|
|
221
|
+
}
|
|
222
|
+
}, 5000).unref();
|
|
223
|
+
}
|
|
224
|
+
catch {
|
|
225
|
+
// already gone
|
|
226
|
+
}
|
|
227
|
+
}, params.timeoutMs);
|
|
228
|
+
child.stdout?.setEncoding("utf8");
|
|
229
|
+
child.stderr?.setEncoding("utf8");
|
|
230
|
+
child.stdout?.on("data", (chunk) => {
|
|
231
|
+
output += chunk;
|
|
232
|
+
});
|
|
233
|
+
child.stderr?.on("data", (chunk) => {
|
|
234
|
+
output += chunk;
|
|
235
|
+
});
|
|
236
|
+
child.on("error", (error) => {
|
|
237
|
+
clearTimeout(timer);
|
|
238
|
+
output += `\n${String(error)}`;
|
|
239
|
+
finish(127);
|
|
240
|
+
});
|
|
241
|
+
child.on("close", (code) => {
|
|
242
|
+
clearTimeout(timer);
|
|
243
|
+
finish(timedOut ? 124 : (code ?? 1));
|
|
244
|
+
});
|
|
245
|
+
if (params.stdin !== undefined) {
|
|
246
|
+
try {
|
|
247
|
+
child.stdin?.write(params.stdin);
|
|
248
|
+
child.stdin?.end();
|
|
249
|
+
}
|
|
250
|
+
catch {
|
|
251
|
+
// child error handler will fire
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
});
|
|
255
|
+
}
|
|
256
|
+
export function tail(text, maxChars) {
|
|
257
|
+
if (text.length <= maxChars)
|
|
258
|
+
return text;
|
|
259
|
+
return `…${text.slice(text.length - maxChars)}`;
|
|
260
|
+
}
|
|
261
|
+
export async function fileExists(filePath) {
|
|
262
|
+
return await pathExists(filePath);
|
|
263
|
+
}
|
|
264
|
+
//# sourceMappingURL=state.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"state.js","sourceRoot":"","sources":["../../src/improve/state.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,QAAQ,IAAI,EAAE,EAAE,MAAM,SAAS,CAAC;AACzC,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAC3C,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,UAAU,EAAE,QAAQ,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAGhG,8EAA8E;AAC9E,gFAAgF;AAChF,8EAA8E;AAC9E,uEAAuE;AACvE,8EAA8E;AAE9E,MAAM,UAAU,WAAW;IACzB,OAAO,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,EAAE,SAAS,CAAC,CAAC;AAC5C,CAAC;AAED,MAAM,UAAU,aAAa;IAC3B,OAAO,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,gBAAgB,CAAC,CAAC;AACpD,CAAC;AAED,MAAM,UAAU,WAAW;IACzB,OAAO,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,eAAe,CAAC,CAAC;AACnD,CAAC;AAED,MAAM,UAAU,UAAU;IACxB,OAAO,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,cAAc,CAAC,CAAC;AAClD,CAAC;AAED,MAAM,UAAU,UAAU;IACxB,OAAO,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,SAAS,CAAC,CAAC;AAC7C,CAAC;AAED,MAAM,UAAU,OAAO;IACrB,OAAO,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,MAAM,CAAC,CAAC;AAC1C,CAAC;AAED,MAAM,UAAU,YAAY;IAC1B,OAAO,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,WAAW,CAAC,CAAC;AAC/C,CAAC;AAED,MAAM,UAAU,YAAY;IAC1B,OAAO,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,YAAY,CAAC,CAAC;AAChD,CAAC;AA8BD,MAAM,CAAC,MAAM,gBAAgB,GAAG;IAC9B,8EAA8E;IAC9E,6EAA6E;IAC7E,sEAAsE;IACtE,QAAQ,EAAE,SAA4B;IACtC,SAAS,EAAE,CAAC;IACZ,WAAW,EAAE,CAAC;IACd,aAAa,EAAE,gBAAgB;IAC/B,UAAU,EAAE,mBAAmB;IAC/B,UAAU,EAAE,mBAAmB;IAC/B,YAAY,EAAE,gBAAgB;IAC9B,cAAc,EAAE,EAAE,GAAG,EAAE,GAAG,IAAI;CAC/B,CAAC;AAEF,MAAM,UAAU,sBAAsB,CAAC,MAAoB,EAAE,YAAoB;IAC/E,MAAM,GAAG,GAAG,MAAM,CAAC,OAAO,IAAI,EAAE,CAAC;IACjC,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,CAAC,cAAc,KAAK,GAAG,CAAC;IACvD,OAAO;QACL,OAAO,EAAE,CAAC,WAAW,IAAI,GAAG,CAAC,OAAO,KAAK,KAAK;QAC9C,QAAQ,EAAE,GAAG,CAAC,QAAQ,IAAI,gBAAgB,CAAC,QAAQ;QACnD,SAAS,EAAE,GAAG,CAAC,SAAS,IAAI,gBAAgB,CAAC,SAAS;QACtD,WAAW,EAAE,GAAG,CAAC,WAAW,IAAI,gBAAgB,CAAC,WAAW;QAC5D,QAAQ,EAAE,GAAG,CAAC,QAAQ,IAAI,YAAY;QACtC,aAAa,EAAE,GAAG,CAAC,aAAa,IAAI,gBAAgB,CAAC,aAAa;QAClE,eAAe,EAAE,GAAG,CAAC,eAAe,IAAI,EAAE;QAC1C,UAAU,EAAE,GAAG,CAAC,UAAU,IAAI,gBAAgB,CAAC,UAAU;QACzD,UAAU,EAAE,GAAG,CAAC,UAAU,IAAI,gBAAgB,CAAC,UAAU;QACzD,YAAY,EAAE,GAAG,CAAC,YAAY,IAAI,gBAAgB,CAAC,YAAY;QAC/D,WAAW,EAAE,GAAG,CAAC,WAAW,IAAI,EAAE;QAClC,cAAc,EAAE,GAAG,CAAC,cAAc,IAAI,gBAAgB,CAAC,cAAc;KACtE,CAAC;AACJ,CAAC;AAkFD,MAAM,UAAU,QAAQ,CAAC,KAAa;IACpC,OAAO,KAAK;SACT,WAAW,EAAE;SACb,OAAO,CAAC,cAAc,EAAE,EAAE,CAAC;SAC3B,KAAK,CAAC,KAAK,CAAC;SACZ,MAAM,CAAC,OAAO,CAAC;SACf,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;SACX,IAAI,CAAC,GAAG,CAAC,CAAC;AACf,CAAC;AAED,8EAA8E;AAC9E,gBAAgB;AAChB,8EAA8E;AAE9E,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,QAAgB,EAAE,KAAc;IAChE,MAAM,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC;IACxC,MAAM,EAAE,CAAC,UAAU,CAAC,QAAQ,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;AACtE,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,SAAS,CAAI,QAAgB;IACjD,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;QAChD,MAAM,GAAG,GAAQ,EAAE,CAAC;QACpB,KAAK,MAAM,IAAI,IAAI,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;YACnC,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;YAC5B,IAAI,CAAC,OAAO;gBAAE,SAAS;YACvB,IAAI,CAAC;gBACH,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAM,CAAC,CAAC;YACrC,CAAC;YAAC,MAAM,CAAC;gBACP,iEAAiE;YACnE,CAAC;QACH,CAAC;QACD,OAAO,GAAG,CAAC;IACb,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAaD,MAAM,CAAC,KAAK,UAAU,aAAa;IACjC,MAAM,QAAQ,GAAG,MAAM,QAAQ,CAAY,aAAa,EAAE,CAAC,CAAC;IAC5D,IAAI,QAAQ,EAAE,OAAO,KAAK,CAAC,IAAI,QAAQ,CAAC,QAAQ,EAAE,CAAC;QACjD,OAAO,QAAQ,CAAC;IAClB,CAAC;IACD,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC;AACtC,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,IAAe;IACjD,MAAM,SAAS,CAAC,WAAW,EAAE,CAAC,CAAC;IAC/B,MAAM,SAAS,CAAC,aAAa,EAAE,EAAE,IAAI,CAAC,CAAC;AACzC,CAAC;AAED,8EAA8E;AAC9E,6EAA6E;AAC7E,yCAAyC;AACzC,8EAA8E;AAE9E,MAAM,aAAa,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;AAEzC,MAAM,CAAC,KAAK,UAAU,gBAAgB;IACpC,MAAM,SAAS,CAAC,WAAW,EAAE,CAAC,CAAC;IAC/B,MAAM,IAAI,GAAG,YAAY,EAAE,CAAC;IAC5B,IAAI,CAAC;QACH,MAAM,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACrB,MAAM,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,CAAC;QACxE,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,MAAM,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACjC,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,OAAO,GAAG,aAAa,EAAE,CAAC;gBAC9C,MAAM,EAAE,CAAC,EAAE,CAAC,IAAI,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;gBACpD,MAAM,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;gBACrB,MAAM,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,CAAC;gBACxE,OAAO,IAAI,CAAC;YACd,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,sCAAsC;QACxC,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,gBAAgB;IACpC,MAAM,EAAE,CAAC,EAAE,CAAC,YAAY,EAAE,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;AAChE,CAAC;AAED,8EAA8E;AAC9E,0EAA0E;AAC1E,4EAA4E;AAC5E,2EAA2E;AAC3E,8EAA8E;AAE9E,MAAM,cAAc,GAA4D;IAC9E,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE;IACxC,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE;IAC1C,EAAE,KAAK,EAAE,aAAa,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE;CAC/C,CAAC;AAEF,MAAM,CAAC,MAAM,kBAAkB,GAAG,IAAI,CAAC;AAEvC,MAAM,OAAO,UAAU;IAEQ;IADrB,KAAK,GAAG,CAAC,CAAC;IAClB,YAA6B,SAAiB;QAAjB,cAAS,GAAT,SAAS,CAAQ;IAAG,CAAC;IAElD,YAAY,CAAC,KAAa,EAAE,OAAe,EAAE,QAAgB;QAC3D,IAAI,CAAC,cAAc,CAAC,KAAK,EAAE,OAAO,GAAG,CAAC,EAAE,QAAQ,GAAG,CAAC,CAAC,CAAC;IACxD,CAAC;IAED,2EAA2E;IAC3E,cAAc,CAAC,KAAa,EAAE,WAAmB,EAAE,YAAoB;QACrE,MAAM,KAAK,GAAG,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,cAAc,CAAC,CAAC,CAAC,CAAC;QACnF,IAAI,CAAC,KAAK,IAAI,CAAC,WAAW,GAAG,SAAS,CAAC,GAAG,KAAK,CAAC,KAAK,GAAG,CAAC,YAAY,GAAG,SAAS,CAAC,GAAG,KAAK,CAAC,MAAM,CAAC;IACpG,CAAC;IAED,OAAO,CAAC,GAAW;QACjB,IAAI,CAAC,KAAK,IAAI,GAAG,CAAC;IACpB,CAAC;IAED,QAAQ;QACN,OAAO,IAAI,CAAC,KAAK,CAAC;IACpB,CAAC;IAED,YAAY;QACV,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC;IAClD,CAAC;IAED,uEAAuE;IACvE,SAAS,CAAC,GAAW;QACnB,OAAO,IAAI,CAAC,KAAK,GAAG,GAAG,IAAI,IAAI,CAAC,SAAS,CAAC;IAC5C,CAAC;CACF;AASD,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAC,MAQ9B;IACC,OAAO,MAAM,IAAI,OAAO,CAAa,CAAC,OAAO,EAAE,EAAE;QAC/C,IAAI,OAAO,GAAG,KAAK,CAAC;QACpB,IAAI,QAAQ,GAAG,KAAK,CAAC;QACrB,IAAI,MAAM,GAAG,EAAE,CAAC;QAChB,MAAM,MAAM,GAAG,CAAC,IAAY,EAAE,EAAE;YAC9B,IAAI,OAAO;gBAAE,OAAO;YACpB,OAAO,GAAG,IAAI,CAAC;YACf,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;gBACnB,KAAK,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,CACrD,EAAE,CAAC,UAAU,CACX,MAAM,CAAC,OAAiB,EACxB,WAAW,MAAM,CAAC,OAAO,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,UAAU,IAAI,GAAG,QAAQ,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,YAAY,MAAM,EAAE,EACpH,MAAM,CACP,CACF,CAAC;YACJ,CAAC;YACD,OAAO,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC,CAAC;QACtC,CAAC,CAAC;QACF,IAAI,KAAK,CAAC;QACV,IAAI,CAAC;YACH,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,IAAI,EAAE;gBACzC,GAAG,EAAE,MAAM,CAAC,GAAG;gBACf,GAAG,EAAE,UAAU,CAAC,MAAM,CAAC,GAAG,CAAC;gBAC3B,KAAK,EAAE,CAAC,MAAM,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC;aACxE,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;YACvB,MAAM,CAAC,GAAG,CAAC,CAAC;YACZ,OAAO;QACT,CAAC;QACD,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE;YAC5B,QAAQ,GAAG,IAAI,CAAC;YAChB,IAAI,CAAC;gBACH,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;gBACtB,UAAU,CAAC,GAAG,EAAE;oBACd,IAAI,CAAC;wBACH,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;oBACxB,CAAC;oBAAC,MAAM,CAAC;wBACP,eAAe;oBACjB,CAAC;gBACH,CAAC,EAAE,IAAI,CAAC,CAAC,KAAK,EAAE,CAAC;YACnB,CAAC;YAAC,MAAM,CAAC;gBACP,eAAe;YACjB,CAAC;QACH,CAAC,EAAE,MAAM,CAAC,SAAS,CAAC,CAAC;QACrB,KAAK,CAAC,MAAM,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;QAClC,KAAK,CAAC,MAAM,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;QAClC,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,EAAE,CAAC,KAAa,EAAE,EAAE;YACzC,MAAM,IAAI,KAAK,CAAC;QAClB,CAAC,CAAC,CAAC;QACH,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,EAAE,CAAC,KAAa,EAAE,EAAE;YACzC,MAAM,IAAI,KAAK,CAAC;QAClB,CAAC,CAAC,CAAC;QACH,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE;YAC1B,YAAY,CAAC,KAAK,CAAC,CAAC;YACpB,MAAM,IAAI,KAAK,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;YAC/B,MAAM,CAAC,GAAG,CAAC,CAAC;QACd,CAAC,CAAC,CAAC;QACH,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE;YACzB,YAAY,CAAC,KAAK,CAAC,CAAC;YACpB,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC;QACvC,CAAC,CAAC,CAAC;QACH,IAAI,MAAM,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;YAC/B,IAAI,CAAC;gBACH,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;gBACjC,KAAK,CAAC,KAAK,EAAE,GAAG,EAAE,CAAC;YACrB,CAAC;YAAC,MAAM,CAAC;gBACP,gCAAgC;YAClC,CAAC;QACH,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,IAAI,CAAC,IAAY,EAAE,QAAgB;IACjD,IAAI,IAAI,CAAC,MAAM,IAAI,QAAQ;QAAE,OAAO,IAAI,CAAC;IACzC,OAAO,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,GAAG,QAAQ,CAAC,EAAE,CAAC;AAClD,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,QAAgB;IAC/C,OAAO,MAAM,UAAU,CAAC,QAAQ,CAAC,CAAC;AACpC,CAAC"}
|
package/dist/index.d.ts
ADDED
package/dist/index.js
ADDED
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import fs from "node:fs";
|
|
3
|
+
import os from "node:os";
|
|
4
|
+
import path from "node:path";
|
|
5
|
+
const recovery = recoverCwdIfNeeded();
|
|
6
|
+
try {
|
|
7
|
+
const { main } = await import("./main.js");
|
|
8
|
+
if (recovery.recovered) {
|
|
9
|
+
console.error(formatCwdRecoveryNotice(recovery));
|
|
10
|
+
}
|
|
11
|
+
await main();
|
|
12
|
+
}
|
|
13
|
+
catch (error) {
|
|
14
|
+
if (isMissingToolError(error)) {
|
|
15
|
+
console.error(error.message);
|
|
16
|
+
process.exit(1);
|
|
17
|
+
}
|
|
18
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
19
|
+
console.error(`rudder: ${message}`);
|
|
20
|
+
process.exit(1);
|
|
21
|
+
}
|
|
22
|
+
function recoverCwdIfNeeded() {
|
|
23
|
+
try {
|
|
24
|
+
return { recovered: false, current: process.cwd() };
|
|
25
|
+
}
|
|
26
|
+
catch (error) {
|
|
27
|
+
const original = process.env.PWD?.trim() || undefined;
|
|
28
|
+
process.env.RUDDER_ORIGINAL_CWD = original ?? "";
|
|
29
|
+
process.env.RUDDER_CWD_RECOVERY_ERROR = error instanceof Error ? error.message : String(error);
|
|
30
|
+
for (const candidate of cwdRecoveryCandidates(original)) {
|
|
31
|
+
try {
|
|
32
|
+
if (!isReadableDirectory(candidate)) {
|
|
33
|
+
continue;
|
|
34
|
+
}
|
|
35
|
+
process.chdir(candidate);
|
|
36
|
+
const current = process.cwd();
|
|
37
|
+
process.env.RUDDER_RECOVERED_CWD = current;
|
|
38
|
+
return { recovered: true, original, current, error };
|
|
39
|
+
}
|
|
40
|
+
catch {
|
|
41
|
+
// Try the next fallback candidate.
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
console.error([
|
|
45
|
+
"rudder: current directory is not readable, and Rudder could not recover.",
|
|
46
|
+
original ? ` original cwd: ${original}` : undefined,
|
|
47
|
+
" Try `cd ~` or another readable directory, then run `rudder --cwd <repo>`.",
|
|
48
|
+
]
|
|
49
|
+
.filter(Boolean)
|
|
50
|
+
.join("\n"));
|
|
51
|
+
process.exit(1);
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
function cwdRecoveryCandidates(original) {
|
|
55
|
+
const candidates = [];
|
|
56
|
+
if (original) {
|
|
57
|
+
candidates.push(original);
|
|
58
|
+
let next = path.dirname(original);
|
|
59
|
+
while (next && next !== path.dirname(next)) {
|
|
60
|
+
candidates.push(next);
|
|
61
|
+
next = path.dirname(next);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
candidates.push(os.homedir(), "/tmp", "/");
|
|
65
|
+
return [...new Set(candidates.filter(Boolean))];
|
|
66
|
+
}
|
|
67
|
+
function isReadableDirectory(candidate) {
|
|
68
|
+
try {
|
|
69
|
+
const stat = fs.statSync(candidate);
|
|
70
|
+
if (!stat.isDirectory()) {
|
|
71
|
+
return false;
|
|
72
|
+
}
|
|
73
|
+
fs.accessSync(candidate, fs.constants.R_OK | fs.constants.X_OK);
|
|
74
|
+
return true;
|
|
75
|
+
}
|
|
76
|
+
catch {
|
|
77
|
+
return false;
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
function formatCwdRecoveryNotice(recovery) {
|
|
81
|
+
const original = recovery.original ? ` from ${recovery.original}` : "";
|
|
82
|
+
const current = recovery.current ?? process.cwd();
|
|
83
|
+
return `rudder: recovered from an unreadable cwd${original}; using ${current}`;
|
|
84
|
+
}
|
|
85
|
+
function isMissingToolError(error) {
|
|
86
|
+
return error instanceof Error && error.name === "MissingToolError";
|
|
87
|
+
}
|
|
88
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
export declare const MANAGED_JJ_VERSION = "0.40.0";
|
|
2
|
+
export declare const MANAGED_JJ_ASSETS: Record<string, {
|
|
3
|
+
target: string;
|
|
4
|
+
sha256: string;
|
|
5
|
+
}>;
|
|
6
|
+
export type JjSource = "system" | "managed";
|
|
7
|
+
/** Why the last automatic install failed, for the "jj is missing" error. */
|
|
8
|
+
export declare function managedJjInstallError(): string | null;
|
|
9
|
+
export declare function managedJjDir(version?: string): string;
|
|
10
|
+
export declare function managedJjPath(version?: string): string;
|
|
11
|
+
export declare function managedJjAsset(platform?: NodeJS.Platform, arch?: NodeJS.Architecture): {
|
|
12
|
+
url: string;
|
|
13
|
+
sha256: string;
|
|
14
|
+
} | null;
|
|
15
|
+
/** True when the managed jj's directory is already on this process's PATH. */
|
|
16
|
+
export declare function managedJjOnPath(): boolean;
|
|
17
|
+
/**
|
|
18
|
+
* Make `jj` resolve for this process and its children. Returns where it comes
|
|
19
|
+
* from, or null when there is none and it could not be installed. Never throws:
|
|
20
|
+
* commands that need jj fail later with MissingToolError, which carries the
|
|
21
|
+
* reason recorded here.
|
|
22
|
+
*/
|
|
23
|
+
export declare function ensureJjAvailable(options?: {
|
|
24
|
+
onInstall?: (message: string) => void;
|
|
25
|
+
}): Promise<JjSource | null>;
|
|
26
|
+
/**
|
|
27
|
+
* Download a jj release archive, check it against the pinned sha256, unpack the
|
|
28
|
+
* `jj` binary, make sure it runs, then move it into place. Nothing is left at
|
|
29
|
+
* `dest` unless every step passed.
|
|
30
|
+
*/
|
|
31
|
+
export declare function installManagedJj(params: {
|
|
32
|
+
url: string;
|
|
33
|
+
sha256: string;
|
|
34
|
+
dest: string;
|
|
35
|
+
timeoutMs?: number;
|
|
36
|
+
}): Promise<void>;
|