posimai-root/docs/LEARNINGS.md

145 lines
5.5 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 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`
- 環境変数未設定時は認証スキップ(デフォルト認証情報は削除済み)
### アプリ種別と認証の必要性
| アプリ種別 | 認証 | 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@0.344.0`(バージョン固定必須。`@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 で先に作成する**