プロジェクト

全般

プロフィール

機能 #192

未完了

AIアシスタント機能拡張 - URL文脈連携とRedmine全文検索統合

Redmine Admin さんが4日前に追加.

ステータス:
新規
優先度:
高め
担当者:
開始日:
2025-06-04
期日:
進捗率:

0%

予定工数:

説明

機能拡張要望

対象機能: AIアシスタント(吹き出しマーク)
現在の状況: 基本的なClaude AI会話機能のみ
要望内容: コンテキスト情報連携とRedmine全文検索機能の統合

拡張要望詳細

1. URL文脈情報の自動引き継ぎ

動作仕様:

  • AIアシスタント呼び出し時に現在のページURL情報を取得
  • ページコンテンツを文脈情報として Claude に送信
  • ページ固有の質問に対して適切な回答を提供

実装例:

// AIアシスタント呼び出し時
const contextData = {
  currentUrl: window.location.href,
  pageTitle: document.title,
  pageContent: extractPageContent(), // ページの主要コンテンツ抽出
  redmineData: getCurrentRedmineData() // Redmine固有データ
};

// Claude APIに送信
const systemPrompt = `
現在のページ情報:
URL: ${contextData.currentUrl}
タイトル: ${contextData.pageTitle}
コンテンツ: ${contextData.pageContent}

このページに関する質問に答えてください。
`;

2. Redmine全文検索統合

検索対象:

  • チケット: 件名、説明、コメント
  • プロジェクト: 名前、説明
  • ドキュメント: タイトル、内容、添付ファイル
  • ニュース: タイトル、内容、概要
  • Wiki: ページ内容(存在する場合)
  • ユーザー: 名前、メール(権限に応じて)

API実装仕様:

# 統合検索API
GET /api/search.json?q={query}&scope=all
GET /api/search.json?q={query}&scope=issues
GET /api/search.json?q={query}&scope=documents
GET /api/search.json?q={query}&scope=news

3. AIアシスタント統合UI

フロー設計:

1. ユーザーがAIアシスタント呼び出し
   ↓
2. 現在ページの文脈情報を自動収集
   ↓  
3. ユーザーの質問を受信
   ↓
4. 関連するRedmineデータを全文検索
   ↓
5. 文脈 + 検索結果 + 質問をClaudeに送信
   ↓
6. Redmine情報に基づいた回答を表示

UI改善案:

const AIAssistant = () => {
  return (
    <div className="ai-assistant-panel">
      {/* 文脈情報表示 */}
      <div className="context-info">
        <span>📍 現在のページ: {currentPageTitle}</span>
        <span>🔍 Redmine検索: 有効</span>
      </div>
      
      {/* 会話エリア */}
      <div className="chat-area">
        {messages.map(message => (
          <div key={message.id} className="message">
            {message.content}
            {/* 検索結果の表示 */}
            {message.searchResults && (
              <SearchResultsPreview results={message.searchResults} />
            )}
          </div>
        ))}
      </div>
      
      {/* 入力エリア */}
      <div className="input-area">
        <input placeholder="Redmineについて質問してください..." />
        <button>送信</button>
      </div>
    </div>
  );
};

具体的な使用例

ケース1: チケット詳細ページでの質問

ページ: /redmine-ui/tickets/184
ユーザー: "このチケットの関連チケットを教えて"
AI: "チケット#184に関連して、以下のチケットが見つかりました:
- #185: 同じnginx設定に関する課題
- #186: 関連するAPI問題
現在のチケットは502エラーの修正で、これらと技術的に関連しています。"

ケース2: プロジェクト一覧での質問

ページ: /redmine-ui/projects  
ユーザー: "VPSセキュリティプロジェクトの進捗状況は?"
AI: "VPSセキュリティプロジェクトの状況:
- オープンチケット: 3件
- 最新の活動: チケット#180 (DNS MXレコード問題)
- 担当者: Redmine Admin
主な課題はnews.sharelab.jpのメール送信問題の解決です。"

ケース3: 全般的な検索質問

ユーザー: "nginx設定に関する問題を教えて"
AI: "nginx設定に関する以下の情報が見つかりました:
[チケット検索結果]
- #184: task.call2arm.com nginx設定修正
- #185: プロキシ設定の問題
[ドキュメント検索結果]  
- nginx設定マニュアル
[ニュース検索結果]
- サーバー設定変更のお知らせ"

技術実装要件

1. バックエンドAPI

// 統合検索エンドポイント
app.get('/api/ai/search', async (req, res) => {
  const { query, context } = req.query;
  
  const searchResults = await Promise.all([
    searchIssues(query),
    searchDocuments(query), 
    searchNews(query),
    searchProjects(query)
  ]);
  
  res.json({
    context,
    searchResults: mergeAndRankResults(searchResults)
  });
});

2. フロントエンド実装

// ページ文脈の取得
const getPageContext = () => {
  const url = window.location.href;
  const title = document.title;
  
  // Redmine特有のデータ抽出
  if (url.includes('/tickets/')) {
    return extractTicketContext();
  } else if (url.includes('/projects/')) {
    return extractProjectContext();
  }
  // ... 他のページタイプ
};

// AI質問時の処理
const askAI = async (question) => {
  const context = getPageContext();
  const searchResults = await searchRedmine(question);
  
  const response = await claudeAPI({
    context,
    searchResults,
    question
  });
  
  return response;
};

期待効果

  • 生産性向上: Redmine情報への素早いアクセス
  • 知識共有: 過去のチケット・ドキュメントの活用
  • 意思決定支援: 関連情報に基づいた判断
  • 学習効率: 新メンバーのRedmine理解促進

優先度

  • 緊急度: 中(機能拡張・UX向上)
  • 重要度: 高(AI統合による業務効率化)

関連チケット

  • #191: Claude API接続問題(前提条件として解決必要)
  • #188: ニュース機能実装(検索対象として必要)

表示するデータがありません

他の形式にエクスポート: Atom PDF