Set up npm workspaces monorepo with Turborepo and local infra

Postgres and Redis run via docker compose on non-default ports (5447/6380)
to avoid clashing with other local services. React is pinned to a single
version across workspaces because Expo requires it.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MzFywujuH9TiuXbr9vjoX8
This commit is contained in:
2026-10-03 09:59:02 -04:00
co-authored by Claude Opus 5.5
commit 3627f29f73
7 changed files with 18756 additions and 0 deletions
+8
View File
@@ -0,0 +1,8 @@
node_modules
.env
.env.local
dist
.next
.turbo
*.tsbuildinfo
next-env.d.ts
+10
View File
@@ -0,0 +1,10 @@
<!-- BEGIN:turborepo-agent-rules -->
# This is NOT the Turborepo you know
Turborepo configuration, task behavior, and CLI commands can vary between installed versions and may differ from your training data. Resolve the `turbo` package from this file's directory or relevant workspace; in monorepos, it may not be visible from the repository root. For example, run `node -p "require.resolve('turbo/package.json')"` from a workspace that depends on `turbo`.
Read `docs/README.md` inside that installed package first, then read the relevant pages from its `docs/` directory before changing Turborepo configuration or commands. Heed deprecation notices. These bundled docs match the installed package version and are available without network access.
This block is written and re-added by `turbo` before repository-scoped commands when an AI agent is detected. In the Turborepo source repository, its template is defined in `crates/turborepo-cli/src/cli/agent_guidance.rs`. Removing the managed block while updates are enabled means a later qualifying invocation will add it again. Set `"agentGuidance": false` in the root `turbo.json` or `turbo.jsonc` to opt out; this does not remove an existing block. Keep the block committed with your work to avoid an uncommitted change on the next agent invocation.
<!-- END:turborepo-agent-rules -->
+17
View File
@@ -0,0 +1,17 @@
services:
postgres:
image: postgres:17
environment:
POSTGRES_USER: musicshare
POSTGRES_PASSWORD: musicshare
POSTGRES_DB: musicshare
ports:
- "${POSTGRES_PORT:-5447}:5432"
volumes:
- pgdata:/var/lib/postgresql/data
redis:
image: redis:7
ports:
- "${REDIS_PORT:-6380}:6379"
volumes:
pgdata:
+18658
View File
File diff suppressed because it is too large Load Diff
+31
View File
@@ -0,0 +1,31 @@
{
"name": "musicshare",
"private": true,
"workspaces": [
"apps/*",
"packages/*"
],
"scripts": {
"dev": "turbo run dev",
"build": "turbo run build",
"typecheck": "turbo run typecheck",
"infra:up": "docker compose up -d",
"infra:down": "docker compose down",
"db:generate": "npm run db:generate -w @musicshare/api",
"db:migrate": "npm run db:migrate -w @musicshare/api",
"mobile": "npm run start -w @musicshare/mobile"
},
"packageManager": "npm@10.8.1",
"engines": {
"node": ">=22"
},
"devDependencies": {
"turbo": "^2.11.7",
"typescript": "~6.0.3"
},
"overrides": {
"react": "19.2.3",
"react-dom": "19.2.3",
"@types/react": "~19.2.2"
}
}
+16
View File
@@ -0,0 +1,16 @@
{
"compilerOptions": {
"target": "ES2022",
"module": "ESNext",
"moduleResolution": "Bundler",
"lib": ["ES2023"],
"strict": true,
"noUncheckedIndexedAccess": true,
"esModuleInterop": true,
"skipLibCheck": true,
"resolveJsonModule": true,
"isolatedModules": true,
"forceConsistentCasingInFileNames": true,
"noEmit": true
}
}
+16
View File
@@ -0,0 +1,16 @@
{
"$schema": "https://turbo.build/schema.json",
"tasks": {
"dev": {
"cache": false,
"persistent": true
},
"build": {
"dependsOn": ["^build"],
"outputs": [".next/**", "!.next/cache/**", "dist/**"]
},
"typecheck": {
"dependsOn": ["^typecheck"]
}
}
}