Add project scaffolding and infrastructure config

pnpm monorepo with shared packages, server, and UI workspaces.
Includes Docker multi-stage build, Postgres compose, and root TypeScript/Vitest config.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
Forgotten
2026-02-16 13:31:35 -06:00
commit 481b3a46db
10 changed files with 3973 additions and 0 deletions

3
.env.example Normal file
View File

@@ -0,0 +1,3 @@
DATABASE_URL=postgres://paperclip:paperclip@localhost:5432/paperclip
PORT=3100
SERVE_UI=false

8
.gitignore vendored Normal file
View File

@@ -0,0 +1,8 @@
node_modules/
dist/
.env
*.tsbuildinfo
drizzle/meta/
.vite/
coverage/
.DS_Store

1
.npmrc Normal file
View File

@@ -0,0 +1 @@
auto-install-peers=true

38
Dockerfile Normal file
View File

@@ -0,0 +1,38 @@
FROM node:20-alpine AS base
RUN corepack enable
FROM base AS deps
WORKDIR /app
COPY package.json pnpm-workspace.yaml pnpm-lock.yaml .npmrc ./
COPY packages/shared/package.json packages/shared/
COPY packages/db/package.json packages/db/
COPY server/package.json server/
COPY ui/package.json ui/
RUN pnpm install --frozen-lockfile
FROM base AS build
WORKDIR /app
COPY --from=deps /app/node_modules node_modules
COPY --from=deps /app/packages/shared/node_modules packages/shared/node_modules
COPY --from=deps /app/packages/db/node_modules packages/db/node_modules
COPY --from=deps /app/server/node_modules server/node_modules
COPY --from=deps /app/ui/node_modules ui/node_modules
COPY . .
RUN pnpm --filter @paperclip/ui build
RUN pnpm --filter @paperclip/server build
FROM base AS production
WORKDIR /app
COPY --from=deps /app/node_modules node_modules
COPY --from=deps /app/packages/shared/node_modules packages/shared/node_modules
COPY --from=deps /app/packages/db/node_modules packages/db/node_modules
COPY --from=deps /app/server/node_modules server/node_modules
COPY --from=build /app/packages/shared packages/shared
COPY --from=build /app/packages/db packages/db
COPY --from=build /app/server/dist server/dist
COPY --from=build /app/server/package.json server/package.json
COPY --from=build /app/ui/dist ui/dist
COPY package.json pnpm-workspace.yaml ./
EXPOSE 3100
CMD ["node", "server/dist/index.js"]

25
docker-compose.yml Normal file
View File

@@ -0,0 +1,25 @@
services:
db:
image: postgres:17-alpine
environment:
POSTGRES_USER: paperclip
POSTGRES_PASSWORD: paperclip
POSTGRES_DB: paperclip
ports:
- "5432:5432"
volumes:
- pgdata:/var/lib/postgresql/data
server:
build: .
ports:
- "3100:3100"
environment:
DATABASE_URL: postgres://paperclip:paperclip@db:5432/paperclip
PORT: "3100"
SERVE_UI: "true"
depends_on:
- db
volumes:
pgdata:

24
package.json Normal file
View File

@@ -0,0 +1,24 @@
{
"name": "paperclip",
"private": true,
"type": "module",
"scripts": {
"dev": "pnpm run --parallel dev:server dev:ui",
"dev:server": "pnpm --filter @paperclip/server dev",
"dev:ui": "pnpm --filter @paperclip/ui dev",
"build": "pnpm -r build",
"typecheck": "pnpm -r typecheck",
"test": "vitest",
"test:run": "vitest run",
"db:generate": "pnpm --filter @paperclip/db generate",
"db:migrate": "pnpm --filter @paperclip/db migrate"
},
"devDependencies": {
"typescript": "^5.7.3",
"vitest": "^3.0.5"
},
"engines": {
"node": ">=20"
},
"packageManager": "pnpm@9.15.4"
}

3845
pnpm-lock.yaml generated Normal file

File diff suppressed because it is too large Load Diff

4
pnpm-workspace.yaml Normal file
View File

@@ -0,0 +1,4 @@
packages:
- packages/*
- server
- ui

18
tsconfig.json Normal file
View File

@@ -0,0 +1,18 @@
{
"compilerOptions": {
"target": "ES2023",
"module": "NodeNext",
"moduleResolution": "NodeNext",
"esModuleInterop": true,
"strict": true,
"skipLibCheck": true,
"declaration": true,
"declarationMap": true,
"sourceMap": true,
"outDir": "dist",
"rootDir": "src",
"forceConsistentCasingInFileNames": true,
"resolveJsonModule": true,
"isolatedModules": true
}
}

7
vitest.config.ts Normal file
View File

@@ -0,0 +1,7 @@
import { defineConfig } from "vitest/config";
export default defineConfig({
test: {
projects: ["packages/db", "server", "ui"],
},
});