chore: update MEMORY.md description for project_infrastructure

This commit is contained in:
posimai 2026-03-29 07:35:23 +09:00
parent b043e5ca57
commit 4c8a4b74ce
7 changed files with 398 additions and 129 deletions

View File

@ -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の謎

View File

@ -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 / FeedMaps は別途 Google Maps API キーが必要)
## 新認証実装中・2026-03-26 時点)
**方式:** Magic Linkメール+ PasskeyWebAuthn/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 KeyAIza... | Gemini 2.5 Flash 直接呼び出し |
## AI API方針
- フロントエンドからAIを直接呼ぶ場合は **Gemini API**AIza...)を使う
- Claude APIsk-ant-...)は持っていないため使わない
- posimai_api バックエンドに chatエンドポイントはまだない将来追加予定
- Vercel: `POSIMAI_API_KEY` = pk_maita_...(設定済み)
- Vercel: `BASIC_AUTH_USER` / `BASIC_AUTH_PASSWORD`(設定済み)

View File

@ -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` → Vercel76.76.21.21)→ posimai-dashboard
- `api.soar-enrich.com` → VPS85.131.245.239)→ バックエンド API :8090
**完了済み:**
- DNS 切り替え完了A レコード設定済み)
- Resend DNSDKIM/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 ロジックには手を付けない。移行は認証実装完了後に着手。

View File

@ -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_labSynology 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 15Gitea 用 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 プロキシ)
| 項目 | 状態 |
|------|------|
| バックエンド本番 | VPSUbuntu 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` | Vercel76.76.21.21 | posimai-dashboard 表示 |
| `api.soar-enrich.com` | VPS85.131.245.239 | バックエンド API |
| `posimai-xxx.vercel.app` | Vercel | 各アプリ(全 23 本) |
## 認証方式(確定: Supabase Auth
- **現行**: API_KEYSpk_maita_xxx 等)+ `?init_key=` Magic Link → localStorage
- **移行先(確定)**: Supabase AuthMagic 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-apiNode.js / Express / :8090
- PostgreSQL 16posimai_brain DB
- Nginxapi.soar-enrich.com SSL + リバースプロキシ)
- VOICEVOX:50021【追加予定・Eiji 作業中】— docker-compose に voicevox コンテナ追加で有効化、server.js は設定済み
- deploy: `bash deploy-server.sh`SSH鍵認証・完全無人
## Synology Docker 構成(バックアップ)
- NAS IPTailscale: 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 認証ロジック・認証実装全般

View File

@ -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 VPS85.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.0Pulse ウィジェット追加)の実機動作確認 |
| Magic Link 動作確認 | ?init_key= パラメータでブラウザ手動テストhabit/pulse/daily/ambient/clean/brain |
| Brief VOICEVOX テスト | Synology Docker に VOICEVOX コンテナ追加後、ずんだもん音声の動作確認 |
### 新アプリ候補(確定)
| アプリ | 内容 | 優先度 |
|--------|------|--------|
| posimai-rewind | habit / pulse / brain / journal 横断の振り返りアプリ。pulse の相関分析ギャップも解決 | 高 |
| posimai-shelf | 本・映画・アニメ記録。brainWeb記事と補完、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 レコードを Vercel76.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 記事読み上げ PWAVOICEVOX / ずんだもん 対応、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 #6EE7B7Teal
- Light: bg #F9FAFB / surface #FFFFFF / accent #059669Emerald-600
- アプリ別例外: journal/site = #80CAEESky Blue
- radius: 12px / フォント: Inter / アイコン: Lucide / 絵文字禁止
## 残タスク(アプリ機能)
### Synology インフラ
- NAS IPTailscale: 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 コンテナ追加後の動作確認 |
### VOICEVOXBrief 用)
- 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` 参照

15
project_stripe.md Normal file
View File

@ -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 の設定手順も経験済みのはず。

View File

@ -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クリーン + 履歴 | なし |