@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.
@@ -0,0 +1,160 @@
1
+ export type JsonValue = null | boolean | number | string | JsonValue[] | {
2
+ [key: string]: JsonValue;
3
+ };
4
+ export type CredentialType = "api_key" | "oauth" | "token";
5
+ export type ApiKeyCredential = {
6
+ type: "api_key";
7
+ provider: string;
8
+ key?: string;
9
+ keyRef?: SecretRef;
10
+ email?: string;
11
+ metadata?: Record<string, string>;
12
+ };
13
+ export type TokenCredential = {
14
+ type: "token";
15
+ provider: string;
16
+ token?: string;
17
+ tokenRef?: SecretRef;
18
+ expires?: number;
19
+ email?: string;
20
+ };
21
+ export type OAuthCredential = {
22
+ type: "oauth";
23
+ provider: string;
24
+ access: string;
25
+ refresh: string;
26
+ expires: number;
27
+ clientId?: string;
28
+ email?: string;
29
+ accountId?: string;
30
+ enterpriseUrl?: string;
31
+ projectId?: string;
32
+ };
33
+ export type SecretRef = {
34
+ source: "env" | "file" | "exec";
35
+ provider: string;
36
+ id: string;
37
+ };
38
+ export type AuthProfileCredential = ApiKeyCredential | TokenCredential | OAuthCredential;
39
+ export type ProfileUsageStats = {
40
+ lastUsed?: number;
41
+ cooldownUntil?: number;
42
+ disabledUntil?: number;
43
+ disabledReason?: string;
44
+ errorCount?: number;
45
+ lastFailureAt?: number;
46
+ };
47
+ export type AuthProfileStore = {
48
+ version: 1;
49
+ profiles: Record<string, AuthProfileCredential>;
50
+ order?: Record<string, string[]>;
51
+ lastGood?: Record<string, string>;
52
+ usageStats?: Record<string, ProfileUsageStats>;
53
+ };
54
+ export type RudderConfig = {
55
+ version: 1;
56
+ defaultBackend: BackendId;
57
+ lastUsedBackend?: BackendId;
58
+ runPolicy: {
59
+ sameCheckout: "single-active";
60
+ concurrentPromptMode: "worktree" | "queue";
61
+ mergeMode: "manual-on-conflict";
62
+ };
63
+ acpx: {
64
+ install: "latest";
65
+ };
66
+ backends: {
67
+ claude?: BackendConfig;
68
+ codex?: BackendConfig;
69
+ acpx?: BackendConfig;
70
+ };
71
+ };
72
+ export type BackendId = "claude" | "codex" | "acpx";
73
+ export type BackendConfig = {
74
+ profileId?: string;
75
+ model?: string;
76
+ effort?: "low" | "medium" | "high" | "xhigh" | "max";
77
+ reasoningEffort?: "low" | "medium" | "high" | "xhigh";
78
+ };
79
+ export type RunStatus = "created" | "running" | "verifying" | "completed" | "failed" | "cancelled" | "merge-conflict" | "merged";
80
+ export type RunRecord = {
81
+ id: string;
82
+ status: RunStatus;
83
+ task: string;
84
+ backend: BackendId;
85
+ model?: string;
86
+ createdAt: string;
87
+ updatedAt: string;
88
+ repoRoot: string;
89
+ targetBranch: string;
90
+ baseCommit: string;
91
+ worktree: {
92
+ enabled: boolean;
93
+ path: string;
94
+ branch?: string;
95
+ };
96
+ process?: {
97
+ pid?: number;
98
+ startedAt?: string;
99
+ endedAt?: string;
100
+ exitCode?: number | null;
101
+ signal?: NodeJS.Signals | null;
102
+ };
103
+ session?: {
104
+ nativeSessionId?: string;
105
+ acpxSessionId?: string;
106
+ sessionName?: string;
107
+ };
108
+ verification?: VerificationResult;
109
+ merge?: MergeState;
110
+ };
111
+ export type MergeState = {
112
+ status: "not-started" | "merged" | "conflict" | "failed";
113
+ attemptedAt?: string;
114
+ targetBranch?: string;
115
+ conflictedFiles?: string[];
116
+ error?: string;
117
+ };
118
+ export type RudderEvent = {
119
+ ts: string;
120
+ runId: string;
121
+ type: "run.created" | "run.started" | "run.detached" | "planner.spec" | "backend.output" | "backend.error" | "backend.exit" | "verifier.result" | "run.completed" | "run.failed" | "run.cancelled" | "merge.result";
122
+ message?: string;
123
+ data?: JsonValue;
124
+ };
125
+ export type RunRequest = {
126
+ run: RunRecord;
127
+ prompt: string;
128
+ contract: string;
129
+ };
130
+ export type BackendAdapter = {
131
+ id: BackendId;
132
+ verify(): Promise<{
133
+ ok: boolean;
134
+ message: string;
135
+ }>;
136
+ run(request: RunRequest, emit: (event: RudderEvent) => Promise<void>): Promise<number>;
137
+ };
138
+ export type SpecContract = {
139
+ runId: string;
140
+ task: string;
141
+ createdAt: string;
142
+ repo: {
143
+ root: string;
144
+ branch: string;
145
+ baseCommit: string;
146
+ status: string[];
147
+ };
148
+ instructionsFiles: Array<{
149
+ path: string;
150
+ content: string;
151
+ }>;
152
+ acceptanceCriteria: string[];
153
+ suggestedTests: string[];
154
+ };
155
+ export type VerificationResult = {
156
+ satisfied: string[];
157
+ missing: string[];
158
+ notes: string;
159
+ shouldContinue: boolean;
160
+ };
package/dist/types.js ADDED
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
package/dist/util.d.ts ADDED
@@ -0,0 +1,47 @@
1
+ import type { JsonValue } from "./types.js";
2
+ export declare function nowIso(): string;
3
+ export declare function isTty(): boolean;
4
+ export declare function rudderHome(): string;
5
+ export declare function expandHome(value: string): string;
6
+ export declare function shortenHome(value: string): string;
7
+ export declare function ensureDir(dir: string): Promise<void>;
8
+ export declare function pathExists(filePath: string): Promise<boolean>;
9
+ export declare function pathExistsSync(filePath: string): boolean;
10
+ export declare function readJson<T>(filePath: string): Promise<T | null>;
11
+ export declare function writeJson(filePath: string, value: JsonValue, options?: {
12
+ mode?: number;
13
+ }): Promise<void>;
14
+ export declare function commandExists(command: string): boolean;
15
+ export declare function runCommand(command: string, args: string[], options?: {
16
+ cwd?: string;
17
+ allowFailure?: boolean;
18
+ env?: NodeJS.ProcessEnv;
19
+ }): Promise<{
20
+ stdout: string;
21
+ stderr: string;
22
+ code: number;
23
+ }>;
24
+ export declare function runCommandSync(command: string, args: string[], options?: {
25
+ cwd?: string;
26
+ allowFailure?: boolean;
27
+ }): {
28
+ stdout: string;
29
+ stderr: string;
30
+ code: number;
31
+ };
32
+ export declare function promptText(message: string, defaultValue?: string): Promise<string>;
33
+ export declare function promptConfirm(message: string, defaultValue?: boolean): Promise<boolean>;
34
+ export declare function promptSelect<T extends string>(message: string, options: Array<{
35
+ value: T;
36
+ label: string;
37
+ hint?: string;
38
+ }>, defaultValue: T): Promise<T>;
39
+ export declare function slugify(inputValue: string, fallback?: string): string;
40
+ export declare function newRunId(task: string): string;
41
+ export declare function shortHash(value: string): string;
42
+ export declare function shellQuote(value: string): string;
43
+ export declare function parseJsonLine(line: string): JsonValue | null;
44
+ export declare function lineSplitBuffer(previous: string, chunk: string): {
45
+ lines: string[];
46
+ rest: string;
47
+ };
package/dist/util.js ADDED
@@ -0,0 +1,192 @@
1
+ import { spawn, spawnSync } from "node:child_process";
2
+ import { createHash, randomUUID } from "node:crypto";
3
+ import fs from "node:fs";
4
+ import fsp from "node:fs/promises";
5
+ import os from "node:os";
6
+ import path from "node:path";
7
+ import readline from "node:readline/promises";
8
+ import { stdin as input, stdout as output } from "node:process";
9
+ export function nowIso() {
10
+ return new Date().toISOString();
11
+ }
12
+ export function isTty() {
13
+ return Boolean(process.stdin.isTTY && process.stdout.isTTY);
14
+ }
15
+ export function rudderHome() {
16
+ return path.resolve(process.env.RUDDER_HOME?.trim() || path.join(os.homedir(), ".rudder"));
17
+ }
18
+ export function expandHome(value) {
19
+ if (value === "~") {
20
+ return os.homedir();
21
+ }
22
+ if (value.startsWith("~/")) {
23
+ return path.join(os.homedir(), value.slice(2));
24
+ }
25
+ return value;
26
+ }
27
+ export function shortenHome(value) {
28
+ const home = os.homedir();
29
+ return value === home || value.startsWith(`${home}${path.sep}`)
30
+ ? `~${value.slice(home.length)}`
31
+ : value;
32
+ }
33
+ export async function ensureDir(dir) {
34
+ await fsp.mkdir(dir, { recursive: true });
35
+ }
36
+ export async function pathExists(filePath) {
37
+ try {
38
+ await fsp.access(filePath);
39
+ return true;
40
+ }
41
+ catch {
42
+ return false;
43
+ }
44
+ }
45
+ export function pathExistsSync(filePath) {
46
+ try {
47
+ fs.accessSync(filePath);
48
+ return true;
49
+ }
50
+ catch {
51
+ return false;
52
+ }
53
+ }
54
+ export async function readJson(filePath) {
55
+ try {
56
+ const raw = await fsp.readFile(filePath, "utf8");
57
+ return JSON.parse(raw);
58
+ }
59
+ catch {
60
+ return null;
61
+ }
62
+ }
63
+ export async function writeJson(filePath, value, options) {
64
+ await ensureDir(path.dirname(filePath));
65
+ const temp = `${filePath}.${process.pid}.${Date.now()}.tmp`;
66
+ await fsp.writeFile(temp, `${JSON.stringify(value, null, 2)}\n`, {
67
+ encoding: "utf8",
68
+ mode: options?.mode ?? 0o644,
69
+ });
70
+ await fsp.rename(temp, filePath);
71
+ if (options?.mode !== undefined) {
72
+ await fsp.chmod(filePath, options.mode);
73
+ }
74
+ }
75
+ export function commandExists(command) {
76
+ const result = spawnSync("sh", ["-lc", `command -v ${shellQuote(command)}`], {
77
+ encoding: "utf8",
78
+ });
79
+ return result.status === 0 && result.stdout.trim().length > 0;
80
+ }
81
+ export async function runCommand(command, args, options) {
82
+ return await new Promise((resolve, reject) => {
83
+ const child = spawn(command, args, {
84
+ cwd: options?.cwd,
85
+ env: { ...process.env, ...options?.env },
86
+ stdio: ["ignore", "pipe", "pipe"],
87
+ });
88
+ let stdout = "";
89
+ let stderr = "";
90
+ child.stdout.setEncoding("utf8");
91
+ child.stderr.setEncoding("utf8");
92
+ child.stdout.on("data", (chunk) => {
93
+ stdout += chunk;
94
+ });
95
+ child.stderr.on("data", (chunk) => {
96
+ stderr += chunk;
97
+ });
98
+ child.on("error", reject);
99
+ child.on("close", (code) => {
100
+ const exitCode = code ?? 1;
101
+ if (exitCode !== 0 && !options?.allowFailure) {
102
+ reject(new Error(`${command} ${args.join(" ")} failed: ${stderr.trim() || stdout.trim()}`));
103
+ return;
104
+ }
105
+ resolve({ stdout, stderr, code: exitCode });
106
+ });
107
+ });
108
+ }
109
+ export function runCommandSync(command, args, options) {
110
+ const result = spawnSync(command, args, {
111
+ cwd: options?.cwd,
112
+ encoding: "utf8",
113
+ stdio: ["ignore", "pipe", "pipe"],
114
+ });
115
+ const code = result.status ?? 1;
116
+ if (code !== 0 && !options?.allowFailure) {
117
+ throw new Error(`${command} ${args.join(" ")} failed: ${result.stderr || result.stdout}`);
118
+ }
119
+ return {
120
+ stdout: result.stdout ?? "",
121
+ stderr: result.stderr ?? "",
122
+ code,
123
+ };
124
+ }
125
+ export async function promptText(message, defaultValue) {
126
+ const rl = readline.createInterface({ input, output });
127
+ try {
128
+ const suffix = defaultValue ? ` [${defaultValue}]` : "";
129
+ const answer = await rl.question(`${message}${suffix}: `);
130
+ const trimmed = answer.trim();
131
+ return trimmed || defaultValue || "";
132
+ }
133
+ finally {
134
+ rl.close();
135
+ }
136
+ }
137
+ export async function promptConfirm(message, defaultValue = true) {
138
+ const defaultHint = defaultValue ? "Y/n" : "y/N";
139
+ const raw = await promptText(`${message} (${defaultHint})`);
140
+ if (!raw) {
141
+ return defaultValue;
142
+ }
143
+ return ["y", "yes", "true", "1"].includes(raw.toLowerCase());
144
+ }
145
+ export async function promptSelect(message, options, defaultValue) {
146
+ console.log(message);
147
+ options.forEach((option, index) => {
148
+ const marker = option.value === defaultValue ? " [default]" : "";
149
+ const hint = option.hint ? ` - ${option.hint}` : "";
150
+ console.log(` ${index + 1}. ${option.label}${marker}${hint}`);
151
+ });
152
+ const raw = await promptText("Choose", String(options.findIndex((o) => o.value === defaultValue) + 1));
153
+ const byIndex = options[Number(raw) - 1];
154
+ if (byIndex) {
155
+ return byIndex.value;
156
+ }
157
+ const byValue = options.find((option) => option.value === raw);
158
+ return byValue?.value ?? defaultValue;
159
+ }
160
+ export function slugify(inputValue, fallback = "task") {
161
+ const slug = inputValue
162
+ .toLowerCase()
163
+ .replace(/[^a-z0-9]+/g, "-")
164
+ .replace(/^-+|-+$/g, "")
165
+ .slice(0, 48);
166
+ return slug || fallback;
167
+ }
168
+ export function newRunId(task) {
169
+ const stamp = new Date().toISOString().replace(/[-:.TZ]/g, "").slice(0, 14);
170
+ return `${stamp}-${slugify(task)}-${randomUUID().slice(0, 8)}`;
171
+ }
172
+ export function shortHash(value) {
173
+ return createHash("sha1").update(value).digest("hex").slice(0, 10);
174
+ }
175
+ export function shellQuote(value) {
176
+ return `'${value.replace(/'/g, `'\\''`)}'`;
177
+ }
178
+ export function parseJsonLine(line) {
179
+ try {
180
+ return JSON.parse(line);
181
+ }
182
+ catch {
183
+ return null;
184
+ }
185
+ }
186
+ export function lineSplitBuffer(previous, chunk) {
187
+ const joined = previous + chunk;
188
+ const parts = joined.split(/\r?\n/);
189
+ const rest = parts.pop() ?? "";
190
+ return { lines: parts, rest };
191
+ }
192
+ //# sourceMappingURL=util.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"util.js","sourceRoot":"","sources":["../src/util.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,30 @@
1
+ {
2
+ "name": "@viraatdas/rudder",
3
+ "version": "0.1.0",
4
+ "description": "A coding-agent harness for Claude Code, Codex, and acpx with worktree-isolated runs.",
5
+ "type": "module",
6
+ "bin": {
7
+ "rudder": "dist/index.js"
8
+ },
9
+ "scripts": {
10
+ "build": "tsc -p tsconfig.json",
11
+ "check": "tsc -p tsconfig.json --noEmit",
12
+ "prepack": "npm run build",
13
+ "start": "node dist/index.js"
14
+ },
15
+ "files": [
16
+ "dist/",
17
+ "README.md",
18
+ "package.json"
19
+ ],
20
+ "publishConfig": {
21
+ "access": "public"
22
+ },
23
+ "engines": {
24
+ "node": ">=20"
25
+ },
26
+ "devDependencies": {
27
+ "@types/node": "^22.15.3",
28
+ "typescript": "^5.8.3"
29
+ }
30
+ }