diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json index baeee1973..5a6a386dc 100644 --- a/.devcontainer/devcontainer.json +++ b/.devcontainer/devcontainer.json @@ -48,7 +48,7 @@ "editor.codeActionsOnSave": { "source.fixAll": true }, - "editor.defaultFormatter": "esbenp.prettier-vscode", + "editor.defaultFormatter": "oxc.oxc-vscode", "editor.formatOnSave": true, "editor.formatOnPaste": false, "editor.quickSuggestions": { @@ -67,13 +67,13 @@ "files.trimFinalNewlines": true, "files.trimTrailingWhitespace": true, "[javascript]": { - "editor.defaultFormatter": "esbenp.prettier-vscode" + "editor.defaultFormatter": "oxc.oxc-vscode" }, "[typescript]": { - "editor.defaultFormatter": "esbenp.prettier-vscode" + "editor.defaultFormatter": "oxc.oxc-vscode" }, "[svelte]": { - "editor.defaultFormatter": "svelte.svelte-vscode" + "editor.defaultFormatter": "oxc.oxc-vscode" }, "[prisma]": { "editor.defaultFormatter": "Prisma.prisma" @@ -90,10 +90,10 @@ "christian-kohler.path-intellisense", "csstools.postcss", "dbaeumer.vscode-eslint", - "esbenp.prettier-vscode", "formulahendry.auto-rename-tag", "ms-playwright.playwright", "openai.chatgpt", + "oxc.oxc-vscode", "Prisma.prisma", "streetsidesoftware.code-spell-checker", "svelte.svelte-vscode", diff --git a/.devcontainer/init-firewall.sh b/.devcontainer/init-firewall.sh index a90a93663..a8959e0a1 100644 --- a/.devcontainer/init-firewall.sh +++ b/.devcontainer/init-firewall.sh @@ -36,10 +36,10 @@ vscode_extension_publishers=( christian-kohler csstools dbaeumer - esbenp formulahendry ms-playwright openai + oxc prisma streetsidesoftware svelte diff --git a/.oxfmtrc.json b/.oxfmtrc.json new file mode 100644 index 000000000..ccc8bf60d --- /dev/null +++ b/.oxfmtrc.json @@ -0,0 +1,34 @@ +{ + "$schema": "./node_modules/oxfmt/configuration_schema.json", + "useTabs": false, + "singleQuote": true, + "tabWidth": 2, + "trailingComma": "all", + "printWidth": 100, + "sortPackageJson": false, + "svelte": {}, + "associations": [ + { + "files": ["*.svelte"], + "language": "svelte" + } + ], + "ignorePatterns": [ + ".DS_Store", + "node_modules", + "/build", + "/.svelte-kit", + "/package", + ".env", + ".env.*", + "!.env.example", + "/.pnpm-store", + "pnpm-lock.yaml", + "package-lock.json", + "yarn.lock", + "vite.config.js.timestamp-*", + "vite.config.ts.timestamp-*", + "prisma/ERD.md", + "prisma/migrations/migration_lock.toml" + ] +} diff --git a/.prettierignore b/.prettierignore deleted file mode 100644 index b4d45f78d..000000000 --- a/.prettierignore +++ /dev/null @@ -1,18 +0,0 @@ -.DS_Store -node_modules -/build -/.svelte-kit -/package -.env -.env.* -!.env.example - -# Ignore files for PNPM, NPM and YARN -/.pnpm-store -pnpm-lock.yaml -package-lock.json -yarn.lock -vite.config.js.timestamp-* -vite.config.ts.timestamp-* - -prisma/ERD.md diff --git a/.prettierrc b/.prettierrc deleted file mode 100644 index 5e33984f4..000000000 --- a/.prettierrc +++ /dev/null @@ -1,9 +0,0 @@ -{ - "useTabs": false, - "singleQuote": true, - "tabWidth": 2, - "trailingComma": "all", - "printWidth": 100, - "plugins": ["prettier-plugin-svelte"], - "overrides": [{ "files": "*.svelte", "options": { "parser": "svelte" } }] -} diff --git a/AGENTS.md b/AGENTS.md index 7f089f720..16f2d7ae0 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -22,7 +22,7 @@ Before adding a function, search `src/lib/utils/`, `src/lib/services/`, `src/fea ## Architecture -SvelteKit 3 + Svelte 5 Runes + TypeScript | PostgreSQL + Prisma | Flowbite Svelte + Tailwind 4 | Vitest + Playwright | oxlint + ESLint +SvelteKit 3 + Svelte 5 Runes + TypeScript | PostgreSQL + Prisma | Flowbite Svelte + Tailwind 4 | Vitest + Playwright | oxfmt + oxlint + ESLint Layers: `prisma/` | `src/**/server/` | `src/**/zod/` | `src/**/types/`, `src/**/fixtures/` | `src/**/services/` | `src/**/utils/` | `src/**/stores/` | `src/routes/` | `src/**/*.svelte`. Each layer's constraints are in the layer table of `coding-style.md`; read it before writing logic. @@ -80,7 +80,9 @@ pnpm exec prisma migrate dev --name Run project tools with `pnpm exec`, never `pnpm dlx`: `dlx` downloads the latest release and ignores the pinned version (CI once ran Prisma v7 against the v5 schema). -Lefthook runs Prettier, oxlint for JS/TS, and ESLint for Svelte before commit. +Lefthook runs oxfmt, oxlint for JS/TS, and ESLint for Svelte before commit. + +Formatting belongs to oxfmt alone. Do not add ESLint or oxlint rules whose `meta.type` is `layout` (e.g. `svelte/indent`), because they would conflict with the formatter. ## Verification and Cross-review Before a PR diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index d5ac12798..eede3dbc2 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -49,7 +49,7 @@ - 文法およびフォーマットチェッカー - [oxlint](https://oxc.rs/docs/guide/usage/linter.html): JS/TS ファイルの高速リンター(50–100x 高速) - [ESLint](https://eslint.org/): Svelte ファイル専用リンター(eslint-plugin-svelte)のみ使用 - - [Prettier](https://prettier.io/) + - [oxfmt](https://oxc.rs/docs/guide/usage/formatter.html): Prettier 互換のフォーマッター。整形は oxfmt だけが担当し、ESLint・oxlint には整形のルール(`meta.type` が `layout`)を入れない - [lefthook](https://github.com/evilmartians/lefthook): Git hooks 管理ツール(コミット前の自動フォーマット・リント) - Search Engine Optimization (SEO) 対策 - [Svelte Meta Tags](https://github.com/oekazuma/svelte-meta-tags): メタタグ、Open Graph などの設定 @@ -164,7 +164,7 @@ Claude Code と Codex は用途や利用可能な契約に応じて選択でき - ホストの VS Code のユーザー設定に `"dev.containers.gitCredentialHelperConfigLocation": "none"` を追加し、GitHub のトークンをコンテナに共有しないようにします。 - コンテナ内の `sudo` はファイアウォール専用です。apt のパッケージや Playwright のブラウザは `Dockerfile` を変更して Rebuild します。 - インターネット向けの通信は [init-firewall.sh](.devcontainer/init-firewall.sh) の許可リストに限られ、Docker ネットワーク内では `web` から `db:5432` への通信を許可します。許可リストの宛先が突然つながらないときは CDN の IP が変わった可能性があるので、コンテナを Rebuild します。スクリプトを変更した場合も Rebuild が必要です。宛先の追加は、持ち出し経路が増えるため必要なものだけにします。 -- `devcontainer.json` に VS Code の拡張機能を追加したときは、`init-firewall.sh` の `vscode_extension_publishers` にも発行者 ID(`esbenp.prettier-vscode` なら `esbenp`)を追加します。 +- `devcontainer.json` に VS Code の拡張機能を追加したときは、`init-firewall.sh` の `vscode_extension_publishers` にも発行者 ID(`oxc.oxc-vscode` なら `oxc`)を追加します。拡張機能を外したときは、その発行者の拡張機能がほかに無ければ発行者 ID も消します。 #### ホスト側で SSH の鍵を ssh-agent へ登録 @@ -315,7 +315,7 @@ Set-Service ssh-agent -StartupType Automatic; Start-Service ssh-agent 本プロジェクトでは、[lefthook](https://github.com/evilmartians/lefthook)を使用して、コミット前に自動的にコードの書式チェック・フォーマットを行います。 - **Pre-commit Hook**: ステージ済みファイルのみに対して以下を実行 - - `prettier --write`: コード書式の自動修正(JavaScript、TypeScript、Markdown、Svelte) + - `oxfmt`: コード書式の自動修正(JavaScript、TypeScript、Markdown、Svelte) - `oxlint`: JS/TS ファイルのリント(JavaScript、TypeScript) - `eslint`: Svelte ファイルのリント(.svelte のみ) diff --git a/docs/dev-notes/2026-03-27/atcoder-verified-voting/plan.md b/docs/dev-notes/2026-03-27/atcoder-verified-voting/plan.md index 92372d3c2..be5a6d6c9 100644 --- a/docs/dev-notes/2026-03-27/atcoder-verified-voting/plan.md +++ b/docs/dev-notes/2026-03-27/atcoder-verified-voting/plan.md @@ -509,9 +509,9 @@ return { `EDIT_PROFILE_PAGE` は `$lib/constants/navbar-links` からインポートし、`