Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions node/.changeset/fix-cli-prompt-warning.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"@cluic/codex-remote-proxy": patch
---

Avoid loading SQLite capture support when CLI commands only need default capture settings, so interactive `crp init` and `crp start` prompts stay visible instead of being interrupted by experimental SQLite warnings.
2 changes: 1 addition & 1 deletion node/bin/crp.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ import readline from "node:readline/promises";
import os from "node:os";
import { setTimeout as delay } from "node:timers/promises";

import { DEFAULT_CAPTURE_DB_PATH } from "../src/capture-store.mjs";
import { DEFAULT_CAPTURE_DB_PATH } from "../src/capture-config.mjs";

const PACKAGE_ROOT = resolve(import.meta.dirname, "..");
const DEFAULT_CODEX_CONFIG_PATH = resolve(os.homedir(), ".codex", "config.toml");
Expand Down
4 changes: 4 additions & 0 deletions node/src/capture-config.mjs
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
import os from "node:os";
import { resolve } from "node:path";

export const DEFAULT_CAPTURE_DB_PATH = resolve(os.homedir(), ".codex-remote-proxy", "traffic.sqlite3");
5 changes: 3 additions & 2 deletions node/src/capture-store.mjs
Original file line number Diff line number Diff line change
@@ -1,9 +1,10 @@
import { watchFile, unwatchFile, readFileSync, mkdirSync } from "node:fs";
import os from "node:os";
import { dirname, isAbsolute, resolve } from "node:path";
import { DatabaseSync } from "node:sqlite";

export const DEFAULT_CAPTURE_DB_PATH = resolve(os.homedir(), ".codex-remote-proxy", "traffic.sqlite3");
import { DEFAULT_CAPTURE_DB_PATH } from "./capture-config.mjs";

export { DEFAULT_CAPTURE_DB_PATH };

const WATCH_INTERVAL_MS = 500;
const WATCH_DEBOUNCE_MS = 100;
Expand Down
70 changes: 70 additions & 0 deletions node/test/crp.test.mjs
Original file line number Diff line number Diff line change
@@ -0,0 +1,70 @@
import test from "node:test";
import assert from "node:assert/strict";
import { spawnSync } from "node:child_process";
import { mkdtempSync, rmSync } from "node:fs";
import os from "node:os";
import { dirname, join } from "node:path";
import { fileURLToPath } from "node:url";

const PACKAGE_ROOT = join(dirname(fileURLToPath(import.meta.url)), "..");

function makeTempHome() {
return mkdtempSync(join(os.tmpdir(), "crp-home-"));
}

function makeHomeEnv(homeDir) {
return {
...process.env,
HOME: homeDir,
USERPROFILE: homeDir
};
}

function runCrp(args, env) {
return spawnSync(process.execPath, [join(PACKAGE_ROOT, "bin", "crp.mjs"), ...args], {
cwd: PACKAGE_ROOT,
env,
encoding: "utf8"
});
}

test("check does not emit sqlite experimental warnings", () => {
const homeDir = makeTempHome();
try {
const result = runCrp(["check", "--json"], makeHomeEnv(homeDir));
const output = `${result.stdout}\n${result.stderr}`;

assert.equal(result.status, 0);
assert.doesNotMatch(output, /ExperimentalWarning: SQLite/);
} finally {
rmSync(homeDir, { recursive: true, force: true });
}
});

test("init without config fails cleanly without sqlite warnings", () => {
const homeDir = makeTempHome();
try {
const result = runCrp(["init"], makeHomeEnv(homeDir));
const output = `${result.stdout}\n${result.stderr}`;

assert.equal(result.status, 1);
assert.match(output, /Error: Upstream base URL is required/);
assert.doesNotMatch(output, /ExperimentalWarning: SQLite/);
} finally {
rmSync(homeDir, { recursive: true, force: true });
}
});

test("start without config fails cleanly without sqlite warnings", () => {
const homeDir = makeTempHome();
try {
const result = runCrp(["start"], makeHomeEnv(homeDir));
const output = `${result.stdout}\n${result.stderr}`;

assert.equal(result.status, 1);
assert.match(output, /Error: Upstream base URL is required/);
assert.doesNotMatch(output, /ExperimentalWarning: SQLite/);
} finally {
rmSync(homeDir, { recursive: true, force: true });
}
});
Loading