tech-stack について
FixMyBerlin/FMC の地理系 React SPA 向けに、標準スタックと開発規約をまとめた Claude Code スキルです。アプリの新規作成や変更を行う開発者向けで、専門スキルや設定テンプレートも参照できます。
主な機能
- 01React 19 と TypeScript の標準設定
- 02Bun と Vite のビルド規約
- 03地理・地図ライブラリの選択
- 04Lint、整形、ブラウザー対象
- 05データ、状態、スタイルの選択
- 06スキャフォールドと CI テンプレート
活用シーン
- 01地理系 React アプリのスタック選定
- 02依存関係とアプリ共通規約の確認
- 03スクリプト、TypeScript、ツールの設定
- 04地図やテストの専門ガイドの参照
MCP 対応
Postgres スキーマの確認、データベースへの問い合わせ、ブラウザー探索に使う Claude Code MCP の設定を案内し、テンプレートや関連資料を参照します。
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ fixmyberlin/ fixmyskills --skill tech-stackインストール後、Claude Code で/tech-stackを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
examples/bunfig.netlify.toml.templatebunfig.toml.templateci.yml.templatedependabot.yml.templateknip.config.mjs.templatemcp.json.templateoxfmt.config.mjsoxlint.config.mjspackage-json-scripts.md.templatetsconfig.app.jsontsconfig.scripts.jsonvscode.extensions.json.templatevscode.settings.typescript.json.templateexamples/husky/ensure-bun.sh.templatepre-push.templatereferences/agent-browser-mcp.mdbrowser-target.mdbun-install-verify.mdbun-install.mddependabot.mdknip.mdllm-resources.mdoxc-config.mdpackage-json-scripts.mdpostgres-mcp.md詳細
FMC の技術スタック
FixMyBerlin / FMC における地理情報を多用する React SPAの標準スタックです。アプリの新規作成や変更時の技術選定に使用してください。個々のライブラリを深く掘り下げるものではありません。
関連スキルは個別にインストールしてください:bunx skills add FixMyBerlin/fixmyskills --skill <name> -g -a claude-code -y
適用するタイミング
- 新規アプリのスキャフォールド(依存関係、ツール、フォルダー構成)
package.jsonのスクリプトの追加または名前変更- ライブラリやパターンの選定(「X を使うべきか?」)
- 既存アプリの横断的な規約の確認
- Postgres スキーマの調査、エージェントによるデータベースクエリ、またはブラウザー探索 MCP 用の Claude Code MCP セットアップ
LLM リソース
references/llm-resources.md は、タスクに関係する領域についてのみ読み込んでください。
マップ: スキル react-map-gl を読み込みます(また、スキルで参照されている場合は上流の React Map GL ドキュメント も読み込みます)。
専門スキル
スキルは名前で参照してください。不足しているスキルは上記のコマンドでインストールしてください。
| 領域 | スキル |
|---|---|
| Rust/WASM の地理情報処理 | rust-wasm-geo |
| マップ(react-map-gl) | react-map-gl |
| React TS のパターン、useEffect の運用 | react-dev |
| TanStack Router(検索、ローダー、Query) | tanstack-router-conventions(参照:params-search-ui-routes.md、見やすい URL 用の router-search-serialization.md、router-and-query.md、devtools.md) |
| TanStack Start(境界、SSR、サーバー) | tanstack-start-conventions(フォルダー構成の参照:app-structure.md) |
| URL の状態管理(TanStack Router 使用時) | tanstack-router-conventions → params-search-ui-routes.md |
| URL の状態管理(Router を使わない Vite アプリ) | nuqs |
| クライアントのグローバル状態 | zustand-state-management |
| Prisma スキーマの命名、マイグレーション | prisma |
| E2E / Playwright | playwright-skill |
ランタイムとビルド
- ランタイム/パッケージマネージャー: Bun — インストール方針は bun-install.md を参照(≥ 1.3.14、グローバルストア、Vite では
bun --bun、Prisma/Playwright では.nvmrc、Docker イメージのインストールと Netlify 関数のパッケージ化) - ビルド: 最新の Vite(8+)
- Lint/フォーマット: 修正フラグ付きの oxlint と oxfmt。Prettier 互換のデフォルト設定:
- クラスの並べ替え、インポートの並べ替え、
package.jsonの並べ替え printWidth100、セミコロンはasNeeded、シングルクォート'typescript/switch-exhaustiveness-check': 'error'- React Compiler:oxlint の
reactプラグインと'react/unsupported-syntax': 'error'。Vite ではviteReact({ compiler: true })とoxc-transform-reactを使用(Babel は不使用) - テンプレート:examples/oxfmt.config.mjs、examples/oxlint.config.mjs
- セットアップとプロジェクトごとの調整:references/oxc-config.md
- クラスの並べ替え、インポートの並べ替え、
- クライアントのブラウザー対象:
package.jsonのbrowserslistが、Vite クライアントのbuild.targetと oxlint のeslint-plugin-compatを設定します — references/browser-target.md
React と TypeScript
- UI: React 19
- TypeScript(デフォルト):
typescript@^7(ネイティブ移植版。7.0 リリース)。bun run type-check経由でtsc --noEmitを使って型チェックします。ワークスペースのtypescriptパッケージは CLI(tsc)とエディターの言語サービスの両方を提供します。型チェック用に別のコンパイラーバイナリを追加しないでください。ナイトリービルド:typescript@next(廃止された@typescript/native-previewパッケージではありません)。 - エディターと CLI の整合性:
js/ts.tsdk.pathは、tscと同じdevDependencies.typescriptのインストール先(lib/ではなくパッケージルート)を指す必要があります。不整合があると、IDE の診断結果がbun run type-checkと食い違います。 - スキャフォールド(TS 7):
package.json—devDependencies.typescriptは^7、スクリプトは"type-check": "tsc --noEmit"(tsconfig を分割している場合は-pを追加)。CI が開発環境とは異なるプラットフォームで実行される場合は、@typescript/typescript-darwin-arm64/@typescript/typescript-linux-x64を同じバージョンでoptionalDependenciesに固定します(typescriptパッケージではこれらはオプションとして列挙されています。必要に応じて他のプラットフォームも追加してください)。bunfig.toml— bun-install.md。.vscode/settings.json(テンプレート:examples/vscode.settings.typescript.json.template)をコミットし、.vscode/extensions.jsonで TypeScript 7 拡張機能を推奨します(examples/vscode.extensions.json.template)。 - モノレポ: TypeScript がパッケージのサブフォルダーにある場合は、
js/ts.tsdk.pathにそのパッケージのnode_modules/typescriptへのパスを指定します(例:app/node_modules/typescript— tilda-geo)。 - Cursor / VS Code: TypeScript 7(
TypeScriptTeam.native-preview— マーケットプレイス ID は変更なし)をインストールします。コマンドパレットの TypeScript: Enable TypeScript 7 または設定テンプレートを使って有効にします。examples/vscode.settings.typescript.json.template を.vscode/settings.jsonにコピーします(references/oxc-config.md の oxc キーとマージしてください)。エディタープラグインが TS 6 を必要とする場合(Vue、Astro、Svelte、Angular のテンプレート — リリースノートを参照)は、Disable TypeScript 7 Language Server で切り替えます。 - Claude Code MCP(ユーザーレベル):
claude mcp add --scope userのみ(~/.claude.json)— examples/mcp.json.template。Postgres:references/postgres-mcp.md。ブラウザーでの調査:references/agent-browser-mcp.md。 - Claude Code ルール(アプリレベル): スキャフォールド時に examples/package-json-scripts.md.template を
.claude/rules/package-json-scripts.mdにコピーします — references/package-json-scripts.md
確認: node -e "console.log(require('typescript/package.json').version)"、tsc --version、bun run type-check を実行し、すべてが 7.x であることを確認します。エディターでは、TypeScript 7 が有効になっていることを確認します(ステータスバー/コマンドパレット)。このスキルのモノレポのように TS ソースがないリポジトリには、typescript を追加しないでください。
- React Compiler: デフォルトで有効です。メモ化と型付けの規約については、スキル
react-devを参照してください - GeoJSON: すべての GeoJSON ペイロードに
@types/geojsonを使用します - 日付/時刻:
@date-fns/tz - バリデーション: Zod 4
tsconfig のテンプレート
2 つのプロファイルを使用してください。アプリとスクリプトを 1 つの設定にまとめないでください。
| プロファイル | テンプレート | プロファイルの相当例 |
|---|---|---|
| アプリ(DOM、TanStack Start) | examples/tsconfig.app.json | total-typescript bundler/dom |
| スクリプト(CLI、DOM なし) | examples/tsconfig.scripts.json | total-typescript bundler/no-dom |
compilerOptions.types に bun-types / web を含める場合は、必ず型パッケージが必要です。これらの名前は組み込みではなく npm パッケージです。直接の devDependencies としてインストールしてください(Knip と globalStore は推移的な依存関係を自分の依存関係として扱いません。knip.md / bun-install.md):
- Bun の最低バージョンに合わせて
@types/bunを固定します(1.3.14) bun-typesを直接の依存関係として追加します(その最低バージョンに対する^)。typesはパッケージ名bun-typesを検索するため、@types/bunだけでは不十分です- 設定に
"web"が記載されている場合は@types/webも追加します
スクリプトプロファイル(types: ["bun-types"])では、DOM がなくても @types/bun と bun-types の両方が必要です。Bun スクリプトでは Glob / Bun.file() を使用してください。これらの依存関係を追加して初めて、型安全に使用できます。追加しない場合、エージェントは node:fs に頼ることになります。
スキャフォールド時にコピーして調整してください。プロジェクトの構成に合わせて paths(./src/* と ./*)を調整します。リポジトリに .js ファイルが残っている場合に限り、allowJs: true を追加してください。
TanStack Start(アプリのみ): verbatimModuleSyntax: false にしてください。型のみのインポートが空のランタイムインポートになり、サーバーコードがクライアントバンドルに漏れる可能性があります。tsconfig.app.json の冒頭のコメントを参照してください。
@total-typescript/tsconfig は絶対にインストールしたり、extends で指定したりしないでください。設定は逸脱理由のコメントとともにインラインで記述してください。
型チェック:
tsc --noEmit -p tsconfig.app.json && tsc --noEmit -p tsconfig.scripts.json
単一設定のリポジトリ(アプリとスクリプトをカバーするルートの tsconfig.json が 1 つだけある場合など)も許容されます。新規の TanStack Start アプリでは、設定を分けることを推奨します。
Astro / 単一設定: extends: astro/tsconfigs/strict を維持してください。types は ["bun-types", "web"] に設定します。vite/client は追加しないでください(Astro のクライアント型は .astro/types.d.ts から提供されます)。同じ tsconfig 内のスクリプトにも、Bun の型が必要です(上記と同じパッケージ)。
任意で、両方の子設定への "references" を含むルート tsconfig.json を追加できます。
ES2025: target と lib は同期させてください。ES2025 の新しいランタイム API は、クライアントでは意図的に使用し、サーバー / Bun / スクリプトでは問題なく使用できます。クライアントバンドルの対象となるブラウザーについては、references/browser-target.md を参照してください。
コンポーネントの型付け、Compiler、oxlint の React ルール、useEffect の運用規律については、スキル react-dev を参照してください。マップのカメラ、クリック、レイヤーについては、スキル react-map-gl を参照してください(useEffect + map.on() は使用しないでください)。
データと状態
| 必要なもの | 選択 |
|---|---|
| サーバー/非同期データ | TanStack Query — 生の useEffect によるフェッチは避けます。ルーターが対応している場合は Suspense を使用します |
| フォーム(複雑なもの) | TanStack Form |
| ルーティング | TanStack Router / Start |
| 共有可能な URL の状態(TanStack Router を使用する場合) | ルートの validateSearch(Zod)を使用し、nuqs は使いません — tanstack-router-conventions → params-search-ui-routes.md を参照 |
| 共有可能な URL の状態(TanStack Router を使用しない Vite アプリ) | nuqs — スキル nuqs を参照 |
| 頻繁に更新される URL | @tanstack/react-pacer — https://tanstack.com/pacer/latest を参照 |
| グローバルなクライアント状態 | Zustand(tkdodo のパターン)— スキル zustand-state-management を参照 |
| ローカル UI 状態 | useState |
| Prisma スキーマ/マイグレーション | スキル prisma — 命名、リレーションフィールド、マイグレーションのワークフロー |
Loader と Query の統合:スキル tanstack-router-conventions → router-and-query.md を参照してください。
スタイリングと UI
- CSS: Tailwind CSS、
@tailwindcss/forms、@tailwindcss/typography - クラスのマージ:
twJoin、twMergeを使ったtailwind-merge - フォント: Fontsource のインポート
- アクセシビリティ: セマンティック HTML、キーボードで操作できるマップコントロール
地図と地理空間(JS)
選択肢のみです。地図コンポーネントのパターン、レイヤー、イベント、URL のビューポートについては、スキル react-map-gl を参照してください。
| 選択項目 | デフォルト |
|---|---|
| ライブラリ | コンポーネント内では生の MapLibre ではなく、react-map-gl/maplibre を使用します |
| ベースマップ | OpenFreeMap。必要に応じて Maptiler を使用します |
| 座標 | API 境界では WGS84 を使用し、Zod で検証します |
| Turf | 関数ごとに @turf/* をインポートします。import * as turf は使用しません |
| フィーチャーの編集 | @osm-editor-kit/react-map-gl-draw(制御対象の value / onChange、スタイルはレイヤースタイルとして指定)。例:tilda-geo の描画。以前使用され、現在も代替候補となるもの:TerraDraw と maplibre-gl-terradraw |
Rust / WASM による地理空間処理
Turf と WASM の比較、クレート、Vite の連携については、スキル rust-wasm-geo を参照してください。
依存関係の更新(Dependabot)
- プロジェクトの種類に応じてスケジュールを設定します。不明な場合はAskUserQuestionを使用してください。FixMyCity:毎週月曜日。Private OSS と Astro:毎月第1金曜日。同じテンプレートを使用します。詳細:dependabot.md。
- エコシステムごとにオープン PR は一度に1件まで(
open-pull-requests-limit: 1)。 - テンプレート:examples/dependabot.yml.template
- **PR のレビューとマージ:**スキル
review-dependabot(変更履歴のトリアージ、リスク区分、リベースマージ)
CI(GitHub Actions)
- PR の依存関係レビュー:制限の緩い
allow-licenses(非推奨のdeny-licensesではありません)。プロジェクトが AGPL の場合はAGPL-3.0とAGPL-3.0-or-laterを含めます。テンプレート:examples/ci.yml.template
テストと品質
| 必要な内容 | スキル/ツール |
|---|---|
| 単体テスト/コンポーネントテスト | Vitest(常に使用) |
| ルート間、マップ、または認証フロー | playwright-skill |
| 純粋なロジック/ユーティリティのみ | Vitest — Playwright は使用しません |
| 明示的な依存関係/未使用のエクスポート | knip.md · スクリプトを確認 package-json-scripts.md |