diff --git a/README.md b/README.md index af9c409..c6f2f9d 100644 --- a/README.md +++ b/README.md @@ -54,6 +54,8 @@ cd web && npm run dev Open http://localhost:3326 and create your first project in Settings. +`npm run db:push` creates the local `data/` directory automatically on first run, so no manual `mkdir -p data` step is needed. + ## Claude Code Integration Add these hooks to your Claude Code config (`.claude/settings.json`) to auto-track ticket progress: diff --git a/drizzle.config.ts b/drizzle.config.ts index 225bfa1..2507379 100644 --- a/drizzle.config.ts +++ b/drizzle.config.ts @@ -1,10 +1,16 @@ +import fs from "node:fs"; +import path from "node:path"; import { defineConfig } from "drizzle-kit"; +const databasePath = "data/sqlite.db"; + +fs.mkdirSync(path.dirname(databasePath), { recursive: true }); + export default defineConfig({ schema: "./src/db/schema.ts", out: "./drizzle", dialect: "sqlite", dbCredentials: { - url: "data/sqlite.db", + url: databasePath, }, }); diff --git a/test/drizzle-config.test.ts b/test/drizzle-config.test.ts new file mode 100644 index 0000000..108429f --- /dev/null +++ b/test/drizzle-config.test.ts @@ -0,0 +1,23 @@ +import { afterEach, describe, expect, it, vi } from "vitest"; + +describe("drizzle config", () => { + afterEach(() => { + vi.resetModules(); + vi.clearAllMocks(); + vi.doUnmock("node:fs"); + }); + + it("creates the sqlite data directory before exporting config", async () => { + const mkdirSync = vi.fn(); + vi.doMock("node:fs", () => ({ + default: { + mkdirSync, + }, + })); + + const { default: config } = await import("../drizzle.config.ts"); + + expect(mkdirSync).toHaveBeenCalledWith("data", { recursive: true }); + expect(config.dbCredentials.url).toBe("data/sqlite.db"); + }); +});