ponshu-room-lite/docs/POSIMAI_BRAIN_ROADMAP_2026.md

577 lines
15 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 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 の総合判断
**方針**: 段階的実装、実用性優先、テンプレート化で横展開