ponshu-room-lite/docs/POSIMAI_BRAIN_ROADMAP_2026.md

577 lines
15 KiB
Markdown
Raw Normal View History

# Posimai Brain プロジェクト: 実装ロードマップ
**作成日**: 2026-02-23
**目的**: Chrome 100タブ問題の解決 + AI自動整理システム
**方針**: 段階的実装、最小構成から開始
---
## 🎯 **プロジェクト目標**
### **解決したい課題**
1. **情報の洪水**
- Chrome 100タブ常時開きっぱなし
- Slack DM / LINE Keepへの手動転送
- カテゴリ分けなし → 必要な記事を探せない
2. **共同開発者との情報共有**
- 手動でURLを送る手間
- 文脈情報が欠落
- 過去の共有記事を探せない
3. **関連情報の取得**
- 記事を読んだ後、関連情報を手動で検索
- 最新動向のキャッチアップに時間がかかる
### **理想の状態**
```
スマホで気になる記事を見つける
「共有」ボタン → 「Posimai Brain」選択 (1タップ)
AIが自動で要約・カテゴリ分け・関連情報取得
Synology Chatに通知 + ダッシュボードに蓄積
共同開発者も自動で閲覧可能
```
---
## 🏗️ **3フェーズ実装計画**
### **Phase 1: データパイプライン構築(今週: 3-4時間**
#### **目標**: Chromeタブを閉じられるようにする
#### **アーキテクチャ**
```
[スマホ共有]
[iOS/Android ショートカット]
[Vercel Webhook API] (無料枠)
[PostgreSQL (Synology)]
[Synology Chat 通知]
```
#### **実装タスク**
**Task 1.1: Synology PostgreSQL + Chat セットアップ (30分)**
```bash
# SSH接続
ssh admin@100.76.7.3
# PostgreSQL起動既存docker-compose.ymlを使用
cd /volume1/docker/posimai-stack
nano docker-compose.yml
```
**追加サービス**:
```yaml
services:
# 既存のpostgres, redisに追加
# Posimai Brain用テーブル初期化
postgres_init:
image: postgres:16-alpine
depends_on:
postgres:
condition: service_healthy
volumes:
- ./init.sql:/docker-entrypoint-initdb.d/init.sql
environment:
PGPASSWORD: ${POSTGRES_PASSWORD}
command: >
psql -h postgres -U posimai -d posimai_db -f /docker-entrypoint-initdb.d/init.sql
```
**init.sql**:
```sql
-- Posimai Brain テーブル
CREATE TABLE IF NOT EXISTS brain_articles (
id SERIAL PRIMARY KEY,
url TEXT NOT NULL UNIQUE,
title TEXT,
content TEXT,
summary TEXT,
category VARCHAR(50),
importance INT DEFAULT 0,
tags TEXT[],
related_urls TEXT[],
created_at TIMESTAMP DEFAULT NOW(),
updated_at TIMESTAMP DEFAULT NOW(),
shared_by VARCHAR(50) DEFAULT 'maita'
);
-- インデックス
CREATE INDEX idx_category ON brain_articles(category);
CREATE INDEX idx_created_at ON brain_articles(created_at DESC);
CREATE INDEX idx_tags ON brain_articles USING GIN(tags);
-- 全文検索用
CREATE INDEX idx_content_search ON brain_articles USING gin(to_tsvector('japanese', content));
```
**Synology Chat セットアップ**:
1. DSM → パッケージセンター → **Chat** インストール
2. Chat起動 → **統合****Incoming Webhook** 作成
3. Webhook URL をメモ: `https://your-synology.tail72e846.ts.net/webapi/entry.cgi?api=...`
**Task 1.2: Vercel Webhook API 作成 (1.5時間)**
```bash
# ローカルPCで実行
cd C:\Users\maita\posimai-project
mkdir posimai-brain-api
cd posimai-brain-api
npm init -y
npm install @vercel/node pg node-fetch
```
**api/save-article.js**:
```javascript
import { Pool } from 'pg';
const pool = new Pool({
host: process.env.DB_HOST,
port: 5432,
database: 'posimai_db',
user: 'posimai',
password: process.env.DB_PASSWORD,
ssl: false // Tailscale経由のため
});
export default async function handler(req, res) {
if (req.method !== 'POST') {
return res.status(405).json({ error: 'Method not allowed' });
}
const { url, source = 'mobile' } = req.body;
if (!url) {
return res.status(400).json({ error: 'URL required' });
}
try {
// Phase 1: URLのみ保存
const result = await pool.query(
'INSERT INTO brain_articles (url, title) VALUES ($1, $2) ON CONFLICT (url) DO NOTHING RETURNING id',
[url, `Article from ${source}`]
);
// Synology Chat通知
if (result.rows.length > 0) {
await fetch(process.env.SYNOLOGY_CHAT_WEBHOOK, {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
text: `📌 新しい記事を保存しました\n${url}`
})
});
}
res.status(200).json({ success: true, id: result.rows[0]?.id });
} catch (error) {
console.error(error);
res.status(500).json({ error: error.message });
}
}
```
**vercel.json**:
```json
{
"version": 2,
"builds": [
{ "src": "api/**/*.js", "use": "@vercel/node" }
],
"env": {
"DB_HOST": "100.76.7.3",
"DB_PASSWORD": "@db-password",
"SYNOLOGY_CHAT_WEBHOOK": "@synology-chat-webhook"
}
}
```
**デプロイ**:
```bash
vercel --prod
# Secrets設定
vercel secrets add db-password "your_db_password"
vercel secrets add synology-chat-webhook "your_webhook_url"
```
**Task 1.3: スマホショートカット作成 (30分)**
**iOS (Shortcuts アプリ)**:
1. ショートカットアプリ起動
2. 新規ショートカット → 「入力を受け取る」
3. アクション追加:
- **URL の内容を取得** (入力: ショートカットの入力)
- **Web を取得**:
- URL: `https://your-vercel-app.vercel.app/api/save-article`
- メソッド: POST
- 本文: JSON `{"url": "ショートカットの入力"}`
- **通知を表示**: "記事を保存しました"
**Android (HTTP Shortcuts アプリ)**:
1. Google Playから「HTTP Shortcuts」インストール
2. 新規ショートカット作成:
- URL: `https://your-vercel-app.vercel.app/api/save-article`
- Method: POST
- Body: `{"url": "{url}"}`
- Share target: ON
**成功基準**:
- [ ] スマホから記事URLを共有 → ショートカット実行
- [ ] PostgreSQLにURLが保存される
- [ ] Synology Chatに通知が届く
- [ ] Chromeタブを閉じられる
---
### **Phase 2: AI知能統合来週: 4-6時間**
#### **目標**: 自動要約・カテゴリ分け・関連情報取得
#### **アーキテクチャ拡張**
```
[Vercel Webhook]
[Article Scraper] (Vercel Functionまたはn8n)
[Gemini API]
- 要約生成3行
- カテゴリ判定(技術/日本酒/本業/AI/その他)
- 重要度スコア1-10
- タグ抽出
- 関連情報検索
[PostgreSQL 更新]
[Synology Chat通知] - リッチ要約付き
```
#### **実装タスク**
**Task 2.1: Article Scraper追加 (2時間)**
**api/save-article.js 更新**:
```javascript
import { JSDOM } from 'jsdom';
import { Readability } from '@mozilla/readability';
async function scrapeArticle(url) {
const response = await fetch(url);
const html = await response.text();
const dom = new JSDOM(html, { url });
const reader = new Readability(dom.window.document);
const article = reader.parse();
return {
title: article.title,
content: article.textContent.slice(0, 5000), // 最初の5000文字
excerpt: article.excerpt
};
}
```
**Task 2.2: Gemini API統合 (2-3時間)**
```javascript
import { GoogleGenerativeAI } from '@google/generative-ai';
const genAI = new GoogleGenerativeAI(process.env.GEMINI_API_KEY);
async function analyzeWithGemini(title, content) {
const model = genAI.getGenerativeModel({
model: 'gemini-2.0-flash-exp',
generationConfig: { responseMimeType: 'application/json' }
});
const prompt = `
以下の記事を分析してください:
タイトル: ${title}
本文: ${content}
以下のJSON形式で回答してください:
{
"summary": "3行要約各行60文字以内",
"category": "技術|日本酒|本業|AI|その他",
"importance": 1-10のスコア,
"tags": ["タグ1", "タグ2", "タグ3"],
"related_keywords": ["関連キーワード1", "関連キーワード2"]
}
`;
const result = await model.generateContent(prompt);
return JSON.parse(result.response.text());
}
```
**Task 2.3: Synology Chat通知拡張 (1時間)**
```javascript
// リッチ通知フォーマット
const chatMessage = {
text: `📰 **新しい記事**\n${analysis.category}`,
attachments: [{
title: article.title,
title_link: url,
text: analysis.summary,
color: getCategoryColor(analysis.category),
fields: [
{ title: '重要度', value: `${analysis.importance}/10`, short: true },
{ title: 'タグ', value: analysis.tags.join(', '), short: true }
]
}]
};
```
**成功基準**:
- [ ] URLから記事本文を自動取得
- [ ] Gemini APIで要約・カテゴリ・タグ生成
- [ ] PostgreSQLに全データ保存
- [ ] Synology Chatにリッチ通知
---
### **Phase 3: Posimai Dashboard作成2週目: 1週間**
#### **目標**: 検索・フィルタ・共有可能なWebダッシュボード
#### **技術スタック**
- **フレームワーク**: Flutter Web (日本酒アプリの知識流用)
- **デプロイ**: Vercel (または Synology Web Station)
- **API**: Vercel Serverless Functions
- **認証**: 簡易パスワード(共同開発者と共有)
#### **デザインシステム: Posimai UIテンプレ**
**カラーパレット** (日本酒アプリから流用):
```dart
// lib/theme/posimai_colors.dart
class PosimaiColors {
// メインカラー: 和風トーン
static const primary = Color(0xFF2C3E50); // 濃紺
static const accent = Color(0xFFD4A574); // 琥珀
static const background = Color(0xFFF5F1E8); // 和紙
// カテゴリ別カラー
static const tech = Color(0xFF3498DB); // 技術: 青
static const sake = Color(0xFFE74C3C); // 日本酒: 赤
static const business = Color(0xFF2ECC71); // 本業: 緑
static const ai = Color(0xFF9B59B6); // AI: 紫
static const other = Color(0xFF95A5A6); // その他: グレー
}
```
**コンポーネント構成**:
```
lib/
├── main.dart
├── theme/
│ ├── posimai_colors.dart
│ └── posimai_theme.dart
├── widgets/
│ ├── article_card.dart # 記事カード
│ ├── category_chip.dart # カテゴリチップ
│ ├── search_bar.dart # 検索バー
│ └── filter_drawer.dart # フィルタドロワー
├── screens/
│ ├── home_screen.dart # 記事一覧
│ ├── article_detail_screen.dart # 記事詳細
│ └── search_screen.dart # 検索画面
└── services/
├── api_service.dart # API通信
└── database_service.dart # ローカルキャッシュ
```
**主要機能**:
1. **記事一覧画面**
- カテゴリ別フィルタ
- 日付順・重要度順ソート
- 無限スクロール
2. **検索機能**
- 全文検索PostgreSQL tsvector
- タグ検索
- カテゴリ絞り込み
3. **記事詳細画面**
- 要約表示
- 元記事リンク
- 関連記事表示
- 共有ボタンURL生成
4. **ダークモード**
- システム設定連動
- 手動切り替え
#### **実装タスク**
**Task 3.1: Flutter Webプロジェクト作成 (2時間)**
```bash
cd C:\Users\maita\posimai-project
mkdir 01_active
cd 01_active
flutter create posimai_brain_dashboard --platforms=web
cd posimai_brain_dashboard
```
**Task 3.2: Posimai UIテンプレ実装 (1日)**
```dart
// lib/theme/posimai_theme.dart
ThemeData posimaiLightTheme = ThemeData(
useMaterial3: true,
colorScheme: ColorScheme.light(
primary: PosimaiColors.primary,
secondary: PosimaiColors.accent,
surface: PosimaiColors.background,
),
// ... 日本酒アプリのテーマを流用
);
```
**Task 3.3: API接続・記事一覧表示 (2日)**
```dart
// lib/services/api_service.dart
class ApiService {
static const baseUrl = 'https://your-vercel-app.vercel.app/api';
Future<List<Article>> getArticles({
String? category,
String? query,
int limit = 50,
}) async {
final response = await http.get(
Uri.parse('$baseUrl/articles').replace(queryParameters: {
if (category != null) 'category': category,
if (query != null) 'q': query,
'limit': limit.toString(),
}),
);
// ... JSONパース
}
}
```
**Task 3.4: Vercelデプロイ (30分)**
```bash
cd posimai_brain_dashboard
flutter build web --release
cd build/web
vercel --prod
```
**成功基準**:
- [ ] Flutter Webでダッシュボード表示
- [ ] カテゴリフィルタ動作
- [ ] 全文検索動作
- [ ] モバイル・デスクトップ対応
- [ ] ダークモード切替
- [ ] Vercelで公開
- [ ] 共同開発者がURLアクセス可能
---
## 🎨 **Posimai UIテンプレートの転用計画**
Phase 3で作成した **Posimai Dashboard Template** は以下に転用可能:
1. **テック管理ダッシュボード**
- GitHub連携
- 技術記事管理
2. **RFM分析ダッシュボード**
- 顧客データ可視化
- kintone連携収益化案件用
3. **香道アプリ管理画面**
- 香木データベース
- 履歴管理
**テンプレート共通コンポーネント**:
```
00_core/ui_components/
├── posimai_theme/ # カラー・テーマ定義
├── data_table.dart # データテーブル
├── chart_widget.dart # グラフ表示
├── export_button.dart # CSVエクスポート
└── auth_wrapper.dart # 簡易認証
```
---
## 📊 **開発スケジュール**
| Week | フェーズ | タスク | 所要時間 | 成果物 |
|------|---------|--------|---------|--------|
| **Week 1** | Phase 1 | データパイプライン | 3-4h | Chromeタブ解放 |
| **Week 2** | Phase 2 | AI知能統合 | 4-6h | 自動要約・通知 |
| **Week 3-4** | Phase 3 | Dashboard作成 | 30-40h | 検索・共有可能UI |
**合計**: 40-50時間2-3週間
---
## 🎯 **成功指標**
### **Phase 1完了時**
- [ ] Chromeタブ100 → 10以下
- [ ] 1日5-10記事を自動保存
- [ ] Synology Chatで確認可能
### **Phase 2完了時**
- [ ] AI要約精度80%以上
- [ ] カテゴリ自動分類精度90%以上
- [ ] 情報収集時間50%削減
### **Phase 3完了時**
- [ ] 共同開発者が週1回以上アクセス
- [ ] 過去記事検索時間90%削減
- [ ] テンプレートを他プロジェクトに転用
---
## 🚀 **次のアクション**
### **今すぐ(今日)**
1. ✅ Synology Chat インストール
2. ✅ PostgreSQL テーブル作成
3. ✅ Incoming Webhook URL取得
### **今週中**
1. ⏳ Vercel API デプロイ
2. ⏳ スマホショートカット作成
3. ⏳ Phase 1 動作確認
### **来週**
1. ⏳ Gemini API統合
2. ⏳ AI自動要約テスト
3. ⏳ Phase 2 完成
---
**作成者**: Claude (Sonnet 4.5) + Antigravity + Gemini の総合判断
**方針**: 段階的実装、実用性優先、テンプレート化で横展開