posimai-root/STATUS.md

275 lines
21 KiB
Markdown
Raw Normal View History

# Posimai — 現在の状態
> このファイルはセッション末に AI が更新する。「今何をしている最中か」を引き継ぐ唯一の場所。
## 作業中
- 特になし
## mai のPC から実行待ち
- **posimai-boki** は独立リポジトリで Gitea/GitHub へ push 済み。追加分を出したときは `cd posimai-boki && npm run deploy`
- **article-keeper フォルダ削除**(エクスプローラーから手動削除): Firebase プロジェクトは削除済み。キーは git 未追跡なので履歴汚染なし。フォルダを消すだけで OK。
- **contact.html**: Resend API 経由に切り替え済み・送受信テスト完了2026-04-21
- **Stripe 本番化時**: index.html・index-b.html・index-c.html・index-d.html の 4ファイルにある `test_9B67sEbN3fowfMW4jwenS00` を本番 Payment Link URL に一括差し替えCursor 指摘 2026-04-22
## Together 認証設計2026-04-22 確定)
- Together は Posimai アカウント不要のため、JWT なし username 認証を継続維持する
- JWT あり: user_id + username で strict チェック
- JWT なし: username のみで照合Eiji 等 Posimai 外メンバー向け)
- invite_code はメンバー認証済みであれば JWT 有無に関わらず返す
- Gemini 2.5-flash 503 フォールバック(→ 2.0-flash`archiveShare` + `rearchive` に追加済み2026-04-22
## 次にやること(優先順)
### posimai-bokiP1 — P0 完了+学習フロー強化済み)
1. **P1-1ほぼ達成**: 概念は「もっと詳しく」で折りたたみ済み。任意改善: `details/summary` への置き換え・アクセシビリティ微調整
2. **P1-2一部達成**: 「3ステップで学ぶ」用語→仕訳イメージ→理解度実装済み。残り: **既存 quiz のメタ分類**(難易タグ・出題意図)が必要ならデータ設計
3. **P1-3: 深掘りモーダル** — 比喩・長い補足のモーダル分離(未着手)
4. **技術負債(任意)**: 自動テスト、CSS の `index.html` 外だし、`categories.js` の分割、ビルド導入(ハッシュ付きアセット)
### posimai-boki P0 完了状態2026-04-19 〜 更新)
- URL ?unit= 同期でリロード後も単元を復元 ✓
- 全 23 単元に examtips試験対策メモ
- freq/diff頻出度・難易度全単元設定 ✓
- ミス追跡wrongUnits localStorage
- ホームに「今日の学習」ブロック(苦手 + 未学習 を1タップで開始
- サイドバーに苦手インジケーター ✓
- **弱点集中特訓**・**単元内 3 ステップ**・概念折りたたみ・ブロック並び概念→要点→試験メモ→3ステップ→理解度
- **データとアプリの分離**: `js/data/categories.js` / `drills.js` + `js/app.js`
- **表示 HTML**: DOMPurify + `safeHtml()`、解説の保存時サニタイズ ✓
- **学習フロー UX**: 戻る1枚前、学習フローを終了理解度保持、理解度をクリアして学ぶ、`#comprehension-quiz` へスクロール ✓
### Guard方針確定: Web v1のみ・2026-04-20
**v1 = Web PWA のみ。Tauri・VS Code拡張・CLI はすべて v1 タグ後のロードマップ。**
現行の main ブランチは Web のみを対象とする。Tauri/拡張のブランチは統合しない。
v1 残タスク:
1. **Web v1 完了条件の文書化** — 入力・出力・非機能タイムアウト・APIキー未設定時・免責表記を検証可能な形で定義する
### Guard 完成状態2026-04-14
- ルールエンジン133ルール
- 静的修正テンプレート85ルール
- VS Code で開く ✓
- CLI`npx tsx cli/guard.ts`)✓
- VS Code 拡張APIキー不要
### Guard ビルド方法メモ(次回再ビルド時)
```bash
cd /c/Users/maita/posimai-project/posimai-guard-app
export PATH="$PATH:/c/Program Files (x86)/Microsoft Visual Studio/2022/BuildTools/VC/Tools/MSVC/14.44.35207/bin/Hostx64/x64:/c/Program Files (x86)/Windows Kits/10/bin/10.0.26100.0/x64"
export LIB="C:\Program Files (x86)\Microsoft Visual Studio\2022\BuildTools\VC\Tools\MSVC\14.44.35207\lib\x64;..."
export INCLUDE="..."
node_modules/.bin/tauri build
# → target/release/bundle/nsis/Posimai Guard_0.1.0_x64-setup.exe
# → target/release/bundle/msi/Posimai Guard_0.1.0_x64_en-US.msi
```
### MCP 設定mai 作業)
1. **Stripe キー確認・ローテーション**
- Stripe ダッシュボード → Developers → Logs で 4/11 の API リクエストを確認(使用元の特定)
- 既存の `sk_test_...` キーをロールオーバー(無効化)
- 新しいテスト用シークレットキーを発行(名前: `posimai-mcp`
- [.mcp.json](.mcp.json) の `FILL_IN: Stripe ダッシュボードの sk_test_...` を置換
2. **Vercel トークン発行**
- [vercel.com/account/tokens](https://vercel.com/account/tokens) → Create → 名前: `claude-code-mcp`、Scope: Full Account
- [.mcp.json](.mcp.json) の `FILL_IN: vercel.com/account/tokens...` を置換
3. **Claude Code 再起動** → vercel・stripe MCP が有効になる
### ビジネス化
1. **Eiji に Stripe sandbox テストをお願いする**(購入フロー確認)
2. **日本酒アプリを完成させて展開**mai 最優先)
3. 特商法ページ記入mai 作業 — 事業者名・住所・電話番号)
4. Store デザイン確定Eiji と A/B/C/D から選定)
5. Stripe 本番モード切り替え(上記完了後)
## mai 作業待ちAI では実行できない)
| タスク | 内容 | 優先度 |
|--------|------|--------|
| **article-keeper フォルダ削除** | Firebase プロジェクト削除済みmai 完了)。キーは git 未追跡のため履歴汚染なし。エクスプローラーでフォルダ削除するだけ | 低(プロジェクト削除済みでキー無効) |
| Stripe sandbox テスト | Eiji に購入フロー確認依頼 | 中 |
| 特商法ページ記入 | tokushoho.html 作成済み。事業者名・住所・電話番号の**内容記入**が残っているか確認が必要 | 中 |
| Store デザイン確定 | Eiji と A/B/C/D から選定 | 中 |
## ブロック中
| ブロック | 待ち先 |
|---------|--------|
| Stripe sandbox テスト結果 | Eiji |
| premium 実装対象決定 | mai + Eiji の判断 |
| Store デザイン確定 | Eiji |
| Stripe 本番切り替え | Store 確定・特商法記入 |
## 他 AI に見解を求めている案件2026-04-24 Claude Code が判断を留保)
以下は Claude Code が「対応しない」と判断したセキュリティ案件。設計の妥当性・代替案・優先度について他 AI の意見を求めている。
### 1. JWT を localStorage に保存している問題(#25, #26, #31
**場所**: `posimai-dashboard/src/app/auth/verify/page.tsx`、`login/page.tsx`、`posimai-brain/js/utils/storage.js`
**Guard の指摘**: XSS 攻撃で JWT が盗まれる可能性。httpOnly Cookie に移行すべき。
**Claude Code が保留した理由**:
Posimai はクロスドメイン SSO を採用しており、JWT を URL パラメータでサブアプリに渡す設計になっている(例: `brain.posimai.soar-enrich.com?token=xxx`。httpOnly Cookie はクロスドメインでは使えないため、単純な移行はできない。移行するには全サブアプリの認証フローを書き直す大規模リファクタが必要。
**見解を求めたい点**:
- この設計URL パラメータ経由の JWT 受け渡し)は許容できるか
- httpOnly Cookie + バックエンドセッション方式への移行は現実的か
- localStorage XSS リスクを軽減する現実的な代替手段はあるか(例: `secure` フラグ付き sessionStorage、短い TTL 等)
---
### 2. `express.static(__dirname)` が `requireLocal` なしで Tailscale 全体に公開されている問題
**場所**: `posimai-dev/server.js:44`
**Guard の指摘**: `requireLocal`localhost/Tailscale限定の保護なしに `express.static(path.join(__dirname))` が設定されているため、Tailscale ネットワーク上の全端末から `server.js``.env` などのファイルを URL で直接取得できる可能性がある。
**Claude Code が保留した理由**:
`requireLocal``::1`/`127.0.0.1`/`100.*`Tailscaleを許可している。Tailscale は認証済みの信頼ネットワークなので、実害は低いと判断。ただし Tailscale 上の他端末Eiji の PC 等)から `.env` の内容を読めるのは意図した設計かどうか不明。
**見解を求めたい点**:
- Tailscale 内でも `server.js``.env` を公開することは許容できるか
- `express.static``requireLocal` を適用するのは簡単だが、それにより現在機能している何かが壊れる可能性はあるか(`sessions.html` 等の静的ファイルはどこから読み込まれているか)
---
## 保留中(着手条件あり)
| タスク | 条件 | 理由 |
|--------|------|------|
| server.js リファクタリングlib/ + routes/ 分割) | 3500行超 or 新ルート追加時 | 現在 ~3130行、本番稼働中・障害なし |
| habit/pulse → VPS API 移行 | premium 対象決定後 | テーブルは VPS 存在済み。localStorage データの移行 UX 設計が必要 |
| user_activity テーブル追加 | mai 確認必要DB スキーマ変更) | Digest 週次集計の前提。CLAUDE.md 要確認事項 |
| Redis 移行webauthnChallenges | スケール要件が出てから | 現状インメモリで問題なし |
| **Brain アクセントカラー確定** | mai 判断 | 2026-04-19 に indigo (`#818CF8`) → teal (`#6EE7B7`) へ変更。Posimai 標準に合わせたが、Brain は読書アプリとして indigo の方が雰囲気に合う可能性あり。indigo に戻す場合は `[data-app-id="posimai-brain"] { --accent: #818CF8; --accent-dim: rgba(129,140,248,.12); }` を style.css に追加。 |
## 直近でやったこと2026-04-20 — AI キー BYOK 廃止・VPS プロキシ化)
### セキュリティ改善: Gemini BYOK 廃止
- **posimai-digest**: `gemini_api_key` localStorage を撤去。`summarize()` を `POST /brain/api/ai/generate`JWT 認証)経由に変更
- **posimai-think**: `APP_ID-apikey` localStorage を撤去。`sendMessage()` を VPS プロキシ経由に変更。setup-screen をログインリンクに変更
- **server.js**: `POST /ai/generate` エンドポイント認証必須・30req/h・60KB 上限・15秒タイムアウトVPS 反映済み
- **CSP**: think の `connect-src` から `generativelanguage.googleapis.com` を削除
- 両アプリの設定パネルから Gemini API キー入力 UI を撤去
- デプロイ済みGitea + GitHub → Vercel 自動デプロイ)
## 直近でやったこと2026-04-20 — 全体セキュリティ監査・修正)
### セキュリティ監査対応(全件デプロイ済み)
- **P1 Together API 認証強化**: `/together/groups` `/together/join` に JWT 照合追加。JWT 提示時に body の username と不一致なら 403なりすまし防止
- **P2 CSP + HSTS**: 全 31 アプリの vercel.json に `Content-Security-Policy``Strict-Transport-Security` を追加。デプロイ済み
- **P3 エラー情報露出修正**: TTS エンドポイント 2箇所・プロキシ 1箇所の `e.message`/`e.code` をクライアントレスポンスから除去
- **P4 JWT TTL 短縮**: 30日 → 7日VPS 反映済み)
- **P5 Stripe Webhook 確認**: 署名検証HMAC-SHA256 + timingSafeEqual + タイムスタンプ検証)実装済みを確認 ✓
### その他
- **pc-audit バグ修正 9件**: Sort-Object -Unique / netstat Address:Port 解析 / ConsentPromptBehaviorAdmin 未検出 / スキャンスキップ追跡 / IDE キーワードノイズ / RowsEnrichedSample 統一(40行) / レポート自動削除 / SYNOPSIS 修正 / viewer 行数統一
- **posimai-dashboard**: posimai-sc 用語インデックス・試験モードを timeline + projects.json に追加
## 直近でやったこと2026-04-20 — posimai-sc 完了)
- **posimai-sc**: drills.jsS01〜S20 各2問・manifest.json・sw.js・vercel.json・package.json 追加。Vercel プロジェクト接続・カスタムドメイン設定・エコシステム全登録([OK]確認済み)
- **Vercel Root Directory**: Vercel API PATCH で `rootDirectory: "posimai-sc"` に設定完了2026-04-20。以後 `git push` のみで本番更新可能
- **残タスク(任意)**: 教材ファクトチェック・logo.png の SC 専用差し替え
## 直近でやったこと2026-04-18 — posimai-boki
- **リポジトリ**: `posimai-boki` 独立リポジトリGitea/GitHub。`npm run deploy` = 両リモート push → Vercel 自動デプロイ
- **構成**: カリキュラムを `js/data/categories.js` / `drills.js`、Alpine 本体を `js/app.js` に分割。`sw.js` で該当 JS をプリキャッシュ
- **セキュリティ**: DOMPurify固定版 + SRI、`x-html` は `safeHtml` 経由、クイズ解説は保存時サニタイズ
- **UX**: 単元ブロック順、Step1 タップ進行、戻る1枚前、「学習フローを終了」、弱点特訓は「特訓をやめる」、理解度クリアして学ぶ、Step3 から `#comprehension-quiz` へ誘導
- **STATUS**: 本節および「mai のPC から実行待ち」の posimai-boki 古い記述を整理
## 直近でやったこと2026-04-14 セッション2
### ponshu / Guard 拡張 / Guard VS Code修正
- **ponshu_room_lite 消費者APK**: 最新コミット04-12 13:23でリビルド完了 → `build/apk_releases/2026-04-14_22-54-28/` に maita・Eiji 向け各 90MB
- **posimai-guard-ext**: ルールエンジン組み込み完了。APIキー不要でスキャン可能に。Gemini/Claude はオプション追加スキャンに降格。バンドル 120KBルールエンジン込み
- **Guard「VS Code で開く」修正**: `window.open(uri, '_self')``window.location.href = uri` に変更。popup ブロッカーによる無効化を解消
- デプロイ済みVercel 自動デプロイ中)
## 直近でやったこと2026-04-14
### Guard 静的修正テンプレート + セキュリティ修正
- **ruleEngine.ts**: `RULE_FIXES` マップを追加。85ルール以上に静的修正テンプレートを設定。`makeIssue()` が `RULE_FIXES[rule.id] ?? null` を返すよう変更
- **CodeViewer.tsx `InlineFix`**: `issue.fix` があれば即表示API 呼び出しなし)。紫色の TEMPLATE ラベル + コピーボタン。「AI生成に切替」ボタンで従来の詳細 BEFORE/AFTER 生成も可能
- **`/api/fetch-url`**: レートリミット未設定だったため追加10 req/min per IP
- **`clientIp.ts`**: `x-forwarded-for` の最後のエントリを使うよう変更スプーフィング耐性向上。IP 形式検証追加
- デプロイ済みVercel 自動デプロイ中)
## 直近でやったこと2026-04-19〜20 Together セキュリティ強化)
### Together 安全性修正(全て VPS 反映済み・Eiji/Nanami への影響なし)
- **JWT legacy fallback なりすまし穴修正**`96f22b6`: legacy path は warn ログのみ、user_id 紐付きは厳格チェック
- **GET /together/groups/:groupId 認証なし invite_code 露出修正**`222238f`: `?u=username` + `togetherEnsureMember` でメンバーのみ返却。フロントは `?u=${currentUser}` 送信済みで整合している
- **together_members.user_id バックフィル**: 起動時 SQL で `users` テーブルと username 一致行を自動紐付け
- **UI バグ修正**: 未読ドットに `event.stopPropagation()`、設定パネルに invite_code 表示、名前フィールド変更時データ消失を解消
### together_members.user_id 本番確認2026-04-20
- VPS の DB `posimai_brain``SELECT group_id, username, user_id FROM together_members` を実行。**`user_id` が NULL の行はなし**(全行に `maita` または `partner` が入っている)
- 参考: 当時の懸念どおり `users.user_id` / `users.name` と Together の `username` が一致しないと起動時 `UPDATE` だけでは紐付けられないが、現状データでは問題なし
### 残る既知のリスク(商用前に対応)
- グループ作成・参加エンドポイントはまだ認証なしmai + Eiji のみ運用で許容)
- JWT 必須化legacy path 完全削除)は運用判断(本番では user_id 列は全行埋まっていることを確認済み)
## 直近でやったこと2026-04-11 セッション3
### セキュリティ修正・コード品質改善(批判的コードレビュー対応)
- **Together API メンバー検証**: `/together/share` `/together/react` `/together/comments``together_members` テーブルでのグループ参加確認を追加。非メンバー投稿を 403 で拒否 → VPS デプロイ済み
- **manifest.json id 統一**: lens / diff / habit / pulse の `"id"``"posimai-xxx"``"/posimai-xxx/"` 形式に修正new-app-guide.md 仕様通り)→ 各アプリデプロイ済み
- **feed XSS 修正**: `onclick="openInReader('${article.url}', ...)"` の URL 直接埋め込みを `data-url` 属性 + イベント委任に変更 → デプロイ済み
- **PostgreSQL MCP**: 前セッションで完了SSH トンネル設定・start-postgres-mcp.sh 作成。Claude Code 再起動で有効化される
### 残る既知の課題2026-04-11 時点、一部は上記で解消済み)
- **9アプリ base.css 未移行**: feed/maps/hotels/reader/journal/daily/events/timer/storeカスタムテーマ以外
## 直近でやったこと2026-04-11 セッション2
### posimai-ui 移行バッチCSS 重複削除・base.css 統一)
- **posimai-lens**: 完全移行768行 → 632行+ デプロイ済み
- **posimai-diff**: 完全移行807行 → 705行+ デプロイ済み
- **posimai-clean**: 最小移行data-app-id + base.css 追加、JWT handoff は既存実装あり)+ デプロイ済み
- **posimai-think**: 最小移行data-app-id + base.css + CSP style-src 更新)+ デプロイ済み
- **posimai-digest**: 完全移行1602行 → 1113行+ JWT handoff 追加 + デプロイ済み
- **posimai-pulse / posimai-habit**: 前セッションで移行・デプロイ済みを確認
- **posimai-ui/base.css**: サイドバーレイアウトパターン追加済み(前セッション)
- **_template-minimal / create-app.sh**: 前セッションで最新化済み
### PostgreSQL MCP 設定
- [docs/postgresql-mcp-setup.md](docs/postgresql-mcp-setup.md): セットアップガイド作成SSH トンネル・read-only user・セキュリティ要件
- [.mcp.json](.mcp.json): MCP 設定テンプレート作成(`.gitignore` に追加済み)
- **次のアクション**: VPS に `posimai_readonly` ユーザー作成 → パスワードを `.mcp.json` に設定 → SSH トンネル起動
### 移行スキップ(意図的)
- **brain / atlas / analytics / dev**: カスタムテーマnavy/violet 等)のため移行しない
- **clean / think**: CSS が複雑混在のため最小移行のみ(重複 CSS は残存するが機能的に問題なし)
## 直近でやったこと2026-04-11 セッション1
- **全アプリ認証統一**: `posimai_token`JWTを優先、`pk_` キーをフォールバックに変更Brief / Daily / Journal / Ambient
- **Brief**: API キー手入力欄を廃止 → ログインボタン UI に変更
- **Daily**: 設定の API キー欄を撤去 → ログインボタン UI に変更
- **Journal**: Auth Gate を「ログインする」ボタンに変更JWT で自動通過)
- **Ambient**: `posimai_token` を優先認証に対応
- **Habit / Pulse**: ログイン先を `posimai.soar-enrich.com/login` に修正(旧 `posimai-dashboard.vercel.app` から)
- **server.js**: 購入チェック失敗時のストア URL を `store.posimai.soar-enrich.com` に統一(旧 `posimai-store.vercel.app`
- **VPS デプロイ**: scp + docker compose restart で反映済み
- **Together**: 本番運用中のため変更なし(設計通りの独自 user/group 方式)
- **Brief feed API**: CORS で Authorization ヘッダーを許可・POST 失敗時の GET フォールバック追加
## 直近でやったこと2026-04-10
- **Brain 記事保存ラグ解消**: POST /save を即時 INSERT + setImmediate() 非同期 AI 処理に変更
- **Brain 楽観的 UI**: addArticleFromCommand() に temp article 即時表示を実装
- **Brain AI pending UX**: 「AI分析中...」テキスト削除・sparkles アイコン点滅のみに変更
- **SW キャッシュ**: Brain sw.js を v27 に更新
- **server.js セキュリティ修正 7件**: SSRF ガードisSsrfSafe・サイズ上限・pool 設定改善
- **Together Supabase 撤退2026-04-06**: VPS PostgreSQL に完全移行61件投稿
- **セキュリティ修正 4件2026-04-06**: e.message 直返し撤廃・WebSocket 認証・SSRF・Feed 認証
- **全体最適化2026-04-10**: skipWaiting 追加4アプリ・SW 登録追加2アプリ・brain ハードコード色修正
- **ドキュメント最新化**: server-refactor-plan.md マージ・atlas.json Supabase 削除/Gemini 追加・projects.json 更新・timeli