Swadhin Biswas Feature/ai code reviewer (#74) · 8/5/2026
739f935
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
import fs from "fs";
import path from "path";
// Keep config in the DATA_DIR (which defaults to ./data)
const DATA_DIR = process.env.DATA_DIR || path.join(process.cwd(), "data");
const CONFIG_PATH = path.join(DATA_DIR, "config.json");
export function loadConfig() {
if (fs.existsSync(CONFIG_PATH)) {
try {
const config = JSON.parse(fs.readFileSync(CONFIG_PATH, "utf8"));
// Only set env vars from config.json if they aren't already set in the
// environment. CI injects DATABASE_URL etc. via process.env and those
// must never be overridden by a stale data/config.json on disk.
if (config.DATABASE_URL && !process.env.DATABASE_URL) process.env.DATABASE_URL = config.DATABASE_URL;
if (config.DATABASE_DRIVER && !process.env.DATABASE_DRIVER) process.env.DATABASE_DRIVER = config.DATABASE_DRIVER;
if (config.REDIS_URL && !process.env.REDIS_URL) process.env.REDIS_URL = config.REDIS_URL;
// Store flag in process.env so we don't need to read FS constantly
process.env.OPENCODEHUB_CONFIGURED = "true";
return true;
} catch (e) {
console.error("Failed to parse config.json", e);
}
}
return false;
}
export function saveConfig(config: {
DATABASE_URL?: string;
DATABASE_DRIVER?: string;
REDIS_URL?: string;
}) {
if (!fs.existsSync(DATA_DIR)) {
fs.mkdirSync(DATA_DIR, { recursive: true });
}
// Read existing to merge
let existing = {};
if (fs.existsSync(CONFIG_PATH)) {
try {
existing = JSON.parse(fs.readFileSync(CONFIG_PATH, "utf8"));
} catch(e) {}
}
const merged = { ...existing, ...config };
fs.writeFileSync(CONFIG_PATH, JSON.stringify(merged, null, 2), "utf8");
// Update process.env immediately
if (merged.DATABASE_URL) process.env.DATABASE_URL = merged.DATABASE_URL;
if (merged.DATABASE_DRIVER) process.env.DATABASE_DRIVER = merged.DATABASE_DRIVER;
if (merged.REDIS_URL) process.env.REDIS_URL = merged.REDIS_URL;
process.env.OPENCODEHUB_CONFIGURED = "true";
}
export function isConfigured() {
if (process.env.OPENCODEHUB_CONFIGURED === "true") return true;
if (process.env.DATABASE_URL) return true;
return loadConfig();
}
export function isOfflineMode() {
return process.env.OFFLINE_MODE === "true" || process.env.OFFLINE_MODE === "1";
}