{"id":51110329,"url":"https://github.com/syscat64/sorapalette","last_synced_at":"2026-06-24T17:01:16.659Z","repository":{"id":362581578,"uuid":"1188551589","full_name":"sysCat64/SoraPalette","owner":"sysCat64","description":"気象庁オープンデータを使った、Electronデスクトップ天気予報アプリです。","archived":false,"fork":false,"pushed_at":"2026-06-05T00:09:29.000Z","size":2462,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-06-05T00:12:46.955Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/sysCat64.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":"AGENTS.md","dco":null,"cla":null}},"created_at":"2026-03-22T08:39:30.000Z","updated_at":"2026-06-05T00:09:33.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/sysCat64/SoraPalette","commit_stats":null,"previous_names":["syscat64/sorapalette"],"tags_count":null,"template":false,"template_full_name":null,"purl":"pkg:github/sysCat64/SoraPalette","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sysCat64%2FSoraPalette","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sysCat64%2FSoraPalette/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sysCat64%2FSoraPalette/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sysCat64%2FSoraPalette/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/sysCat64","download_url":"https://codeload.github.com/sysCat64/SoraPalette/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sysCat64%2FSoraPalette/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34741320,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-24T02:00:07.484Z","response_time":106,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2026-06-24T17:01:14.496Z","updated_at":"2026-06-24T17:01:16.631Z","avatar_url":"https://github.com/sysCat64.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# ⛅ SoraPalette（ソラ・パレット）\n\n[![CI](https://github.com/sysCat64/SoraPalette/actions/workflows/ci.yml/badge.svg)](https://github.com/sysCat64/SoraPalette/actions/workflows/ci.yml)\n\n気象庁オープンデータを使った、Electronデスクトップ天気予報アプリです。\n要件整理、JMA APIの調査、Electron IPC設計、Svelteの状態管理、テストとCI整備までを、\nAIエージェントと役割分担しながら進めた学習用プロジェクトです。\n\n完成したアプリだけでなく、**AI協働でデスクトップアプリを作るプロセス**が伝わるように、\n設計意図、実装メモ、日本語コメント、ADRをリポジトリ内に残しています。\n\n---\n\n## このリポジトリで見てほしいこと\n\n- Electron の `contextBridge` / IPC を使い、レンダラーから Node.js API に直接触れない構成にしていること\n- JMA のネストした JSON を `types/` と `lib/` で内部表現へ変換し、Svelte store から UI に渡していること\n- Claude Code / OpenAI Codex / Gemini Code Assist の担当領域を分け、MemoryBank と ADR で引き継ぎを残していること\n- Vitest のユニットテストと GitHub Actions CI で、変換ロジックと store の基本品質を継続確認していること\n\n---\n\n## 実装済み機能\n\n| # | 機能 | 状態 |\n|---|------|------|\n| 1 | 今日の天気（天気概況・SVGアイコン） | ✅ 実装済み |\n| 2 | 7日間予報の横並びカード | ✅ 実装済み |\n| 3 | 最高 / 最低気温表示 | ✅ 実装済み |\n| 4 | 降水確率（時間帯別バー表示） | ✅ 実装済み |\n| 5 | 地域選択（全47都道府県） | ✅ 実装済み |\n| 6 | お気に入りエリア（最大5件） | ✅ 実装済み |\n| 7 | テーマ切替（sora-light / sora-dark） | ✅ 実装済み |\n| 8 | 更新ボタン＋自動更新（30分間隔） | ✅ 実装済み |\n| 9 | オフラインキャッシュ＋最終更新日時表示 | ✅ 実装済み |\n| 10 | 気象警報バナー（JMA警報API連携） | ✅ 実装済み |\n| + | 天気概況テキスト（overview_forecast API連携） | ✅ 実装済み（v1追加） |\n\n---\n\n## 技術スタック\n\n| 役割 | 技術 |\n|------|------|\n| デスクトップフレームワーク | [Electron](https://www.electronjs.org/) v33 |\n| UIフレームワーク | [Svelte](https://svelte.dev/) v5 |\n| 言語 | TypeScript（strict mode） |\n| スタイリング | [Tailwind CSS](https://tailwindcss.com/) v4 + [daisyUI](https://daisyui.com/) v5 |\n| ビルドツール | [electron-vite](https://electron-vite.org/) v3 |\n| ユニットテスト | [Vitest](https://vitest.dev/) |\n| E2Eテスト | [Playwright](https://playwright.dev/) |\n| データソース | [気象庁オープンデータAPI](https://www.jma.go.jp/bosai/) |\n\n---\n\n## アーキテクチャ\n\n```\nRenderer Process (Svelte + Tailwind)\n    │  window.electronAPI（contextBridge）\nPreload Script\n    │  ipcRenderer.invoke / ipcMain.handle\nMain Process (Node.js + Electron)\n    │  fetch（CORS回避のためメインプロセスで実行）\n気象庁 API\n```\n\n- `contextIsolation: true` / `nodeIntegration: false` / `sandbox: true` を厳守\n- JMA APIはCORSヘッダー非対応のため、メインプロセスのみがfetchを行う\n- メイン ↔ レンダラー間の通信はすべてIPC経由\n\n---\n\n## セットアップ\n\n### 必要環境\n\n- Node.js 20 以上\n- npm 10 以上\n\n### インストール\n\n```bash\ngit clone https://github.com/sysCat64/SoraPalette.git\ncd SoraPalette\nnpm install\n```\n\n### 開発サーバー起動\n\n```bash\nnpm run dev\n```\n\n\u003e **注意（macOS）**: `npm run dev` は **通常のターミナル**（Terminal.app または VSCode の統合ターミナル）から実行してください。\n\u003e `ELECTRON_RUN_AS_NODE=1` が設定された環境（Claude Code のツール経由など）から実行すると、\n\u003e Electron が GUI モードで起動しません。\n\n### ビルド\n\n```bash\n# 型チェック・Lint\nnpm run typecheck\nnpm run lint\n\n# アプリケーションビルド\nnpm run build\n```\n\n### テスト\n\n```bash\n# ユニットテスト（Vitest）\nnpm run test\n\n# E2Eテスト（Playwright）\nnpm run test:e2e\n```\n\n### CI\n\nGitHub Actions では、`main` への push と pull request で以下を実行します。\n\n```bash\nnpm ci\nnpm run lint\nnpm run typecheck\nnpm run test\n```\n\nE2Eテストは JMA API への実ネットワークアクセスと Electron 起動を伴うため、ローカル確認用として扱います。\n\n---\n\n## ディレクトリ構成\n\n```\nSoraPalette/\n├── src/\n│   ├── main/               # Electronメインプロセス\n│   │   ├── index.ts        # エントリポイント・BrowserWindow生成\n│   │   ├── services/       # JMA API fetch・キャッシュ（警報・概況含む）\n│   │   └── ipc/            # IPCハンドラ（天気・設定・通知・警報）\n│   ├── preload/            # contextBridgeによるIPC API定義\n│   │   ├── index.ts        # contextBridge実装\n│   │   └── types.ts        # window.electronAPI の型定義（全AIの型境界）\n│   └── renderer/           # Svelteアプリ\n│       ├── components/\n│       │   ├── icons/      # SVG天気アイコン（Svelte コンポーネント）\n│       │   └── weather/    # WeatherCard・ForecastStrip\n│       ├── stores/         # weatherStore（状態管理・警報・概況）\n│       ├── lib/            # 変換ロジック・エリアコード・天気コードマップ・警報変換\n│       └── types/          # JMA APIレスポンス型・アプリ内部型\n├── tests/\n│   ├── unit/               # Vitestユニットテスト\n│   └── e2e/                # PlaywrightのE2Eテスト\n├── docs/\n│   ├── ja/                 # 学習用ガイド（IPC・Svelte・JMA API解説）\n│   └── decisions/          # アーキテクチャ判断記録（ADR-001〜003）\n└── .agent/MemoryBank/      # AI間の共有メモリ（進捗・設計記録）\n```\n\n---\n\n## 学習目的について\n\nこのプロジェクトはデスクトップアプリ開発と、AIエージェントとの協働開発を学ぶことを主目的としています。\n\n- ソースコード全体に**詳細な日本語コメント**を記述\n- `docs/ja/` に学習用ガイド（IPC・Svelte・JMA APIの解説）を収録\n- `docs/decisions/` にアーキテクチャ上の判断記録（ADR）を収録\n- `.agent/MemoryBank/` に AI 間の進捗・設計メモを保存\n\n---\n\n## データソース\n\n[気象庁オープンデータ](https://www.jma.go.jp/bosai/)を使用しています。\n商用利用の際は気象庁の利用規約を確認してください。\n\n---\n\n## ライセンス\n\n[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT) - 詳細は [LICENSE](LICENSE) ファイルを参照してください。\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsyscat64%2Fsorapalette","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fsyscat64%2Fsorapalette","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsyscat64%2Fsorapalette/lists"}