@viraatdas/rudder 0.1.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/README.md ADDED
@@ -0,0 +1,91 @@
1
+ # rudder
2
+
3
+ Rudder is a coding-agent harness for Claude Code, Codex, and `acpx`. It adds a
4
+ clean run manager around the existing tools: OpenClaw-style onboarding,
5
+ background runs, watch/log commands, and git worktree isolation so multiple
6
+ prompts do not fight over the same checkout.
7
+
8
+ ## Install
9
+
10
+ From npm:
11
+
12
+ ```bash
13
+ npm install -g @viraatdas/rudder
14
+ ```
15
+
16
+ Or run without a global install:
17
+
18
+ ```bash
19
+ npx @viraatdas/rudder@latest --help
20
+ ```
21
+
22
+ Verify the installed CLI:
23
+
24
+ ```bash
25
+ rudder --help
26
+ rudder doctor
27
+ ```
28
+
29
+ Local development:
30
+
31
+ ```bash
32
+ npm install
33
+ npm run build
34
+ npm link
35
+ ```
36
+
37
+ ## Setup
38
+
39
+ ```bash
40
+ rudder onboard
41
+ rudder doctor
42
+ ```
43
+
44
+ Rudder stores config in `~/.rudder/config.json` and OpenClaw-shaped auth
45
+ profiles in `~/.rudder/auth-profiles.json`.
46
+
47
+ It detects and can mirror:
48
+
49
+ - Claude Code auth from macOS Keychain or `~/.claude/.credentials.json`
50
+ - Codex auth from macOS Keychain or `~/.codex/auth.json`
51
+ - `ANTHROPIC_API_KEY` and `OPENAI_API_KEY`
52
+
53
+ It also offers setup-token/API-key fallback paths during onboarding.
54
+
55
+ ## Run
56
+
57
+ ```bash
58
+ rudder "fix the failing tests"
59
+ rudder claude "fix the auth redirect bug"
60
+ rudder codex --model gpt-5.4-codex "refactor the parser"
61
+ rudder run -d "rewrite this module"
62
+ ```
63
+
64
+ Foreground runs are just an attached watch. Pressing `Ctrl-C` detaches from the
65
+ output; it does not stop the agent. Use `rudder stop <runId>` to cancel work.
66
+
67
+ ## Manage Runs
68
+
69
+ ```bash
70
+ rudder status
71
+ rudder runs
72
+ rudder watch <runId>
73
+ rudder logs <runId> --follow
74
+ rudder stop <runId>
75
+ ```
76
+
77
+ ## Worktrees
78
+
79
+ Rudder enforces one active agent per checkout. If you start a second task in the
80
+ same repo while one is already running, Rudder creates a git worktree on a
81
+ `rudder/<run>` branch and runs the agent there.
82
+
83
+ ```bash
84
+ rudder run --worktree "try the alternate implementation"
85
+ rudder merge <runId>
86
+ rudder cleanup
87
+ ```
88
+
89
+ `rudder merge` uses normal git merge semantics. Clean merges are committed as a
90
+ merge commit; conflicts are left in the standard git conflict state for you to
91
+ resolve.
package/dist/auth.d.ts ADDED
@@ -0,0 +1,33 @@
1
+ import type { AuthProfileCredential, AuthProfileStore, OAuthCredential } from "./types.js";
2
+ type Detection = {
3
+ claudeCommand: boolean;
4
+ codexCommand: boolean;
5
+ acpxCommand: boolean;
6
+ acpxVersion?: string;
7
+ npmAcpxLatest?: string;
8
+ anthropicEnv?: boolean;
9
+ openaiEnv?: boolean;
10
+ claudeCredential?: AuthProfileCredential;
11
+ claudeCredentialSource?: string;
12
+ codexCredential?: OAuthCredential;
13
+ codexCredentialSource?: string;
14
+ };
15
+ export declare function detectEnvironment(): Promise<Detection>;
16
+ export declare function syncExternalCredentials(): Promise<AuthProfileStore>;
17
+ export declare function runDoctor(options?: {
18
+ json?: boolean;
19
+ }): Promise<void>;
20
+ export declare function runOnboard(options?: {
21
+ nonInteractive?: boolean;
22
+ json?: boolean;
23
+ }): Promise<void>;
24
+ export declare function readClaudeCliCredential(): Promise<{
25
+ credential: AuthProfileCredential;
26
+ source: string;
27
+ } | null>;
28
+ export declare function readCodexCliCredential(): Promise<{
29
+ credential: OAuthCredential;
30
+ source: string;
31
+ } | null>;
32
+ export declare function authStoreExists(): Promise<boolean>;
33
+ export {};
package/dist/auth.js ADDED
@@ -0,0 +1,348 @@
1
+ import { createHash } from "node:crypto";
2
+ import fs from "node:fs";
3
+ import path from "node:path";
4
+ import { commandExists, expandHome, pathExists, promptConfirm, promptSelect, promptText, readJson, runCommand, runCommandSync, shortenHome, } from "./util.js";
5
+ import { authStorePath, loadAuthStore, loadConfig, saveAuthStore, saveConfig } from "./state.js";
6
+ const CLAUDE_KEYCHAIN_SERVICE = "Claude Code-credentials";
7
+ const CODEX_KEYCHAIN_SERVICE = "Codex Auth";
8
+ export async function detectEnvironment() {
9
+ const claudeCommand = commandExists("claude");
10
+ const codexCommand = commandExists("codex");
11
+ const acpxCommand = commandExists("acpx");
12
+ const acpxVersion = acpxCommand
13
+ ? (await runCommand("acpx", ["--version"], {
14
+ allowFailure: true,
15
+ })).stdout.trim()
16
+ : undefined;
17
+ const npmAcpxLatest = (await runCommand("npm", ["view", "acpx", "version"], {
18
+ allowFailure: true,
19
+ })).stdout.trim();
20
+ const claude = await readClaudeCliCredential();
21
+ const codex = await readCodexCliCredential();
22
+ return {
23
+ claudeCommand,
24
+ codexCommand,
25
+ acpxCommand,
26
+ acpxVersion,
27
+ npmAcpxLatest,
28
+ anthropicEnv: Boolean(process.env.ANTHROPIC_API_KEY?.trim()),
29
+ openaiEnv: Boolean(process.env.OPENAI_API_KEY?.trim()),
30
+ claudeCredential: claude?.credential,
31
+ claudeCredentialSource: claude?.source,
32
+ codexCredential: codex?.credential,
33
+ codexCredentialSource: codex?.source,
34
+ };
35
+ }
36
+ export async function syncExternalCredentials() {
37
+ const store = await loadAuthStore();
38
+ const claude = await readClaudeCliCredential();
39
+ if (claude?.credential) {
40
+ store.profiles["anthropic:claude-code"] = claude.credential;
41
+ }
42
+ const codex = await readCodexCliCredential();
43
+ if (codex?.credential) {
44
+ store.profiles["openai-codex:default"] = codex.credential;
45
+ }
46
+ if (process.env.ANTHROPIC_API_KEY?.trim()) {
47
+ store.profiles["anthropic:env"] = {
48
+ type: "api_key",
49
+ provider: "anthropic",
50
+ key: process.env.ANTHROPIC_API_KEY.trim(),
51
+ };
52
+ }
53
+ if (process.env.OPENAI_API_KEY?.trim()) {
54
+ store.profiles["openai:env"] = {
55
+ type: "api_key",
56
+ provider: "openai",
57
+ key: process.env.OPENAI_API_KEY.trim(),
58
+ };
59
+ }
60
+ await saveAuthStore(store);
61
+ return store;
62
+ }
63
+ export async function runDoctor(options) {
64
+ const detection = await detectEnvironment();
65
+ const store = await syncExternalCredentials();
66
+ const config = await loadConfig();
67
+ const payload = {
68
+ commands: {
69
+ claude: detection.claudeCommand,
70
+ codex: detection.codexCommand,
71
+ acpx: detection.acpxCommand,
72
+ acpxVersion: detection.acpxVersion || null,
73
+ acpxLatest: detection.npmAcpxLatest || null,
74
+ },
75
+ auth: {
76
+ storePath: authStorePath(),
77
+ profiles: Object.keys(store.profiles).sort(),
78
+ claudeCredentialSource: detection.claudeCredentialSource || null,
79
+ codexCredentialSource: detection.codexCredentialSource || null,
80
+ },
81
+ config,
82
+ };
83
+ if (options?.json) {
84
+ console.log(JSON.stringify(payload, null, 2));
85
+ return;
86
+ }
87
+ console.log("Rudder doctor");
88
+ console.log(` claude: ${status(detection.claudeCommand)}`);
89
+ console.log(` codex: ${status(detection.codexCommand)}`);
90
+ console.log(` acpx: ${status(detection.acpxCommand)}${detection.acpxVersion ? ` (${detection.acpxVersion})` : ""}${detection.npmAcpxLatest ? ` latest=${detection.npmAcpxLatest}` : ""}`);
91
+ console.log(` auth: ${shortenHome(authStorePath())}`);
92
+ for (const [profileId, credential] of Object.entries(store.profiles).sort()) {
93
+ console.log(` - ${profileId} (${credential.provider}/${credential.type})`);
94
+ }
95
+ if (!detection.acpxCommand) {
96
+ console.log(" fix: run `npm install -g acpx@latest` or `rudder onboard`");
97
+ }
98
+ }
99
+ export async function runOnboard(options) {
100
+ const config = await loadConfig();
101
+ let store = await syncExternalCredentials();
102
+ const detection = await detectEnvironment();
103
+ if (!options?.nonInteractive && process.stdin.isTTY) {
104
+ const acpxBehind = detection.acpxCommand &&
105
+ detection.acpxVersion &&
106
+ detection.npmAcpxLatest &&
107
+ detection.acpxVersion !== detection.npmAcpxLatest;
108
+ if (!detection.acpxCommand || acpxBehind) {
109
+ const install = await promptConfirm(detection.acpxCommand
110
+ ? `Update acpx ${detection.acpxVersion} to latest ${detection.npmAcpxLatest}?`
111
+ : "Install acpx globally with npm install -g acpx@latest?", true);
112
+ if (install) {
113
+ await runCommand("npm", ["install", "-g", "acpx@latest"]);
114
+ }
115
+ }
116
+ store = await configureAnthropic(store, config);
117
+ store = await configureOpenAI(store, config);
118
+ }
119
+ await saveAuthStore(store);
120
+ await saveConfig(config);
121
+ if (options?.json) {
122
+ console.log(JSON.stringify({
123
+ config,
124
+ authStore: authStorePath(),
125
+ profiles: Object.keys(store.profiles).sort(),
126
+ }, null, 2));
127
+ return;
128
+ }
129
+ console.log("Rudder configured");
130
+ console.log(` auth: ${shortenHome(authStorePath())}`);
131
+ console.log(` profiles: ${Object.keys(store.profiles).sort().join(", ") || "(none)"}`);
132
+ console.log(' try: rudder "fix the failing tests"');
133
+ }
134
+ async function configureAnthropic(store, config) {
135
+ if (store.profiles["anthropic:claude-code"] || store.profiles["anthropic:env"]) {
136
+ config.backends.claude = {
137
+ ...(config.backends.claude ?? {}),
138
+ profileId: store.profiles["anthropic:claude-code"] ? "anthropic:claude-code" : "anthropic:env",
139
+ model: config.backends.claude?.model ?? "opus",
140
+ effort: "xhigh",
141
+ };
142
+ return store;
143
+ }
144
+ const choice = await promptSelect("Anthropic / Claude Code auth", [
145
+ {
146
+ value: "setup-token",
147
+ label: "Paste setup-token",
148
+ hint: "Run `claude setup-token`, then paste the generated token",
149
+ },
150
+ { value: "api-key", label: "Anthropic API key", hint: "Direct API key" },
151
+ { value: "skip", label: "Skip Anthropic for now" },
152
+ ], "setup-token");
153
+ if (choice === "setup-token") {
154
+ const token = await promptText("Paste Anthropic setup-token");
155
+ store.profiles["anthropic:default"] = {
156
+ type: "token",
157
+ provider: "anthropic",
158
+ token,
159
+ };
160
+ config.backends.claude = { ...(config.backends.claude ?? {}), profileId: "anthropic:default" };
161
+ }
162
+ if (choice === "api-key") {
163
+ const key = await promptText("Paste Anthropic API key");
164
+ store.profiles["anthropic:default"] = {
165
+ type: "api_key",
166
+ provider: "anthropic",
167
+ key,
168
+ };
169
+ config.backends.claude = { ...(config.backends.claude ?? {}), profileId: "anthropic:default" };
170
+ }
171
+ return store;
172
+ }
173
+ async function configureOpenAI(store, config) {
174
+ if (store.profiles["openai-codex:default"] || store.profiles["openai:env"]) {
175
+ config.backends.codex = {
176
+ ...(config.backends.codex ?? {}),
177
+ profileId: store.profiles["openai-codex:default"] ? "openai-codex:default" : "openai:env",
178
+ model: config.backends.codex?.model ?? "gpt-5.4-codex",
179
+ reasoningEffort: "xhigh",
180
+ };
181
+ return store;
182
+ }
183
+ const choice = await promptSelect("OpenAI / Codex auth", [
184
+ { value: "codex-login", label: "Run Codex login", hint: "Uses official Codex CLI auth" },
185
+ { value: "api-key", label: "OpenAI API key", hint: "Direct API key" },
186
+ { value: "skip", label: "Skip OpenAI for now" },
187
+ ], "codex-login");
188
+ if (choice === "codex-login") {
189
+ await runCommand("codex", ["login"]);
190
+ const codex = await readCodexCliCredential();
191
+ if (codex?.credential) {
192
+ store.profiles["openai-codex:default"] = codex.credential;
193
+ config.backends.codex = { ...(config.backends.codex ?? {}), profileId: "openai-codex:default" };
194
+ }
195
+ }
196
+ if (choice === "api-key") {
197
+ const key = await promptText("Paste OpenAI API key");
198
+ store.profiles["openai:default"] = {
199
+ type: "api_key",
200
+ provider: "openai",
201
+ key,
202
+ };
203
+ config.backends.codex = { ...(config.backends.codex ?? {}), profileId: "openai:default" };
204
+ }
205
+ return store;
206
+ }
207
+ export async function readClaudeCliCredential() {
208
+ const keychain = readClaudeKeychainCredential();
209
+ if (keychain) {
210
+ return { credential: keychain, source: "macOS Keychain Claude Code-credentials" };
211
+ }
212
+ const filePath = expandHome("~/.claude/.credentials.json");
213
+ const raw = await readJson(filePath);
214
+ const parsed = parseClaudeOauth(raw?.claudeAiOauth);
215
+ return parsed ? { credential: parsed, source: shortenHome(filePath) } : null;
216
+ }
217
+ function readClaudeKeychainCredential() {
218
+ if (process.platform !== "darwin") {
219
+ return null;
220
+ }
221
+ const result = runCommandSync("security", ["find-generic-password", "-s", CLAUDE_KEYCHAIN_SERVICE, "-w"], {
222
+ allowFailure: true,
223
+ });
224
+ if (result.code !== 0 || !result.stdout.trim()) {
225
+ return null;
226
+ }
227
+ try {
228
+ const raw = JSON.parse(result.stdout.trim());
229
+ return parseClaudeOauth(raw.claudeAiOauth);
230
+ }
231
+ catch {
232
+ return null;
233
+ }
234
+ }
235
+ function parseClaudeOauth(raw) {
236
+ if (!raw || typeof raw !== "object") {
237
+ return null;
238
+ }
239
+ const entry = raw;
240
+ const access = entry.accessToken;
241
+ const refresh = entry.refreshToken;
242
+ const expires = entry.expiresAt;
243
+ if (typeof access !== "string" || !access || typeof expires !== "number") {
244
+ return null;
245
+ }
246
+ if (typeof refresh === "string" && refresh) {
247
+ return {
248
+ type: "oauth",
249
+ provider: "anthropic",
250
+ access,
251
+ refresh,
252
+ expires,
253
+ };
254
+ }
255
+ return {
256
+ type: "token",
257
+ provider: "anthropic",
258
+ token: access,
259
+ expires,
260
+ };
261
+ }
262
+ export async function readCodexCliCredential() {
263
+ const keychain = readCodexKeychainCredential();
264
+ if (keychain) {
265
+ return { credential: keychain, source: "macOS Keychain Codex Auth" };
266
+ }
267
+ const filePath = codexAuthPath();
268
+ const raw = await readJson(filePath);
269
+ const parsed = parseCodexAuth(raw, filePath);
270
+ return parsed ? { credential: parsed, source: shortenHome(filePath) } : null;
271
+ }
272
+ function readCodexKeychainCredential() {
273
+ if (process.platform !== "darwin") {
274
+ return null;
275
+ }
276
+ const account = computeCodexKeychainAccount();
277
+ const result = runCommandSync("security", ["find-generic-password", "-s", CODEX_KEYCHAIN_SERVICE, "-a", account, "-w"], { allowFailure: true });
278
+ if (result.code !== 0 || !result.stdout.trim()) {
279
+ return null;
280
+ }
281
+ try {
282
+ return parseCodexAuth(JSON.parse(result.stdout.trim()), codexAuthPath());
283
+ }
284
+ catch {
285
+ return null;
286
+ }
287
+ }
288
+ function parseCodexAuth(raw, authPathForExpiry) {
289
+ if (!raw || typeof raw !== "object") {
290
+ return null;
291
+ }
292
+ const data = raw;
293
+ const tokens = data.tokens;
294
+ if (!tokens || typeof tokens !== "object") {
295
+ return null;
296
+ }
297
+ const tokenRecord = tokens;
298
+ const access = tokenRecord.access_token;
299
+ const refresh = tokenRecord.refresh_token;
300
+ if (typeof access !== "string" || !access || typeof refresh !== "string" || !refresh) {
301
+ return null;
302
+ }
303
+ const lastRefresh = data.last_refresh;
304
+ const lastRefreshMs = typeof lastRefresh === "string" || typeof lastRefresh === "number"
305
+ ? new Date(lastRefresh).getTime()
306
+ : Number.NaN;
307
+ let expires = Number.isFinite(lastRefreshMs) ? lastRefreshMs + 60 * 60 * 1000 : Date.now() + 60 * 60 * 1000;
308
+ try {
309
+ if (Number.isNaN(lastRefreshMs)) {
310
+ expires = fs.statSync(authPathForExpiry).mtimeMs + 60 * 60 * 1000;
311
+ }
312
+ }
313
+ catch {
314
+ // Keep fallback expiry.
315
+ }
316
+ return {
317
+ type: "oauth",
318
+ provider: "openai-codex",
319
+ access,
320
+ refresh,
321
+ expires,
322
+ ...(typeof tokenRecord.account_id === "string" ? { accountId: tokenRecord.account_id } : {}),
323
+ };
324
+ }
325
+ function codexHome() {
326
+ const configured = process.env.CODEX_HOME?.trim();
327
+ const home = configured ? expandHome(configured) : expandHome("~/.codex");
328
+ try {
329
+ return fs.realpathSync.native(home);
330
+ }
331
+ catch {
332
+ return home;
333
+ }
334
+ }
335
+ function codexAuthPath() {
336
+ return path.join(codexHome(), "auth.json");
337
+ }
338
+ function computeCodexKeychainAccount() {
339
+ const hash = createHash("sha256").update(codexHome()).digest("hex");
340
+ return `cli|${hash.slice(0, 16)}`;
341
+ }
342
+ function status(ok) {
343
+ return ok ? "ok" : "missing";
344
+ }
345
+ export async function authStoreExists() {
346
+ return await pathExists(authStorePath());
347
+ }
348
+ //# sourceMappingURL=auth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.js","sourceRoot":"","sources":["../src/auth.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import type { BackendAdapter, BackendId } from "./types.js";
2
+ export declare function getBackend(id: BackendId): BackendAdapter;