From 35fe84a1dda6a26a91881debd59925abdfedb772 Mon Sep 17 00:00:00 2001 From: Chris Parsons <438676+chrisparsons83@users.noreply.github.com> Date: Sat, 7 Mar 2026 22:31:04 -0800 Subject: [PATCH] Update claude.md to push more tests. (#84) * Update claude.md to push more tests. * Archiving old plans. * fix: run DB migrations programmatically on server startup Replace unreliable drizzle-kit CLI migration with drizzle-orm's built-in migrator running in the server process before accepting connections. This ensures migrations are always applied on deploy and fails fast if they error. - Add runMigrations() to server.ts using drizzle-orm/postgres-js/migrator - Skip migrations in development (handled manually via db:migrate) - Add DATABASE_URL guard with a clear error message - Remove start:production script (now identical to start) - Update Dockerfile CMD to use npm run start Co-Authored-By: Claude Sonnet 4.6 --------- Co-authored-by: Claude Sonnet 4.6 --- CLAUDE.md | 9 +++++++ Dockerfile | 2 +- package.json | 1 - .../DRAFT_ORDER_IMPLEMENTATION.md | 0 plans/{ => completed}/bracket-expansion.md | 0 .../draft-room-implementation.md | 0 plans/{ => completed}/draft-room-redesign.md | 0 plans/{ => completed}/e2e-testing-setup.md | 0 ...ague-draft-rules-IMPLEMENTATION-SUMMARY.md | 0 .../omni-league-draft-rules.md | 0 .../phase-2.7-testing-instructions.md | 0 .../phase-3-server-js-changes.md | 0 .../phase-3-socket-implementation-plan.md | 0 .../phase-3-socket-implementation-summary.md | 0 plans/{ => completed}/phase-3-verification.md | 0 .../phase-4-socket-test-instructions.md | 0 .../phase-5-detailed-implementation-plan.md | 0 .../phase-5-expected-value-planning.md | 0 plans/{ => completed}/phase2-bugs-review.md | 0 plans/{ => completed}/public-api-v1.md | 0 plans/{ => completed}/scoring-system.md | 0 .../server-typescript-conversion-compiled.md | 0 .../server-typescript-conversion.md | 0 .../{ => completed}/testing-implementation.md | 0 server.ts | 27 ++++++++++++++++--- 25 files changed, 33 insertions(+), 6 deletions(-) rename plans/{ => completed}/DRAFT_ORDER_IMPLEMENTATION.md (100%) rename plans/{ => completed}/bracket-expansion.md (100%) rename plans/{ => completed}/draft-room-implementation.md (100%) rename plans/{ => completed}/draft-room-redesign.md (100%) rename plans/{ => completed}/e2e-testing-setup.md (100%) rename plans/{ => completed}/omni-league-draft-rules-IMPLEMENTATION-SUMMARY.md (100%) rename plans/{ => completed}/omni-league-draft-rules.md (100%) rename plans/{ => completed}/phase-2.7-testing-instructions.md (100%) rename plans/{ => completed}/phase-3-server-js-changes.md (100%) rename plans/{ => completed}/phase-3-socket-implementation-plan.md (100%) rename plans/{ => completed}/phase-3-socket-implementation-summary.md (100%) rename plans/{ => completed}/phase-3-verification.md (100%) rename plans/{ => completed}/phase-4-socket-test-instructions.md (100%) rename plans/{ => completed}/phase-5-detailed-implementation-plan.md (100%) rename plans/{ => completed}/phase-5-expected-value-planning.md (100%) rename plans/{ => completed}/phase2-bugs-review.md (100%) rename plans/{ => completed}/public-api-v1.md (100%) rename plans/{ => completed}/scoring-system.md (100%) rename plans/{ => completed}/server-typescript-conversion-compiled.md (100%) rename plans/{ => completed}/server-typescript-conversion.md (100%) rename plans/{ => completed}/testing-implementation.md (100%) diff --git a/CLAUDE.md b/CLAUDE.md index 85941d8..dcbc641 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -163,6 +163,15 @@ The draft system implements snake draft: - **Fixtures**: Reusable test data in `app/test/fixtures/` - See `TESTING.md` for comprehensive testing guide +**IMPORTANT: Tests are required for new features.** When adding any new feature, you must include appropriate tests: +- New model functions → unit tests in a co-located `__tests__/` directory +- New route loaders/actions → unit or integration tests for the logic +- New utility functions → unit tests +- New components with non-trivial logic → component tests +- Critical user flows → Cypress E2E tests + +Do not consider a feature complete until tests are written and passing. + ## Common Workflows ### Adding a New Route diff --git a/Dockerfile b/Dockerfile index 2ed080e..8082a5b 100644 --- a/Dockerfile +++ b/Dockerfile @@ -22,4 +22,4 @@ COPY --from=build-env /app/dist /app/dist COPY ./drizzle /app/drizzle COPY ./drizzle.config.ts /app/drizzle.config.ts WORKDIR /app -CMD ["npm", "run", "start:production"] \ No newline at end of file +CMD ["npm", "run", "start"] \ No newline at end of file diff --git a/package.json b/package.json index dc28c0c..ad3d9ad 100644 --- a/package.json +++ b/package.json @@ -10,7 +10,6 @@ "db:migrate": "dotenv -- drizzle-kit migrate", "dev": "dotenv -- tsx watch server.ts", "start": "node dist/server.js", - "start:production": "drizzle-kit migrate && node dist/server.js", "test": "vitest", "test:ui": "vitest --ui", "test:coverage": "vitest --coverage", diff --git a/plans/DRAFT_ORDER_IMPLEMENTATION.md b/plans/completed/DRAFT_ORDER_IMPLEMENTATION.md similarity index 100% rename from plans/DRAFT_ORDER_IMPLEMENTATION.md rename to plans/completed/DRAFT_ORDER_IMPLEMENTATION.md diff --git a/plans/bracket-expansion.md b/plans/completed/bracket-expansion.md similarity index 100% rename from plans/bracket-expansion.md rename to plans/completed/bracket-expansion.md diff --git a/plans/draft-room-implementation.md b/plans/completed/draft-room-implementation.md similarity index 100% rename from plans/draft-room-implementation.md rename to plans/completed/draft-room-implementation.md diff --git a/plans/draft-room-redesign.md b/plans/completed/draft-room-redesign.md similarity index 100% rename from plans/draft-room-redesign.md rename to plans/completed/draft-room-redesign.md diff --git a/plans/e2e-testing-setup.md b/plans/completed/e2e-testing-setup.md similarity index 100% rename from plans/e2e-testing-setup.md rename to plans/completed/e2e-testing-setup.md diff --git a/plans/omni-league-draft-rules-IMPLEMENTATION-SUMMARY.md b/plans/completed/omni-league-draft-rules-IMPLEMENTATION-SUMMARY.md similarity index 100% rename from plans/omni-league-draft-rules-IMPLEMENTATION-SUMMARY.md rename to plans/completed/omni-league-draft-rules-IMPLEMENTATION-SUMMARY.md diff --git a/plans/omni-league-draft-rules.md b/plans/completed/omni-league-draft-rules.md similarity index 100% rename from plans/omni-league-draft-rules.md rename to plans/completed/omni-league-draft-rules.md diff --git a/plans/phase-2.7-testing-instructions.md b/plans/completed/phase-2.7-testing-instructions.md similarity index 100% rename from plans/phase-2.7-testing-instructions.md rename to plans/completed/phase-2.7-testing-instructions.md diff --git a/plans/phase-3-server-js-changes.md b/plans/completed/phase-3-server-js-changes.md similarity index 100% rename from plans/phase-3-server-js-changes.md rename to plans/completed/phase-3-server-js-changes.md diff --git a/plans/phase-3-socket-implementation-plan.md b/plans/completed/phase-3-socket-implementation-plan.md similarity index 100% rename from plans/phase-3-socket-implementation-plan.md rename to plans/completed/phase-3-socket-implementation-plan.md diff --git a/plans/phase-3-socket-implementation-summary.md b/plans/completed/phase-3-socket-implementation-summary.md similarity index 100% rename from plans/phase-3-socket-implementation-summary.md rename to plans/completed/phase-3-socket-implementation-summary.md diff --git a/plans/phase-3-verification.md b/plans/completed/phase-3-verification.md similarity index 100% rename from plans/phase-3-verification.md rename to plans/completed/phase-3-verification.md diff --git a/plans/phase-4-socket-test-instructions.md b/plans/completed/phase-4-socket-test-instructions.md similarity index 100% rename from plans/phase-4-socket-test-instructions.md rename to plans/completed/phase-4-socket-test-instructions.md diff --git a/plans/phase-5-detailed-implementation-plan.md b/plans/completed/phase-5-detailed-implementation-plan.md similarity index 100% rename from plans/phase-5-detailed-implementation-plan.md rename to plans/completed/phase-5-detailed-implementation-plan.md diff --git a/plans/phase-5-expected-value-planning.md b/plans/completed/phase-5-expected-value-planning.md similarity index 100% rename from plans/phase-5-expected-value-planning.md rename to plans/completed/phase-5-expected-value-planning.md diff --git a/plans/phase2-bugs-review.md b/plans/completed/phase2-bugs-review.md similarity index 100% rename from plans/phase2-bugs-review.md rename to plans/completed/phase2-bugs-review.md diff --git a/plans/public-api-v1.md b/plans/completed/public-api-v1.md similarity index 100% rename from plans/public-api-v1.md rename to plans/completed/public-api-v1.md diff --git a/plans/scoring-system.md b/plans/completed/scoring-system.md similarity index 100% rename from plans/scoring-system.md rename to plans/completed/scoring-system.md diff --git a/plans/server-typescript-conversion-compiled.md b/plans/completed/server-typescript-conversion-compiled.md similarity index 100% rename from plans/server-typescript-conversion-compiled.md rename to plans/completed/server-typescript-conversion-compiled.md diff --git a/plans/server-typescript-conversion.md b/plans/completed/server-typescript-conversion.md similarity index 100% rename from plans/server-typescript-conversion.md rename to plans/completed/server-typescript-conversion.md diff --git a/plans/testing-implementation.md b/plans/completed/testing-implementation.md similarity index 100% rename from plans/testing-implementation.md rename to plans/completed/testing-implementation.md diff --git a/server.ts b/server.ts index 624b0df..797a183 100644 --- a/server.ts +++ b/server.ts @@ -6,6 +6,9 @@ import { createServer } from "http"; import type { ViteDevServer } from "vite"; import path from "path"; import { fileURLToPath } from "url"; +import { drizzle } from "drizzle-orm/postgres-js"; +import { migrate } from "drizzle-orm/postgres-js/migrator"; +import postgres from "postgres"; // ESM module resolution helpers const __filename = fileURLToPath(import.meta.url); @@ -20,6 +23,20 @@ const CLIENT_ASSETS_PATH = path.join(PROJECT_ROOT, "build/client/assets"); const DEVELOPMENT = process.env.NODE_ENV === "development"; const PORT = Number.parseInt(process.env.PORT || "3000", 10); +async function runMigrations(): Promise { + if (!process.env.DATABASE_URL) { + throw new Error("DATABASE_URL is required"); + } + const client = postgres(process.env.DATABASE_URL); + try { + const db = drizzle(client); + await migrate(db, { migrationsFolder: path.join(PROJECT_ROOT, "drizzle") }); + console.log("Migrations complete"); + } finally { + await client.end(); + } +} + async function createAppServer(): Promise { const app: Express = express(); @@ -82,7 +99,9 @@ async function createAppServer(): Promise { } // Start the server with error handling -createAppServer().catch((error) => { - console.error("Failed to start server:", error); - process.exit(1); -}); +(DEVELOPMENT ? Promise.resolve() : runMigrations()) + .then(createAppServer) + .catch((error) => { + console.error("Failed to start server:", error); + process.exit(1); + });