Yuki Takei 6 месяцев назад
Родитель
Сommit
b1986f2256

+ 6 - 2
.serena/memories/apps-app-jotai-migration-progress.md

@@ -192,8 +192,12 @@
 ### 今後の展開(オプション)
 1. 全移行済みフックの包括的なテスト
 2. パフォーマンスベンチマーク
-3. `packages/editor` への Jotai 導入検討
-4. 他パッケージへの展開検討
+3. ✅ **`packages/editor` への Jotai 導入検討完了** → 詳細は `packages-editor-jotai-migration-plan.md` 参照
+4. ✅ **`useSWRStatic/useStaticSWR` 廃止計画策定完了** → 詳細は `useSWRStatic-deprecation-plan.md` 参照
+5. 🔄 **`useSWRStatic/useStaticSWR` 廃止進行中** → 進捗は `useSWRStatic-deprecation-progress.md` 参照
+   - ✅ Phase 1-1 完了: useIsMaintenanceMode (1/7 箇所)
+   - ⏳ Phase 1-2 次: useGlobalAdminSocket
+6. 他パッケージへの展開検討
 
 ---
 

+ 361 - 0
.serena/memories/packages-editor-jotai-migration-plan.md

@@ -0,0 +1,361 @@
+# packages/editor への Jotai 導入検討レポート
+
+**作成日**: 2025-10-06  
+**作成者**: GitHub Copilot  
+**関連**: `apps-app-jotai-migration-progress.md`
+
+---
+
+## 📊 現状分析
+
+### ✅ 既存のJotai実装
+`packages/editor`には**すでにJotaiが導入されており**、一部で活用されています:
+
+#### 既存のJotai States
+```
+packages/editor/src/states/
+├── modal/
+│   ├── link-edit.ts          ✅ Jotai (Status/Actions分離)
+│   ├── template.ts           ✅ Jotai (Status/Actions分離)
+│   ├── drawio-for-editor.ts  ✅ Jotai (Status/Actions分離)
+│   └── handsontable.ts       ✅ Jotai (Status/Actions分離)
+└── ui/
+    └── resolved-theme.ts      ✅ Jotai (シンプルパターン)
+```
+
+**特徴**:
+- `apps/app`と同じアーキテクチャパターンを採用
+- Status/Actions分離パターン(モーダル)
+- シンプルなatom + getter/setter(テーマ)
+- 命名規則も統一されている
+
+### 🔴 SWR/useState依存の実装
+`packages/editor/src/client/stores/` には未移行のフックが存在:
+
+#### 1. **useCodeMirrorEditorIsolated** (codemirror-editor.ts)
+- **現状**: `useSWRStatic` + `useRef`
+- **使用箇所**: 20箇所以上(コンポーネント全体に浸透)
+- **役割**: CodeMirrorインスタンスの分離された管理
+- **複雑度**: 🟡 中 - deepEqualsによる更新判定
+
+#### 2. **useSecondaryYdocs** (use-secondary-ydocs.ts)
+- **現状**: `useSWRImmutable` + Y.Doc管理
+- **使用箇所**: 2箇所(use-collaborative-editor-mode、use-unified-merge-view)
+- **役割**: Collaborative Editingのための Primary/Secondary Y.Doc管理
+- **複雑度**: 🔴 高 - Y.Docライフサイクル、メモリ管理
+
+#### 3. **useCollaborativeEditorMode** (use-collaborative-editor-mode.ts)
+- **現状**: `useState` + `useEffect` + SocketIOProvider
+- **使用箇所**: 調査必要
+- **役割**: リアルタイム共同編集モードの管理
+- **複雑度**: 🔴 高 - WebSocket、Y.Doc、SocketIOProvider統合
+- **依存**: `useSecondaryYdocs`に依存
+
+#### 4. **useEditorSettings** (use-editor-settings.ts)
+- **現状**: `useState` + 複数の`useEffect`
+- **使用箇所**: 調査必要
+- **役割**: エディタ設定(テーマ、キーマップ、スタイル等)の管理
+- **複雑度**: 🟡 中 - 複数の拡張機能の動的ロード
+
+#### 5. **useEditorShortcuts** (use-editor-shortcuts.ts)
+- **現状**: `useEffect` - コマンド登録のみ
+- **使用箇所**: useEditorSettingsから使用
+- **役割**: エディタショートカットキーの登録
+- **複雑度**: 🟢 低 - 副作用のみ
+
+#### 6. **useDefaultExtensions** (use-default-extensions.ts)
+- **現状**: 未確認(調査必要)
+- **使用箇所**: 調査必要
+- **役割**: デフォルトCodeMirror拡張機能
+- **複雑度**: 調査必要
+
+---
+
+## 🎯 移行優先度評価(調査完了版)
+
+### 移行対象フック一覧
+| フック名 | 現状 | 使用箇所 | 複雑度 | 優先度 | 推奨 |
+|---------|------|---------|--------|--------|------|
+| useCodeMirrorEditorIsolated | useSWRStatic | 20+ | 🟡 中 | 🟡 中 | 段階的移行検討 |
+| useEditorSettings | useState | 2 | 🟡 中 | 🟡 中 | 移行検討可能 |
+| useCollaborativeEditorMode | useState | 1 | 🔴 高 | 🟡 中 | 移行検討可能 |
+| useSecondaryYdocs | useSWRImmutable | 2 | 🔴 高 | 🔵 低 | **現状維持** |
+| useEditorShortcuts | useEffect | 1 | 🟢 低 | ❌ なし | **現状維持** |
+| useDefaultExtensions | useEffect | 2 | 🟢 低 | ❌ なし | **現状維持** |
+
+---
+
+### 🔵 優先度:低(当面移行不要)
+
+#### **useSecondaryYdocs**
+**理由**:
+1. **高い複雑度**: Y.Docライフサイクル管理、メモリ管理
+2. **SWRの適切な使用**: キャッシュとライフサイクル管理に適している
+3. **限定的な使用**: 2箇所のみ、影響範囲小
+4. **安定性**: 既存実装が安定稼働中
+5. **Jotai化のメリット小**: キャッシュ機能がSWRで適切に実現されている
+
+**現状維持を推奨**: SWRの特性(キャッシュ、Immutable)が適している
+
+**使用箇所**:
+- `use-collaborative-editor-mode.ts`
+- `use-unified-merge-view.ts`
+
+---
+
+### 🟡 優先度:中(移行検討可能)
+
+#### 1. **useCodeMirrorEditorIsolated** ⭐
+**移行メリット**:
+- 20箇所以上の使用箇所でパフォーマンス改善
+- `useSWRStatic`の不適切な使用を排除
+- `apps/app`の他の状態と統合しやすくなる
+- 最も影響範囲が大きく、改善効果も大きい
+
+**移行課題**:
+- 使用箇所が多く、段階的移行が必要
+- CodeMirrorインスタンスの分離管理ロジックの再設計
+- deepEqualsベースの更新判定の再実装
+
+**使用箇所**: 20+ 箇所
+- Playground系: 3箇所
+- Toolbar系: 9箇所
+- Component系: 4箇所
+- Controller系: 4箇所
+
+**推奨アプローチ**:
+```typescript
+// 新実装案
+// packages/editor/src/states/codemirror-editor.ts
+
+type CodeMirrorEditorData = Map<string, UseCodeMirrorEditor>;
+
+const codeMirrorEditorMapAtom = atom<CodeMirrorEditorData>(new Map());
+
+// Derived atom for specific editor
+const createEditorAtom = (key: string) => {
+  return atom((get) => {
+    const map = get(codeMirrorEditorMapAtom);
+    return map.get(key) ?? null;
+  });
+};
+
+// Hook pattern
+export const useCodeMirrorEditor = (key: string | null) => {
+  const setEditorMap = useSetAtom(codeMirrorEditorMapAtom);
+  // ... implementation
+};
+```
+
+#### 2. **useEditorSettings**
+**移行メリット**:
+- 複数のuseStateを統合してシンプルに
+- 拡張機能の動的ロード状態を明確に管理
+- 再レンダリング最適化
+- コードの可読性向上
+
+**移行課題**:
+- 複数の拡張機能(theme、keymap等)の状態管理
+- 動的import + キャッシングパターンの適用
+- useEditorShortcutsとの統合検討
+
+**使用箇所**: 2箇所
+- `CodeMirrorEditor.tsx`
+- `CodeMirrorEditorDiff.tsx`
+
+**推奨アプローチ**:
+```typescript
+// packages/editor/src/states/editor-settings.ts
+
+type EditorSettingsState = {
+  styleActiveLine?: boolean;
+  autoFormatMarkdownTable?: boolean;
+  theme?: EditorTheme;
+  keymapMode?: KeyMapMode;
+};
+
+const editorSettingsAtom = atom<EditorSettingsState>({});
+
+// Individual derived atoms for each extension
+const themeExtensionAtom = atom(async (get) => {
+  const theme = get(editorSettingsAtom).theme;
+  return theme ? await getEditorTheme(theme) : undefined;
+});
+```
+
+#### 3. **useCollaborativeEditorMode**
+**移行メリット**:
+- WebSocket状態の明確な管理
+- 複数のuseEffectをクリーンに整理
+- 共同編集状態の可視化向上
+
+**移行課題**:
+- SocketIOProvider統合の複雑性
+- useSecondaryYdocsへの依存(これはSWR維持推奨)
+- WebSocketライフサイクル管理
+- リアルタイム通信の状態管理
+
+**使用箇所**: 1箇所のみ
+- `CodeMirrorEditorMain.tsx`
+
+**推奨**: `useSecondaryYdocs`との統合を考慮した設計が必要。  
+影響範囲は小さいが、実装の複雑度は高い。
+
+---
+
+### 🟢 移行不要(現状維持推奨)
+
+#### 1. **useEditorShortcuts**
+**理由**:
+- 状態を持たず、副作用のみ
+- Jotai化してもしなくても影響は限定的
+- カスタムフックのまま維持でも問題なし
+
+**推奨**: 現状維持でOK(Jotai化の優先度低)
+
+#### 2. **useDefaultExtensions**
+**理由**:
+- 状態を持たず、静的なExtension配列の適用のみ
+- 使用箇所も2箇所のみ
+- Jotai化する意味がない
+
+**推奨**: 現状維持でOK(Jotai化不要)
+
+---
+
+## 📋 推奨移行戦略
+
+### フェーズ1: 基盤整備(優先度:低)
+1. ✅ 既存Jotai States(modal、ui)は完成済み
+2. 📝 `packages/editor`固有のJotaiパターンドキュメント化
+3. 📝 `apps/app`との統合ガイドライン策定
+
+### フェーズ2: 段階的移行(優先度:中)
+**実施条件**: リソースに余裕がある場合のみ
+
+#### 推奨移行順序と工数見積もり
+
+##### ステップ1: useEditorSettings(推定工数:2-3日)
+- ✅ **影響範囲**: 小(2箇所のみ)
+- ✅ **複雑度**: 中
+- ✅ **リスク**: 低
+- **作業内容**:
+  - 複数のuseStateをJotai atomに統合
+  - Dynamic Import + Cachingパターン適用
+  - theme/keymap extensionの状態管理をatomに移行
+- **期待効果**: コード整理、可読性向上
+
+##### ステップ2: useCollaborativeEditorMode(推定工数:3-5日)
+- ✅ **影響範囲**: 小(1箇所のみ)
+- 🟡 **複雑度**: 高
+- 🟡 **リスク**: 中
+- **作業内容**:
+  - WebSocket/SocketIOProvider状態のatom化
+  - useSecondaryYdocs(SWR維持)との統合設計
+  - リアルタイム編集状態の管理改善
+- **期待効果**: 状態管理の明確化、デバッグ容易性向上
+
+##### ステップ3: useCodeMirrorEditorIsolated(推定工数:5-7日)⭐
+- 🔴 **影響範囲**: 大(20+箇所)
+- 🟡 **複雑度**: 中
+- 🔴 **リスク**: 中~高
+- **作業内容**:
+  - Map<string, UseCodeMirrorEditor>パターンでの実装
+  - 段階的移行(後方互換フック提供)
+  - 全使用箇所の更新(20+箇所)
+  - 十分なテスト実施
+- **期待効果**: パフォーマンス改善(最大)、useSWRStatic排除
+
+**総工数見積もり**: 10-15日(フルタイム換算)
+
+### フェーズ3: 維持(継続)
+- **useSecondaryYdocs**: SWR維持(移行不要)
+- **useEditorShortcuts**: 現状維持(移行不要)
+
+---
+
+## ✅ 追加調査完了
+
+### 1. **useDefaultExtensions** ✅
+- **実装**: 静的なExtension配列をappendExtensionsするだけ
+- **状態**: なし(副作用のみ)
+- **使用箇所**: 2箇所(CodeMirrorEditor.tsx、CodeMirrorEditorDiff.tsx)
+- **複雑度**: 🟢 最低 - 設定適用のみ
+- **Jotai化の必要性**: ❌ なし(状態を持たないため)
+- **推奨**: 現状維持
+
+### 2. **useCodeMirrorEditorIsolated** ✅
+- **使用箇所**: 20箇所以上
+  - Playground.tsx (2箇所)
+  - CodeMirrorEditor.tsx (1箇所)
+  - controller/* (4箇所)
+  - Toolbar/* (9箇所)
+  - CodeMirrorEditorMain.tsx (1箇所)
+  - その他
+- **影響範囲**: 🔴 大 - パッケージ全体に浸透
+- **段階的移行**: 必須
+
+### 3. **useCollaborativeEditorMode** ✅
+- **使用箇所**: 1箇所のみ(CodeMirrorEditorMain.tsx)
+- **影響範囲**: 🟢 小 - 限定的
+- **依存**: useSecondaryYdocs(SWR維持推奨)
+- **移行容易性**: 🟡 中 - 依存関係はシンプルだが、実装は複雑
+
+### 4. **useEditorSettings** ✅
+- **使用箇所**: 2箇所(CodeMirrorEditor.tsx、CodeMirrorEditorDiff.tsx)
+- **影響範囲**: 🟢 小 - 限定的
+- **移行容易性**: 🟡 中 - 複数のuseStateとuseEffectを整理
+- **移行メリット**: 🟡 中 - コード整理とパフォーマンス改善
+
+### 5. `packages/editor` ⇔ `apps/app` 連携 ✅
+- **独立パッケージ**: `packages/editor`は独立したパッケージ
+- **状態の分離**: `apps/app/src/states` と `packages/editor/src/states` は完全に分離
+- **影響**: 移行は独立して実施可能、相互影響なし
+
+---
+
+## 🎯 結論と推奨事項
+
+### 即座の移行は不要
+- 既存のJotai実装(modal、ui)は完成しており、パターンも確立
+- `stores/`配下のフックは複雑度が高く、SWRが適切に機能している箇所もある
+
+### 段階的アプローチを推奨
+1. **短期**: 現状維持、既存Jotai Statesの活用拡大
+2. **中期**: useEditorSettings → useCodeMirrorEditorIsolated の順で移行検討
+3. **長期**: useCollaborativeEditorModeの移行検討(useSecondaryYdocsはSWR維持)
+
+### 移行判断の基準
+- **パフォーマンス改善**: 再レンダリング最適化の効果が大きい
+- **コード品質**: useSWRStatic等の不適切な使用を排除
+- **保守性向上**: 状態管理の統一によるコードベースの一貫性
+- **リソース**: 十分な開発リソースと検証期間の確保
+
+### `apps/app` との関係
+- `apps/app`のJotai移行は100%完了
+- `packages/editor`は独立パッケージとして段階的に移行可能
+- 両者のstatesディレクトリは明確に分離されており、影響は限定的
+
+---
+
+## 📚 参考情報
+
+### 関連ドキュメント
+- `apps-app-jotai-migration-progress.md` - apps/app移行完了レポート
+- `apps-app-jotai-migration-guidelines.md` - 技術パターン・ベストプラクティス
+- `apps-app-jotai-directory-structure.md` - ディレクトリ構造・命名規則
+- `useSWRStatic-deprecation-plan.md` - useSWRStatic/useStaticSWR 廃止計画 ⭐ NEW
+
+### 技術パターンの適用可能性
+- ✅ Status/Actions分離パターン → 既に適用済み(modal)
+- ✅ シンプルBooleanパターン → 既に適用済み(resolved-theme)
+- 🟡 Dynamic Import + Cachingパターン → useEditorSettings に適用可能
+- 🟡 Map操作パターン → useCodeMirrorEditorIsolated に適用可能
+- 🔴 副作用統合パターン → useCollaborativeEditorMode に適用可能(高難度)
+
+---
+
+**結論**: `packages/editor`へのJotai導入は段階的に進めることを推奨。  
+現時点では、既存のJotai実装(modal、ui)が安定しており、  
+`stores/`配下の複雑なフックは**無理に移行する必要はない**。  
+リソースと優先度に応じて、中期的に移行を検討する。

+ 382 - 0
.serena/memories/useSWRStatic-deprecation-plan.md

@@ -0,0 +1,382 @@
+# useSWRStatic / useStaticSWR 廃止計画
+
+**作成日**: 2025-10-06  
+**作成者**: GitHub Copilot  
+**目標**: `useSWRStatic`と`useStaticSWR`を完全廃止する
+
+---
+
+## 📊 現状分析
+
+### useSWRStatic / useStaticSWR の使用箇所
+
+#### 🔴 apps/app での使用(要対応:4箇所)
+
+##### 1. **stores/maintenanceMode.tsx** - `useIsMaintenanceMode`
+- **現状**: `useStaticSWR` を使用
+- **状況**: ⚠️ **重複実装が存在** - `states/global/global.ts` にも `isMaintenanceModeAtom` が存在
+- **使用箇所**: 調査必要
+- **移行方法**: 既存の `states/global/global.ts` の atom を活用
+- **優先度**: 🔴 **高** - 重複コード削除
+
+##### 2. **stores/personal-settings.tsx** - `usePersonalSettings`
+- **現状**: `useStaticSWR` を使用(DB同期用の中間キャッシュ)
+- **使用箇所**: 12箇所(Me設定画面、DrawioModal、TemplateModal等)
+- **役割**: `/personal-setting` API から取得したユーザー情報のキャッシュ管理
+- **複雑度**: 🟡 中 - sync/update機能を含む
+- **移行方法**: Jotai atom化 + `useSWRxPersonalSettings`との統合
+- **優先度**: 🟡 **中**
+
+##### 3. **stores/websocket.tsx** - `useGlobalAdminSocket`
+- **現状**: `useSWRStatic` を使用(WebSocket管理)
+- **使用箇所**: 1箇所(Admin/V5PageMigration.tsx)
+- **役割**: Global Admin Socket の管理
+- **複雑度**: 🟢 低
+- **移行方法**: Jotai atom化(socket.io client state)
+- **優先度**: 🟢 **低**
+
+##### 4. **stores-universal/use-context-swr.tsx** - `useContextSWR`
+- **現状**: `useSWRStatic` を使用
+- **使用箇所**: 使用箇所なし(internal definition only)
+- **役割**: Context用の SWR wrapper(mutate禁止)
+- **複雑度**: 🟢 低
+- **移行方法**: 使用箇所がないため削除可能
+- **優先度**: 🟢 **低** - 使用箇所がない
+
+##### 5. **stores/use-static-swr.ts**
+- **現状**: `@deprecated` - `useSWRStatic` の再エクスポート
+- **移行方法**: 上記1-4の移行完了後に削除
+- **優先度**: ⭐ **最終削除対象**
+
+---
+
+#### 🔴 packages/editor での使用(要対応:2箇所)
+
+##### 1. **stores/codemirror-editor.ts** - `useCodeMirrorEditorIsolated`
+- **現状**: `useSWRStatic` + `useRef`
+- **使用箇所**: 20+箇所(パッケージ全体に浸透)
+- **役割**: CodeMirrorインスタンスの分離管理
+- **複雑度**: 🟡 中
+- **移行方法**: Map<string, UseCodeMirrorEditor> パターンで Jotai 化
+- **優先度**: 🔴 **最高** - 影響範囲が最大
+- **詳細**: `packages-editor-jotai-migration-plan.md` 参照
+
+##### 2. **components-internal/playground/Playground.tsx**
+- **現状**: `useSWRStatic(GLOBAL_SOCKET_KEY)` - mutate のみ使用
+- **使用箇所**: 1箇所(Playgroundのみ)
+- **役割**: Global Socket の mutate
+- **複雑度**: 🟢 低
+- **移行方法**: Jotai atom化またはprops経由
+- **優先度**: 🟢 **低** - Playground専用
+
+---
+
+#### 🟢 packages/core での定義(変更不要)
+
+##### packages/core/src/swr/use-swr-static.ts
+- **役割**: `useSWRStatic` の実装定義
+- **依存**: 
+  - `packages/core/src/swr/use-global-socket.ts` → Jotai化必要
+- **移行方法**: apps/app と packages/editor の移行完了後に削除を検討
+
+---
+
+## 🎯 廃止計画
+
+### フェーズ1: apps/app の移行(優先度:高)
+
+#### ステップ1-1: useIsMaintenanceMode 重複解消(推定工数:0.5日)⭐
+**優先度:最高 - 重複コード削除**
+
+**現状**:
+- `stores/maintenanceMode.tsx` - `useStaticSWR` 使用
+- `states/global/global.ts` - `isMaintenanceModeAtom` 既存(Jotai)
+
+**問題**: 同じ状態を2箇所で管理している
+
+**移行手順**:
+1. `stores/maintenanceMode.tsx` の使用箇所を調査
+2. `states/global/global.ts` に actions を追加
+3. 使用箇所を新しい実装に置き換え
+4. `stores/maintenanceMode.tsx` を削除
+
+**新実装案**:
+```typescript
+// states/global/global.ts に追加
+
+const isMaintenanceModeAtom = atom<boolean>(false); // 既存
+
+export const useIsMaintenanceMode = () => useAtomValue(isMaintenanceModeAtom); // 既存
+
+// Actions を追加
+export const useMaintenanceModeActions = () => {
+  const setIsMaintenanceMode = useSetAtom(isMaintenanceModeAtom);
+
+  const start = useCallback(async () => {
+    await apiv3Post('/app-settings/maintenance-mode', { flag: true });
+    setIsMaintenanceMode(true);
+  }, [setIsMaintenanceMode]);
+
+  const end = useCallback(async () => {
+    await apiv3Post('/app-settings/maintenance-mode', { flag: false });
+    setIsMaintenanceMode(false);
+  }, [setIsMaintenanceMode]);
+
+  return { start, end };
+};
+```
+
+**期待効果**: 
+- 重複コード削除
+- Jotai統一による保守性向上
+- useSWRStatic使用箇所 -1
+
+---
+
+#### ステップ1-2: usePersonalSettings のJotai化(推定工数:2-3日)
+
+**移行手順**:
+1. `states/user/` ディレクトリ作成
+2. Personal Settings 用の atom + actions 実装
+3. `useSWRxPersonalSettings`(SWR)との連携設計
+4. 12箇所の使用箇所を段階的に移行
+5. `stores/personal-settings.tsx` 削除
+
+**新実装案**:
+```typescript
+// states/user/personal-settings.ts
+
+type PersonalSettingsData = IUser;
+
+const personalSettingsAtom = atom<PersonalSettingsData | undefined>(undefined);
+
+// Read-only hook
+export const usePersonalSettings = () => {
+  return useAtomValue(personalSettingsAtom);
+};
+
+// Actions hook
+export const usePersonalSettingsActions = () => {
+  const setPersonalSettings = useSetAtom(personalSettingsAtom);
+  const { mutate: revalidateDB } = useSWRxPersonalSettings();
+
+  const sync = useCallback(async () => {
+    const result = await revalidateDB();
+    setPersonalSettings(result);
+  }, [setPersonalSettings, revalidateDB]);
+
+  const updateBasicInfo = useCallback(async () => {
+    // ... implementation
+  }, [setPersonalSettings]);
+
+  // ... other actions
+
+  return { sync, updateBasicInfo, /* ... */ };
+};
+```
+
+**期待効果**:
+- SWR(DB通信)とJotai(クライアント状態)の責務分離
+- useSWRStatic使用箇所 -1
+
+---
+
+#### ステップ1-3: useGlobalAdminSocket のJotai化(推定工数:0.5日)
+
+**移行手順**:
+1. `states/socket-io/admin-socket.ts` 作成
+2. Admin Socket 用の atom 実装
+3. 1箇所の使用箇所を更新
+4. `stores/websocket.tsx` 削除
+
+**新実装案**:
+```typescript
+// states/socket-io/admin-socket.ts
+
+import type { Socket } from 'socket.io-client';
+
+const globalAdminSocketAtom = atom<Socket | undefined>(undefined);
+
+export const useGlobalAdminSocket = () => {
+  return useAtomValue(globalAdminSocketAtom);
+};
+
+export const useSetGlobalAdminSocket = () => {
+  return useSetAtom(globalAdminSocketAtom);
+};
+```
+
+**期待効果**:
+- Socket管理の Jotai 統一
+- useSWRStatic使用箇所 -1
+
+---
+
+#### ステップ1-4: useContextSWR 削除(推定工数:0.1日)
+
+**移行手順**:
+1. 使用箇所がないことを確認
+2. `stores-universal/use-context-swr.tsx` 削除
+
+**期待効果**:
+- 不要コード削除
+- useSWRStatic使用箇所 -1
+
+---
+
+#### ステップ1-5: use-static-swr.ts 削除(推定工数:0.1日)
+
+**移行手順**:
+1. 上記4ステップ完了後
+2. `stores/use-static-swr.ts` 削除
+
+**期待効果**:
+- deprecated ファイル削除
+- `apps/app` での useSWRStatic 完全廃止 ✅
+
+**apps/app 完了**: useSWRStatic 使用箇所 0 🎉
+
+---
+
+### フェーズ2: packages/editor の移行(優先度:中)
+
+#### ステップ2-1: useCodeMirrorEditorIsolated のJotai化(推定工数:5-7日)⭐
+
+**詳細**: `packages-editor-jotai-migration-plan.md` 参照
+
+**移行手順**:
+1. `states/codemirror-editor.ts` 作成
+2. Map<string, UseCodeMirrorEditor> パターンで実装
+3. 20+箇所を段階的に移行(後方互換フック提供)
+4. `stores/codemirror-editor.ts` 削除
+
+**期待効果**:
+- パフォーマンス改善(最大)
+- useSWRStatic使用箇所 -1
+
+---
+
+#### ステップ2-2: Playground の useSWRStatic 削除(推定工数:0.5日)
+
+**移行手順**:
+1. Global Socket を Jotai atom化(apps/app と統合)
+2. Playground での使用を Jotai hook に置き換え
+3. useSWRStatic import 削除
+
+**期待効果**:
+- useSWRStatic使用箇所 -1
+- `packages/editor` での useSWRStatic 完全廃止 ✅
+
+**packages/editor 完了**: useSWRStatic 使用箇所 0 🎉
+
+---
+
+### フェーズ3: packages/core の整理(優先度:低)
+
+#### ステップ3-1: use-global-socket.ts の更新(推定工数:0.5日)
+
+**現状**: `useSWRStatic` に依存
+
+**移行手順**:
+1. apps/app での Global Socket の Jotai 実装を確認
+2. `packages/core/src/swr/use-global-socket.ts` を更新または削除を検討
+
+---
+
+#### ステップ3-2: use-swr-static.ts の削除検討(推定工数:TBD)
+
+**現状**: `useSWRStatic` の実装
+
+**移行条件**: 
+- apps/app での使用箇所 0 ✅
+- packages/editor での使用箇所 0 ✅
+- 他パッケージでの使用箇所調査
+
+**移行手順**:
+1. 全パッケージでの使用箇所を調査
+2. 使用箇所がなければ削除
+3. ある場合は個別に Jotai 化を検討
+
+---
+
+## 📊 総合工数見積もり
+
+### フェーズ1: apps/app(必須)
+| ステップ | 工数 | 優先度 | 廃止数 |
+|---------|------|--------|--------|
+| 1-1. useIsMaintenanceMode | 0.5日 | 🔴 最高 | -1 |
+| 1-2. usePersonalSettings | 2-3日 | 🟡 中 | -1 |
+| 1-3. useGlobalAdminSocket | 0.5日 | 🟢 低 | -1 |
+| 1-4. useContextSWR | 0.1日 | 🟢 低 | -1 |
+| 1-5. use-static-swr.ts | 0.1日 | ⭐ 最終 | -1 |
+| **小計** | **3-4日** | | **-5箇所** |
+
+### フェーズ2: packages/editor(推奨)
+| ステップ | 工数 | 優先度 | 廃止数 |
+|---------|------|--------|--------|
+| 2-1. useCodeMirrorEditorIsolated | 5-7日 | 🔴 高 | -1 |
+| 2-2. Playground | 0.5日 | 🟢 低 | -1 |
+| **小計** | **5.5-7.5日** | | **-2箇所** |
+
+### フェーズ3: packages/core(オプション)
+| ステップ | 工数 | 優先度 | 廃止数 |
+|---------|------|--------|--------|
+| 3-1. use-global-socket.ts | 0.5日 | 🟢 低 | 調査次第 |
+| 3-2. use-swr-static.ts | TBD | 🟢 低 | 調査次第 |
+| **小計** | **TBD** | | **TBD** |
+
+---
+
+## 🎯 推奨実施順序
+
+### 即座に実施すべき(最優先)
+1. ✅ **ステップ1-1: useIsMaintenanceMode 重複解消** (0.5日)
+   - 重複コード削除
+   - 最も簡単で効果が大きい
+
+### 短期で実施(1-2週間)
+2. ✅ **ステップ1-2: usePersonalSettings** (2-3日)
+3. ✅ **ステップ1-3: useGlobalAdminSocket** (0.5日)
+4. ✅ **ステップ1-4: useContextSWR** (0.1日)
+5. ✅ **ステップ1-5: use-static-swr.ts** (0.1日)
+
+**完了時**: `apps/app` での useSWRStatic 完全廃止 🎉
+
+### 中期で実施(1-2ヶ月)
+6. ✅ **ステップ2-1: useCodeMirrorEditorIsolated** (5-7日)
+7. ✅ **ステップ2-2: Playground** (0.5日)
+
+**完了時**: `packages/editor` での useSWRStatic 完全廃止 🎉
+
+### 長期で検討(3ヶ月+)
+8. ⭐ **フェーズ3: packages/core の整理**
+
+---
+
+## 🎉 最終目標
+
+### 完全廃止達成条件
+- ✅ `apps/app` での useSWRStatic/useStaticSWR 使用箇所: **0**
+- ✅ `packages/editor` での useSWRStatic 使用箇所: **0**
+- ✅ `apps/app/src/stores/use-static-swr.ts` 削除
+- ⭐ `packages/core/src/swr/use-swr-static.ts` 削除検討
+
+### 期待効果
+- 🎯 **アーキテクチャ統一**: SWR(通信)とJotai(状態)の明確な分離
+- 🎯 **保守性向上**: 重複コード削除、責務の明確化
+- 🎯 **パフォーマンス改善**: 不適切なSWR使用の排除
+- 🎯 **コードベース品質**: 技術的負債の解消
+
+---
+
+## 📚 関連ドキュメント
+
+- `apps-app-jotai-migration-progress.md` - apps/app Jotai移行完了レポート
+- `apps-app-jotai-migration-guidelines.md` - 技術パターン
+- `packages-editor-jotai-migration-plan.md` - packages/editor 移行計画
+
+---
+
+**結論**: useSWRStatic/useStaticSWR の完全廃止は実現可能。  
+**推奨**: フェーズ1(apps/app)を優先実施し、早期に成果を得る。  
+**総工数**: 8.5-11.5日(フェーズ1+2)で主要な廃止が完了。

+ 342 - 0
.serena/memories/useSWRStatic-deprecation-progress.md

@@ -0,0 +1,342 @@
+# useSWRStatic / useStaticSWR 廃止計画 - 進捗レポート
+
+**作成日**: 2025-10-06  
+**最終更新**: 2025-10-06  
+**作成者**: GitHub Copilot  
+**目標**: `useSWRStatic`と`useStaticSWR`を完全廃止する
+
+---
+
+## 📊 進捗状況
+
+### 全体進捗
+- **完了**: 1/7 箇所 (14.3%) ✅
+- **残り**: 6箇所
+- **apps/app**: 1/5 完了
+- **packages/editor**: 0/2 完了
+
+---
+
+## ✅ 完了した移行
+
+### ステップ1-1: useIsMaintenanceMode 重複解消 ✅
+
+**実施日**: 2025-10-06  
+**工数**: 0.5日  
+**優先度**: 🔴 最高
+
+#### 実施内容
+
+**問題**:
+- `stores/maintenanceMode.tsx` - useStaticSWR使用(旧実装)
+- `states/global/global.ts` - isMaintenanceModeAtom存在(Jotai)
+- 同じ状態を2箇所で管理していた
+
+**解決策**:
+```
+states/global/global.ts
+├── isMaintenanceModeAtom (状態管理)
+├── useIsMaintenanceMode() (読み取り)
+└── _atomsForMaintenanceMode (特殊名export)
+
+client/services/maintenance-mode.ts
+└── useMaintenanceModeActions() (ビジネスロジック)
+    ├── start()
+    └── end()
+```
+
+**削除したファイル**:
+- ✅ `stores/maintenanceMode.tsx`
+- ✅ `states/system/` ディレクトリ全体
+
+**更新したファイル**:
+- ✅ `states/global/global.ts` - atom追加、`_atomsForMaintenanceMode` export
+- ✅ `states/global/hydrate.ts` - hydration更新
+- ✅ `client/services/maintenance-mode.ts` - 新規作成(actions)
+- ✅ `client/components/Admin/App/MaintenanceMode.tsx` - import更新
+- ✅ `client/components/Admin/App/AppSettingsPageContents.tsx` - import更新
+
+**使用箇所**: 2箇所更新完了
+- `Admin/App/MaintenanceMode.tsx`
+- `Admin/App/AppSettingsPageContents.tsx`
+
+**達成効果**:
+- ✅ 重複コード削除
+- ✅ 責務分離(states ↔ services)
+- ✅ useSWRStatic使用箇所 -1
+- ✅ 型エラー 0件
+
+---
+
+## 🔴 apps/app での残り使用箇所(4箇所)
+
+### 1. **stores/personal-settings.tsx** - usePersonalSettings
+- **現状**: `useStaticSWR` 使用(DB同期用の中間キャッシュ)
+- **使用箇所**: 12箇所(Me設定画面、DrawioModal、TemplateModal等)
+- **役割**: `/personal-setting` API から取得したユーザー情報のキャッシュ管理
+- **複雑度**: 🟡 中
+- **推定工数**: 2-3日
+- **優先度**: 🟡 中
+- **ステータス**: ⏳ 未着手
+
+**移行方針**:
+```typescript
+// states/user/personal-settings.ts
+const personalSettingsAtom = atom<IUser | undefined>(undefined);
+
+export const usePersonalSettings = () => useAtomValue(personalSettingsAtom);
+
+export const usePersonalSettingsActions = () => {
+  const setPersonalSettings = useSetAtom(personalSettingsAtom);
+  const { mutate: revalidateDB } = useSWRxPersonalSettings();
+  
+  const sync = useCallback(async () => {
+    const result = await revalidateDB();
+    setPersonalSettings(result);
+  }, [setPersonalSettings, revalidateDB]);
+  
+  return { sync, updateBasicInfo, /* ... */ };
+};
+```
+
+---
+
+### 2. **stores/websocket.tsx** - useGlobalAdminSocket
+- **現状**: `useSWRStatic` 使用(WebSocket管理)
+- **使用箇所**: 1箇所(Admin/V5PageMigration.tsx)
+- **役割**: Global Admin Socket の管理
+- **複雑度**: 🟢 低
+- **推定工数**: 0.5日
+- **優先度**: 🟢 低
+- **ステータス**: ⏳ 未着手
+
+**移行方針**:
+```typescript
+// states/socket-io/admin-socket.ts
+const globalAdminSocketAtom = atom<Socket | undefined>(undefined);
+
+export const useGlobalAdminSocket = () => useAtomValue(globalAdminSocketAtom);
+export const useSetGlobalAdminSocket = () => useSetAtom(globalAdminSocketAtom);
+```
+
+---
+
+### 3. **stores-universal/use-context-swr.tsx** - useContextSWR
+- **現状**: `useSWRStatic` 使用
+- **使用箇所**: 0箇所(internal definition only)
+- **役割**: Context用の SWR wrapper(mutate禁止)
+- **複雑度**: 🟢 低
+- **推定工数**: 0.1日
+- **優先度**: 🟢 低
+- **ステータス**: ⏳ 未着手
+
+**移行方針**: 使用箇所がないため即座に削除可能
+
+---
+
+### 4. **stores/use-static-swr.ts**
+- **現状**: `@deprecated` - `useSWRStatic` の再エクスポート
+- **ステータス**: ⭐ **最終削除対象**(上記3つの完了後)
+- **推定工数**: 0.1日
+
+---
+
+## 🔴 packages/editor での使用箇所(2箇所)
+
+### 1. **stores/codemirror-editor.ts** - useCodeMirrorEditorIsolated
+- **現状**: `useSWRStatic` + `useRef`
+- **使用箇所**: 20+箇所(パッケージ全体に浸透)
+- **役割**: CodeMirrorインスタンスの分離管理
+- **複雑度**: 🟡 中
+- **推定工数**: 5-7日
+- **優先度**: 🔴 高
+- **ステータス**: ⏳ 未着手
+- **詳細**: `packages-editor-jotai-migration-plan.md` 参照
+
+**影響範囲**:
+- Playground系: 3箇所
+- Toolbar系: 9箇所
+- Component系: 4箇所
+- Controller系: 4箇所
+
+**移行方針**:
+```typescript
+// packages/editor/src/states/codemirror-editor.ts
+type CodeMirrorEditorData = Map<string, UseCodeMirrorEditor>;
+const codeMirrorEditorMapAtom = atom<CodeMirrorEditorData>(new Map());
+
+export const useCodeMirrorEditor = (key: string | null) => {
+  const editorMap = useAtomValue(codeMirrorEditorMapAtom);
+  return key ? editorMap.get(key) ?? null : null;
+};
+```
+
+---
+
+### 2. **components-internal/playground/Playground.tsx**
+- **現状**: `useSWRStatic(GLOBAL_SOCKET_KEY)` - mutate のみ使用
+- **使用箇所**: 1箇所(Playgroundのみ)
+- **役割**: Global Socket の mutate
+- **複雑度**: 🟢 低
+- **推定工数**: 0.5日
+- **優先度**: 🟢 低
+- **ステータス**: ⏳ 未着手
+
+---
+
+## 📋 推奨実施順序
+
+### Phase 1: apps/app の完了(残り工数: 2.5-3.5日)
+
+**優先順位**:
+1. ✅ **useIsMaintenanceMode** - 完了(0.5日)
+2. ⏳ **useGlobalAdminSocket** - 次に実施(0.5日)
+3. ⏳ **useContextSWR** - 削除のみ(0.1日)
+4. ⏳ **usePersonalSettings** - 最も複雑(2-3日)
+5. ⏳ **use-static-swr.ts** - 最終削除(0.1日)
+
+**Phase 1完了時**: `apps/app` での useSWRStatic **完全廃止** 🎉
+
+---
+
+### Phase 2: packages/editor の完了(残り工数: 5.5-7.5日)
+
+**優先順位**:
+1. ⏳ **useCodeMirrorEditorIsolated** - 最優先(5-7日)
+2. ⏳ **Playground** - 最後(0.5日)
+
+**Phase 2完了時**: `packages/editor` での useSWRStatic **完全廃止** 🎉
+
+---
+
+## 🎯 技術パターン(確立済み)
+
+### パターン1: 状態とアクションの分離
+
+```typescript
+// states/global/global.ts (状態管理)
+const fooAtom = atom<T>(initialValue);
+export const useFoo = () => useAtomValue(fooAtom);
+export const _atomsForFooActions = { fooAtom } as const;
+
+// client/services/foo.ts (ビジネスロジック)
+import { _atomsForFooActions } from '~/states/global';
+const { fooAtom } = _atomsForFooActions;
+
+export const useFooActions = () => {
+  const setFoo = useSetAtom(fooAtom);
+  
+  const doSomething = useCallback(async () => {
+    const result = await api();
+    setFoo(result);
+  }, [setFoo]);
+  
+  return { doSomething };
+};
+```
+
+**適用例**: ✅ useIsMaintenanceMode / useMaintenanceModeActions
+
+---
+
+### パターン2: シンプルな状態管理
+
+```typescript
+// states/foo/bar.ts
+const barAtom = atom<T | undefined>(undefined);
+
+export const useBar = () => useAtomValue(barAtom);
+export const useSetBar = () => useSetAtom(barAtom);
+```
+
+**適用予定**: useGlobalAdminSocket
+
+---
+
+### パターン3: SWRとJotaiの協調
+
+```typescript
+// SWR: DB通信・キャッシュ管理
+export const useSWRxFoo = () => {
+  return useSWR('/api/foo', fetcher);
+};
+
+// Jotai: クライアント状態管理
+const fooAtom = atom<T | undefined>(undefined);
+
+export const useFooActions = () => {
+  const setFoo = useSetAtom(fooAtom);
+  const { mutate: revalidateDB } = useSWRxFoo();
+  
+  const sync = useCallback(async () => {
+    const result = await revalidateDB();
+    setFoo(result);
+  }, [setFoo, revalidateDB]);
+  
+  return { sync };
+};
+```
+
+**適用予定**: usePersonalSettings
+
+---
+
+## 📊 統計情報
+
+### コード削減
+- **削除ファイル数**: 1個(+ディレクトリ1個)
+- **削除行数**: ~32行(maintenanceMode.tsx)
+
+### アーキテクチャ改善
+- ✅ 状態管理の責務分離(states ↔ services)
+- ✅ 重複コード削除
+- ✅ 型安全性の向上
+
+### パフォーマンス
+- ✅ 不適切なSWR使用の排除
+- ✅ 最適な再レンダリング制御
+
+---
+
+## 🎉 マイルストーン
+
+### マイルストーン1: apps/app 完全移行
+- **進捗**: 1/5 完了 (20%)
+- **予想完了**: Phase 1 完了時
+- **残り工数**: 2.5-3.5日
+
+### マイルストーン2: packages/editor 完全移行
+- **進捗**: 0/2 完了 (0%)
+- **予想完了**: Phase 2 完了時
+- **残り工数**: 5.5-7.5日
+
+### マイルストーン3: useSWRStatic 完全廃止
+- **進捗**: 1/7 完了 (14.3%)
+- **予想完了**: Phase 1 + Phase 2 完了時
+- **残り工数**: 8-11日
+
+---
+
+## 📚 関連ドキュメント
+
+- `apps-app-jotai-migration-progress.md` - apps/app Jotai移行完了レポート
+- `apps-app-jotai-migration-guidelines.md` - 技術パターン・ベストプラクティス
+- `packages-editor-jotai-migration-plan.md` - packages/editor 移行計画
+
+---
+
+## 📝 学んだこと
+
+### アーキテクチャ設計
+1. **状態とロジックの分離**: `states/` は純粋な状態管理、`services/` はビジネスロジック
+2. **特殊名export**: `_atomsForFooActions` パターンで内部atomを安全に公開
+3. **責務の明確化**: SWR(通信)vs Jotai(状態)の役割分担
+
+### 移行のベストプラクティス
+1. **重複コード検出**: 新旧実装の共存を見逃さない
+2. **段階的移行**: 影響範囲の小さいものから順に実施
+3. **型チェック**: 各ステップで型エラー0を確認
+
+---
+
+**次のアクション**: ステップ1-2 `useGlobalAdminSocket` の移行を開始 🚀