posimai-root/docs/LEARNINGS.md

145 lines
5.4 KiB
Markdown
Raw Normal View History

# Posimai Project — AI 学習ログ
このファイルはすべての AI エージェントが読むべき「現場で学んだ知見」のログです。
新しい重要な発見があれば、ここに追記してください。
---
## デプロイ・Git 関連
### Gitea push "Push to create is not enabled"
- **問題**: リポジトリが存在しない状態で push すると失敗する
- **解決策**: Gitea API でリポジトリを先に作成してから push する
```bash
curl -X POST "$GITEA_URL/api/v1/user/repos" -u "mai:$PASS" \
-d '{"name":"app-id","private":true,"auto_init":false}'
```
### Gitea API 認証は Basic Auth を使う
- **問題**: `Authorization: token` ではなく Basic Auth で認証する必要がある
- **正しい方法**: `curl -u "mai:$GITEA_PASS"` または `-H "Authorization: Basic base64(mai:pass)"`
- **パスワード取得**: `printf "protocol=http\nhost=100.76.7.3\n" | git credential fill`
### npm run deploy の直列化
- `git push gitea main && git push github main``&&` で連結済み
- Gitea が失敗すると GitHub には push されない(意図した動作)
### GitHub push でメールプライバシーエラーGH007
- **原因**: GitHub の「コマンドラインプッシュでメールを公開するブロック」設定
- **解決**: Settings > Emails > "Block command line pushes that expose my email address" を OFF
- **安全性**: リポジトリが private なら安全
---
## Vercel 関連
### Vercel git connect で複数リモートがある場合
- **問題**: gitea と github の2リモートがあると、どちらに接続するか対話的に聞かれる
- **解決策**: `printf "2\n" | vercel git connect "https://github.com/posimai/$APP_ID.git" --yes`
github は通常2番目に表示される
### Vercel 環境変数の Sensitive 設定
- Sensitive な変数は Development 環境では設定不可
- Production + Preview のみ選択して作成する
### `vercel --prod` は直接実行しない
- GitHub push → Vercel 自動デプロイの流れを壊す
- 必ず `npm run deploy`= `git push gitea main && git push github main`)を使う
---
## 認証・セキュリティ関連
### Magic Link 認証パターンBrain 専用)
- `?init_key=xxx` URLパラメータで API キーを localStorage に自動セット
- Synology API が稼働していることが前提
- 静的アプリevents/maps/hotels/reader/togetherには不要
### Basic Authdashboard/analytics
- `middleware.ts` で実装
- 環境変数: `BASIC_AUTH_USER` / `BASIC_AUTH_PASSWORD`
- デフォルト: `mai / posimai`
### アプリ種別と認証の必要性
| アプリ種別 | 認証 | URLだけで見られるか |
|-----------|------|-------------------|
| 静的events/hotels/maps/reader/together | なし | Yes |
| Brain / Feed | Magic Link任意 | Yesゲストモードあり |
| Dashboard / Analytics | Basic Auth | Noパスワード必要 |
---
## デザインシステム
### アクセントカラーの現状2026-03-11 時点)
- **公式(新)**: `#6EE7B7`Posimai Teal— テンプレート・projects.json で採用
- **旧**: `#818CF8`Indigo— Brain / Feed / Reader で未移行
- **方針**: 新規アプリはすべて Teal。旧アプリは次のリファクタ時に移行
### 絵文字は絶対禁止
- ユーザーの明示的なルール
- CSS コメントにも記載済み
- AI がこのルールを破った場合は即 revert する
### Lucide アイコンのみ使用
- stroke: 1.5〜2.0
- CDN: `https://unpkg.com/lucide@latest`
- 他のアイコンセットFont Awesome 等)は使わない
---
## アーキテクチャ判断
### CDN 依存(バンドルツールなし)は意図的な選択
- Vite 等の導入は非エンジニアにとって「ビルドエラー」という障壁を生む
- 2026年の規模9〜20アプリでは CDN で十分
- オフライン強化が必要になったときのみ検討する
### Synology NAS 上での直接作業は避ける
- AI ツールClaude Code / Cursorのファイルスキャンが著しく遅くなる
- 作業: ローカル PCSSD 上)
- バックアップ: Giteapush 時に自動)
### Dev Containers は現時点で不要
- 開発者が 1 名のうちは README.md のセットアップ手順で十分
- 将来コントリビューターが増えたときに検討する
---
## コードパターン
### Stale-While-RevalidateBrain で実証済み)
```js
// 1. キャッシュからの即時描画
const cached = loadFromStorage();
if (cached) render(cached);
// 2. API フェッチ → 差分更新
fetch(API_URL, { headers: authHeaders() })
.then(res => res.json())
.then(data => {
saveToStorage(data);
render(data);
})
.catch(() => { /* キャッシュのまま継続 */ });
```
### タイムアウト付き fetchBrain で実証済み)
```js
const controller = new AbortController();
const timeoutId = setTimeout(() => controller.abort(), 8000);
fetch(url, { signal: controller.signal })
.finally(() => clearTimeout(timeoutId));
```
---
## よくあるミス
1. `git push origin` を使う → **gitea / github の2リモートを使う**
2. `vercel --prod` を直接実行 → **`npm run deploy` のみ**
3. 絵文字をコードに追加 → **即 revert**
4. `--accent` 以外のカラーを追加 → **デザイントークンの変更禁止**
5. Gitea リポジトリ未作成で push → **API で先に作成する**