Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
29 changes: 29 additions & 0 deletions .github/workflows/format.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
name: Format Check

on:
push:
branches: [main]
pull_request:
branches: [main]

jobs:
format:
name: Biome Format
runs-on: ubuntu-latest
permissions:
contents: read

steps:
- name: Checkout code
uses: actions/checkout@v4

- name: Setup Bun
uses: oven-sh/setup-bun@v1
with:
bun-version: 1.2.20

- name: Install dependencies
run: bun install

- name: Run format check
run: bun run format:check
30 changes: 30 additions & 0 deletions .github/workflows/lint.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
name: Lint Check

on:
push:
branches: [main]
pull_request:
branches: [main]

permissions:
contents: read

jobs:
lint:
name: Biome Lint
runs-on: ubuntu-latest

steps:
- name: Checkout code
uses: actions/checkout@v4

- name: Setup Bun
uses: oven-sh/setup-bun@v1
with:
bun-version: 1.2.20

- name: Install dependencies
run: bun install

- name: Run lint check
run: bun run lint
6 changes: 0 additions & 6 deletions .prettierignore

This file was deleted.

7 changes: 0 additions & 7 deletions .prettierrc

This file was deleted.

23 changes: 22 additions & 1 deletion .vscode/settings.json
Original file line number Diff line number Diff line change
@@ -1,3 +1,24 @@
{
"typescript.tsdk": "node_modules/typescript/lib"
"typescript.tsdk": "node_modules/typescript/lib",
"editor.formatOnSave": true,
"editor.defaultFormatter": "biomejs.biome",
"editor.codeActionsOnSave": {
"source.fixAll.biome": "explicit",
"source.organizeImports.biome": "explicit"
},
"[javascript]": {
"editor.defaultFormatter": "biomejs.biome"
},
"[javascriptreact]": {
"editor.defaultFormatter": "biomejs.biome"
},
"[typescript]": {
"editor.defaultFormatter": "biomejs.biome"
},
"[typescriptreact]": {
"editor.defaultFormatter": "biomejs.biome"
},
"[json]": {
"editor.defaultFormatter": "biomejs.biome"
}
}
8 changes: 5 additions & 3 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -134,8 +134,10 @@ bun run dev # Start development server
bun run build # Create production build
bun run start # Start production server
bun run preview # Build and preview production
bun run lint # Run ESLint
bun run lint:fix # Auto-fix ESLint issues
bun run lint # Run Biome linter
bun run lint:fix # Auto-fix Biome lint issues
bun run format # Format with Biome
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Script format silently applies lint fixes beyond formatting

Low Severity

The format script runs biome check --write . which applies lint auto-fixes in addition to formatting and import organization, but the README documents it simply as "Format with Biome." Meanwhile, format:check (used in CI) explicitly disables linting via --linter-enabled=false, creating an asymmetry: format fixes lint+format+imports, but format:check only validates format+imports. A developer running format expecting only whitespace changes may get unexpected code modifications from lint auto-fixes.

Additional Locations (1)

Fix in Cursor Fix in Web

bun run check # Run full Biome check (lint + format + imports)
SUPABASE_PROJECT_ID=your-project-id bun run db:types # Generate DB types
bun run db:migration # Create migration

Expand Down Expand Up @@ -186,4 +188,4 @@ If you need help or have questions:
## License
This project is licensed under the Apache License, Version 2.0 - see the [LICENSE](LICENSE) file for details.

Copyright 2025 FoundryLabs, Inc.
Copyright 2025 FoundryLabs, Inc.
76 changes: 76 additions & 0 deletions biome.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,76 @@
{
"$schema": "https://biomejs.dev/schemas/2.4.4/schema.json",
"vcs": {
"enabled": true,
"clientKind": "git",
"useIgnoreFile": true
},
"formatter": {
"enabled": true,
"indentStyle": "space",
"indentWidth": 2
},
"linter": {
"enabled": true,
"rules": {
"recommended": true,
"a11y": {
"noLabelWithoutControl": "warn",
"noStaticElementInteractions": "warn",
"noSvgWithoutTitle": "warn",
"useButtonType": "warn",
"useIframeTitle": "warn",
"useKeyWithClickEvents": "warn"
},
"correctness": {
"useExhaustiveDependencies": "warn",
"useHookAtTopLevel": "warn"
},
"performance": {
"noAccumulatingSpread": "warn",
"noImgElement": "warn"
},
"security": {
"noDangerouslySetInnerHtml": "warn",
"noDangerouslySetInnerHtmlWithChildren": "warn"
},
"style": {
"noNonNullAssertion": "warn"
},
"suspicious": {
"noArrayIndexKey": "off",
"noCommentText": "warn",
"noExplicitAny": "warn",
"useIterableCallbackReturn": "warn"
}
}
},
"assist": {
"actions": {
"source": {
"organizeImports": "on"
}
}
},
"javascript": {
"formatter": {
"quoteStyle": "single",
"semicolons": "asNeeded",
"trailingCommas": "es5"
}
},
"json": {
"formatter": {
"enabled": true
},
"parser": {
"allowComments": false,
"allowTrailingCommas": false
}
},
"css": {
"parser": {
"tailwindDirectives": true
}
}
}
Loading
Loading