Replace PGlite with embedded-postgres and add startup banner
Switch from PGlite (WebAssembly) to embedded-postgres for zero-config local development — provides a real PostgreSQL server with full compatibility. Add startup banner with config summary on server boot. Improve server bootstrap with auto port detection, database creation, and migration on startup. Update DATABASE.md, DEVELOPING.md, and SPEC-implementation.md to reflect the change. Update CLI database check and prompts. Simplify OnboardingWizard database options. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -35,23 +35,32 @@ export async function databaseCheck(config: PaperclipConfig): Promise<CheckResul
|
||||
}
|
||||
}
|
||||
|
||||
// PGlite mode — check data dir
|
||||
const dataDir = path.resolve(config.database.pgliteDataDir);
|
||||
if (!fs.existsSync(dataDir)) {
|
||||
if (config.database.mode === "embedded-postgres") {
|
||||
const dataDir = path.resolve(config.database.embeddedPostgresDataDir);
|
||||
if (!fs.existsSync(dataDir)) {
|
||||
return {
|
||||
name: "Database",
|
||||
status: "warn",
|
||||
message: `Embedded PostgreSQL data directory does not exist: ${dataDir}`,
|
||||
canRepair: true,
|
||||
repair: () => {
|
||||
fs.mkdirSync(dataDir, { recursive: true });
|
||||
},
|
||||
};
|
||||
}
|
||||
|
||||
return {
|
||||
name: "Database",
|
||||
status: "warn",
|
||||
message: `PGlite data directory does not exist: ${dataDir}`,
|
||||
canRepair: true,
|
||||
repair: () => {
|
||||
fs.mkdirSync(dataDir, { recursive: true });
|
||||
},
|
||||
status: "pass",
|
||||
message: `Embedded PostgreSQL configured at ${dataDir} (port ${config.database.embeddedPostgresPort})`,
|
||||
};
|
||||
}
|
||||
|
||||
return {
|
||||
name: "Database",
|
||||
status: "pass",
|
||||
message: `PGlite data directory exists: ${dataDir}`,
|
||||
status: "fail",
|
||||
message: `Unknown database mode: ${String(config.database.mode)}`,
|
||||
canRepair: false,
|
||||
repairHint: "Run `paperclip configure --section database`",
|
||||
};
|
||||
}
|
||||
|
||||
@@ -5,7 +5,7 @@ export async function promptDatabase(): Promise<DatabaseConfig> {
|
||||
const mode = await p.select({
|
||||
message: "Database mode",
|
||||
options: [
|
||||
{ value: "pglite" as const, label: "PGlite (embedded, no setup needed)", hint: "recommended" },
|
||||
{ value: "embedded-postgres" as const, label: "Embedded PostgreSQL (managed locally)", hint: "recommended" },
|
||||
{ value: "postgres" as const, label: "PostgreSQL (external server)" },
|
||||
],
|
||||
});
|
||||
@@ -30,19 +30,43 @@ export async function promptDatabase(): Promise<DatabaseConfig> {
|
||||
process.exit(0);
|
||||
}
|
||||
|
||||
return { mode: "postgres", connectionString, pgliteDataDir: "./data/pglite" };
|
||||
return {
|
||||
mode: "postgres",
|
||||
connectionString,
|
||||
embeddedPostgresDataDir: "./data/embedded-postgres",
|
||||
embeddedPostgresPort: 54329,
|
||||
};
|
||||
}
|
||||
|
||||
const pgliteDataDir = await p.text({
|
||||
message: "PGlite data directory",
|
||||
defaultValue: "./data/pglite",
|
||||
placeholder: "./data/pglite",
|
||||
const embeddedPostgresDataDir = await p.text({
|
||||
message: "Embedded PostgreSQL data directory",
|
||||
defaultValue: "./data/embedded-postgres",
|
||||
placeholder: "./data/embedded-postgres",
|
||||
});
|
||||
|
||||
if (p.isCancel(pgliteDataDir)) {
|
||||
if (p.isCancel(embeddedPostgresDataDir)) {
|
||||
p.cancel("Setup cancelled.");
|
||||
process.exit(0);
|
||||
}
|
||||
|
||||
return { mode: "pglite", pgliteDataDir: pgliteDataDir || "./data/pglite" };
|
||||
const embeddedPostgresPort = await p.text({
|
||||
message: "Embedded PostgreSQL port",
|
||||
defaultValue: "54329",
|
||||
placeholder: "54329",
|
||||
validate: (val) => {
|
||||
const n = Number(val);
|
||||
if (!Number.isInteger(n) || n < 1 || n > 65535) return "Port must be an integer between 1 and 65535";
|
||||
},
|
||||
});
|
||||
|
||||
if (p.isCancel(embeddedPostgresPort)) {
|
||||
p.cancel("Setup cancelled.");
|
||||
process.exit(0);
|
||||
}
|
||||
|
||||
return {
|
||||
mode: "embedded-postgres",
|
||||
embeddedPostgresDataDir: embeddedPostgresDataDir || "./data/embedded-postgres",
|
||||
embeddedPostgresPort: Number(embeddedPostgresPort || "54329"),
|
||||
};
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user