mirror of
https://github.com/supabase/supabase.git
synced 2026-10-05 09:25:06 +03:00
## Problem shadcn lint rules has been soft landed in #50676 and are now on as warnings in every app, but nothing stops a PR from adding new violations linear: FE-4473 ## Solution - moved the ratchet script and its tests from `apps/studio/scripts` to `packages/eslint-config-supabase` so every app runs one copy - added a shared rule list, `packages/eslint-config-supabase/ratchet-rules.json` with the shadcn rules - www, docs, design-system, ui-library and learn get `lint-ratchet.yml` with one job per changed app (triggered by the app, `packages/**` or the lockfile) + a weekly `lint-ratchet-decrease.yml` (as for studio ratchet) - package tests run in `eslint-config-supabase-tests.yml` <!-- ## Preview links If relevant, include links to changed pages for easy review access. Copy the preview base URL from the Vercel bot comment on this PR. Use the following table as an example template. | Site | Live | Preview | Search for | | -------------- | ------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------ | ----------------------------- | | WWW | [/blog/your-post](https://supabase.com/blog/your-post) | [/blog/your-post](https://zone-www-dot-com-git-branch-name-supabase.vercel.app/blog/your-post) | unique phrase from the change | | Docs | [/docs/guides/your-page](https://supabase.com/docs/guides/your-page) | [/docs/guides/your-page](https://docs-git-branch-name-supabase.vercel.app/docs/guides/your-page) | unique phrase from the change | | Studio | [/dashboard](https://supabase.com/dashboard) | [/dashboard](https://studio-git-branch-name-supabase.vercel.app/dashboard) | unique phrase from the change | | Design system | [/design-system](https://supabase.com/design-system) | [/design-system](https://design-system-git-branch-name-supabase.vercel.app/design-system) | unique phrase from the change | | UI library | [/library](https://supabase.com/library) | [/library](https://ui-library-git-branch-name-supabase.vercel.app/library) | unique phrase from the change | | Knowledge base | [/kb/guides/your-page](https://supabase.com/kb/guides/your-page) | [/kb/guides/your-page](https://kb-git-branch-name-supabase.vercel.app/kb/guides/your-page) | unique phrase from the change | --> <!-- ## Additional context Optionally add any other context or screenshots. --> ## Review instructions 1. run `pnpm --filter ./apps/www run lint:ratchet` 2. add `p-[13px]` to a `className` in any www component and run it again. it fails with `shadcn/no-arbitrary-values` and the file name with `(+1)` 3. revert change 4. run `pnpm --filter eslint-config-supabase test` and see 6 tests pass 5. in ci, check `Ratchet studio lint checks` and the `ratchet (<app>)` jobs for the apps this pr touches ## Checklist Check all before review: - [x] I have read [CONTRIBUTING.md](https://github.com/supabase/supabase/blob/master/CONTRIBUTING.md) - [x] If I wrote a new docs topic or edited an existing topic, I used the `/write-the-docs` or `/edit-the-docs` skill, which applies the docs [style guide](https://github.com/supabase/supabase/tree/master/apps/docs/style-guide) <!-- This is an auto-generated comment: release notes by coderabbit.ai --> ## Summary by CodeRabbit * **Developer Improvements** * Expanded automated lint checks to cover additional apps and shared package changes. * Added checks for arbitrary Tailwind values, unknown classes, and raw colors across supported apps. * Added automated baseline updates that can open or update a pull request when lint counts change. * Added tests for the lint configuration and support for combining multiple rule files. * Updated Studio lint notifications to exclude Shadcn rules with zero-baseline counts. <!-- end of auto-generated comment: release notes by coderabbit.ai -->
76 lines
6.8 KiB
Markdown
76 lines
6.8 KiB
Markdown
# Supabase Monorepo
|
|
|
|
pnpm 11 + Turborepo monorepo. Requires Node >= 22.13.
|
|
|
|
## Structure
|
|
|
|
| Directory | Purpose |
|
|
| ------------------------ | ------------------------------------------------------------------------------------------------------------------ |
|
|
| `apps/studio` | Supabase Studio/Dashboard — has its own `apps/studio/AGENTS.md` (see below) |
|
|
| `apps/docs` | Documentation site — Next.js app router, MDX (port 3001, served under `/docs`) — has its own `apps/docs/AGENTS.md` |
|
|
| `apps/www` | Marketing website — Next.js, app + pages (port 3000) |
|
|
| `apps/design-system` | Component demos — source of truth for Studio UI patterns (port 3003) |
|
|
| `apps/ui-library` | shadcn-style registry site for Supabase UI blocks (port 3004) |
|
|
| `apps/lite-studio` | Lightweight Studio — different stack: React Router 7 + Vite + Tailwind v4 |
|
|
| `apps/kb` | Knowledge base — Astro — has its own `apps/kb/AGENTS.md` |
|
|
| `apps/learn` | Courses site — Next.js + Contentlayer (port 3007), early stage |
|
|
| `packages/ui` | Shared UI components (shadcn/ui based) — `import { Button } from 'ui'` |
|
|
| `packages/ui-patterns` | Composite components — subpath imports, e.g. `ui-patterns/AssistantChat` |
|
|
| `packages/common` | Shared utils, telemetry constants, feature flags |
|
|
| `packages/api-types` | Generated platform Management API types |
|
|
| `packages/pg-meta` | SQL builders for Postgres introspection (`SafeSqlFragment`) |
|
|
| `packages/shared-data` | Static data: pricing, plans, regions, error codes |
|
|
| `e2e/studio`, `e2e/docs` | Playwright E2E tests |
|
|
| `supabase/` | Local Supabase project: edge functions, migrations, config.toml |
|
|
|
|
## Common Commands
|
|
|
|
```bash
|
|
pnpm dev:studio # run Studio dev server → http://localhost:8082
|
|
pnpm dev:docs # run docs dev server
|
|
pnpm dev:www # run www dev server
|
|
pnpm dev:kb # run knowledge base dev server
|
|
pnpm test:studio # Studio unit tests (vitest)
|
|
pnpm e2e # Studio E2E tests (playwright)
|
|
pnpm build --filter=studio # build Studio
|
|
pnpm lint --filter=studio # lint Studio
|
|
pnpm typecheck # typecheck all packages
|
|
pnpm format # Prettier write (check: pnpm test:prettier)
|
|
pnpm generate:types # local DB types → supabase/functions/common/database-types.ts
|
|
pnpm api:codegen # platform Management API types → packages/api-types
|
|
```
|
|
|
|
## CI
|
|
|
|
Every PR must pass typecheck + lint (one workflow), Prettier, and a typos check. Other checks are path-filtered: Studio unit tests/build and the lint ratchet (ESLint warning count must not increase) run on `apps/studio/**` changes and the Tailwind class rules (`shadcn/*`) for `www`, `docs`, `design-system`, `ui-library`, and `learn`; app-specific test suites run on their own paths.
|
|
|
|
Never hand-edit generated files: `packages/api-types/types/**`, `**/routeTree.gen.ts`, `**/__generated__/**`, `apps/docs/features/docs/generated/**`, `apps/www/.generated/**`, `supabase/functions/common/database-types.ts`, `apps/docs/content/_partials/access-control/scoped_pat_*.mdx` (run `make -C apps/docs/spec generate.partials.access-control`).
|
|
|
|
## Conventions
|
|
|
|
**UI** — import from `'ui'`; primitives are shadcn/ui-based and exported unsuffixed (`Input`, `Select`, `Form`, …). Use `Button` — the in-house component and the standard everywhere (a raw shadcn `Button_Shadcn_` also exists but is rarely the right choice). Check `packages/ui/index.tsx` before creating new primitives. Higher-level patterns live in `packages/ui-patterns`.
|
|
|
|
**Styling** — Tailwind only, semantic tokens (`bg-muted`, `text-foreground-light`), no hardcoded colors.
|
|
|
|
**Exports** — named exports only; default exports are allowed only where a framework requires them (`pages/**`, `app/**`, config files — the eslint preset has the exact carve-out list). Lint-enforced across all apps via `eslint-config-supabase` (severity `warn` everywhere; hard-enforced in Studio by the lint ratchet).
|
|
|
|
**Language** — Use U.S. English everywhere.
|
|
|
|
**Public surfaces** — this repo is public: PR descriptions, issues, and code comments are world-readable. Keep internal content out of them: absolute production metrics (event counts, user counts, revenue figures: state percentages, ratios, or relative change instead), internal decision detail (vendor, legal, pricing, or strategy discussions), and competitor names (protocol identifiers such as user-agent strings are fine). Put that context in the Linear issue and link it.
|
|
|
|
## Skills
|
|
|
|
The skills in `.agents/skills/` are the source of truth for conventions. Load the relevant ones before working, don't guess. One exception: for docs **content** style, `apps/docs/style-guide/` is the source of truth and the docs skills are the process that applies it.
|
|
|
|
- `copywriting` — any user-facing text, anywhere in the monorepo
|
|
- `pm-the-docs` / `write-the-docs` / `edit-the-docs` / `ask-the-docs` / `review-the-docs` — anything under `apps/docs` (see `apps/docs/CONTRIBUTING.md` for the authoring skill model, and `apps/docs/style-guide/` for the content style rules they apply)
|
|
- `telemetry-standards` — PostHog events, `packages/common/telemetry-constants.ts`
|
|
- `dev-toolbar-review` — `packages/dev-tools`, `packages/common/posthog-client.ts`, `packages/common/feature-flags.tsx`
|
|
- `safe-sql-execution` — any code that builds or executes SQL against user databases
|
|
- `react-hook-form` — writing or modifying any form code, anywhere in the monorepo
|
|
- `vitest` / `vercel-composition-patterns` — generic unit-testing and React composition references
|
|
|
|
## Studio
|
|
|
|
Before working on anything in `apps/studio`, read `apps/studio/AGENTS.md` if it isn't already in context — it maps Studio tasks to required skills and covers the TanStack Start migration rules.
|