From 4c8a4b74cefff8992800f6ee62db4b250874c7f1 Mon Sep 17 00:00:00 2001 From: posimai Date: Sun, 29 Mar 2026 07:35:23 +0900 Subject: [PATCH] chore: update MEMORY.md description for project_infrastructure --- MEMORY.md | 9 +- project_api_keys.md | 69 ++++++++++------ project_architecture_decisions.md | 82 +++++++++++++++++++ project_infrastructure.md | 91 ++++++++++++++++----- project_status.md | 131 ++++++++++++------------------ project_stripe.md | 15 ++++ project_tools_enhancement.md | 130 +++++++++++++++++++++++++++++ 7 files changed, 398 insertions(+), 129 deletions(-) create mode 100644 project_architecture_decisions.md create mode 100644 project_stripe.md create mode 100644 project_tools_enhancement.md diff --git a/MEMORY.md b/MEMORY.md index aebca33..c36e050 100644 --- a/MEMORY.md +++ b/MEMORY.md @@ -7,7 +7,7 @@ - [feedback_style.md](feedback_style.md) — 応答スタイル・コーディング方針 ## Project -- [project_infrastructure.md](project_infrastructure.md) — Synology インフラ・Docker 構成 +- [project_infrastructure.md](project_infrastructure.md) — VPS 本番インフラ・Synology バックアップ・認証方式・データ保存先 - [project_api_keys.md](project_api_keys.md) — APIキー体系・認証設計 - [project_status.md](project_status.md) — 現在の状態・残タスク・次ステップ @@ -15,5 +15,12 @@ - [reference_deploy.md](reference_deploy.md) — デプロイ手順・リモート設定 - [reference_gitea_auth.md](reference_gitea_auth.md) — Giteaリポジトリ自動作成手順(git credential storeを使用、手動案内禁止) +## 実装計画 +- [project_tools_enhancement.md](project_tools_enhancement.md) — ツールアプリ差別化実装計画(Timer/Diff/Lens/Digest、優先順位・具体的実装内容・CLAUDEルール抜粋) +- [project_architecture_decisions.md](project_architecture_decisions.md) — 技術選定の決定理由(Supabase Auth 不採用・VPS vs Supabase 分担・Lucide 固定・ドメイン A 案採用) + +## 外部サービス +- [project_stripe.md](project_stripe.md) — Stripe アカウント済み・共同開発者共有済み・Kintone で決済テスト実績あり + ## 要判断・保留事項 - [project_ponshu_cleanup.md](project_ponshu_cleanup.md) — ponshu-room環境整理の未解決事項(Vercel命名・git remote・posimai-projectの謎) diff --git a/project_api_keys.md b/project_api_keys.md index 4fc93f5..70b9e6f 100644 --- a/project_api_keys.md +++ b/project_api_keys.md @@ -1,11 +1,10 @@ --- -name: APIキー体系・認証設計 -description: Posimai プロジェクト全体のAPIキー構造と各アプリでの使われ方 +name: APIキー体系・認証設計(移行中) +description: 現行の pk_ キー体系と、移行予定の Magic Link + Passkey 認証の状態 type: project --- -## posimai_api 認証キー(pk_ キー) -フロントエンドアプリ → posimai_api への認証に使用 +## 現行認証(pk_ キー体系)— 移行中・触らない | ユーザー | キー | localStorage キー名 | |---------|------|-------------------| @@ -13,29 +12,45 @@ type: project | partner | pk_partner_fcfcbdf7d4a2ee23abf3ad046830af44 | posimai_api_key | | musume | pk_musume_76488f7ee2a4e6cd9d4b3ad6284d4cc7 | posimai_api_key | -## Gemini API キー -- サーバーサイド(posimai_api)が Gemini に接続するためのキー -- .env の GEMINI_API_KEY に設定 -- フロントエンドアプリは直接使わない +**注意:** `X-API-Key` ヘッダー・`?init_key=` パラメータ・localStorage のキー保存ロジックは変更禁止。インフラ担当 AI が新認証完成後に移行する。 -## Magic Link 仕組み -- Dashboard → `?init_key=pk_maita_...` 付き URL でアプリを開く -- アプリ側: `localStorage.setItem('posimai_api_key', initKey)` で保存 -- 対象: Brain / Reader / Feed(Maps は別途 Google Maps API キーが必要) +## 新認証(実装中・2026-03-26 時点) + +**方式:** Magic Link(メール)+ Passkey(WebAuthn/FIDO2) +**実装場所:** VPS server.js(`@simplewebauthn/server@13.3.0` + `jsonwebtoken@9.0.3`) +**Supabase Auth は不採用**(認証を2箇所に持つことになるため) + +### VPS 環境変数(設定済み) +- `JWT_SECRET`: 設定済み +- `WEBAUTHN_RP_ID`: `posimai.soar-enrich.com` +- `WEBAUTHN_ORIGINS`: `https://posimai.soar-enrich.com,http://localhost:3000` +- `MAGIC_LINK_BASE_URL`: `https://posimai.soar-enrich.com` +- `RESEND_API_KEY`: 設定済み(DNS 検証待ち) + +### VPS DB テーブル(作成済み) +- `magic_link_tokens` — Magic Link トークン管理 +- `passkey_credentials` — WebAuthn 公開鍵保存 +- `auth_sessions` — JWT セッション管理 +- `magic_link_rate_limit` — レート制限 +- `users.email` / `users.email_verified` — カラム追加済み + +### server.js 実装状況 +- エンドポイント実装: **未完了(次のセッションで実施予定)** +- 実装予定エンドポイント: + - `POST /api/auth/magic-link/send` + - `GET /api/auth/magic-link/verify` + - `POST /api/auth/passkey/register/begin` + - `POST /api/auth/passkey/register/finish` + - `POST /api/auth/passkey/login/begin` + - `POST /api/auth/passkey/login/finish` + - `GET /api/auth/session/verify` + - `DELETE /api/auth/session` + +## Gemini API キー +- サーバーサイド(server.js)が Gemini に接続するためのキー +- docker-compose.yml の `GEMINI_API_KEY` に設定済み +- think アプリはフロントから直接 Gemini API を呼び出す(ユーザーが自分の API キーを入力) ## Dashboard 環境変数 -- Vercel: POSIMAI_API_KEY = pk_maita_... (2026-03-12 追加済み) - -## 各アプリのキー要否 -| アプリ | 必要なキー | 用途 | -|--------|-----------|------| -| Brain | posimai_api_key | 記事保存・取得 | -| Reader | posimai_api_key | Brain への保存(記事取得は Jina AI 無料) | -| Feed | posimai_api_key | Brain への保存 | -| Maps | Google Maps API Key | 地図検索(posimai_api キー不要) | -| Think | Gemini API Key(AIza...) | Gemini 2.5 Flash 直接呼び出し | - -## AI API方針 -- フロントエンドからAIを直接呼ぶ場合は **Gemini API**(AIza...)を使う -- Claude API(sk-ant-...)は持っていないため使わない -- posimai_api バックエンドに chatエンドポイントはまだない(将来追加予定) +- Vercel: `POSIMAI_API_KEY` = pk_maita_...(設定済み) +- Vercel: `BASIC_AUTH_USER` / `BASIC_AUTH_PASSWORD`(設定済み) diff --git a/project_architecture_decisions.md b/project_architecture_decisions.md new file mode 100644 index 0000000..e0d0a3f --- /dev/null +++ b/project_architecture_decisions.md @@ -0,0 +1,82 @@ +--- +name: アーキテクチャ決定事項 +description: 技術選定・設計方針の決定理由。なぜその選択をしたかの根拠。将来の AI が同じ議論を繰り返さないために保存。 +type: project +--- + +## 認証方式: Supabase Auth に決定(2026-03-27) + +**決定**: Supabase Auth を採用する。 + +- Magic Link メール送信: Resend をカスタム SMTP として Supabase に接続(noreply@soar-enrich.com) +- Passkey(指紋・顔): Supabase Auth が標準提供 +- VPS server.js は Supabase JWT を受け取って検証するだけ(発行は Supabase) +- VPS に作成済みの auth テーブル(magic_link_tokens 等)は将来削除予定(今は放置) + +**Why:** 実装量が大幅に少ない・habit/pulse を Supabase に移行するときの RLS と自動連携・Resend DNS は Supabase のカスタム SMTP として引き続き活用できる。 + +**Passkey ドメイン課題:** ワイルドカード DNS `*.posimai.soar-enrich.com → 76.76.21.21` を Eiji さんに依頼予定。設定後に rpID=posimai.soar-enrich.com で全アプリ共有可能。 + +**How to apply:** X-API-Key・?init_key=・localStorage 認証ロジックは実装完了まで変更禁止。 + +--- + +## データ保存先: VPS PostgreSQL と Supabase の分担 + +**決定**: 用途によって使い分ける。 + +| 保存先 | 対象データ | 理由 | +|--------|-----------|------| +| VPS PostgreSQL | brain 記事・journal 日記・認証・セッション | サーバー側 AI 処理・全文検索が必要。すでに存在する | +| Supabase | together(リアルタイム同期)・将来: habit/pulse | リアルタイム購読・RLS によるユーザーデータ分離が自然 | +| localStorage | timer 設定・veil 設定 | 端末ごとに持つのが自然な設定値 | + +**Why:** +- VPS: サーバー側で Gemini 呼び出し・検索・集計が必要なデータは API サーバーと同じ場所に置く +- Supabase: 「ユーザーが書いて読むだけ」のシンプルなデータは RLS で安全に管理できる Supabase が適切 +- ユーザーデータ(habit/pulse)を VPS に置く場合は自前で `WHERE user_id = :me` を全エンドポイントに実装する必要があり、バグ時のデータ漏洩リスクがある + +**How to apply:** habit/pulse のクラウド移行は Supabase を推奨。brain/journal は VPS から動かさない。 + +--- + +## CDN バージョン: Lucide @0.344.0 固定 + +**決定**: `unpkg.com/lucide@0.344.0` に固定。`@latest` は使用禁止。 + +**Why:** +- `@latest` を使うと Lucide がバージョンアップしたとき Service Worker が古いバージョンをキャッシュしたままになりアイコンが消える +- アイコン名・API の breaking change が起きたとき気づかずにアプリが壊れる +- バージョンを固定すれば自分のタイミングで確認して更新できる + +**How to apply:** CDN 経由で読み込むすべてのライブラリはバージョン番号を明記する。`@latest` は CLAUDE.md 違反。 + +--- + +## ドメイン構成: A案(API を別サブドメインに分離)を採用 + +**決定・完了(2026-03-26):** +- `posimai.soar-enrich.com` → Vercel(76.76.21.21)→ posimai-dashboard +- `api.soar-enrich.com` → VPS(85.131.245.239)→ バックエンド API :8090 + +**完了済み:** +- DNS 切り替え完了(A レコード設定済み) +- Resend DNS(DKIM/SPF)設定済み・稼働中 +- 全フロントアプリの API URL を `api.soar-enrich.com/brain/api` に更新済み + +**次期計画: ワイルドカード DNS `*.posimai.soar-enrich.com`** +- 全アプリを `brain.posimai.soar-enrich.com` 等に統一することで Passkey の rpID 問題を解決 +- DNS レコード 1 件で 23 アプリ対応(個別 CNAME 不要) +- 実施時期未定(認証方式決定後) + +**How to apply:** フロントの API URL は `api.soar-enrich.com/brain/api` が正。`posimai.soar-enrich.com` は今や Dashboard URL なので API 参照に使ってはいけない。 + +--- + +## localStorage 廃止方針 + +**決定**: habit・pulse・reader 既読履歴は将来的に Supabase へ移行する。ただし現時点では対応しない(商用化フェーズ 3)。 + +**Why:** localStorage はブラウザキャッシュ削除でデータ消失する。有料ユーザーに提供できない。 + +**How to apply:** 現状の localStorage ロジックには手を付けない。移行は認証実装完了後に着手。 diff --git a/project_infrastructure.md b/project_infrastructure.md index d66337f..9c329f6 100644 --- a/project_infrastructure.md +++ b/project_infrastructure.md @@ -1,28 +1,77 @@ --- -name: Synology インフラ・Docker 構成 -description: Synology NAS 上の Docker Compose 環境と各コンテナの役割 +name: インフラ構成・デプロイ構成・AI ロール分担 +description: VPS 移行完了(2026-03-25)。ドメイン分離完了(2026-03-26)。認証: Supabase Auth に確定(2026-03-27)。 type: project --- -## Synology NAS -- 本体: Mai_SVR(物理NAS) -- VM: Posimai_lab(Synology Virtual Machine Manager 上の Linux VM) -- Tailscale ドメイン: posimai-lab.tail72e846.ts.net +## 本番インフラ(2026-03-26 時点・確定済み) -## Docker Compose(/volume1/docker/posimai_lab/) -- **gitea**: Gitea git サーバー(プライマリリモート) -- **gitea_db**: PostgreSQL 15(Gitea 用 DB) -- **posimai_api**: Node.js API サーバー(Brain/Feed/Reader のバックエンド) - - server-current.js がメインファイル - - エンドポイント: /brain/api/articles, /brain/api/save, /brain/api/feed/media 等 -- **mcp_server**: MCP サーバー(AI エージェント連携) -- **ai_proxy**: 停止中・削除予定(旧 Ponshu Room Python プロキシ) +| 項目 | 状態 | +|------|------| +| バックエンド本番 | VPS(Ubuntu 25.04 / AMD EPYC 4コア / 5.8GB RAM / 85.131.245.239) | +| **現行 API URL** | `https://api.soar-enrich.com/brain/api`(2026-03-26 移行完了) | +| フロント入口 | `https://posimai.soar-enrich.com` → Vercel → posimai-dashboard | +| Synology NAS | 並行稼働継続(バックアップ扱い・停止しない) | +| Resend DNS | 設定済み・稼働中(DKIM/SPF 認証完了) | +| WebAuthn rpID | `posimai.soar-enrich.com`(VPS 設定済み・認証実装待ち) | -## 独立コンテナ(プロジェクト外) -- uptime-kuma: 死活監視 -- ponshu-proxy-server: Ponshu Room Node.js プロキシ -- ponshu-redis: Ponshu Room Redis +## ドメイン構成(確定) -## .env ファイル -- 場所: /volume1/docker/posimai_lab/.env -- 変数: DB_PASS, GITEA_DOMAIN, GEMINI_API_KEY, GEMINI_TOGETHER_API_KEY, API_KEYS, ALLOWED_ORIGINS +| ドメイン | 向き先 | 用途 | +|---------|--------|------| +| `posimai.soar-enrich.com` | Vercel(76.76.21.21) | posimai-dashboard 表示 | +| `api.soar-enrich.com` | VPS(85.131.245.239) | バックエンド API | +| `posimai-xxx.vercel.app` | Vercel | 各アプリ(全 23 本) | + +## 認証方式(確定: Supabase Auth) + +- **現行**: API_KEYS(pk_maita_xxx 等)+ `?init_key=` Magic Link → localStorage +- **移行先(確定)**: Supabase Auth(Magic Link + Passkey) + - メール送信: Resend をカスタム SMTP として設定(noreply@soar-enrich.com) + - VPS は Supabase JWT を検証するだけ +- **Passkey ドメイン課題**: `*.posimai.soar-enrich.com` ワイルドカード DNS を Eiji に依頼予定 + +**How to apply:** 実装完了まで `X-API-Key`・`?init_key=`・localStorage 認証ロジックは変更禁止。 + +## データ保存先 + +| 保存先 | 対象アプリ・データ | +|--------|-----------------| +| VPS PostgreSQL | brain・journal・site・reading_history・認証情報 | +| Supabase | together(リアルタイム同期・稼働中) | +| localStorage | veil設定・timer設定(**永続・Supabase 移行しない**)/ habit・pulse・reader既読(将来 Supabase 移行予定・商用化フェーズ3) | +| データなし | diff・clean・lens・digest・think・timer(都度処理) | + +## VPS Docker 構成 + +- posimai-api(Node.js / Express / :8090) +- PostgreSQL 16(posimai_brain DB) +- Nginx(api.soar-enrich.com SSL + リバースプロキシ) +- VOICEVOX(:50021)【追加予定・Eiji 作業中】— docker-compose に voicevox コンテナ追加で有効化、server.js は設定済み +- deploy: `bash deploy-server.sh`(SSH鍵認証・完全無人) + +## Synology Docker 構成(バックアップ) + +- NAS IP(Tailscale): 100.76.7.3 / posimai-lab.tail72e846.ts.net +- posimai_api(旧 API・待機中)・PostgreSQL 15・Gitea・Uptime Kuma + +## Ubuntu PC → Synology NAS バックアップ(別チャットで設定済み) + +| 項目 | 内容 | +|------|------| +| バックアップ元 | Ubuntu PC `/home/ubuntu-pc/` | +| バックアップ先 | NAS `/volume1/homes/mai/backup/ubuntu-pc/home/` | +| 実行タイミング | 毎日午前3時(cron) | +| 転送経路 | Tailscale VPN 経由(約 1.1 MB/s) | +| 除外ディレクトリ | `.cache` / `Downloads` / `Trash` | + +※ Ubuntu PC は Synology NAS・開発用 Windows PC とは別の物理マシン(要確認) + +## AI のロール分担 + +| 担当 | 内容 | +|------|------| +| **インフラ担当チャット** | 認証実装・VPS デプロイ・DNS 管理・server.js 変更 | +| **UI 担当チャット** | UX ブラッシュアップ・デザイン修正・CLAUDE.md 適合・プライバシー表記 | + +UI 担当が触ってはいけないもの: `api.soar-enrich.com` URL・X-API-Key・?init_key=・localStorage 認証ロジック・認証実装全般 diff --git a/project_status.md b/project_status.md index 473b978..c334e14 100644 --- a/project_status.md +++ b/project_status.md @@ -1,102 +1,73 @@ --- name: プロジェクト現状・残タスク・次ステップ -description: 2026-03-21 全アプリコードレビュー完了。残タスク・新アプリ候補を整理。 +description: 2026-03-26 時点の状態。VPS 移行完了・認証実装中・ドメイン分離待ち。 type: project --- -## 残タスク(2026-03-21 時点) +## 現状(2026-03-26) -### AI が対応できる未着手タスク +### 完了済み +- VPS 移行(2026-03-25): Synology → Ubuntu VPS(85.131.245.239) +- 全フロントアプリ(23本)の API URL を Synology → `posimai.soar-enrich.com` に更新・デプロイ済み +- VPS: PostgreSQL 16・Nginx・Let's Encrypt・Docker Compose 構築済み +- VPS: 新認証テーブル(magic_link_tokens / passkey_credentials / auth_sessions)作成済み +- VPS: WebAuthn 環境変数・JWT_SECRET 設定済み +- Resend アカウント作成・API キー設定済み +- Vercel: `posimai-brain` に `posimai.soar-enrich.com` を事前登録済み -| タスク | 詳細 | -|--------|------| -| posimai-events 実データ連携 | MOCK_EVENTS 除去済み。現在は空配列を返す。n8n webhook → POST /api/events → Vercel KV(または Synology DB)に書き込む実装が必要 | -| 既存アプリへの posimai-ui 適用 | together は適用済み。他アプリ(brain, reader, feed, maps 等)へ順次適用予定。1アプリずつ着手時に対応 | -| habit / pulse データを Brief ブリーフィングに組み込む | Brief は現在 Feed API のみ参照。habit の完了率・pulse の気分/エネルギーを冒頭サマリーに読み上げさせる設計が必要 | -| Reader デバイス間同期 | 「近日公開」テキストが残存。Synology history API 経由での既読履歴クロスデバイス共有の実装 | -| Pulse AI インサイト | 相関分析(habit との関係)・Gemini を使った週次振り返りコメント機能 | -| Ambient Ponshu Room ゾーン | zone-placeholder のまま。Ponshu Room が保留解除されたら連携実装 | +### 進行中 +- **server.js への認証エンドポイント実装**(Magic Link + Passkey)— 次セッションで着手 +- **共同開発者待ち**: `api.soar-enrich.com` DNS レコード作成・Resend DNS 検証 -### 手動テスト(人間が必要) - -| タスク | 詳細 | -|--------|------| -| posimai_widget APK 実機テスト | v1.5.0 / v1.6.0(Pulse ウィジェット追加)の実機動作確認 | -| Magic Link 動作確認 | ?init_key= パラメータでブラウザ手動テスト(habit/pulse/daily/ambient/clean/brain) | -| Brief VOICEVOX テスト | Synology Docker に VOICEVOX コンテナ追加後、ずんだもん音声の動作確認 | - -### 新アプリ候補(確定) - -| アプリ | 内容 | 優先度 | -|--------|------|--------| -| posimai-rewind | habit / pulse / brain / journal 横断の振り返りアプリ。pulse の相関分析ギャップも解決 | 高 | -| posimai-shelf | 本・映画・アニメ記録。brain(Web記事)と補完、journal に感想転送 | 中 | - -### 新アプリ候補(却下済み) - -| アプリ | 理由 | -|--------|------| -| posimai-weather | ambient に統合推奨(すでに open-meteo で実装済み)。単独アプリ不要 | -| posimai-budget | 代替ツールで代替しやすい | -| posimai-voice | clean・digest と薄くかぶる、thin すぎ | +### 共同開発者の作業完了後に実施すること(AI が実行) +1. VPS で `certbot certonly --nginx -d api.soar-enrich.com` +2. Nginx `api.soar-enrich.com` config を有効化 +3. 全フロント 23 アプリの API URL を `posimai.soar-enrich.com` → `api.soar-enrich.com` に一括置換・デプロイ +4. 動作確認後、共同開発者に `posimai.soar-enrich.com` A レコードを Vercel(76.76.21.21)に変更依頼 --- -## 完了済み(2026-03-21 このセッション) +## AI ロール分担 -### 全アプリ批判的コードレビュー -- 重大な CLAUDE.md 違反: なし -- 別チャット誤検知の訂正: ambient 天気は open-meteo で実装済み(fetchWeather 関数)、daily skip ボタンも skipArticle() で実装済み -- sw.js console.log / console.warn 削除: brain / reader / feed(各2箇所) +| 担当 | 内容 | +|------|------| +| **インフラ担当チャット(このメモを読んでいる AI)** | server.js 認証実装・API URL 一括置換・DNS 切り替え・VPS デプロイ | +| **UI 担当チャット(別チャット)** | UX ブラッシュアップ・デザイン修正・プライバシー表記追加 | -### posimai-brief 新規作成・デプロイ -- Feed 記事読み上げ PWA(VOICEVOX / ずんだもん 対応、Canvas 波形、MediaSession API) -- GitHub リポジトリ作成・Vercel 連携・初回デプロイトリガー完了 -- Dashboard カード・Ecosystem・Timeline・Access Guide 追加済み - -### posimai-veil 改善(2026-03-21) -- カスタムアプリ登録機能(63 Lucide アイコンピッカー、イニシャルバッジ) -- PWA インストール対応(logo.png 追加) -- ツールバー統合(カテゴリタブ + 虫眼鏡 + square-pen 編集アイコン = 1行) -- 検索バーを折りたたみ式に変更 -- SW キャッシュを v3 にバンプ(旧キャッシュ強制削除) -- base.css の main padding 上書き(没入型レイアウト対応) - -### posimai-dashboard 改善(2026-03-21) -- /keys ページに Gemini API 消費状況(サーバー側 / クライアント側)を詳細追記 -- Brief 追加に伴うカード・Ecosystem・Timeline・Access Guide 更新 +UI 担当チャットへの指示: +- API URL・認証ロジック(X-API-Key / ?init_key=)は触らない +- Supabase Auth の採用提案は禁止(不採用確定) +- Phase 1(プライバシー表記追加)から着手 --- -## 確定済み「対応不要」(CLAUDE.md にも記載済み) -- Lucide CDN に defer 付与: 体感効果なし・不要 -- モノレポ化: 個人規模では不要 -- Firebase / Supabase SSO: 現行 Magic Link で十分 -- `?init_key=` URL 廃止: 意図的設計 +## 商用化ブロッカー現状 -## 重要なシステム情報 +| ブロッカー | 状態 | +|-----------|------| +| 個人インフラ依存(Synology) | **解決済み**(VPS 移行 2026-03-25) | +| 認証モデルが一人用 | **対応中**(Magic Link + Passkey 実装中) | +| localStorage のみ(データ消失リスク) | **将来フェーズ**(認証完了後に habit/pulse を Supabase 移行) | -### Dashboard 認証 -- Basic 認証: middleware.ts で実装 -- デフォルト: mai / posimai -- Vercel 環境変数: BASIC_AUTH_USER / BASIC_AUTH_PASSWORD +--- -### デザインシステム v2 -- Dark: bg #0D0D0D / surface #1A1A1A / accent #6EE7B7(Teal) -- Light: bg #F9FAFB / surface #FFFFFF / accent #059669(Emerald-600) -- アプリ別例外: journal/site = #80CAEE(Sky Blue) -- radius: 12px / フォント: Inter / アイコン: Lucide / 絵文字禁止 +## 残タスク(アプリ機能) -### Synology インフラ -- NAS IP(Tailscale): 100.76.7.3 -- Brain API: http://127.0.0.1:8090/brain/api、コンテナ名 posimai-api -- Tailscale Funnel: /brain → http://127.0.0.1:8090, / → http://127.0.0.1:3000 +| タスク | 詳細 | +|--------|------| +| posimai-events 実データ連携 | 空配列のまま。n8n webhook → POST /api/events → DB の実装が必要 | +| habit / pulse を Supabase に移行 | 将来フェーズ。認証完了後 | +| Reader デバイス間同期 | 「近日公開」テキスト残存。history API 経由での既読履歴同期 | +| Pulse AI インサイト | habit との相関分析・Gemini 週次コメント | +| Brief VOICEVOX テスト | VPS に VOICEVOX コンテナ追加後の動作確認 | -### VOICEVOX(Brief 用) -- server.js に TTS エンドポイント実装済み(/tts, /tts/warmup, /tts/ready) -- VOICEVOX_URL = process.env.VOICEVOX_URL || 'http://voicevox:50021' -- Synology の docker-compose に voicevox コンテナを追加するだけで自動有効化 +## 新アプリ候補 -### ponshu-room 保留中 -- 状態: Flutter版との UI/UX 乖離・Sakenowa 連携・Washi テーマ対応が必要で保留 -- 再開時: `ponshu-room/ROADMAP.md` を参照 +| アプリ | 優先度 | +|--------|--------| +| posimai-rewind | 高(habit/pulse/brain/journal 横断振り返り) | +| posimai-shelf | 中(本・映画・アニメ記録) | + +## ponshu-room 保留中 +- 状態: Flutter 版との UI 乖離・Sakenowa 連携・Washi テーマ対応が必要で保留 +- 再開時: `ponshu-room/ROADMAP.md` 参照 diff --git a/project_stripe.md b/project_stripe.md new file mode 100644 index 0000000..3d481bf --- /dev/null +++ b/project_stripe.md @@ -0,0 +1,15 @@ +--- +name: Stripe アカウント・決済実績 +description: Stripe は既存アカウントあり・共同開発者と共有済み・Kintone 販売フローで決済テスト実績あり +type: project +--- + +## Stripe の現状 + +- アカウント: 既に作成済み +- 共同開発者: 既に共有設定済み +- 決済テスト: Kintone 販売フロー・プラグイン開発時に実施済み(本番フロー通し確認あり) + +**Why:** 別プロダクト(Kintone 系)の開発時に整備された。 + +**How to apply:** Posimai に課金機能を追加する際、Stripe アカウント新規作成・共有設定・テストは不要。「どのエンドポイントに Stripe Checkout を繋ぐか」の実装だけに集中できる。Webhook や Price ID の設定手順も経験済みのはず。 diff --git a/project_tools_enhancement.md b/project_tools_enhancement.md new file mode 100644 index 0000000..aaf53ce --- /dev/null +++ b/project_tools_enhancement.md @@ -0,0 +1,130 @@ +--- +name: ツールアプリ差別化実装計画 +description: Posimai ツールカテゴリ各アプリへのエコシステム連携・差別化機能の実装計画(優先順位付き) +type: project +--- + +## 背景・目的 + +ツールカテゴリ(digest/clean/timer/lens/diff/roadmap)は現状「汎用ツール + Posimaiデザイン」止まりで、 +エコシステムとの連携がゼロ。Posimaiらしさを出すために以下の実装を優先順位順に進める。 + +**Why:** 各ツールが Pulse/Brain/Journal/Maps 等の他アプリと連携することで、 +「使って終わり」から「記録・蓄積・振り返り」のループが完成する。 + +**How to apply:** 実装前に必ず現在のアプリコードを全文読んでから着手する。 + +--- + +## 実装優先順位と内容 + +### 1位: posimai-timer — Pulse連携 + セッションログ + +**実装内容:** +- タイマー終了時(カウントダウン)に「集中セッション終了モーダル」を表示 + - 何をやったか(テキストメモ、任意) + - エネルギーレベル(1-5 スライダー or タップ選択) + - 気分(1-5) + → これを Pulse と同じ localStorage スキーマで保存する +- セッション履歴ビューを追加(サイドバーに「履歴」ナビ追加) + - 日付ごとのセッション一覧(時刻・時間・メモ・エネルギー) + - 今週の合計集中時間を冒頭に表示 + - Habit と同じ週ヒートマップで可視化(日別集中時間) + +**Pulse との連携方式:** +- Pulse の localStorage キー: `posimai-pulse-entries`(data-app-id="posimai-pulse" 配下) +- Timer が直接同じキーに書き込むのではなく、Timer 独自キー `posimai-timer-sessions` に保存 + → Pulse アプリ側で Timer セッション連携を将来追加する方が正しい設計 + → 今回は Timer 内にセッション記録・閲覧機能を完結させる + +**UI ルール:** +- 終了モーダルは既存のデザインシステム(--surface, --border, --accent)を使う +- モーダルはシンプル。テキスト入力 + エネルギー選択(5段階)のみ。送信 or スキップ +- ヒートマップは Habit アプリと同じロジックで実装(7列 × N行グリッド、今週ハイライト) + +--- + +### 2位: posimai-diff — 履歴保存 + Journalへ送信 + +**実装内容:** +- 比較履歴の永続化 + - 「保存」ボタンでタイトル付き保存(localStorage: `posimai-diff-history`) + - 履歴ビュー(サイドバー「履歴」)で過去の比較を再読み込み + - 最大20件保存(古いものから削除) +- Journalへ送信ボタン + - 差分結果エリアの右上に「Journal へ送る」ボタン + - クリックで Posimai Journal(`https://posimai-journal.vercel.app`)を + `?body=` パラメータ付きで別タブで開く + (差分テキスト + 比較元タイトルを body に含める) + +--- + +### 3位: posimai-lens — Maps連携ボタン + +**実装内容:** +- EXIF に GPS 座標が含まれる場合、「Mapsで開く」ボタンを表示 + - クリックで `https://posimai-maps.vercel.app/?lat=XX&lng=YY&label=ファイル名` を別タブで開く + - Maps 側が `?lat=&lng=&label=` を受け取ってピン表示できるか事前確認が必要 + (Maps の現コードを読んで対応の有無を確認してから実装する) +- 撮影設定メモのお気に入り登録 + - 「この設定をお気に入りに追加」ボタン(localStorage: `posimai-lens-favorites`) + - お気に入りビューで設定名 + F値/SS/ISO 一覧 + +--- + +### 4位: posimai-digest — Brainへ保存 + +**実装内容:** +- 要約結果エリアの右下に「Brain に保存」ボタン +- クリックで Synology Brain API に POST + - エンドポイント: `POST /brain/api/articles` + - body: `{ title: (元URLのタイトルor先頭40文字), content: 要約テキスト, url: 元URL, source: "digest" }` + - API キーは既存の `posimai_api_key` を使用(localStorage から取得) +- 保存成功時はトースト表示「Brain に保存しました」 + +--- + +### 5位: posimai-clean — 現状維持 + +現時点では追加機能の優先度が低いため対応しない。 + +--- + +## 実装前に必ず確認すること(CLAUDE.md ルール抜粋・特に重要なもの) + +1. **絵文字は一切使わない**(コード・HTML・コメント・トースト文言すべて) +2. **lucide@latest を使わない** → `@0.344.0` 固定 +3. **アクセントカラーは `var(--accent)` を使う**。`#6EE7B7` のハードコード禁止 +4. **SW でクロスオリジン GET をキャッシュしない**(Brain API 等の外部 API は必ずネットワーク経由) +5. **底面固定要素には `env(safe-area-inset-bottom)` を付ける** +6. **外部リンクには `rel="noopener"` を付ける**(`target="_blank"` とセット) +7. **デプロイは `npm run deploy`**(= `git push gitea main && git push github main`) + `vercel --prod` は直接実行しない +8. **デプロイ後は Dashboard Timeline に追記して Dashboard もデプロイする**(規模問わず必須) +9. **`lucide.createIcons()` は早期 return の後に呼ばない**(アイコンが空になるバグ防止) + +## デプロイ手順(毎回) + +```bash +cd posimai-[app] +git add . +git commit -m "feat: ..." +npm run deploy # git push gitea main && git push github main + +# その後必ず Dashboard Timeline 更新 +cd ../posimai-dashboard +# src/app/timeline/page.tsx の EVENTS 配列に追記 +git add src/app/timeline/page.tsx +git commit -m "chore: update timeline" +npm run deploy +``` + +## 各アプリの現状(2026-03-23 確認) + +| アプリ | 現状 | Pulse/Brain API連携 | +|--------|------|---------------------| +| posimai-timer | ストップウォッチ + カウントダウン。履歴なし | なし | +| posimai-diff | テキスト差分のみ。保存機能なし | なし | +| posimai-lens | EXIF読み取り + 履歴。GPS表示あり(テキスト)| なし | +| posimai-digest | Gemini API 要約 + 履歴。APIキー設定あり | なし | +| posimai-clean | URLクリーン + 履歴 | なし |