o-sumo は、大相撲の番付と取組情報を配信する静的 Web アプリです。React 19 + TypeScript + Vite で構築し、Cloudflare Pages から静的サイトと静的 JSON API を公開しています。
- README:
README.md/README_en.md - 開発ガイド:
DEVELOPMENT.md/DEVELOPMENT_en.md - Skills 一覧:
SKILLS.md/SKILLS_en.md - API 仕様:
docs/api/v1.md/docs/api/v1.en.md - API ポリシー:
docs/api/policy.md/docs/api/policy.en.md - API 変更履歴:
docs/api/changelog.md/docs/api/changelog.en.md
- Web ルート:
- ホーム:
/ - 番付:
/{YYYYMM}-banduke - 結果ハブ:
/{YYYYMM}-torikumi - 予定ハブ:
/{YYYYMM}-yotei - 日別結果:
/{YYYYMMDD}-torikumi - 日別予定:
/{YYYYMMDD}-yotei
- ホーム:
- 現行ルート例:
/202605-banduke/202605-torikumi/20260524-yotei
- 旧番付 URL
/{YYYYMM}-o-sumoは現行の番付 URL にリダイレクトされます。 - 公開 API:
/api/v1/banzuke.json/api/v1/torikumi.json
関連ドキュメント:
docs/api/v1.mddocs/api/policy.mddocs/api/changelog.mdDEVELOPMENT.md
Skill 公開:
SKILLS.mdskills/osumo-api/SKILL.md
- ホームから
番付 / 取組予定 / 結果に直接遷移 - 番付ページで幕内・十両の番付と成績を表示
- 月別ハブで 15 日分の日別ページを一覧表示
- 日別ページで幕内・十両の取組を表示
- 番付・月別ハブ・日別ページで
昇順 / 降順を切り替え可能 - 未更新日は
pendingとして URL を先出しし、空状態メッセージを表示 - 月キーは
app/lib/torikumi-data.tsの生成データから動的に決まります
- フロントエンド: React 19, TypeScript, React Router, Vite
- テスト: Vitest, Testing Library, jsdom
- データ生成: Python (
scripts/update_sumo_data.py) - 配信: Cloudflare Pages
- データ取得元: 日本相撲協会の Ajax エンドポイント
前提:
- Node.js 18 以上
- npm 9 以上
- Python 3.10 以上
セットアップ:
git clone https://github.com/dai/o-sumo.git
cd o-sumo
npm install補足:
package-lock.jsonは commit します- 初回セットアップは
npm install - 再現性重視の再構築や CI は
npm ci
主要コマンド:
# 開発サーバー
npm run dev
# 型チェック
npm run typecheck
# テスト
npm test
# 本番ビルド
npm run build
# ビルド結果のローカル確認
npm run previewローカル確認先:
http://localhost:3001/http://localhost:3001/{YYYYMM}-bandukehttp://localhost:3001/{YYYYMM}-torikumihttp://localhost:3001/{YYYYMM}-yoteihttp://localhost:3001/{YYYYMMDD}-torikumihttp://localhost:3001/{YYYYMMDD}-yoteihttp://localhost:3001/rikishi/{id}
フル更新(番付 + 取組 + 力士プロファイル):
python scripts/update_sumo_data.py力士プロファイルのみを更新:
python scripts/update_sumo_data.py --rikishi-only力士プロファイル取得を最初の10人に限定(テスト用):
python scripts/update_sumo_data.py --rikishi-only --profile-limit 10取組だけを更新:
python scripts/update_sumo_data.py --torikumi-only結果のみ / 予定のみを更新:
python scripts/update_sumo_data.py --torikumi-scope result
python scripts/update_sumo_data.py --torikumi-scope schedule取組だけを対象に結果または予定だけを更新:
python scripts/update_sumo_data.py --torikumi-only --torikumi-scope result
python scripts/update_sumo_data.py --torikumi-only --torikumi-scope schedule生成・更新対象:
app/lib/sumo-data.tsapp/lib/torikumi-data.tspublic/api/v1/banzuke.jsonpublic/api/v1/torikumi.jsonpublic/api/v1/rikishi.jsonpublic/api/v1/rikishi/{id}.json(全力士分)
主な検証内容:
- 幕内 42 人
- 十両 28 人
- 結果 / 予定アーカイブを 15 日分生成
- 公開済み日は取得済みデータで埋める
- 未更新日は
pendingのプレースホルダーとして残す
GitHub Actions で日次更新と結果更新を分けています。
- 日次更新:
.github/workflows/daily-data-update.yml- 実行時刻: 現在は停止(
workflow_dispatchのみ) - 実行内容: 番付 + 取組予定を更新
- 変更がある場合は
mainに直接 commit / push
- 実行時刻: 現在は停止(
- 結果更新:
.github/workflows/realtime-torikumi-update.yml- 実行時刻: 15:00-19:30 JST の 30 分間隔、および 20:00 JST(cron 有効)
- 実行内容: 取組結果のみ更新
- 変更がある場合は
mainに直接 commit / push
- test runner: Vitest
- component test: Testing Library
- workflow:
.github/workflows/test.yml
現在の主な対象:
app/lib/torikumi-routes.tsのルーティング helperapp/lib/sorting.tsの並び替え helper- ホームの主要導線
- 番付ページのソート
- 月別ハブの 15 日表示とソート
- 日別取組ページのソートと未更新表示
GitHub Actions では PR と main / codex/** への push で以下を実行します。
npm cinpm run typechecknpm testnpm run build
- 本番 URL:
https://osada.us - SPA fallback:
public/_redirects - 日付ベースの URL を直接開いても
index.htmlにフォールバックします
- GitHub Actions は
realtime-torikumi-update.ymlのみ cron を有効化し、daily-data-update.ymlはworkflow_dispatch運用を維持します。 - Cloudflare の従量抑制のため、
public/_headersでキャッシュ方針を固定します。 /assets/*:public, max-age=31536000, immutable/manifest.webmanifest:public, max-age=3600/sw.js:public, max-age=0, must-revalidate/:public, max-age=300- PWA の Service Worker 更新は
registerType: "prompt"で運用し、即時自動更新は行いません。
app/main.tsx: ルーティング定義app/page.tsx: ホームapp/banzuke/page.tsx: 番付ページapp/torikumi/page.tsx: 取組結果 / 取組予定の月別ハブapp/rikishi/[id]/page.tsx: 力士プロファイルページapp/components/TorikumiDayPage.tsx: 日別の結果 / 予定ページapp/components/BanzukeTable.tsx: 番付テーブルコンポーネントapp/lib/torikumi-routes.ts: 月キー付き URL とナビゲーション解決app/lib/sumo-data.ts: 番付データ(力士型定義を含む)app/lib/torikumi-data.ts: 取組アーカイブデータscripts/update_sumo_data.py: データ生成スクリプト
ISC